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(); }
private int generateClinit(MethodVisitor mv) { Type clazz = Type.getType("L" + cname + ";"); // the client name (the BTrace script class name) mv.visitLdcInsn(runtime); // the name of the currently processed class mv.visitLdcInsn(clazz); // NOI18N // invocatio nof BTraceRuntime.retransform() method mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(BTraceRuntime.class), "retransform", "(Ljava/lang/String;Ljava/lang/Class;)V"); // NOI18N return clazz.getSize() + Type.getType(String.class).getSize(); } }
@Override public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { if (((access & Opcodes.ACC_PUBLIC) | (access & Opcodes.ACC_PROTECTED) | (access & Opcodes.ACC_PRIVATE)) == 0) { shortSyntax = true; // specifying "class <MyClass>" rather than "public class <MyClass>" means using short syntax access |= Opcodes.ACC_PUBLIC; // force the public modifier on the btrace class } className = name; super.visit(version, access, name, signature, superName, interfaces); }
public void println(String msg) { super.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); super.visitLdcInsn(msg); super.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V"); }
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 Instrumentor(Class clazz, String btraceClassName, byte[] btraceCode, List<OnMethod> onMethods, ClassVisitor cv) { this(clazz, btraceClassName, new ClassReader(btraceCode), onMethods, cv); }
public void visitLdcInsn(Object cst) { if (cst instanceof Type) { String name = ((Type)cst).getInternalName(); if (name.equals(oldName)) { cst = Type.getType(newNameDesc); } } super.visitLdcInsn(cst); }
public void loadLocal(Type type, int index) { super.visitVarInsn(type.getOpcode(ILOAD), index); }
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { className = name; this.superName = superName; classType = Type.getObjectType(className); classInitializerFound = false; super.visit(version, access, name, signature, superName, interfaces); }
@Override public void visitIincInsn(int var, int increment) { if (copyEnabled) { super.visitIincInsn(var + localVarOffset, increment); } }
@Override public void visitAttribute(Attribute atrbt) { if (copyEnabled) { super.visitAttribute(atrbt); } }
@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); }
@Override public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) { if (index + localVarOffset < 0 || !copyEnabled) { return; } super.visitLocalVariable(name, desc, signature, start, end, index + localVarOffset); }
protected String getCommonSuperClass(String type1, String type2) { try { return super.getCommonSuperClass(type1, type2); } catch (LinkageError le) { return JAVA_LANG_OBJECT; } catch (RuntimeException re) { return JAVA_LANG_OBJECT; } } };
@Override public void visitCode() { requiredStack = generateClinit(mv); super.visitCode(); }
public void storeLocal(Type type, int index) { super.visitVarInsn(type.getOpcode(ISTORE), index); }
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { super.visit(version, access, name, signature, superName, interfaces); className = name; }
protected String getCommonSuperClass(String type1, String type2) { try { return super.getCommonSuperClass(type1, type2); } catch (LinkageError le) { return JAVA_LANG_OBJECT; } catch (RuntimeException re) { return JAVA_LANG_OBJECT; } } };