Example usage for org.objectweb.asm MethodVisitor visitLdcInsn

List of usage examples for org.objectweb.asm MethodVisitor visitLdcInsn

Introduction

In this page you can find the example usage for org.objectweb.asm MethodVisitor visitLdcInsn.

Prototype

public void visitLdcInsn(final Object value) 

Source Link

Document

Visits a LDC instruction.

Usage

From source file:dyco4j.instrumentation.LoggingHelper.java

License:BSD License

public static void emitLogMethodExit(final MethodVisitor mv, final String methodId, final ExitKind exitKind) {
    mv.visitLdcInsn(methodId);
    mv.visitLdcInsn(exitKind.getAbbreviatedName());
    emitInvokeLog(mv, LOG_METHOD_EXIT);/*from ww w  .j  a  va 2 s.c  o  m*/
}

From source file:dyco4j.instrumentation.LoggingHelper.java

License:BSD License

public static void emitLogString(final MethodVisitor mv, final String s) {
    mv.visitLdcInsn(s);
    emitInvokeLog(mv, LOG_STRING);//w w  w  .  j av  a 2 s  .co m
}

From source file:dyco4j.LoggingHelper.java

License:BSD License

public static int emitLogArgument(final MethodVisitor mv, final int index, final Type argType) {
    mv.visitLdcInsn(index);

    int _typeLength = 1;
    switch (argType.getSort()) {
    case Type.BOOLEAN:
    case Type.BYTE:
    case Type.CHAR:
    case Type.INT:
    case Type.SHORT:
        mv.visitVarInsn(Opcodes.ILOAD, index);
        break;// ww w.  j av  a  2 s  . c om
    case Type.LONG:
        mv.visitVarInsn(Opcodes.LLOAD, index);
        _typeLength++;
        break;
    case Type.FLOAT:
        mv.visitVarInsn(Opcodes.FLOAD, index);
        break;
    case Type.DOUBLE:
        mv.visitVarInsn(Opcodes.DLOAD, index);
        _typeLength++;
        break;
    case Type.ARRAY:
    case Type.OBJECT:
        mv.visitVarInsn(Opcodes.ALOAD, index);
        break;
    }

    emitConvertToString(mv, argType);
    emitInvokeLog(mv, LOG_ARGUMENT);

    return _typeLength;
}

From source file:edu.illinois.nondex.instr.PriorityBlockingQueueShufflingAdder.java

License:Open Source License

public void addToString() {
    MethodVisitor mv = super.visitMethod(Opcodes.ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null);
    mv.visitCode();//from   www  . j a v a2  s .com
    Label l0 = new Label();
    Label l1 = new Label();
    Label l2 = new Label();
    mv.visitTryCatchBlock(l0, l1, l2, null);
    Label l3 = new Label();
    Label l4 = new Label();
    mv.visitTryCatchBlock(l3, l4, l2, null);
    Label l5 = new Label();
    mv.visitTryCatchBlock(l2, l5, l2, null);
    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitFieldInsn(Opcodes.GETFIELD, "java/util/concurrent/PriorityBlockingQueue", "lock",
            "Ljava/util/concurrent/locks/ReentrantLock;");
    mv.visitVarInsn(Opcodes.ASTORE, 1);
    mv.visitVarInsn(Opcodes.ALOAD, 1);
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/concurrent/locks/ReentrantLock", "lock", "()V", false);
    mv.visitLabel(l0);
    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitFieldInsn(Opcodes.GETFIELD, "java/util/concurrent/PriorityBlockingQueue", "size", "I");
    mv.visitVarInsn(Opcodes.ISTORE, 2);
    mv.visitVarInsn(Opcodes.ILOAD, 2);
    mv.visitJumpInsn(Opcodes.IFNE, l3);
    mv.visitLdcInsn("[]");
    mv.visitVarInsn(Opcodes.ASTORE, 3);
    mv.visitLabel(l1);
    mv.visitVarInsn(Opcodes.ALOAD, 1);
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/concurrent/locks/ReentrantLock", "unlock", "()V",
            false);
    mv.visitVarInsn(Opcodes.ALOAD, 3);
    mv.visitInsn(Opcodes.ARETURN);
    mv.visitLabel(l3);
    mv.visitFrame(Opcodes.F_APPEND, 2,
            new Object[] { "java/util/concurrent/locks/ReentrantLock", Opcodes.INTEGER }, 0, null);
    mv.visitTypeInsn(Opcodes.NEW, "java/lang/StringBuilder");
    mv.visitInsn(Opcodes.DUP);
    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false);
    mv.visitVarInsn(Opcodes.ASTORE, 3);
    mv.visitVarInsn(Opcodes.ALOAD, 3);
    mv.visitIntInsn(Opcodes.BIPUSH, 91);
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
            "(C)Ljava/lang/StringBuilder;", false);
    mv.visitInsn(Opcodes.POP);
    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitFieldInsn(Opcodes.GETFIELD, "java/util/concurrent/PriorityBlockingQueue", "queue",
            "[Ljava/lang/Object;");
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "[Ljava/lang/Object;", "clone", "()Ljava/lang/Object;", false);
    mv.visitTypeInsn(Opcodes.CHECKCAST, "[Ljava/lang/Object;");
    mv.visitVarInsn(Opcodes.ASTORE, 4);
    mv.visitVarInsn(Opcodes.ALOAD, 4);
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, "edu/illinois/nondex/shuffling/ControlNondeterminism", "shuffle",
            "([Ljava/lang/Object;)[Ljava/lang/Object;", false);
    mv.visitVarInsn(Opcodes.ASTORE, 4);
    mv.visitInsn(Opcodes.ICONST_0);
    mv.visitVarInsn(Opcodes.ISTORE, 5);
    Label l6 = new Label();
    mv.visitLabel(l6);
    mv.visitFrame(Opcodes.F_APPEND, 3,
            new Object[] { "java/lang/StringBuilder", "[Ljava/lang/Object;", Opcodes.INTEGER }, 0, null);
    mv.visitVarInsn(Opcodes.ILOAD, 5);
    mv.visitVarInsn(Opcodes.ILOAD, 2);
    Label l7 = new Label();
    mv.visitJumpInsn(Opcodes.IF_ICMPGE, l7);
    mv.visitVarInsn(Opcodes.ALOAD, 4);
    mv.visitVarInsn(Opcodes.ILOAD, 5);
    mv.visitInsn(Opcodes.AALOAD);
    mv.visitVarInsn(Opcodes.ASTORE, 6);
    mv.visitVarInsn(Opcodes.ALOAD, 3);
    mv.visitVarInsn(Opcodes.ALOAD, 6);
    mv.visitVarInsn(Opcodes.ALOAD, 0);
    Label l8 = new Label();
    mv.visitJumpInsn(Opcodes.IF_ACMPNE, l8);
    mv.visitLdcInsn("(this Collection)");
    Label l9 = new Label();
    mv.visitJumpInsn(Opcodes.GOTO, l9);
    mv.visitLabel(l8);
    mv.visitFrame(Opcodes.F_FULL, 7,
            new Object[] { "java/util/concurrent/PriorityBlockingQueue",
                    "java/util/concurrent/locks/ReentrantLock", Opcodes.INTEGER, "java/lang/StringBuilder",
                    "[Ljava/lang/Object;", Opcodes.INTEGER, "java/lang/Object" },
            1, new Object[] { "java/lang/StringBuilder" });
    mv.visitVarInsn(Opcodes.ALOAD, 6);
    mv.visitLabel(l9);
    mv.visitFrame(Opcodes.F_FULL, 7,
            new Object[] { "java/util/concurrent/PriorityBlockingQueue",
                    "java/util/concurrent/locks/ReentrantLock", Opcodes.INTEGER, "java/lang/StringBuilder",
                    "[Ljava/lang/Object;", Opcodes.INTEGER, "java/lang/Object" },
            2, new Object[] { "java/lang/StringBuilder", "java/lang/Object" });
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
            "(Ljava/lang/Object;)Ljava/lang/StringBuilder;", false);
    mv.visitInsn(Opcodes.POP);
    mv.visitVarInsn(Opcodes.ILOAD, 5);
    mv.visitVarInsn(Opcodes.ILOAD, 2);
    mv.visitInsn(Opcodes.ICONST_1);
    mv.visitInsn(Opcodes.ISUB);
    Label l10 = new Label();
    mv.visitJumpInsn(Opcodes.IF_ICMPEQ, l10);
    mv.visitVarInsn(Opcodes.ALOAD, 3);
    mv.visitIntInsn(Opcodes.BIPUSH, 44);
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
            "(C)Ljava/lang/StringBuilder;", false);
    mv.visitIntInsn(Opcodes.BIPUSH, 32);
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
            "(C)Ljava/lang/StringBuilder;", false);
    mv.visitInsn(Opcodes.POP);
    mv.visitLabel(l10);
    mv.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
    mv.visitIincInsn(5, 1);
    mv.visitJumpInsn(Opcodes.GOTO, l6);
    mv.visitLabel(l7);
    mv.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
    mv.visitVarInsn(Opcodes.ALOAD, 3);
    mv.visitIntInsn(Opcodes.BIPUSH, 93);
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
            "(C)Ljava/lang/StringBuilder;", false);
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;",
            false);
    mv.visitVarInsn(Opcodes.ASTORE, 5);
    mv.visitLabel(l4);
    mv.visitVarInsn(Opcodes.ALOAD, 1);
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/concurrent/locks/ReentrantLock", "unlock", "()V",
            false);
    mv.visitVarInsn(Opcodes.ALOAD, 5);
    mv.visitInsn(Opcodes.ARETURN);
    mv.visitLabel(l2);
    mv.visitFrame(Opcodes.F_FULL, 2, new Object[] { "java/util/concurrent/PriorityBlockingQueue",
            "java/util/concurrent/locks/ReentrantLock" }, 1, new Object[] { "java/lang/Throwable" });
    mv.visitVarInsn(Opcodes.ASTORE, 7);
    mv.visitLabel(l5);
    mv.visitVarInsn(Opcodes.ALOAD, 1);
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/concurrent/locks/ReentrantLock", "unlock", "()V",
            false);
    mv.visitVarInsn(Opcodes.ALOAD, 7);
    mv.visitInsn(Opcodes.ATHROW);
    mv.visitMaxs(3, 8);
    mv.visitEnd();
}

From source file:edu.ubc.mirrors.holograms.MainEntryAdaptor.java

License:Open Source License

@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {

    MethodVisitor superVisitor = super.visitMethod(access, name, desc, signature, exceptions);
    if (superVisitor != null && name.equals("main") && (Opcodes.ACC_STATIC & access) != 0
            && desc.equals(mainDesc)) {
        superVisitor.visitCode();/*www  .j  a  v a2  s .c  om*/
        superVisitor.visitLdcInsn(Type.getObjectType(className));
        superVisitor.visitVarInsn(Opcodes.ALOAD, 0);
        superVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(ObjectHologram.class),
                "invokeHologramMainMethod", invokeHologramMainMethodDesc);
        superVisitor.visitInsn(Opcodes.RETURN);
        superVisitor.visitMaxs(2, 1);
        superVisitor.visitEnd();
        return null;
    } else {
        return superVisitor;
    }
}

From source file:egovframework.rte.itl.webservice.service.impl.EgovWebServiceClassLoaderImpl.java

License:Apache License

private byte[] createServiceEndpointClass(final ServiceEndpointInfo serviceEndpointInfo)
        throws ClassNotFoundException {
    String serviceEndpointInterfaceClassName = getServiceEndpointInterfaceClassName(
            serviceEndpointInfo.getServiceName());
    String serviceEndpointClassName = getServiceEndpointClassName(serviceEndpointInfo.getServiceName());

    String asmServiceEndpointInterfaceClassName = serviceEndpointInterfaceClassName.replace('.', '/');
    String asmServiceEndpointClassName = serviceEndpointClassName.replace('.', '/');
    // CHECKSTYLE:ON
    // ClassWriter classWriter = new ClassWriter(false);
    ClassWriter classWriter = new ClassWriter(0);
    classWriter.visit(V1_5, // version
            ACC_PUBLIC, // access
            asmServiceEndpointClassName, // name
            null, // signature
            "java/lang/Object", // superName
            new String[] { asmServiceEndpointInterfaceClassName }); // interfaces
    // Create Annotation
    AnnotationVisitor annotationVisitor = classWriter.visitAnnotation(DESC_OF_WEB_SERVICE, true);
    annotationVisitor.visit("endpointInterface", serviceEndpointInterfaceClassName);
    annotationVisitor.visit("targetNamespace", serviceEndpointInfo.getNamespace());
    // annotationVisitor.visit("name",
    // serviceProviderInfo.getServiceName());
    annotationVisitor.visit("serviceName", serviceEndpointInfo.getServiceName());
    annotationVisitor.visit("portName", serviceEndpointInfo.getPortName());
    annotationVisitor.visitEnd();//from   w w w  .ja v  a2  s.c o  m

    // Create Attribute
    FieldVisitor fieldVisitor = classWriter.visitField(ACC_PUBLIC, // access
            FIELD_NAME_OF_SERVICE_BRIDGE, // name
            DESC_OF_SERVICE_BRIDGE_CLASS, // desc
            null, // signature
            null); // value
    fieldVisitor.visitEnd();

    // Create Constructor
    MethodVisitor methodVisitor = classWriter.visitMethod(ACC_PUBLIC, // access
            "<init>", // name
            "()V", // desc
            null, // signature
            null); // exceptions
    methodVisitor.visitCode();
    methodVisitor.visitVarInsn(ALOAD, 0);
    methodVisitor.visitMethodInsn(INVOKESPECIAL, // opcode
            "java/lang/Object", // owner
            "<init>", // name
            "()V"); // desc
    methodVisitor.visitInsn(RETURN);
    methodVisitor.visitMaxs(1, 1);
    methodVisitor.visitEnd();

    // Create Method
    ServiceParamInfo returnInfo = serviceEndpointInfo.getReturnInfo();
    Collection<ServiceParamInfo> paramInfos = serviceEndpointInfo.getParamInfos();

    StringBuffer desc = new StringBuffer("(");
    StringBuffer signature = new StringBuffer("(");

    for (ServiceParamInfo info : paramInfos) {
        Class<?> paramClass = loadClass(info.getType());
        org.objectweb.asm.Type paramType = org.objectweb.asm.Type.getType(paramClass);
        String paramSign = paramType.getDescriptor();
        if (info.getMode().equals(OUT) || info.getMode().equals(INOUT)) {
            if (paramClass.isPrimitive()) {
                paramClass = wrapperClasses.get(paramClass);
                paramType = org.objectweb.asm.Type.getType(paramClass);
                paramSign = paramType.getDescriptor();
            }
            paramClass = Holder.class;
            paramType = TYPE_OF_HOLDER;
            paramSign = "Ljavax/xml/ws/Holder<" + paramSign + ">;";
        }
        desc.append(paramType.getDescriptor());
        signature.append(paramSign);
    }
    desc.append(")");
    signature.append(")");
    // CHECKSTYLE:OFF
    org.objectweb.asm.Type returnType = (returnInfo == null ? returnType = org.objectweb.asm.Type.VOID_TYPE
            : org.objectweb.asm.Type.getType(loadClass(returnInfo.getType())));
    // CHECKSTYLE:ON
    desc.append(returnType.getDescriptor());
    signature.append(returnType.getDescriptor());

    methodVisitor = classWriter.visitMethod(ACC_PUBLIC, // access
            serviceEndpointInfo.getOperationName(), // name
            desc.toString(), // desc
            signature.toString(), // signature
            null); // exceptions

    int mapPosition = paramInfos.size() + 1;
    methodVisitor.visitCode();
    methodVisitor.visitTypeInsn(NEW, "java/util/HashMap");
    methodVisitor.visitInsn(DUP);
    methodVisitor.visitMethodInsn(INVOKESPECIAL, // opcode
            "java/util/HashMap", // owner
            "<init>", // name
            "()V"); // desc
    methodVisitor.visitVarInsn(ASTORE, mapPosition);
    int i = 1;
    for (ServiceParamInfo info : paramInfos) {
        methodVisitor.visitVarInsn(ALOAD, mapPosition);
        methodVisitor.visitLdcInsn(info.getName());
        methodVisitor.visitVarInsn(ALOAD, i);
        methodVisitor.visitMethodInsn(INVOKEINTERFACE, // opcode
                "java/util/Map", // owner
                "put", // name
                "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); // desc
        methodVisitor.visitInsn(POP);
        i++;
    }
    methodVisitor.visitVarInsn(ALOAD, 0);
    methodVisitor.visitFieldInsn(GETFIELD, // opcode
            asmServiceEndpointClassName, // owner
            FIELD_NAME_OF_SERVICE_BRIDGE, // name
            DESC_OF_SERVICE_BRIDGE_CLASS); // desc
    methodVisitor.visitVarInsn(ALOAD, mapPosition);
    methodVisitor.visitMethodInsn(INVOKEINTERFACE, // opcode
            NAME_OF_SERVICE_BRIDGE_CLASS, // owner
            "doService", // name
            "(Ljava/util/Map;)Ljava/lang/Object;"); // desc
    if (returnInfo != null) {
        methodVisitor.visitTypeInsn(CHECKCAST, // opcode
                returnType.getInternalName()); // type
        methodVisitor.visitInsn(ARETURN);
    } else {
        methodVisitor.visitInsn(POP);
        methodVisitor.visitInsn(RETURN);
    }
    methodVisitor.visitMaxs(paramInfos.size(), paramInfos.size() + 2);
    methodVisitor.visitEnd();

    // Class finalize
    classWriter.visitEnd();

    // try
    // {
    // DataOutputStream dos = new DataOutputStream(
    // new FileOutputStream("EgovType" +
    // serviceProviderInfo.getServiceName() +
    // "Impl.class"));
    // dos.write(classWriter.toByteArray());
    // dos.close();
    // }
    // catch (IOException e)
    // {
    // e.printStackTrace();
    // }

    return classWriter.toByteArray();
}

From source file:enhancer.examples.generator.aop.internal.LoggingGenerator.java

License:Apache License

private void generateMethod(ClassWriter cw, String proxyName, String fieldDesc, Method method) {
    final String methName = method.getName();
    final String methDescr = Type.getMethodDescriptor(method);
    final String[] methdExcs = getInternalNames(method.getExceptionTypes());

    /* Generation start */
    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, methName, methDescr, null, methdExcs);
    mv.visitCode();//ww w.j  ava 2 s . c  o  m

    /* Dump "entry <methog sig>" on the screen */
    mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
    mv.visitLdcInsn("entry " + method);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");

    /* Load delegate */
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, proxyName, DELEGATE, fieldDesc);

    final Class<?> clazz = method.getDeclaringClass();
    final String subjectName = getInternalName(clazz);
    if (!clazz.isInterface()) {
        mv.visitTypeInsn(CHECKCAST, subjectName);
    }

    /* Load arguments */
    int i = 1;
    for (Type type : getArgumentTypes(method)) {
        mv.visitVarInsn(type.getOpcode(ILOAD), i);
        i += type.getSize();
    }

    /* Invoke */
    if (clazz.isInterface()) {
        mv.visitMethodInsn(INVOKEINTERFACE, subjectName, methName, methDescr);
    } else {
        mv.visitMethodInsn(INVOKEVIRTUAL, subjectName, methName, methDescr);
    }

    /* Return */
    mv.visitInsn(getReturnType(method).getOpcode(IRETURN));

    /* Generation end */
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}

From source file:enhancer.examples.generator.proxy.internal.ServiceProxyGenerator.java

License:Apache License

private void generateInit(ClassWriter cw, String proxyName, String inputName) {
    /* Generation start */
    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(" + BC_DESC + ")V", null, null);
    mv.visitCode();//from www.j  a  v  a  2 s  .c  om

    /* Call super constructor */
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");

    /* Construct a service handle and store it in a field */
    mv.visitVarInsn(ALOAD, 0);
    mv.visitTypeInsn(NEW, HANDLE);
    mv.visitInsn(DUP);
    mv.visitLdcInsn(Type.getType("L" + inputName + ";"));
    mv.visitVarInsn(ALOAD, 1);
    mv.visitMethodInsn(INVOKESPECIAL, HANDLE, "<init>",
            "(Ljava/lang/Class;Lorg/osgi/framework/BundleContext;)V");
    mv.visitFieldInsn(PUTFIELD, proxyName, HANDLE_FIELD, HANDLE_DESC);

    /* Return */
    mv.visitInsn(RETURN);

    /* Generation end */
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}

From source file:erjang.beam.CompilerVisitor.java

License:Apache License

/**
 * /*www  . j  av  a  2s  .co  m*/
 */
private void generate_classinit() {
    MethodVisitor mv = cv.visitMethod(ACC_STATIC | ACC_PRIVATE, "<clinit>", "()V", null, null);
    mv.visitCode();

    for (Map.Entry<String, String> ent : funs.entrySet()) {

        String field = ent.getKey();
        String clazz = ent.getValue();

        mv.visitTypeInsn(NEW, clazz);
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, clazz, "<init>", "()V");

        mv.visitFieldInsn(PUTSTATIC, self_type.getInternalName(), field, "L" + funt.get(field) + ";");

    }

    for (Map.Entry<EObject, String> ent : constants.entrySet()) {

        EObject term = ent.getKey();
        term.emit_const(mv);
        mv.visitFieldInsn(Opcodes.PUTSTATIC, self_type.getInternalName(), ent.getValue(),
                Type.getType(term.getClass()).getDescriptor());
    }

    cv.visitField(ACC_STATIC | ACC_PRIVATE, "attributes", ESEQ_TYPE.getDescriptor(), null, null);

    atts.emit_const(mv);
    mv.visitFieldInsn(Opcodes.PUTSTATIC, self_type.getInternalName(), "attributes", ESEQ_TYPE.getDescriptor());

    if (this.module_md5 != null) {
        cv.visitField(ACC_STATIC, "module_md5", EBINARY_TYPE.getDescriptor(), null, null);
        module_md5.emit_const(mv);
        mv.visitFieldInsn(PUTSTATIC, self_type.getInternalName(), "module_md5", EBINARY_TYPE.getDescriptor());
    }

    mv.visitInsn(RETURN);
    mv.visitMaxs(200, 10);
    mv.visitEnd();

    // make the method module_name
    mv = cv.visitMethod(ACC_PROTECTED, "module_name", "()Ljava/lang/String;", null, null);
    mv.visitCode();
    mv.visitLdcInsn(this.module_name.getName());
    mv.visitInsn(ARETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();

    // make the method attributes
    mv = cv.visitMethod(ACC_PROTECTED, "attributes", "()" + ESEQ_TYPE.getDescriptor(), null, null);
    mv.visitCode();
    mv.visitFieldInsn(Opcodes.GETSTATIC, self_type.getInternalName(), "attributes", ESEQ_TYPE.getDescriptor());
    mv.visitInsn(ARETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();

    // make default constructor
    mv = cv.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, ECOMPILEDMODULE_NAME, "<init>", "()V");
    mv.visitInsn(RETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();

    mv = cv.visitMethod(ACC_PUBLIC, "registerImportsAndExports", "()V", null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, ECOMPILEDMODULE_NAME, "registerImportsAndExports", "()V");

    for (Lambda l : lambdas_xx.values()) {

        mv.visitTypeInsn(NEW, Type.getInternalName(LocalFunID.class));
        mv.visitInsn(DUP);

        module_name.emit_const(mv);
        l.fun.emit_const(mv);
        push_int(mv, l.arity);
        push_int(mv, l.old_index);
        push_int(mv, l.index);
        push_int(mv, l.old_uniq);
        mv.visitFieldInsn(GETSTATIC, self_type.getInternalName(), "module_md5", EBINARY_TYPE.getDescriptor());

        mv.visitMethodInsn(INVOKESPECIAL, Type.getInternalName(LocalFunID.class), "<init>",
                "(" + EATOM_DESC + EATOM_DESC + "IIII" + EBINARY_TYPE.getDescriptor() + ")V");

        mv.visitInsn(DUP);
        cv.visitField(ACC_STATIC, anon_fun_name(l), Type.getDescriptor(LocalFunID.class), null, null)
                .visitEnd();
        mv.visitFieldInsn(PUTSTATIC, self_type.getInternalName(), anon_fun_name(l),
                Type.getDescriptor(LocalFunID.class));

        String mname = EUtil.getJavaName(l.fun, l.arity - l.freevars);
        String outer_name = self_type.getInternalName();
        String inner_name = "FN_" + mname;
        String full_inner_name = outer_name + "$" + inner_name;

        mv.visitLdcInsn(full_inner_name.replace('/', '.'));

        mv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(Class.class), "forName",
                "(Ljava/lang/String;)Ljava/lang/Class;");

        mv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(EModuleManager.class), "register_lambda",
                "(" + Type.getDescriptor(LocalFunID.class) + Type.getDescriptor(Class.class) + ")V");
    }

    mv.visitInsn(RETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();

}

From source file:erjang.beam.CompilerVisitor.java

License:Apache License

private void push_int(MethodVisitor mv, int val) {
    if (val == -1) {
        mv.visitInsn(ICONST_M1);/*w ww  .  j a  va 2s.  c  o m*/
    } else if (val >= 0 && val <= 5) {
        mv.visitInsn(ICONST_0 + val);
    } else {
        mv.visitLdcInsn(new Integer(val));
    }

}