private void visitInitStub(ClassDef classDef, MethodVisitor mv) { mv.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 0); if (classDef.getSuperclass() != null) { String superName = stripName(classDef.getSuperclass()); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, superName, "<init>", "()V", false); } mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(0, 0); mv.visitEnd(); }
private void visitMethod(ClassDef classDef, Method method, MethodVisitor mv) { mv.visitCode(); String methodName = method.getName(); if (methodName.equals("<clinit>")) { visitClInitStub(mv); } else if (methodName.equals("<init>")) { visitInitStub(classDef, mv); } else if (methodName.equals("hashCode") && method.getReturnType().equals("I")) { visitCallObjectHashCode(mv); } else { visitMethodStub(mv); } // Do this at the end so ASM can calculate max stack and locals sizes mv.visitMaxs(0, 0); mv.visitEnd(); }
bridgeWriter.visitMethodInsn(INVOKESPECIAL, declaringTypeReference.getInternalName(), methodName, overrideDescriptor, false); pushReturnValue(bridgeWriter, returnType); bridgeWriter.visitMaxs(DEFAULT_MAX_STACK, 1); bridgeWriter.visitEnd();
private static void implementProxy(ClassVisitor classVisitor, Class<?> iFace, String generatedName) { MethodVisitor methodVisitor = classVisitor.visitMethod(Opcodes.ACC_PUBLIC, "proxy", methodDescriptor(iFace), null, null); methodVisitor.visitCode(); methodVisitor.visitVarInsn(Opcodes.ALOAD, LOCALS_INDEX_THIS); methodVisitor.visitInsn(Opcodes.ARETURN); methodVisitor.visitMaxs(-1, -1); methodVisitor.visitEnd(); implementBridgeMethod(classVisitor, generatedName, "proxy", iFace); }
private void parseMethodBody() { labels.clear(); declaredLabels.clear(); mv.visitCode(); while (true) { readLine(); if (line.startsWith(".end method")) { break; } else if (line.startsWith(".")) { parseMethodDirective(); } else if (lineMatch(labelPattern)) { parseLabel(); } else { parseInstructions(); } } checkLabelDeclarations(); mv.visitMaxs(maxStack, maxLocals); mv.visitEnd(); }
private static void implementProxyInstance(ClassVisitor classVisitor, Class<?> iFace, String generatedName) { MethodVisitor methodVisitor = classVisitor.visitMethod(Opcodes.ACC_PUBLIC, "proxyInstance", methodDescriptor(iFace, iFace), null, null); methodVisitor.visitCode(); methodVisitor.visitVarInsn(Opcodes.ALOAD, LOCALS_INDEX_THIS); methodVisitor.visitInsn(Opcodes.ARETURN); methodVisitor.visitMaxs(-1, -1); methodVisitor.visitEnd(); implementBridgeMethod(classVisitor, generatedName, "proxyInstance", iFace, iFace); }
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(); mv.visitLabel(e.getValue()); mv.visitLdcInsn(e.getKey()); mv.visitInsn(ARETURN); 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 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(); }
mv.visitCode(); int start; if (opcode != INVOKESTATIC) { mv.visitVarInsn(ALOAD, 0); if (opcode != INVOKESPECIAL) { mv.visitTypeInsn(CHECKCAST, toInternal(t.owner)); 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;
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.visitInsn(DUP); mv.visitVarInsn(Opcodes.ASTORE, 2); mv.visitVarInsn(Opcodes.ALOAD, 2); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, internalName, FIELD_NAME, Type.getDescriptor(String.class)); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(String.class), "format", "(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;", false); mv.visitMethodInsn(INVOKESPECIAL, internalException, "<init>", "(Ljava/lang/String;)V", false); mv.visitInsn(ATHROW); mv.visitMaxs(0, 0); mv.visitEnd();
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>", 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();
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.visitMethodInsn(Opcodes.INVOKEVIRTUAL, generatedName, methodName, methodVisitor.visitInsn(returnOpcode); methodVisitor.visitMaxs(-1, -1); methodVisitor.visitEnd();
mv.visitInsn(DUP); if (hasThis) { mv.visitVarInsn(ALOAD, 0); start = 1; } else { mv.visitInsn(ACONST_NULL); start = 0; mv.visitInsn(ACONST_NULL); } else { mv.visitLdcInsn(args.length); mv.visitInsn(DUP); mv.visitLdcInsn(i); mv.visitVarInsn(args[i].getOpcode(ILOAD), i + start); box(args[i], mv); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, getCurrentInvocationName(), "<init>", "(Ljava/lang/Object;[Ljava/lang/Object;I)V"); mv.visitMethodInsn(INVOKESTATIC, toInternal(mapTo.owner), mapTo.name, mapTo.desc); unBox(ret, Type.getReturnType(mapTo.desc), mv); mv.visitInsn(ret.getOpcode(IRETURN)); mv.visitMaxs(-1, -1); mv.visitEnd();
mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V"); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(RETURN); mv.visitMaxs(-1, -1); mv.visitEnd(); mv.visitCode(); mv.visitInsn(ARETURN); mv.visitMaxs(-1, -1); mv.visitEnd(); mv.visitCode(); mv.visitInsn(ARETURN); mv.visitMaxs(-1, -1); mv.visitEnd(); mv.visitMethodInsn(INVOKESTATIC, toInternal(m.owner), m.name, m.desc); mv.visitMethodInsn(INVOKEVIRTUAL, toInternal(m.owner), m.name, m.desc); mv.visitEnd();
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();
mv.visitCode(); mv.visitInsn(Opcodes.DUP); mv.visitIntInsn(Opcodes.BIPUSH, i); mv.visitFieldInsn(Opcodes.GETSTATIC, name, fieldName, classDef.getType()); mv.visitInsn(Opcodes.AASTORE); mv.visitMaxs(0, 0); mv.visitEnd(); mv.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitVarInsn(Opcodes.ALOAD, 1); mv.visitVarInsn(Opcodes.ILOAD, 2); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Enum", "<init>", mv.visitMaxs(0, 0); mv.visitEnd(); mv.visitCode(); mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "arraycopy", mv.visitMaxs(0, 0); mv.visitEnd(); mv.visitEnd();