Refine search
@Override public void visitMaxs(int maxStack, int maxLocals) { Label endFinally = new Label(); mv.visitTryCatchBlock(startFinally, endFinally, endFinally, null); mv.visitLabel(endFinally); mv.visitInsn(DUP); int errIdx = newLocal(Type.getType(Throwable.class)); mv.visitVarInsn(Opcodes.ASTORE, errIdx); mv.visitVarInsn(Opcodes.ALOAD, statIdx); mv.visitVarInsn(Opcodes.ALOAD, errIdx); mv.visitMethodInsn(Opcodes.INVOKESTATIC, TRACE_MAIN, END_METHOD, END_SIGNATURE, false); mv.visitInsn(ATHROW); mv.visitMaxs(maxStack + 8, maxLocals + 2); }
private void genSwitchMethod(ClassVisitor cw, String typeName, String methodName, CB callback) { MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, methodName, "()Ljava/lang/String;", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, typeName, "idx", "I"); Label def = new Label(); Label[] labels = new Label[callbacks.size()]; Label label = strMap.get(key); if (label == null) { label = new Label(); strMap.put(key, label); mv.visitTableSwitchInsn(0, callbacks.size() - 1, def, labels); mv.visitLabel(e.getValue()); mv.visitLdcInsn(e.getKey()); mv.visitInsn(ARETURN); mv.visitLabel(def); mv.visitTypeInsn(NEW, "java/lang/RuntimeException"); mv.visitInsn(DUP); mv.visitLdcInsn("invalid idx"); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/String;)V"); mv.visitInsn(ATHROW); mv.visitMaxs(-1, -1); mv.visitEnd();
private static void createFloatObj(MethodVisitor mv, int argsPostion) { mv.visitTypeInsn(Opcodes.NEW, "java/lang/Float"); mv.visitInsn(Opcodes.DUP); mv.visitVarInsn(Opcodes.FLOAD, argsPostion); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Float", "<init>", "(F)V"); mv.visitInsn(Opcodes.AASTORE); }
private void visitMethodStub(MethodVisitor mv) { mv.visitTypeInsn(Opcodes.NEW, "java/lang/RuntimeException"); mv.visitInsn(Opcodes.DUP); mv.visitLdcInsn("Stub!"); String owner = "java/lang/RuntimeException"; String name = "<init>"; String desc = "(Ljava/lang/String;)V"; mv.visitMethodInsn(Opcodes.INVOKESPECIAL, owner, name, desc, false); mv.visitInsn(Opcodes.ATHROW); }
private void visitCallObjectHashCode(MethodVisitor mv) { mv.visitVarInsn(Opcodes.ALOAD, 0); String owner = "java/lang/Object"; String name = "hashCode"; String desc = "()I"; mv.visitMethodInsn(Opcodes.INVOKESPECIAL, owner, name, desc, false); mv.visitInsn(Opcodes.IRETURN); }
mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, superClassNameInternal, "<init>", "()V", false); mv.visitInsn(RETURN); mv.visitMaxs(0, 0); mv.visitEnd(); mv.visitCode(); mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(CHECKCAST, classNameInternal); mv.visitVarInsn(ASTORE, 4); mv.visitVarInsn(ILOAD, 2); Label[] labels = new Label[n]; for (int i = 0; i < n; i++) { labels[i] = new Label(); Label defaultLabel = new Label(); // the default handler block mv.visitTableSwitchInsn(0, labels.length - 1, defaultLabel, labels); mv.visitLabel(labels[i]); if (i == 0) { mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] { classNameInternal }, 0, null); } else { mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null); mv.visitVarInsn(ALOAD, 4);
@RequiresNonNull({"type", "metaHolderInternalName", "loader"}) private void generateMetaHolder() throws Exception { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES); cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, metaHolderInternalName, null, "java/lang/Object", null); Type metaHolderType = Type.getObjectType(metaHolderInternalName); MethodVisitor mv = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null); mv.visitCode(); Label l0 = new Label(); Label l1 = new Label(); Label l2 = new Label(); mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Throwable"); mv.visitLabel(l0); for (Type classMetaType : classMetaTypes) { String classMetaInternalName = classMetaType.getInternalName(); String classMetaFieldName = "glowroot$class$meta$" + classMetaInternalName.replace('/', '$'); "L" + classMetaInternalName + ";", null, null); fv.visitEnd(); mv.visitTypeInsn(NEW, classMetaInternalName); mv.visitInsn(DUP); mv.visitTypeInsn(NEW, classInfoImplType.getInternalName()); mv.visitInsn(DUP); mv.visitLdcInsn(type.getClassName()); mv.visitLdcInsn(metaHolderType); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getClassLoader", "()Ljava/lang/ClassLoader;", false); mv.visitMethodInsn(INVOKESPECIAL, classInfoImplType.getInternalName(), "<init>", "(Ljava/lang/String;Ljava/lang/ClassLoader;)V", false);
MethodVisitor methodVisitor = classVisitor.visitMethod(Opcodes.ACC_PUBLIC, "process", methodDescriptor(int.class, iFace, int.class), null, null); methodVisitor.visitCode(); Label localScopeStart = new Label(); methodVisitor.visitLabel(localScopeStart); methodVisitor.visitInsn(Opcodes.ICONST_0); methodVisitor.visitVarInsn(Opcodes.ISTORE, localIndexOfLoopIndex); Label loopStart = new Label(), loopEnd = new Label(); methodVisitor.visitLabel(loopStart); methodVisitor.visitVarInsn(Opcodes.ILOAD, localIndexOfLoopIndex); methodVisitor.visitVarInsn(Opcodes.ILOAD, localIndexOfLimit); methodVisitor.visitJumpInsn(Opcodes.IF_ICMPGE, loopEnd); methodVisitor.visitVarInsn(Opcodes.LSTORE, localIndexOfROffset); methodVisitor.visitVarInsn(Opcodes.LLOAD, localIndexOfROffset); methodVisitor.visitLdcInsn(ProxyChannelRingBuffer.EOF); methodVisitor.visitInsn(Opcodes.LCMP); methodVisitor.visitJumpInsn(Opcodes.IFEQ, loopEnd); methodVisitor.visitVarInsn(Opcodes.ISTORE, localIndexOfTypeId); methodVisitor.visitVarInsn(Opcodes.ILOAD, localIndexOfTypeId);
@Override public void visitCode() { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, ownerClass, "producerConfig", "Lorg/apache/kafka/clients/producer/ProducerConfig;"); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/kafka/clients/producer/ProducerRecord", "topic", "()Ljava/lang/String;", false); mv.visitMethodInsn(Opcodes.INVOKESTATIC, TRACE_KAFKA, START_METHOD, START_SIGNATURE, false); statIdx = newLocal(Type.getType(Object.class)); mv.visitVarInsn(Opcodes.ASTORE, statIdx); mv.visitLabel(startFinally); mv.visitCode(); }
mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V"); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitFieldInsn(PUTFIELD, typeName, "thiz", "Ljava/lang/Object;"); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 2); mv.visitFieldInsn(PUTFIELD, typeName, "args", "[Ljava/lang/Object;"); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ILOAD, 3); mv.visitFieldInsn(PUTFIELD, typeName, "idx", "I"); mv.visitInsn(RETURN); mv.visitMaxs(-1, -1); mv.visitEnd(); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, typeName, "args", "[Ljava/lang/Object;"); mv.visitInsn(ARETURN); mv.visitMaxs(-1, -1); mv.visitEnd(); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, typeName, "thiz", "Ljava/lang/Object;"); mv.visitInsn(ARETURN); mv.visitMaxs(-1, -1); mv.visitEnd();
private void generateMethods(ClassWriter cw, String internalName, List<Method> methods, Class<?> exceptionType) { for (Method method: methods) { MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, method.getName(), Type.getMethodDescriptor(method), null, null); mv.visitCode(); mv.visitTypeInsn(NEW, internalException); mv.visitInsn(DUP); mv.visitLdcInsn("A method was invoked on a dummy class, due to the static field %s not being initialized " + "(most likely in a CatalogType-related class).\n" + "Method: " + method); mv.visitLdcInsn(1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitVarInsn(Opcodes.ASTORE, 2); mv.visitVarInsn(Opcodes.ALOAD, 2); mv.visitLdcInsn(0); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, internalName, FIELD_NAME, Type.getDescriptor(String.class)); mv.visitInsn(AASTORE); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(String.class), "format", "(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;", false);
.visitMethod(Opcodes.ACC_STATIC, "<clinit>", "()V", null, null); mv.visitCode(); for (int i = 0; i < fieldCount; i++) { String fieldName = fieldNames.get(i); mv.visitTypeInsn(Opcodes.NEW, name); mv.visitInsn(Opcodes.DUP); mv.visitLdcInsn(fieldName); mv.visitIntInsn(Opcodes.BIPUSH, i); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, name, "<init>", "(Ljava/lang/String;I)V", false); mv.visitFieldInsn(Opcodes.PUTSTATIC, name, fieldName, classDef.getType()); mv.visitIntInsn(Opcodes.BIPUSH, fieldCount); mv.visitTypeInsn(Opcodes.ANEWARRAY, name); mv.visitInsn(Opcodes.DUP); mv.visitIntInsn(Opcodes.BIPUSH, i); mv.visitFieldInsn(Opcodes.GETSTATIC, name, fieldName, classDef.getType()); mv.visitInsn(Opcodes.AASTORE); mv.visitFieldInsn(Opcodes.PUTSTATIC, name, valuesFieldName, "[" + classDef.getType()); mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(0, 0); mv.visitEnd(); .visitMethod(Opcodes.ACC_PRIVATE, "<init>", "(Ljava/lang/String;I)V", null, null); mv.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 0);
cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "isEnabled", descriptor, null, null); visitAnnotation(mv, "Lorg/glowroot/agent/plugin/api/weaving/IsEnabled;"); mv.visitCode(); if (checkNotInTransaction && !checkPropertyNotEnabled) { mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEINTERFACE, "org/glowroot/agent/plugin/api/OptionalThreadContext", "isInTransaction", "()Z", true); Label returnTrueLabel = new Label(); mv.visitJumpInsn(IFEQ, returnTrueLabel); mv.visitInsn(ICONST_0); mv.visitInsn(IRETURN); mv.visitLabel(returnTrueLabel); mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); } else if (!checkNotInTransaction) { mv.visitFieldInsn(GETSTATIC, adviceInternalName, "enabled", "Lorg/glowroot/agent/plugin/api/config/BooleanProperty;"); mv.visitMethodInsn(INVOKEINTERFACE, "org/glowroot/agent/plugin/api/config/BooleanProperty", "value", "()Z", true); mv.visitInsn(IRETURN); } else { mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEINTERFACE, "org/glowroot/agent/plugin/api/OptionalThreadContext", "isInTransaction", "()Z", true); Label returnTrueLabel = new Label(); mv.visitJumpInsn(IFEQ, returnTrueLabel);
null, null); methodVisitor.visitCode(); int localIndexOfWaitStrategy = locals.newLocal(WaitStrategy.class); methodVisitor.visitVarInsn(Opcodes.ALOAD, LOCALS_INDEX_THIS); methodVisitor.visitVarInsn(Opcodes.ILOAD, localIndexOfCapacity); methodVisitor.visitLdcInsn(primitiveMessageSize); methodVisitor.visitLdcInsn(referenceMessageSize); methodVisitor.visitMethodInsn(Opcodes.INVOKESPECIAL, Type.getInternalName(parentType), "<init>", methodDescriptor(void.class, false); methodVisitor.visitVarInsn(Opcodes.ALOAD, LOCALS_INDEX_THIS); methodVisitor.visitVarInsn(Opcodes.ALOAD, localIndexOfWaitStrategy); methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, generatedName, "waitStrategy", Type.getDescriptor(WaitStrategy.class)); methodVisitor.visitInsn(Opcodes.RETURN); methodVisitor.visitMaxs(-1, -1); methodVisitor.visitEnd();
n.desc = "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;"; MethodVisitor mv = cv.visitMethod(opcode == INVOKESPECIAL ? ACC_PUBLIC : ACC_PUBLIC | ACC_STATIC, n.name, n.desc, null, null); mv.visitCode(); int start; if (opcode != INVOKESTATIC) { mv.visitVarInsn(ALOAD, 0); if (opcode != INVOKESPECIAL) { mv.visitTypeInsn(CHECKCAST, toInternal(t.owner)); start = 0; Type[] args = Type.getArgumentTypes(t.desc); mv.visitVarInsn(ALOAD, start); mv.visitLdcInsn(i); mv.visitInsn(AALOAD); unBox(args[i], OBJECT_TYPE, mv); mv.visitMethodInsn(opcode, toInternal(t.owner), t.name, t.desc); Type ret = Type.getReturnType(t.desc); box(ret, mv); mv.visitInsn(ARETURN); mv.visitMaxs(-1, -1); mv.visitEnd(); return n;
MethodVisitor methodVisitor = classVisitor.visitMethod(Opcodes.ACC_BRIDGE | Opcodes.ACC_SYNTHETIC | Opcodes.ACC_PUBLIC, methodName, methodDescriptor(bridgeMethodReturnType, bridgeMethodParameterTypes), null); methodVisitor.visitCode(); methodVisitor.visitVarInsn(Opcodes.ALOAD, LOCALS_INDEX_THIS); for (Class<?> parameterType : parameterTypes) { int localIndexOfParameter = locals.newLocal(parameterType); int loadOpCode = Type.getType(parameterType).getOpcode(Opcodes.ILOAD); methodVisitor.visitVarInsn(loadOpCode, localIndexOfParameter); methodVisitor.visitTypeInsn(Opcodes.CHECKCAST, Type.getInternalName(parameterType)); methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, generatedName, methodName, methodVisitor.visitTypeInsn(Opcodes.CHECKCAST, Type.getInternalName(returnType)); int returnOpcode = Type.getType(returnType).getOpcode(Opcodes.IRETURN); methodVisitor.visitInsn(returnOpcode); methodVisitor.visitMaxs(-1, -1); methodVisitor.visitEnd();
String travelerType = entryOrTimer ? "Ljava/lang/Object;" : "Lorg/glowroot/agent/plugin/api/TraceEntry;"; MethodVisitor mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "onReturn", "(Lorg/glowroot/agent/plugin/api/weaving/OptionalReturn;" + travelerType + ")V", null, null); checkNotNull(mv.visitParameterAnnotation(0, "Lorg/glowroot/agent/plugin/api/weaving/BindOptionalReturn;", true)).visitEnd(); checkNotNull(mv.visitParameterAnnotation(1, "Lorg/glowroot/agent/plugin/api/weaving/BindTraveler;", true)).visitEnd(); int travelerParamIndex = 1; visitAnnotation(mv, "Lorg/glowroot/agent/plugin/api/weaving/OnReturn;"); mv.visitCode(); if (!config.traceEntryEnabledProperty().isEmpty()) { mv.visitVarInsn(ALOAD, travelerParamIndex); mv.visitTypeInsn(INSTANCEOF, "org/glowroot/agent/plugin/api/TraceEntry"); Label label = new Label(); mv.visitJumpInsn(IFNE, label); mv.visitVarInsn(ALOAD, travelerParamIndex); mv.visitTypeInsn(CHECKCAST, "org/glowroot/agent/plugin/api/Timer"); mv.visitMethodInsn(INVOKEINTERFACE, "org/glowroot/agent/plugin/api/Timer", "stop", "()V", true); mv.visitInsn(RETURN); mv.visitLabel(label); mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEINTERFACE, "org/glowroot/agent/plugin/api/weaving/OptionalReturn", "isVoid", "()Z", true);
private void createValueOfEnum() { final int opcodes = VisibilityEnum.PUBLIC.getOpCodes() + ModifierEnum.STATIC.getOpCodes(); final MethodVisitor mv = this.cw.visitMethod(opcodes, "valueOf", "(Ljava/lang/String;)" + this.getEntityEnumName(), null, null); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(1, l0); mv.visitLdcInsn(Type.getType(this.getEntityEnumName())); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Enum", "valueOf", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;", false); mv.visitTypeInsn(Opcodes.CHECKCAST, this.getEntityName()); mv.visitInsn(Opcodes.ARETURN); mv.visitMaxs(2, 1); mv.visitEnd(); }
private void generateConstructor(ClassWriter cw, String internalName) { cw.visitField(Modifier.PRIVATE, FIELD_NAME, Type.getDescriptor(String.class), null, null); MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(Ljava/lang/String;)V", null, null); // Load 'this' mv.visitVarInsn(ALOAD, 0); // Cal super() mv.visitMethodInsn(INVOKESPECIAL, Type.getInternalName(Object.class), "<init>", "()V", false); // Load 'this' mv.visitVarInsn(ALOAD, 0); // Load first method parameter (the fieldName) mv.visitVarInsn(ALOAD, 1); // Store first parameter in field FIELD_NAME mv.visitFieldInsn(PUTFIELD, internalName, FIELD_NAME, Type.getDescriptor(String.class)); mv.visitInsn(RETURN); mv.visitMaxs(0, 0); mv.visitEnd(); }
long ms = System.currentTimeMillis(); ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); ClassVisitor cv = new ClassVisitor(Opcodes.ASM5, writer) { }; String className = Const.SERVICE_LOADER_INIT.replace('.', '/'); cv.visit(50, Opcodes.ACC_PUBLIC, className, null, "java/lang/Object", null); MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, Const.INIT_METHOD, "()V", null, null); mv.visitCode(); mv.visitMethodInsn(Opcodes.INVOKESTATIC, clazz.replace('.', '/'), "init", "()V", false); mv.visitMaxs(0, 0); mv.visitInsn(Opcodes.RETURN); mv.visitEnd(); cv.visitEnd(); new FileOutputStream(dest).write(writer.toByteArray());