@Override public void visitInsn(int i) { // checking for existence of a proper exit instruction if (i == Opcodes.RETURN || i == Opcodes.IRETURN || i == Opcodes.LRETURN || i == Opcodes.DRETURN || i == Opcodes.FRETURN || i == Opcodes.ATHROW) { exitFound = true; } super.visitInsn(i); }
public void dup2() { super.visitInsn(DUP2); }
public void pop() { super.visitInsn(POP); }
public void dup() { super.visitInsn(DUP); }
public void defaultValue(String desc) { int typeCode = desc.charAt(0); switch (typeCode) { case '[': case 'L': super.visitInsn(ACONST_NULL); break; case 'Z': case 'C': case 'B': case 'S': case 'I': super.visitInsn(ICONST_0); break; case 'J': super.visitInsn(LCONST_0); break; case 'F': super.visitInsn(FCONST_0); break; case 'D': super.visitInsn(DCONST_0); break; } }
@Override public void visitEnd() { if (!exitFound) { // no proper exit instruction found; generate RETURN super.visitInsn(Opcodes.RETURN); } super.visitEnd(); } };
public void visitInsn(int opcode) { if (include) { getAdaptee().visitInsn(opcode); } }
public void arrayLoad(Type type) { super.visitInsn(type.getOpcode(IALOAD)); }
public void returnValue() { super.visitInsn(returnType.getOpcode(IRETURN)); }
public void arrayStore(Type type) { super.visitInsn(type.getOpcode(IASTORE)); }
@Override public void visitInsn(int opcode) { if (tsIndex[1] == -1) { for(int exitOpcode : exitOpcodes) { if (exitOpcode == opcode) { if (tsIndex[0] != -1 && tsIndex[1] == -1) generateTS(1); break; } } } super.visitInsn(opcode); if (tsIndex[1] != -1) { switch (opcode) { case RETURN: case IRETURN: case FRETURN: case LRETURN: case DRETURN: case ARETURN: case ATHROW: tsIndex[1] = -1; // reset the exit time stamp as it gets invalidated } } }
public void printObject() { super.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); super.visitInsn(SWAP); super.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/Object;)V"); }
public void push(int value) { if (value >= -1 && value <= 5) { super.visitInsn(ICONST_0 + value); } else if (value >= Byte.MIN_VALUE && value <= Byte.MAX_VALUE) { super.visitIntInsn(BIPUSH, value); } else if (value >= Short.MIN_VALUE && value <= Short.MAX_VALUE) { super.visitIntInsn(SIPUSH, value); } else { super.visitLdcInsn(Integer.valueOf(value)); } }
public void visitInsn(int opcode) { switch (opcode) { case IASTORE: case LASTORE: case FASTORE: case DASTORE: case AASTORE: case BASTORE: case CASTORE: case SASTORE: reportError("no.assignment"); break; case ATHROW: reportError("no.throw"); break; case MONITORENTER: case MONITOREXIT: reportError("no.synchronized.blocks"); break; } super.visitInsn(opcode); }
public static void generateTimeStampGetter(ClassVisitor cv) { MethodVisitor timestamp = cv.visitMethod(ACC_STATIC + ACC_PRIVATE + ACC_FINAL, TIME_STAMP_NAME, "()J", null, new String[0]); timestamp.visitCode(); timestamp.visitMethodInsn(INVOKESTATIC, "java/lang/System", "nanoTime", "()J"); timestamp.visitInsn(LRETURN); timestamp.visitMaxs(1, 0); timestamp.visitEnd(); }
public void visitEnd() { if (! classInitializerFound) { // add a dummy <clinit> method that just returns. MethodVisitor clinit = visitMethod(ACC_STATIC|ACC_PUBLIC, CLASS_INITIALIZER, "()V", null, null); clinit.visitCode(); clinit.visitInsn(RETURN); clinit.visitMaxs(0, 0); clinit.visitEnd(); } addFields(); super.visitEnd(); }
@Override public void visitEnd() { if (isExtension) { MethodVisitor mv = visitMethod(Opcodes.ACC_STATIC, CLINIT, "()V", null, null); mv.visitCode(); for(InitializerBlock ib : initBlocks) { ib.apply(mv); } mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(Type.getType(BTraceRuntimeBridge.class).getSize(), 0); mv.visitEnd(); } super.visitEnd(); } }