List of usage examples for org.objectweb.asm MethodVisitor visitEnd
public void visitEnd()
From source file:fr.insalyon.citi.golo.compiler.JavaBytecodeStructGenerator.java
License:Apache License
private void makeGetter(ClassWriter classWriter, String owner, String name) { int accessFlag = name.startsWith("_") ? ACC_PRIVATE : ACC_PUBLIC; MethodVisitor visitor = classWriter.visitMethod(accessFlag, name, "()Ljava/lang/Object;", null, null); visitor.visitCode();// ww w .j a v a 2 s. co m visitor.visitVarInsn(ALOAD, 0); visitor.visitFieldInsn(GETFIELD, owner, name, "Ljava/lang/Object;"); visitor.visitInsn(ARETURN); visitor.visitMaxs(0, 0); visitor.visitEnd(); }
From source file:fr.insalyon.citi.golo.compiler.JavaBytecodeUnionGenerator.java
License:Apache License
private void initStaticFields(ClassWriter cw, PackageAndClass unionType, Map<String, PackageAndClass> staticFields) { MethodVisitor mv = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null); mv.visitCode();/* ww w . j a v a 2 s . com*/ for (String attr : staticFields.keySet()) { mv.visitTypeInsn(NEW, staticFields.get(attr).toJVMType()); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, staticFields.get(attr).toJVMType(), "<init>", "()V", false); mv.visitFieldInsn(PUTSTATIC, unionType.toJVMType(), attr, unionType.toJVMRef()); } mv.visitInsn(RETURN); mv.visitMaxs(0, 0); mv.visitEnd(); }
From source file:fr.insalyon.citi.golo.compiler.JavaBytecodeUnionGenerator.java
License:Apache License
private void makeStaticFactory(ClassWriter cw, Union.Value value) { MethodVisitor mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, value.getName(), argsSignature(value.getMembers().size()) + value.getUnion().getPackageAndClass().toJVMRef(), null, null);//from ww w . j a v a 2s . c o m mv.visitCode(); mv.visitTypeInsn(NEW, value.getPackageAndClass().toJVMType()); mv.visitInsn(DUP); for (int i = 0; i < value.getMembers().size(); i++) { mv.visitVarInsn(ALOAD, i); } mv.visitMethodInsn(INVOKESPECIAL, value.getPackageAndClass().toJVMType(), "<init>", argsSignature(value.getMembers().size()) + "V", false); mv.visitInsn(ARETURN); mv.visitMaxs(0, 0); mv.visitEnd(); }
From source file:fr.insalyon.citi.golo.compiler.JavaBytecodeUnionGenerator.java
License:Apache License
private void makeDefaultConstructor(ClassWriter classWriter, String superCls) { MethodVisitor visitor = classWriter.visitMethod(ACC_PROTECTED, "<init>", "()V", null, null); visitor.visitCode();/* w ww .j av a 2s . com*/ visitor.visitVarInsn(ALOAD, 0); visitor.visitMethodInsn(INVOKESPECIAL, superCls, "<init>", "()V", false); visitor.visitInsn(RETURN); visitor.visitMaxs(0, 0); visitor.visitEnd(); }
From source file:fr.insalyon.citi.golo.compiler.JavaBytecodeUnionGenerator.java
License:Apache License
private void makeToString(ClassWriter classWriter, Union.Value value) { MethodVisitor visitor = classWriter.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null); visitor.visitCode();/*www . j av a 2s.com*/ if (!value.hasMembers()) { visitor.visitLdcInsn( "union " + value.getUnion().getPackageAndClass().className() + "." + value.getName()); } else { visitor.visitTypeInsn(NEW, "java/lang/StringBuilder"); visitor.visitInsn(DUP); visitor.visitLdcInsn( "union " + value.getUnion().getPackageAndClass().className() + "." + value.getName() + "{"); visitor.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V", false); visitor.visitVarInsn(ASTORE, 1); boolean first = true; for (String member : value.getMembers()) { visitor.visitVarInsn(ALOAD, 1); visitor.visitLdcInsn((first ? "" : ", ") + member + "="); visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false); visitor.visitInsn(POP); visitor.visitVarInsn(ALOAD, 1); visitor.visitVarInsn(ALOAD, 0); visitor.visitFieldInsn(GETFIELD, value.getPackageAndClass().toJVMType(), member, "Ljava/lang/Object;"); visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/Object;)Ljava/lang/StringBuilder;", false); visitor.visitInsn(POP); first = false; } visitor.visitVarInsn(ALOAD, 1); visitor.visitLdcInsn("}"); visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false); visitor.visitInsn(POP); visitor.visitVarInsn(ALOAD, 1); visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false); } visitor.visitInsn(ARETURN); visitor.visitMaxs(0, 0); visitor.visitEnd(); }
From source file:fr.insalyon.citi.golo.compiler.JavaBytecodeUnionGenerator.java
License:Apache License
private void makeEquals(ClassWriter cw, Union.Value value) { String target = value.getPackageAndClass().toJVMType(); MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "equals", "(Ljava/lang/Object;)Z", null, null); Label notSameInstance = new Label(); Label notNull = new Label(); Label sameType = new Label(); Label allAttrsEquals = new Label(); Label attrNotEqual = new Label(); mv.visitCode();/*ww w . j a va 2 s . c o m*/ // if (other == this) { return true; } mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 0); mv.visitJumpInsn(IF_ACMPNE, notSameInstance); mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); mv.visitLabel(notSameInstance); // if (other == null) { return false; } mv.visitVarInsn(ALOAD, 1); mv.visitJumpInsn(IFNONNULL, notNull); mv.visitInsn(ICONST_0); mv.visitInsn(IRETURN); mv.visitLabel(notNull); // if (!(other instanceof <value>)) { return false; } mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(INSTANCEOF, target); mv.visitJumpInsn(IFNE, sameType); mv.visitInsn(ICONST_0); mv.visitInsn(IRETURN); mv.visitLabel(sameType); // cast other to <value> mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(CHECKCAST, target); mv.visitVarInsn(ASTORE, 2); // java.util.Objects.equals(<member>, other.<member>) for (String member : value.getMembers()) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, target, member, "Ljava/lang/Object;"); mv.visitVarInsn(ALOAD, 2); mv.visitFieldInsn(GETFIELD, target, member, "Ljava/lang/Object;"); mv.visitMethodInsn(INVOKESTATIC, "java/util/Objects", "equals", "(Ljava/lang/Object;Ljava/lang/Object;)Z", false); mv.visitJumpInsn(IFEQ, attrNotEqual); } mv.visitInsn(ICONST_1); mv.visitJumpInsn(GOTO, allAttrsEquals); mv.visitLabel(attrNotEqual); mv.visitInsn(ICONST_0); mv.visitLabel(allAttrsEquals); mv.visitInsn(IRETURN); mv.visitMaxs(0, 0); mv.visitEnd(); }
From source file:fr.insalyon.citi.golo.compiler.JavaBytecodeUnionGenerator.java
License:Apache License
private void makeHashCode(ClassWriter cw, Union.Value value) { MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "hashCode", "()I", null, null); mv.visitCode();//from w w w. j a v a 2 s . com loadInteger(mv, value.getMembers().size()); mv.visitTypeInsn(ANEWARRAY, "java/lang/Object"); int i = 0; for (String member : value.getMembers()) { mv.visitInsn(DUP); loadInteger(mv, i); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, value.getPackageAndClass().toJVMType(), member, "Ljava/lang/Object;"); mv.visitInsn(AASTORE); } mv.visitMethodInsn(INVOKESTATIC, "java/util/Objects", "hash", "([Ljava/lang/Object;)I", false); mv.visitInsn(IRETURN); mv.visitMaxs(0, 0); mv.visitEnd(); }
From source file:fr.insalyon.citi.golo.compiler.JavaBytecodeUnionGenerator.java
License:Apache License
private void makeValuedConstructor(ClassWriter cw, Union.Value value) { MethodVisitor mv = cw.visitMethod(ACC_PROTECTED, "<init>", argsSignature(value.getMembers().size()) + "V", null, null);//from ww w . ja va2s.c o m mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, value.getUnion().getPackageAndClass().toJVMType(), "<init>", "()V", false); int idx = 1; for (String member : value.getMembers()) { mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, idx++); mv.visitFieldInsn(PUTFIELD, value.getPackageAndClass().toJVMType(), member, "Ljava/lang/Object;"); } mv.visitInsn(RETURN); mv.visitMaxs(0, 0); mv.visitEnd(); }
From source file:fr.insalyon.citi.golo.runtime.adapters.JavaBytecodeAdapterGenerator.java
License:Apache License
private void makeFrontendOverrides(ClassWriter classWriter, AdapterDefinition adapterDefinition) { for (Method method : getAllVirtualMethods(adapterDefinition)) { int access = isPublic(method.getModifiers()) ? ACC_PUBLIC : ACC_PROTECTED; if (method.isVarArgs()) { access = access & ACC_VARARGS; }//from ww w. j ava2s. c o m String name = method.getName(); String descriptor = Type.getMethodDescriptor(method); Class<?>[] exceptionTypes = method.getExceptionTypes(); String[] exceptions = new String[exceptionTypes.length]; for (int i = 0; i < exceptionTypes.length; i++) { exceptions[i] = Type.getInternalName(exceptionTypes[i]); } MethodVisitor methodVisitor = classWriter.visitMethod(access, name, descriptor, null, exceptions); methodVisitor.visitCode(); Class<?>[] parameterTypes = method.getParameterTypes(); Type[] indyTypes = new Type[parameterTypes.length + 1]; indyTypes[0] = Type.getType(Object.class); methodVisitor.visitVarInsn(ALOAD, 0); int argIndex = 1; for (int i = 0; i < parameterTypes.length; i++) { argIndex = loadArgument(methodVisitor, parameterTypes[i], argIndex); indyTypes[i + 1] = Type.getType(parameterTypes[i]); } methodVisitor.visitInvokeDynamicInsn(method.getName(), Type.getMethodDescriptor(Type.getReturnType(method), indyTypes), ADAPTER_HANDLE); makeReturn(methodVisitor, method.getReturnType()); methodVisitor.visitMaxs(0, 0); methodVisitor.visitEnd(); } }
From source file:fr.insalyon.citi.golo.runtime.adapters.JavaBytecodeAdapterGenerator.java
License:Apache License
private void makeConstructors(ClassWriter classWriter, AdapterDefinition adapterDefinition) { try {//from w w w. j a v a2 s.c o m Class<?> parentClass = Class.forName(adapterDefinition.getParent(), true, adapterDefinition.getClassLoader()); for (Constructor constructor : parentClass.getDeclaredConstructors()) { if (Modifier.isPublic(constructor.getModifiers()) || Modifier.isProtected(constructor.getModifiers())) { Class[] parameterTypes = constructor.getParameterTypes(); Type[] adapterParameterTypes = new Type[parameterTypes.length + 1]; adapterParameterTypes[0] = Type.getType(AdapterDefinition.class); for (int i = 1; i < adapterParameterTypes.length; i++) { adapterParameterTypes[i] = Type.getType(parameterTypes[i - 1]); } String descriptor = Type.getMethodDescriptor(Type.VOID_TYPE, adapterParameterTypes); MethodVisitor methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", descriptor, null, null); methodVisitor.visitCode(); methodVisitor.visitVarInsn(ALOAD, 0); methodVisitor.visitVarInsn(ALOAD, 1); methodVisitor.visitFieldInsn(PUTFIELD, jvmType(adapterDefinition.getName()), DEFINITION_FIELD, "Lfr/insalyon/citi/golo/runtime/adapters/AdapterDefinition;"); methodVisitor.visitVarInsn(ALOAD, 0); int argIndex = 2; for (Class parameterType : parameterTypes) { argIndex = loadArgument(methodVisitor, parameterType, argIndex); } methodVisitor.visitMethodInsn(INVOKESPECIAL, Type.getInternalName(parentClass), "<init>", Type.getConstructorDescriptor(constructor)); methodVisitor.visitInsn(RETURN); methodVisitor.visitMaxs(0, 0); methodVisitor.visitEnd(); } } } catch (ClassNotFoundException e) { throw new RuntimeException(e); } }