List of usage examples for org.objectweb.asm MethodVisitor visitIntInsn
public void visitIntInsn(final int opcode, final int operand)
From source file:sg.atom.core.actor.internal.codegenerator.ActorProxyCreator.java
License:Apache License
/** * Writes a proxy method for messages.//from ww w.j ava 2s . c om * * @param classNameInternal the internal class name * @param classNameDescriptor the class name descriptor * @param cw the ClassWriter * @param index the message index * @param type the ActorState type to use * @param concurrencyModel the concurrency model of the message * @param messageDescriptor the message's descriptor * @param method the method to override * @param simpleDescriptor a simple descriptor of the message * @param genericSignature the signature of the message */ private static void writeProxyMethod(String classNameInternal, String classNameDescriptor, ClassWriter cw, int index, Type actorState, ConcurrencyModel concurrencyModel, MessageImplDescriptor messageDescriptor, Method method, String simpleDescriptor, String genericSignature) throws NoSuchMethodException { MethodVisitor mv; { mv = cw.visitMethod(Opcodes.ACC_PUBLIC, method.getName(), simpleDescriptor, genericSignature, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitIntInsn(Opcodes.BIPUSH, method.getParameterTypes().length); mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/Object"); for (int j = 0; j < method.getParameterTypes().length; j++) { mv.visitInsn(Opcodes.DUP); mv.visitIntInsn(Opcodes.BIPUSH, j); Class<?> paraType = method.getParameterTypes()[j]; if (paraType.isPrimitive()) { String wrapperClass = GenerationUtils.getWrapperInternalName(paraType); Type primType = Type.getType(paraType); mv.visitVarInsn(primType.getOpcode(Opcodes.ILOAD), j + 1); mv.visitMethodInsn(Opcodes.INVOKESTATIC, wrapperClass, "valueOf", "(" + primType.getDescriptor() + ")" + "L" + wrapperClass + ";"); } else if (isArgumentFreezingRequired(method, j, paraType)) { mv.visitVarInsn(Opcodes.ALOAD, j + 1); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(SerializableFreezer.class), "freeze", Type.getMethodDescriptor(SerializableFreezer.class.getMethod("freeze", Object.class))); } else if (paraType.isInterface()) { mv.visitVarInsn(Opcodes.ALOAD, j + 1); mv.visitInsn(Opcodes.DUP); mv.visitTypeInsn(Opcodes.INSTANCEOF, "org/actorsguildframework/Actor"); Label lEndif = new Label(); mv.visitJumpInsn(Opcodes.IFNE, lEndif); mv.visitTypeInsn(Opcodes.NEW, Type.getInternalName(ActorRuntimeException.class)); mv.visitInsn(Opcodes.DUP); mv.visitLdcInsn(String.format( "Argument %d is an non-Serializable interface, but you did not give an Actor. If a message's argument type is an interface that does not extend Serializable, only Actors are acceptable as argument.", j)); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, Type.getInternalName(ActorRuntimeException.class), "<init>", "(Ljava/lang/String;)V"); mv.visitInsn(Opcodes.ATHROW); mv.visitLabel(lEndif); } else { mv.visitVarInsn(Opcodes.ALOAD, j + 1); } mv.visitInsn(Opcodes.AASTORE); } Label l1 = new Label(); mv.visitLabel(l1); mv.visitVarInsn(Opcodes.ASTORE, method.getParameterTypes().length + 1); // method.getParameterTypes().length+1 ==> 'args' local variable mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitFieldInsn(Opcodes.GETFIELD, classNameInternal, "actorState__ACTORPROXY", actorState.getDescriptor()); mv.visitFieldInsn(Opcodes.GETSTATIC, classNameInternal, String.format(MESSAGE_CALLER_NAME_FORMAT, index), "Lorg/actorsguildframework/internal/MessageCaller;"); mv.visitFieldInsn(Opcodes.GETSTATIC, "org/actorsguildframework/annotations/ThreadUsage", messageDescriptor.getThreadUsage().name(), "Lorg/actorsguildframework/annotations/ThreadUsage;"); mv.visitVarInsn(Opcodes.ALOAD, method.getParameterTypes().length + 1); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, actorState.getInternalName(), "queueMessage", "(Lorg/actorsguildframework/internal/MessageCaller;Lorg/actorsguildframework/annotations/ThreadUsage;[Ljava/lang/Object;)Lorg/actorsguildframework/internal/AsyncResultImpl;"); mv.visitInsn(Opcodes.ARETURN); Label l4 = new Label(); mv.visitLabel(l4); mv.visitLocalVariable("this", classNameDescriptor, null, l0, l4, 0); for (int j = 0; j < method.getParameterTypes().length; j++) { mv.visitLocalVariable("arg" + j, Type.getDescriptor(method.getParameterTypes()[j]), GenericTypeHelper.getSignatureIfGeneric(method.getGenericParameterTypes()[j]), l0, l4, j + 1); } mv.visitLocalVariable("args", "[Ljava/lang/Object;", null, l1, l4, method.getParameterTypes().length + 1); mv.visitMaxs(0, 0); mv.visitEnd(); } }
From source file:st.redline.compiler.SmalltalkGeneratingVisitor.java
License:Open Source License
public static void pushNumber(MethodVisitor mv, int value) { switch (value) { case 0://from ww w. j a va 2 s.com mv.visitInsn(ICONST_0); break; case 1: mv.visitInsn(ICONST_1); break; case 2: mv.visitInsn(ICONST_2); break; case 3: mv.visitInsn(ICONST_3); break; case 4: mv.visitInsn(ICONST_4); break; case 5: mv.visitInsn(ICONST_5); break; default: if (value > 5 && value < 128) mv.visitIntInsn(BIPUSH, value); else // SIPUSH not supported yet. throw new IllegalStateException("push of integer value " + value + " not yet supported."); } }
From source file:suneido.compiler.ClassGen.java
License:Open Source License
void iconst(MethodVisitor mv, int i) { if (-1 <= i && i <= 5) mv.visitInsn(ICONST_0 + i);// w ww .j a va2 s .co m else if (Byte.MIN_VALUE <= i && i <= Byte.MAX_VALUE) mv.visitIntInsn(BIPUSH, i); else if (Short.MIN_VALUE <= i && i <= Short.MAX_VALUE) mv.visitIntInsn(SIPUSH, i); else mv.visitLdcInsn(i); }
From source file:vanilla.java.collections.impl.GenerateHugeArrays.java
License:Apache License
public static byte[] dumpArrayList(TypeModel tm) { ClassWriter cw = new ClassWriter(0); FieldVisitor fv;//from w w w . j a v a 2 s . c o m MethodVisitor mv; Class interfaceClass = tm.type(); String name = interfaceClass.getName().replace('.', '/'); cw.visit( V1_5, ACC_PUBLIC + ACC_SUPER, name + "ArrayList", "L" + collections + "impl/AbstractHugeArrayList<L" + name + ";L" + name + "Allocation;L" + name + "Element;>;", collections + "impl/AbstractHugeArrayList", null); cw.visitSource(tm.type().getSimpleName() + "ArrayList.java", null); for (FieldModel fm : tm.fields()) { if (fm instanceof Enum8FieldModel) { fv = cw.visitField(ACC_FINAL, fm.fieldName() + "FieldModel", "L" + collections + "model/Enum8FieldModel;", "L" + collections + "model/Enum8FieldModel<Ljava/lang/annotation/ElementType;>;", null); fv.visitEnd(); } else if (fm instanceof Enumerated16FieldModel) { fv = cw.visitField(ACC_FINAL, fm.fieldName() + "FieldModel", "L" + collections + "model/Enumerated16FieldModel;", "L" + collections + "model/Enumerated16FieldModel<Ljava/lang/String;>;", null); fv.visitEnd(); } } List<FieldModel> fields = new ArrayList<FieldModel>(); { mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(L" + collections + "HugeArrayBuilder;)V", null, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(35, l0); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, collections + "impl/AbstractHugeArrayList", "<init>", "(L" + collections + "HugeArrayBuilder;)V"); Label l1 = new Label(); mv.visitLabel(l1); mv.visitLineNumber(29, l1); for (FieldModel fm : tm.fields()) { if (fm instanceof Enum8FieldModel) { mv.visitVarInsn(ALOAD, 0); mv.visitTypeInsn(NEW, fm.bcModelType()); mv.visitInsn(DUP); mv.visitLdcInsn(fm.fieldName()); mv.visitIntInsn(BIPUSH, fm.fieldNumber()); mv.visitLdcInsn(Type.getType(fm.bcLFieldType())); mv.visitMethodInsn(INVOKESTATIC, fm.bcFieldType(), "values", "()[" + fm.bcLFieldType()); mv.visitMethodInsn(INVOKESPECIAL, fm.bcModelType(), "<init>", "(Ljava/lang/String;ILjava/lang/Class;[Ljava/lang/Enum;)V"); mv.visitFieldInsn(PUTFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType()); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType()); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, collections + "HugeArrayBuilder", "baseDirectory", "()Ljava/lang/String;"); mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcModelType(), "baseDirectory", "(Ljava/lang/String;)V"); fields.add(fm); } else if (fm instanceof Enumerated16FieldModel) { mv.visitVarInsn(ALOAD, 0); mv.visitTypeInsn(NEW, fm.bcModelType()); mv.visitInsn(DUP); mv.visitLdcInsn(fm.fieldName()); mv.visitIntInsn(BIPUSH, fm.fieldNumber()); mv.visitLdcInsn(Type.getType(fm.bcLFieldType())); mv.visitMethodInsn(INVOKESPECIAL, fm.bcModelType(), "<init>", "(Ljava/lang/String;ILjava/lang/Class;)V"); mv.visitFieldInsn(PUTFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType()); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType()); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, collections + "HugeArrayBuilder", "baseDirectory", "()Ljava/lang/String;"); mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcModelType(), "baseDirectory", "(Ljava/lang/String;)V"); fields.add(fm); } } mv.visitInsn(RETURN); Label l4 = new Label(); mv.visitLabel(l4); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l4, 0); mv.visitLocalVariable("hab", "L" + collections + "HugeArrayBuilder;", null, l0, l4, 1); mv.visitMaxs(7, 2); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PROTECTED, "createAllocation", "(L" + collections + "impl/MappedFileChannel;)L" + name + "Allocation;", null, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(43, l0); mv.visitTypeInsn(NEW, name + "Allocation"); mv.visitInsn(DUP); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name + "ArrayList", "allocationSize", "I"); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, name + "Allocation", "<init>", "(IL" + collections + "impl/MappedFileChannel;)V"); mv.visitInsn(ARETURN); Label l1 = new Label(); mv.visitLabel(l1); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l1, 0); mv.visitLocalVariable("mfc", "L" + collections + "impl/MappedFileChannel;", null, l0, l1, 1); mv.visitMaxs(4, 2); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PROTECTED, "createElement", "(J)L" + name + "Element;", null, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(48, l0); mv.visitTypeInsn(NEW, name + "Element"); mv.visitInsn(DUP); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(LLOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, name + "Element", "<init>", "(L" + collections + "impl/AbstractHugeArrayList;J)V"); mv.visitInsn(ARETURN); Label l1 = new Label(); mv.visitLabel(l1); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l1, 0); mv.visitLocalVariable("n", "J", null, l0, l1, 1); mv.visitMaxs(5, 3); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PROTECTED, "createImpl", "()L" + name + ";", null, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(53, l0); mv.visitTypeInsn(NEW, name + "Impl"); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, name + "Impl", "<init>", "()V"); mv.visitInsn(ARETURN); Label l1 = new Label(); mv.visitLabel(l1); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l1, 0); mv.visitMaxs(2, 1); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PROTECTED, "compactStart", "()V", null, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(57, l0); for (FieldModel fm : fields) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType()); mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcModelType(), "compactStart", "()V"); } Label l1 = new Label(); mv.visitLabel(l1); mv.visitLineNumber(58, l1); mv.visitInsn(RETURN); Label l2 = new Label(); mv.visitLabel(l2); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l2, 0); mv.visitMaxs(1, 1); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PROTECTED, "compactOnAllocation", "(L" + name + "Allocation;J)V", null, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(65, l0); for (FieldModel fm : fields) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType()); mv.visitVarInsn(ALOAD, 1); mv.visitFieldInsn(GETFIELD, name + "Allocation", "m_string", fm.bcLStoreType()); mv.visitVarInsn(LLOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcModelType(), "compactScan", "(" + fm.bcLStoreType() + "J)V"); } Label l1 = new Label(); mv.visitLabel(l1); mv.visitLineNumber(66, l1); mv.visitInsn(RETURN); Label l2 = new Label(); mv.visitLabel(l2); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l2, 0); mv.visitLocalVariable("allocation", "L" + name + "Allocation;", null, l0, l2, 1); mv.visitLocalVariable("thisSize", "J", null, l0, l2, 2); mv.visitMaxs(4, 4); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PROTECTED, "compactEnd", "()V", null, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(69, l0); for (FieldModel fm : fields) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType()); mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcModelType(), "compactEnd", "()V"); } Label l1 = new Label(); mv.visitLabel(l1); mv.visitLineNumber(70, l1); mv.visitInsn(RETURN); Label l2 = new Label(); mv.visitLabel(l2); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l2, 0); mv.visitMaxs(1, 1); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "clear", "()V", null, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(74, l0); for (FieldModel fm : fields) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType()); mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcModelType(), "clear", "()V"); } Label l3 = new Label(); mv.visitLabel(l3); mv.visitLineNumber(77, l3); mv.visitInsn(RETURN); Label l4 = new Label(); mv.visitLabel(l4); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l4, 0); mv.visitMaxs(1, 1); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PROTECTED + ACC_BRIDGE + ACC_SYNTHETIC, "createImpl", "()Ljava/lang/Object;", null, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(29, l0); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, name + "ArrayList", "createImpl", "()L" + name + ";"); mv.visitInsn(ARETURN); Label l1 = new Label(); mv.visitLabel(l1); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l1, 0); mv.visitMaxs(1, 1); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PROTECTED + ACC_BRIDGE + ACC_SYNTHETIC, "createElement", "(J)L" + collections + "impl/AbstractHugeElement;", null, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(29, l0); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(LLOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, name + "ArrayList", "createElement", "(J)L" + name + "Element;"); mv.visitInsn(ARETURN); Label l1 = new Label(); mv.visitLabel(l1); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l1, 0); mv.visitLocalVariable("x0", "J", null, l0, l1, 1); mv.visitMaxs(3, 3); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PROTECTED + ACC_BRIDGE + ACC_SYNTHETIC, "compactOnAllocation", "(L" + collections + "api/HugeAllocation;J)V", null, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(29, l0); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(CHECKCAST, name + "Allocation"); mv.visitVarInsn(LLOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, name + "ArrayList", "compactOnAllocation", "(L" + name + "Allocation;J)V"); mv.visitInsn(RETURN); Label l1 = new Label(); mv.visitLabel(l1); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l1, 0); mv.visitLocalVariable("x0", "L" + collections + "api/HugeAllocation;", null, l0, l1, 1); mv.visitLocalVariable("x1", "J", null, l0, l1, 2); mv.visitMaxs(4, 4); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PROTECTED + ACC_BRIDGE + ACC_SYNTHETIC, "createAllocation", "(L" + collections + "impl/MappedFileChannel;)L" + collections + "api/HugeAllocation;", null, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(29, l0); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, name + "ArrayList", "createAllocation", "(L" + collections + "impl/MappedFileChannel;)L" + name + "Allocation;"); mv.visitInsn(ARETURN); Label l1 = new Label(); mv.visitLabel(l1); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l1, 0); mv.visitLocalVariable("x0", "L" + collections + "impl/MappedFileChannel;", null, l0, l1, 1); mv.visitMaxs(2, 2); mv.visitEnd(); } cw.visitEnd(); final byte[] bytes = cw.toByteArray(); // ClassReader cr = new ClassReader(bytes); // cr.accept(new ASMifierClassVisitor(new PrintWriter(System.out)), 0); return bytes; }
From source file:vanilla.java.collections.impl.GenerateHugeArrays.java
License:Apache License
private static void appendToStringHashCodeEqualsCopyOf(TypeModel tm, ClassWriter cw, String name2, boolean hasListField) { String name = tm.bcType();/*from ww w. j a v a2 s. co m*/ MethodVisitor mv; { mv = cw.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(176, l0); mv.visitTypeInsn(NEW, "java/lang/StringBuilder"); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V"); mv.visitLdcInsn(tm.type().getSimpleName() + "{"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;"); String sep = ""; for (FieldModel fm : tm.fields()) { boolean text = CharSequence.class.isAssignableFrom(tm.type()); mv.visitLdcInsn(sep + fm.fieldName() + "=" + (text ? "'" : "")); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;"); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType()); String appendType = "Ljava/lang/Object;"; final Class fmType = fm.type(); if (fmType.isPrimitive()) { if (fmType == byte.class || fmType == short.class) appendType = "I"; else appendType = fm.bcLFieldType(); } mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(" + appendType + ")Ljava/lang/StringBuilder;"); sep = text ? "', " : ", "; } if (sep.startsWith("'")) { mv.visitIntInsn(BIPUSH, 39); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(C)Ljava/lang/StringBuilder;"); } mv.visitIntInsn(BIPUSH, 125); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(C)Ljava/lang/StringBuilder;"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;"); mv.visitInsn(ARETURN); Label l1 = new Label(); mv.visitLabel(l1); mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l1, 0); mv.visitMaxs(3, 1); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "equals", "(Ljava/lang/Object;)Z", null, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(194, l0); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); Label l1 = new Label(); mv.visitJumpInsn(IF_ACMPNE, l1); mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); mv.visitLabel(l1); mv.visitLineNumber(195, l1); mv.visitVarInsn(ALOAD, 1); Label l2 = new Label(); mv.visitJumpInsn(IFNULL, l2); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;"); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;"); Label l3 = new Label(); mv.visitJumpInsn(IF_ACMPEQ, l3); mv.visitLabel(l2); mv.visitInsn(ICONST_0); mv.visitInsn(IRETURN); mv.visitLabel(l3); mv.visitLineNumber(197, l3); mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(CHECKCAST, name2); mv.visitVarInsn(ASTORE, 2); Label l4 = new Label(); mv.visitLabel(l4); mv.visitLineNumber(199, l4); final FieldModel[] fieldModels = tm.fields().clone(); Arrays.sort(fieldModels, new Comparator<FieldModel>() { // reverse sort the preferences to optimise the @Override public int compare(FieldModel o1, FieldModel o2) { return o2.equalsPreference() - o1.equalsPreference(); } }); for (FieldModel fm : fieldModels) { // System.out.println(fm.fieldName()); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType()); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType()); Label l5 = new Label(); if (fm.isCallsNotEquals()) { mv.visitMethodInsn(INVOKESTATIC, fm.bcLModelType(), "notEquals", "(" + fm.bcLSetType() + fm.bcLSetType() + ")Z"); mv.visitJumpInsn(IFEQ, l5); } else { mv.visitJumpInsn(IF_ICMPEQ, l5); } mv.visitInsn(ICONST_0); mv.visitInsn(IRETURN); mv.visitLabel(l5); } mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); Label l17 = new Label(); mv.visitLabel(l17); mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l17, 0); mv.visitLocalVariable("o", "Ljava/lang/Object;", null, l0, l17, 1); mv.visitLocalVariable("that", "L" + name2 + ";", null, l4, l17, 2); mv.visitMaxs(4, 3); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "hashCode", "()I", null, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); int count = 0; for (FieldModel fm : tm.fields()) { // if (count > 5) break; // System.out.println(fm.fieldName()); if (count > 0) { mv.visitIntInsn(BIPUSH, 31); mv.visitInsn(IMUL); } mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType()); if (fm.isCallsHashCode()) { mv.visitMethodInsn(INVOKESTATIC, fm.bcLModelType(), "hashCode", "(" + fm.bcLSetType() + ")I"); } if (count > 0) mv.visitInsn(IADD); count++; } mv.visitInsn(IRETURN); Label l3 = new Label(); mv.visitLabel(l3); mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l3, 0); mv.visitMaxs(6, 1); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "copyOf", "(L" + name + ";)V", null, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(240, l0); boolean copySimpleValues = false; for (FieldModel fm : tm.fields()) { if (!fm.copySimpleValue() || !hasListField) { // if (true) { mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEINTERFACE, name, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType()); mv.visitMethodInsn(INVOKEVIRTUAL, name2, "set" + fm.titleFieldName(), "(" + fm.bcLFieldType() + ")V"); } else { copySimpleValues = true; } } Label l4 = new Label(); Label l6 = new Label(); if (copySimpleValues) { Label l3 = new Label(); mv.visitLabel(l3); mv.visitLineNumber(243, l3); mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(INSTANCEOF, name2); mv.visitJumpInsn(IFEQ, l4); Label l5 = new Label(); mv.visitLabel(l5); mv.visitLineNumber(238, l5); mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(CHECKCAST, name2); mv.visitVarInsn(ASTORE, 2); mv.visitLabel(l6); mv.visitLineNumber(239, l6); mv.visitVarInsn(ALOAD, 2); mv.visitFieldInsn(GETFIELD, name2, "container", "L" + collections + "impl/AbstractHugeContainer;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name2, "container", "L" + collections + "impl/AbstractHugeContainer;"); mv.visitJumpInsn(IF_ACMPNE, l4); for (FieldModel fm : tm.fields()) { if (fm.copySimpleValue()) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name2, "allocation", "L" + name + "Allocation;"); mv.visitFieldInsn(GETFIELD, name + "Allocation", "m_" + fm.fieldName(), fm.bcLStoreType()); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name2, "offset", "I"); mv.visitVarInsn(ALOAD, 2); mv.visitFieldInsn(GETFIELD, name2, "allocation", "L" + name + "Allocation;"); mv.visitFieldInsn(GETFIELD, name + "Allocation", "m_" + fm.fieldName(), fm.bcLStoreType()); mv.visitVarInsn(ALOAD, 2); mv.visitFieldInsn(GETFIELD, name2, "offset", "I"); mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcStoreType(), "get", "(I)" + fm.bcLStoredType()); mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcStoreType(), "put", "(I" + fm.bcLStoredType() + ")" + fm.bcLStoreType()); mv.visitInsn(POP); } } } Label l16 = new Label(); mv.visitLabel(l16); mv.visitLineNumber(238, l16); Label l17 = new Label(); mv.visitJumpInsn(GOTO, l17); mv.visitLabel(l4); mv.visitLineNumber(241, l4); for (FieldModel fm : tm.fields()) { if (fm.copySimpleValue()) { mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEINTERFACE, name, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType()); mv.visitMethodInsn(INVOKEVIRTUAL, name2, "set" + fm.titleFieldName(), "(" + fm.bcLFieldType() + ")V"); } } mv.visitLabel(l17); mv.visitLineNumber(251, l17); mv.visitInsn(RETURN); Label l27 = new Label(); mv.visitLabel(l27); mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l27, 0); mv.visitLocalVariable("t", "L" + name + ";", null, l0, l27, 1); if (copySimpleValues) { mv.visitLocalVariable("mte", "L" + name + "Element;", null, l6, l4, 2); } mv.visitMaxs(4, 3); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC + ACC_BRIDGE + ACC_SYNTHETIC, "copyOf", "(Ljava/lang/Object;)V", null, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(275, l0); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(CHECKCAST, name); mv.visitMethodInsn(INVOKEVIRTUAL, name2, "copyOf", "(L" + name + ";)V"); mv.visitInsn(RETURN); Label l1 = new Label(); mv.visitLabel(l1); mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l1, 0); mv.visitLocalVariable("x0", "Ljava/lang/Object;", null, l0, l1, 1); mv.visitMaxs(2, 2); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "writeExternal", "(Ljava/io/ObjectOutput;)V", null, new String[] { "java/io/IOException" }); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(185, l0); for (FieldModel fm : tm.fields()) { mv.visitVarInsn(ALOAD, 1); if (fm.bcLSetType().equals(fm.bcLFieldType())) { mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType()); mv.visitMethodInsn(INVOKESTATIC, fm.bcModelType(), "write", "(Ljava/io/ObjectOutput;" + fm.bcLSetType() + ")V"); } else { mv.visitLdcInsn(Type.getType(fm.bcLFieldType())); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType()); mv.visitMethodInsn(INVOKESTATIC, fm.bcModelType(), "write", "(Ljava/io/ObjectOutput;Ljava/lang/Class;" + fm.bcLSetType() + ")V"); } } Label l13 = new Label(); mv.visitLabel(l13); mv.visitLineNumber(288, l13); mv.visitInsn(RETURN); Label l14 = new Label(); mv.visitLabel(l14); mv.visitLocalVariable("this", "L" + name2 + ';', null, l0, l14, 0); mv.visitLocalVariable("out", "Ljava/io/ObjectOutput;", null, l0, l14, 1); mv.visitMaxs(4, 2); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "readExternal", "(Ljava/io/ObjectInput;)V", null, new String[] { "java/io/IOException", "java/lang/ClassNotFoundException" }); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(287, l0); for (FieldModel fm : tm.fields()) { mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); if (fm.bcLSetType().equals(fm.bcLFieldType())) { mv.visitMethodInsn(INVOKESTATIC, fm.bcModelType(), "read", "(Ljava/io/ObjectInput;)" + fm.bcLSetType()); } else { mv.visitLdcInsn(Type.getType(fm.bcLFieldType())); mv.visitMethodInsn(INVOKESTATIC, fm.bcModelType(), "read", "(Ljava/io/ObjectInput;Ljava/lang/Class;)" + fm.bcLSetType()); mv.visitTypeInsn(CHECKCAST, fm.bcFieldType()); } mv.visitMethodInsn(INVOKEVIRTUAL, name2, "set" + fm.titleFieldName(), "(" + fm.bcLFieldType() + ")V"); } Label l13 = new Label(); mv.visitLabel(l13); mv.visitLineNumber(305, l13); mv.visitInsn(RETURN); Label l14 = new Label(); mv.visitLabel(l14); mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l14, 0); mv.visitLocalVariable("in", "Ljava/io/ObjectInput;", null, l0, l14, 1); mv.visitMaxs(3, 2); mv.visitEnd(); } }