List of usage examples for org.objectweb.asm MethodVisitor visitIntInsn
public void visitIntInsn(final int opcode, final int operand)
From source file:com.sun.fortress.runtimeSystem.InstantiatingClassloader.java
License:Open Source License
private byte[] instantiateConcreteTuple(String dename, List<String> parameters) { /*//from w ww. j a v a 2s. c om * extends AnyConcreteTuple[\ N \] * * implements Tuple[\ parameters \] * * defines f1 ... fN * defines e1 ... eN * defines o1 ... oN */ ManglingClassWriter cw = new ManglingClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); final int n = parameters.size(); final String any_tuple_n = ANY_TUPLE + Naming.LEFT_OXFORD + n + Naming.RIGHT_OXFORD; final String any_concrete_tuple_n = ANY_CONCRETE_TUPLE + Naming.LEFT_OXFORD + n + Naming.RIGHT_OXFORD; final String tuple_params = stringListToTuple(parameters); String[] superInterfaces = { tuple_params }; cw.visit(JVM_BYTECODE_VERSION, ACC_PUBLIC + ACC_SUPER, dename, null, any_concrete_tuple_n, superInterfaces); /* Outline of what must be generated: // fields // init method // factory method // getRTTI method // is instance method -- takes an Object // is instance method // cast method // typed getters // untyped getters */ // fields { for (int i = 0; i < n; i++) { String f = TUPLE_FIELD_PFX + (i + Naming.TUPLE_ORIGIN); String sig = Naming.internalToDesc(parameters.get(i)); cw.visitField(Opcodes.ACC_PRIVATE + Opcodes.ACC_FINAL, f, sig, null /* for non-generic */, null /* instance has no value */); } } // init method { String init_sig = tupleParamsToJvmInitSig(parameters); MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", init_sig, null, null); mv.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, any_concrete_tuple_n, "<init>", Naming.voidToVoid); for (int i = 0; i < n; i++) { String f = TUPLE_FIELD_PFX + (i + Naming.TUPLE_ORIGIN); String sig = Naming.internalToDesc(parameters.get(i)); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitVarInsn(Opcodes.ALOAD, i + 1); mv.visitFieldInsn(Opcodes.PUTFIELD, dename, f, sig); } mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(Naming.ignoredMaxsParameter, Naming.ignoredMaxsParameter); mv.visitEnd(); } // factory method -- same args as init, returns a new one. { String init_sig = tupleParamsToJvmInitSig(parameters); String make_sig = toJvmSig(parameters, Naming.javaDescForTaggedFortressType(tuple_params)); MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, "make", make_sig, null, null); mv.visitCode(); // eep(mv, "before new"); mv.visitTypeInsn(NEW, dename); mv.visitInsn(DUP); // push params for init for (int i = 0; i < n; i++) { mv.visitVarInsn(Opcodes.ALOAD, i); } // eep(mv, "before init"); mv.visitMethodInsn(INVOKESPECIAL, dename, "<init>", init_sig); mv.visitInsn(Opcodes.ARETURN); mv.visitMaxs(Naming.ignoredMaxsParameter, Naming.ignoredMaxsParameter); mv.visitEnd(); } // getRTTI method/field and static initialization { final String classname = dename; MethodVisitor mv = cw.visitNoMangleMethod(Opcodes.ACC_PUBLIC, // acccess Naming.RTTI_GETTER, // name Naming.STATIC_PARAMETER_GETTER_SIG, // sig null, // generics sig? null); // exceptions mv.visitCode(); mv.visitFieldInsn(GETSTATIC, classname, Naming.RTTI_FIELD, Naming.RTTI_CONTAINER_DESC); areturnEpilogue(mv); MethodVisitor imv = cw.visitMethod(ACC_STATIC, "<clinit>", Naming.voidToVoid, null, null); //taken from codegen.emitRttiField InitializedStaticField isf = new InitializedStaticField.StaticForRttiFieldOfTuple(classname, this); isf.forClinit(imv); cw.visitField(ACC_PUBLIC + ACC_STATIC + ACC_FINAL, isf.asmName(), isf.asmSignature(), null /* for non-generic */, null /* instance has no value */); imv.visitInsn(RETURN); imv.visitMaxs(Naming.ignoredMaxsParameter, Naming.ignoredMaxsParameter); imv.visitEnd(); } // is instance method -- takes an Object { String sig = "(Ljava/lang/Object;)Z"; MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, IS_A, sig, null, null); Label fail = new Label(); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitTypeInsn(Opcodes.INSTANCEOF, any_tuple_n); mv.visitJumpInsn(Opcodes.IFEQ, fail); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitTypeInsn(Opcodes.CHECKCAST, any_tuple_n); mv.visitMethodInsn(Opcodes.INVOKESTATIC, dename, IS_A, "(" + Naming.internalToDesc(any_tuple_n) + ")Z"); mv.visitInsn(Opcodes.IRETURN); mv.visitLabel(fail); mv.visitIntInsn(BIPUSH, 0); mv.visitInsn(Opcodes.IRETURN); mv.visitMaxs(Naming.ignoredMaxsParameter, Naming.ignoredMaxsParameter); mv.visitEnd(); } // is instance method -- takes an AnyTuple[\N\] { String sig = "(" + Naming.internalToDesc(any_tuple_n) + ")Z"; MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, IS_A, sig, null, null); Label fail = new Label(); for (int i = 0; i < n; i++) { mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(INVOKEINTERFACE, any_tuple_n, TUPLE_OBJECT_ELT_PFX + (Naming.TUPLE_ORIGIN + i), UNTYPED_GETTER_SIG); String cast_to = parameters.get(i); generalizedInstanceOf(mv, cast_to); mv.visitJumpInsn(Opcodes.IFEQ, fail); } mv.visitIntInsn(BIPUSH, 1); mv.visitInsn(Opcodes.IRETURN); mv.visitLabel(fail); mv.visitIntInsn(BIPUSH, 0); mv.visitInsn(Opcodes.IRETURN); mv.visitMaxs(Naming.ignoredMaxsParameter, Naming.ignoredMaxsParameter); mv.visitEnd(); } // cast method { String sig = "(" + Naming.internalToDesc(any_tuple_n) + ")" + Naming.internalToDesc(tuple_params); String make_sig = toJvmSig(parameters, Naming.javaDescForTaggedFortressType(tuple_params)); MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, CAST_TO, sig, null, null); // Get the parameters to make, and cast them. for (int i = 0; i < n; i++) { mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(INVOKEINTERFACE, any_tuple_n, TUPLE_OBJECT_ELT_PFX + (Naming.TUPLE_ORIGIN + i), UNTYPED_GETTER_SIG); String cast_to = parameters.get(i); generalizedCastTo(mv, cast_to); } mv.visitMethodInsn(INVOKESTATIC, dename, "make", make_sig); mv.visitInsn(Opcodes.ARETURN); mv.visitMaxs(Naming.ignoredMaxsParameter, Naming.ignoredMaxsParameter); mv.visitEnd(); } // typed getters // untyped getters for (int i = 0; i < n; i++) { String untyped = TUPLE_OBJECT_ELT_PFX + (Naming.TUPLE_ORIGIN + i); String typed = TUPLE_TYPED_ELT_PFX + (Naming.TUPLE_ORIGIN + i); String field = TUPLE_FIELD_PFX + (Naming.TUPLE_ORIGIN + i); String param_type = parameters.get(i); String param_desc = Naming.internalToDesc(param_type); { MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, untyped, UNTYPED_GETTER_SIG, null, null); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitFieldInsn(GETFIELD, dename, field, param_desc); mv.visitInsn(Opcodes.ARETURN); mv.visitMaxs(Naming.ignoredMaxsParameter, Naming.ignoredMaxsParameter); mv.visitEnd(); } { MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, typed, "()" + param_desc, null, null); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitFieldInsn(GETFIELD, dename, field, param_desc); mv.visitInsn(Opcodes.ARETURN); mv.visitMaxs(Naming.ignoredMaxsParameter, Naming.ignoredMaxsParameter); mv.visitEnd(); } } cw.visitEnd(); return cw.toByteArray(); }
From source file:com.toolazydogs.maiden.agent.asm.AsmUtils.java
License:Apache License
/** * Generates the instruction to push the given value on the stack. * * @param methodVisitor the visitor to which to send the instruction * @param value the value to be pushed on the stack. *///w ww . j a va 2 s. c om public static void push(MethodVisitor methodVisitor, int value) { if (value >= -1 && value <= 5) { methodVisitor.visitInsn(Opcodes.ICONST_0 + value); } else if (value >= Byte.MIN_VALUE && value <= Byte.MAX_VALUE) { methodVisitor.visitIntInsn(Opcodes.BIPUSH, value); } else if (value >= Short.MIN_VALUE && value <= Short.MAX_VALUE) { methodVisitor.visitIntInsn(Opcodes.SIPUSH, value); } else { methodVisitor.visitLdcInsn(value); } }
From source file:com.weibo.lodil.mmap.impl.GenerateHugeArrays.java
License:Apache License
public static byte[] dumpArrayList(final TypeModel tm) { final ClassWriter cw = new ClassWriter(0); FieldVisitor fv;//from w w w .j a v a 2 s . c o m MethodVisitor mv; final Class interfaceClass = tm.type(); final 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 (final 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(); } } final List<FieldModel> fields = new ArrayList<FieldModel>(); { mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(L" + collections + "HugeArrayBuilder;)V", null, null); mv.visitCode(); final 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"); final Label l1 = new Label(); mv.visitLabel(l1); mv.visitLineNumber(29, l1); for (final 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); final 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(); final 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); final 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(); final 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); final 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(); final 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); final 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(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(57, l0); for (final FieldModel fm : fields) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType()); mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcModelType(), "compactStart", "()V"); } final Label l1 = new Label(); mv.visitLabel(l1); mv.visitLineNumber(58, l1); mv.visitInsn(RETURN); final 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(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(65, l0); for (final 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"); } final Label l1 = new Label(); mv.visitLabel(l1); mv.visitLineNumber(66, l1); mv.visitInsn(RETURN); final 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(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(69, l0); for (final FieldModel fm : fields) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType()); mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcModelType(), "compactEnd", "()V"); } final Label l1 = new Label(); mv.visitLabel(l1); mv.visitLineNumber(70, l1); mv.visitInsn(RETURN); final 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(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(74, l0); for (final FieldModel fm : fields) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType()); mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcModelType(), "clear", "()V"); } final Label l3 = new Label(); mv.visitLabel(l3); mv.visitLineNumber(77, l3); mv.visitInsn(RETURN); final 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(); final 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); final 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(); final 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); final 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(); final 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); final 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(); final 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); final 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:com.weibo.lodil.mmap.impl.GenerateHugeArrays.java
License:Apache License
private static void appendToStringHashCodeEqualsCopyOf(final TypeModel tm, final ClassWriter cw, final String name2, final boolean hasListField) { final String name = tm.bcType(); MethodVisitor mv; {//from ww w.j a va 2 s . c o m mv = cw.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null); mv.visitCode(); final 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 (final FieldModel fm : tm.fields()) { final 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); final 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(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(194, l0); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); final 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); final 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;"); final 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); final 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 public int compare(final FieldModel o1, final FieldModel o2) { return o2.equalsPreference() - o1.equalsPreference(); } }); for (final 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()); final 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); final 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(); final Label l0 = new Label(); mv.visitLabel(l0); int count = 0; for (final 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); final 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(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(240, l0); boolean copySimpleValues = false; for (final 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; } } final Label l4 = new Label(); final Label l6 = new Label(); if (copySimpleValues) { final Label l3 = new Label(); mv.visitLabel(l3); mv.visitLineNumber(243, l3); mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(INSTANCEOF, name2); mv.visitJumpInsn(IFEQ, l4); final 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 (final 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); } } } final Label l16 = new Label(); mv.visitLabel(l16); mv.visitLineNumber(238, l16); final Label l17 = new Label(); mv.visitJumpInsn(GOTO, l17); mv.visitLabel(l4); mv.visitLineNumber(241, l4); for (final 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); final 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(); final 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); final 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(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(185, l0); for (final 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"); } } final Label l13 = new Label(); mv.visitLabel(l13); mv.visitLineNumber(288, l13); mv.visitInsn(RETURN); final 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(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(287, l0); for (final 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"); } final Label l13 = new Label(); mv.visitLabel(l13); mv.visitLineNumber(305, l13); mv.visitInsn(RETURN); final 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(); } }
From source file:com.yahoo.yqlplus.engine.internal.compiler.CodeEmitter.java
public void emitNewArray(TypeWidget elementType, BytecodeExpression e) { MethodVisitor mv = getMethodVisitor(); exec(e);/*from w ww. j a v a 2 s. c o m*/ cast(BaseTypeAdapter.INT32, e.getType()); switch (elementType.getJVMType().getSort()) { case Type.BYTE: mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_BYTE); break; case Type.BOOLEAN: mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_BOOLEAN); break; case Type.SHORT: mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_SHORT); break; case Type.INT: mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_INT); break; case Type.CHAR: mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_CHAR); break; case Type.FLOAT: mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_FLOAT); break; case Type.LONG: mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_LONG); break; case Type.DOUBLE: mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_DOUBLE); break; case Type.OBJECT: mv.visitTypeInsn(Opcodes.ANEWARRAY, elementType.getJVMType().getInternalName()); break; default: throw new UnsupportedOperationException("unknown sort for newArray" + elementType.getJVMType()); } }
From source file:de.kandid.model.Emitter.java
License:Apache License
/** * Assembles a class that implements the given interface by generating the byte code. * @param interfaze the interface to implement * @return the class/*from w ww.j a v a2 s .c o m*/ */ private static Class<? extends Emitter<?>> makeClass(Class<?> interfaze) { String nameClass = _nameEmitter + '$' + interfaze.getName().replace('.', '$'); String nameInterface = Type.getInternalName(interfaze); // ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); ClassWriter cw = new ClassWriter(0); cw.visit(V1_4, ACC_PUBLIC + ACC_SUPER, nameClass, null, _nameEmitter, new String[] { name(interfaze) }); // Generate default construcotor MethodVisitor cv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null); cv.visitVarInsn(ALOAD, 0); cv.visitMethodInsn(INVOKESPECIAL, _nameEmitter, "<init>", "()V"); cv.visitInsn(RETURN); cv.visitMaxs(1, 1); // Generate methods Method[] methods = interfaze.getMethods(); for (int i = 0; i < methods.length; ++i) { final Method m = methods[i]; if (m.getReturnType() != void.class) throw new IllegalArgumentException("Method " + m.toGenericString() + " must not return a value"); final String descMethod = Type.getMethodDescriptor(m); final MethodVisitor mw = cw.visitMethod(ACC_PUBLIC + ACC_SYNCHRONIZED, m.getName(), descMethod, null, null); final Type[] argTypes = Type.getArgumentTypes(m); // for (int i = 0; i < _end; i += 2) // ((Listener) _listeners[i]).send(...); int localStart = 1; // give one for "this" for (Type at : argTypes) localStart += at.getSize(); Label entry = new Label(); Label exit = new Label(); mw.visitLabel(entry); // _isFiring = true; mw.visitVarInsn(ALOAD, 0); mw.visitInsn(Opcodes.ICONST_1); mw.visitFieldInsn(Opcodes.PUTFIELD, nameClass, "_isFiring", Type.BOOLEAN_TYPE.getDescriptor()); // setup local variables: i, _listeners, _end mw.visitLocalVariable("i", Type.INT_TYPE.getDescriptor(), null, entry, exit, localStart); mw.visitInsn(Opcodes.ICONST_0); mw.visitIntInsn(Opcodes.ISTORE, localStart); mw.visitLocalVariable("listeners", _descObjectArray, null, entry, exit, localStart + 1); mw.visitVarInsn(ALOAD, 0); mw.visitFieldInsn(GETFIELD, nameClass, "_listeners", _descObjectArray); mw.visitIntInsn(Opcodes.ASTORE, localStart + 1); mw.visitLocalVariable("end", Type.INT_TYPE.getDescriptor(), null, entry, exit, localStart + 2); mw.visitVarInsn(ALOAD, 0); mw.visitFieldInsn(GETFIELD, nameClass, "_end", Type.INT_TYPE.getDescriptor()); mw.visitIntInsn(Opcodes.ISTORE, localStart + 2); final Label condition = new Label(); mw.visitJumpInsn(GOTO, condition); final Label loop = new Label(); mw.visitLabel(loop); //((Listener) _listeners[i]).doSomething() mw.visitIntInsn(Opcodes.ALOAD, localStart + 1); mw.visitIntInsn(Opcodes.ILOAD, localStart); mw.visitInsn(Opcodes.AALOAD); mw.visitTypeInsn(CHECKCAST, nameInterface); int offs = 1; // give one for "this" for (Type at : argTypes) { mw.visitVarInsn(at.getOpcode(ILOAD), offs); offs += at.getSize(); } mw.visitMethodInsn(INVOKEINTERFACE, nameInterface, m.getName(), descMethod); // i += 2 mw.visitIincInsn(localStart, 2); // if (i < end) goto loop mw.visitLabel(condition); mw.visitIntInsn(Opcodes.ILOAD, localStart); mw.visitIntInsn(Opcodes.ILOAD, localStart + 2); mw.visitJumpInsn(Opcodes.IF_ICMPLT, loop); // _isFiring = false; mw.visitVarInsn(ALOAD, 0); mw.visitInsn(Opcodes.ICONST_0); mw.visitFieldInsn(Opcodes.PUTFIELD, nameClass, "_isFiring", Type.BOOLEAN_TYPE.getDescriptor()); mw.visitLabel(exit); mw.visitInsn(RETURN); mw.visitMaxs(localStart + 2, localStart + 3); mw.visitEnd(); } cw.visitEnd(); return _loader.loadClass(cw, nameClass.replace('/', '.')); }
From source file:dijkstra.gen.DijkstraCodeGenerator.java
License:Open Source License
public byte[] visit(ArrayDeclarationNode decl) { if (!mvStack.isEmpty() && !processingClassFields) { final MethodVisitor mv = mvStack.peek(); for (IDNode id : decl.getIdList()) { decl.arrayLength.accept(this); if (decl.arrayLength.type == DijkstraType.INT) { mv.visitInsn(L2I);/*w w w. ja v a 2 s. c om*/ } else { mv.visitInsn(D2I); } ArraySymbol symbol = ((ArraySymbol) id.symbol); if (id.symbol.isGlobal()) { if (symbol.getArrayType() == DijkstraType.INT) { mv.visitIntInsn(NEWARRAY, T_LONG); mv.visitFieldInsn(PUTSTATIC, fullPath, id.getName(), "[J"); } else if (symbol.getArrayType() == DijkstraType.FLOAT) { mv.visitIntInsn(NEWARRAY, T_DOUBLE); mv.visitFieldInsn(PUTSTATIC, fullPath, id.getName(), "[D"); } else if (symbol.getArrayType() == DijkstraType.BOOLEAN) { mv.visitIntInsn(NEWARRAY, T_BOOLEAN); mv.visitFieldInsn(PUTSTATIC, fullPath, id.getName(), "[Z"); } } else { if (symbol.getArrayType() == DijkstraType.INT) { mv.visitIntInsn(NEWARRAY, T_LONG); mv.visitVarInsn(ASTORE, id.getAddress()); } else if (symbol.getArrayType() == DijkstraType.FLOAT) { mv.visitIntInsn(NEWARRAY, T_DOUBLE); mv.visitVarInsn(ASTORE, id.getAddress()); } else if (symbol.getArrayType() == DijkstraType.BOOLEAN) { // boolean mv.visitIntInsn(NEWARRAY, T_BOOLEAN); mv.visitVarInsn(ASTORE, id.getAddress()); } } } } else if (processingClassFields) { final MethodVisitor mv = mvStack.peek(); for (IDNode id : decl.getIdList()) { mv.visitVarInsn(ALOAD, 0); decl.arrayLength.accept(this); if (decl.arrayLength.type == DijkstraType.INT) { mv.visitInsn(L2I); } else { mv.visitInsn(D2I); } ArraySymbol symbol = ((ArraySymbol) id.symbol); if (symbol.getArrayType() == DijkstraType.INT) { mv.visitIntInsn(NEWARRAY, T_LONG); mv.visitFieldInsn(PUTFIELD, fullPath, id.getName(), "[J"); } else if (symbol.getArrayType() == DijkstraType.FLOAT) { mv.visitIntInsn(NEWARRAY, T_DOUBLE); mv.visitFieldInsn(PUTFIELD, fullPath, id.getName(), "[D"); } else if (symbol.getArrayType() == DijkstraType.BOOLEAN) { mv.visitIntInsn(NEWARRAY, T_BOOLEAN); mv.visitFieldInsn(PUTFIELD, fullPath, id.getName(), "[Z"); } } } return null; }
From source file:dijkstra.gen.DijkstraCodeGenerator.java
License:Open Source License
public byte[] visit(AlternativeNode alternative) { final MethodVisitor mv = mvStack.peek(); final Label endLabel = new Label(); guardLabelStack.push(endLabel);//from w ww. j a v a 2s . co m visitChildren(alternative); guardLabelStack.pop(); mv.visitIntInsn(BIPUSH, alternative.getLineNumber()); mv.visitMethodInsn(INVOKESTATIC, "dijkstra/runtime/DijkstraRuntime", "abortNoAlternative", "(I)V", false); mv.visitLabel(endLabel); return null; }
From source file:dijkstra.gen.DijkstraCodeGenerator.java
License:Open Source License
public byte[] visit(MethodCallNode node) { final MethodVisitor mv = mvStack.peek(); final String objectType = ((ObjectSymbol) node.getObjectId().symbol).getObjectType(); final StringBuilder sig = new StringBuilder(); sig.append('('); List<Symbol> propertySymbols; if (node.getId().symbol.getType() == DijkstraType.PROCEDURE) { propertySymbols = ((ProcedureSymbol) node.getId().symbol).getParamSymbols(); } else {/* w w w .j av a 2s.com*/ propertySymbols = ((FunctionSymbol) node.getId().symbol).getParamSymbols(); } for (Symbol property : propertySymbols) { if (property.getType() == DijkstraType.INT) { sig.append('J'); } else if (property.getType() == DijkstraType.FLOAT) { sig.append('D'); } else { sig.append('Z'); } } if (node.getId().symbol.getType() == FUNCTION) { sig.append(")[Ljava/lang/Object;"); } else { sig.append(")V"); } if (node.getObjectId().symbol.isGlobal() && !inClass) { mv.visitFieldInsn(GETSTATIC, fullPath, node.getObjectId().getName(), "L" + classPackage + "/" + ((ObjectSymbol) node.getObjectId().symbol).getObjectType() + ";"); } else if (node.getObjectId().symbol.isGlobal() && inClass) { mv.visitFieldInsn(GETFIELD, fullPath, node.getObjectId().getName(), "L" + classPackage + "/" + ((ObjectSymbol) node.getObjectId().symbol).getObjectType() + ";"); } else { mv.visitVarInsn(ALOAD, node.getObjectId().getAddress()); } int paramIndex = 0; for (ASTNode arg : node.getArgs()) { arg.accept(this); if (arg.nodeType == FUNCALL) { paramIndex += ((FunctionSymbol) ((FunctionCallNode) arg).getId().symbol).getReturnTypes().size() - 1; } else if (propertySymbols.get(paramIndex).getType() == DijkstraType.INT && arg.getType() == DijkstraType.FLOAT) { mv.visitInsn(D2L); } else if (propertySymbols.get(paramIndex).getType() == DijkstraType.FLOAT && arg.getType() == DijkstraType.INT) { mv.visitInsn(L2D); } paramIndex++; } // mv.visitVarInsn(ALOAD, node.getObjectId().getAddress()) mv.visitMethodInsn(INVOKEVIRTUAL, classPackage + "/" + objectType, node.getId().getName(), sig.toString(), false); if (node.getId().symbol.getType() == FUNCTION) { final FunctionSymbol fSymbol = ((FunctionSymbol) node.getId().symbol); returnArrayStack.push(new ArraySymbol(null, UNDEFINED)); mv.visitVarInsn(ASTORE, JVMInfo.getAddressForSymbol(returnArrayStack.peek())); for (int i = 0; i < fSymbol.getReturnTypes().size(); i++) { // Load the only element in the array and put it on the stack mv.visitVarInsn(ALOAD, JVMInfo.getAddressForSymbol(returnArrayStack.peek())); mv.visitIntInsn(SIPUSH, i); mv.visitInsn(AALOAD); DijkstraType retType = fSymbol.getReturnTypes().get(i); if (retType == DijkstraType.INT) { mv.visitTypeInsn(CHECKCAST, "java/lang/Long"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Long", "longValue", "()J", false); } else if (retType == DijkstraType.FLOAT) { mv.visitTypeInsn(CHECKCAST, "java/lang/Double"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D", false); } else { mv.visitTypeInsn(CHECKCAST, "java/lang/Boolean"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z", false); } } returnArrayStack.pop(); } return null; }
From source file:dijkstra.gen.DijkstraCodeGenerator.java
License:Open Source License
public byte[] visit(FunctionDeclarationNode funDeclNode) { if (processingClassFields) { return null; }// ww w . j av a2 s . c om final String methodName = funDeclNode.getIDNode().getName(); final StringBuilder sig = new StringBuilder(); sig.append('('); for (IDNode param : funDeclNode.getParamList()) { if (param.getType() == DijkstraType.INT) { sig.append('J'); } else if (param.getType() == DijkstraType.FLOAT) { sig.append('D'); } else { sig.append('Z'); } } sig.append(')'); sig.append("[Ljava/lang/Object;"); if (inClass) { mvStack.push(cw.visitMethod(ACC_PUBLIC, methodName, sig.toString(), null, null)); } else { mvStack.push(cw.visitMethod(ACC_PUBLIC + ACC_STATIC, methodName, sig.toString(), null, null)); } final MethodVisitor mv = mvStack.peek(); JVMInfo.enterScope(inClass); // Load the parameters into the JVMInfo so it knows the proper addresses for (IDNode param : funDeclNode.getParamList()) { param.getAddress(); } mv.visitIntInsn(SIPUSH, funDeclNode.getReturnTypes().size()); mv.visitTypeInsn(ANEWARRAY, "java/lang/Object"); returnArrayStack.push(new ArraySymbol(null, UNDEFINED)); mv.visitVarInsn(ASTORE, JVMInfo.getAddressForSymbol(returnArrayStack.peek())); mv.visitInsn(ICONST_0); returnIndexStack.push(new Symbol(null, UNDEFINED)); mv.visitVarInsn(ISTORE, JVMInfo.getAddressForSymbol(returnIndexStack.peek())); mv.visitCode(); final Label startLabel = new Label(); mv.visitLabel(startLabel); funDeclNode.getCompoundNode().accept(this); returnIndexStack.pop(); mv.visitVarInsn(ALOAD, JVMInfo.getAddressForSymbol(returnArrayStack.pop())); mv.visitInsn(ARETURN); final Label endLabel = new Label(); mv.visitLabel(endLabel); int paramLoc = 0; for (IDNode param : funDeclNode.getParamList()) { if (param.getType() == DijkstraType.INT) { mv.visitLocalVariable(param.getName(), "J", null, startLabel, endLabel, paramLoc); paramLoc += 2; } else if (param.getType() == DijkstraType.FLOAT) { mv.visitLocalVariable(param.getName(), "D", null, startLabel, endLabel, paramLoc); paramLoc += 2; } else { mv.visitLocalVariable(param.getName(), "Z", null, startLabel, endLabel, paramLoc); paramLoc += 1; } } mv.visitMaxs(0, 0); mv.visitEnd(); JVMInfo.exitScope(); mvStack.pop(); return null; }