Example usage for org.objectweb.asm MethodVisitor visitMethodInsn

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

Introduction

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

Prototype

@Deprecated
public void visitMethodInsn(final int opcode, final String owner, final String name, final String descriptor) 

Source Link

Document

Visits a method instruction.

Usage

From source file:edu.ubc.mirrors.raw.NativeClassGenerator.java

License:Open Source License

@Override
public void visitEnd() {
    if (!isInterface) {
        // Generate the no-argument constructor
        String constructorDesc = Type.getMethodDescriptor(Type.VOID_TYPE);
        MethodVisitor methodVisitor = super.visitMethod(Opcodes.ACC_PUBLIC, "<init>", constructorDesc, null,
                null);//www . j  av  a2s  .c om
        methodVisitor.visitCode();
        methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
        methodVisitor.visitMethodInsn(Opcodes.INVOKESPECIAL, superName, "<init>", constructorDesc);
        methodVisitor.visitInsn(Opcodes.RETURN);
        methodVisitor.visitMaxs(1, 1);
        methodVisitor.visitEnd();
    }

    super.visitEnd();
}

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

License:Apache License

private byte[] createRecordClass(final String className, final RecordType recordType)
        throws ClassNotFoundException {
    String asmClassName = className.replace('.', '/');

    // ClassWriter classWriter = new
    // ClassWriter(0);
    ClassWriter classWriter = new ClassWriter(0);
    classWriter.visit(V1_5, // version
            ACC_PUBLIC, // access
            asmClassName, // name
            null, // signature
            "java/lang/Object", // superName
            null); // interfaces

    // Create Annotation
    AnnotationVisitor annotationVisitor = classWriter.visitAnnotation(DESC_OF_XML_ACCESSOR_TYPE, true);
    annotationVisitor.visitEnum("value", // name
            DESC_OF_XML_ACCESS_TYPE, // desc
            "FIELD"); // value
    annotationVisitor.visitEnd();/*from   ww  w.  j a v  a  2s .  c o  m*/

    // Create Fields
    for (Entry<String, Type> entry : recordType.getFieldTypes().entrySet()) {
        String fieldName = entry.getKey();
        Type fieldType = entry.getValue();

        Class<?> fieldTypeClass = loadClass(fieldType);
        String desc = org.objectweb.asm.Type.getDescriptor(fieldTypeClass);

        classWriter.visitField(ACC_PUBLIC, // access
                fieldName, // name
                desc, // desc
                null, // signature
                null); // value
    }

    // 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();

    // Class finalize
    classWriter.visitEnd();

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

    return classWriter.toByteArray();
}

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();/* w ww . jav  a  2 s  . c  om*/

    // 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 generateInit(ClassWriter cw, String proxyName, String fieldDesc) {
    /* Generation start */
    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(" + fieldDesc + ")V", null, null);
    mv.visitCode();// w w w .  j a va  2  s. c  o  m

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

    /* Set delegate field */
    mv.visitVarInsn(ALOAD, 0);
    mv.visitVarInsn(ALOAD, 1);
    mv.visitFieldInsn(PUTFIELD, proxyName, DELEGATE, fieldDesc);

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

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

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  av  a  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();//ww  w .  j ava2s .  c  o m

    /* 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:enhancer.examples.generator.proxy.internal.ServiceProxyGenerator.java

License:Apache License

private void generateMethod(ClassWriter cw, String proxyName, 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();//from w  ww .ja v a 2  s.  co  m

    /* Dereference dynamic handle */
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, proxyName, HANDLE_FIELD, HANDLE_DESC);
    mv.visitMethodInsn(INVOKEVIRTUAL, HANDLE, "get", "()Ljava/lang/Object;");

    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:erjang.beam.CompilerVisitor.java

License:Apache License

/**
 * //  ww  w .  ja va 2s  .  c o  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

static public byte[] make_invoker(String module, String function, Type self_type, String mname, String fname,
        int arity, boolean proc, boolean exported, Lambda lambda, Type return_type, boolean is_tail_call,
        final boolean is_pausable) {

    int freevars = lambda == null ? 0 : lambda.freevars;

    String outer_name = self_type.getInternalName();
    String inner_name = "FN_" + mname;
    String full_inner_name = outer_name + "$" + inner_name;

    ClassWriter cw = new ClassWriter(true);
    int residual_arity = arity - freevars;
    String super_class_name = EFUN_NAME + residual_arity + (exported ? "Exported" : "");
    if (exported)
        EFun.ensure_exported(residual_arity);
    else// ww w. j a  v  a2 s  .c  o m
        EFun.ensure(residual_arity);

    cw.visit(V1_6, ACC_FINAL | ACC_PUBLIC, full_inner_name, null, super_class_name, null);

    if (lambda != null) {
        cw.visitField(ACC_STATIC | ACC_PUBLIC | ACC_FINAL, "index", "I", null, new Integer(lambda.index));
        cw.visitField(ACC_STATIC | ACC_PUBLIC | ACC_FINAL, "old_index", "I", null,
                new Integer(lambda.old_index));
        cw.visitField(ACC_STATIC | ACC_PUBLIC | ACC_FINAL, "old_uniq", "I", null, new Integer(lambda.old_uniq));

        /** */
        MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "encode",
                "(" + Type.getDescriptor(EOutputStream.class) + ")V", null, null);
        mv.visitCode();

        mv.visitVarInsn(ALOAD, 1);

        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, full_inner_name, "pid", EPID_TYPE.getDescriptor());
        mv.visitLdcInsn(module);

        mv.visitFieldInsn(GETSTATIC, full_inner_name, "old_index", "I");
        mv.visitInsn(I2L);
        mv.visitLdcInsn(new Integer(arity));
        mv.visitFieldInsn(GETSTATIC, outer_name, "module_md5", EBINARY_TYPE.getDescriptor());

        mv.visitFieldInsn(GETSTATIC, full_inner_name, "index", "I");
        mv.visitInsn(I2L);
        mv.visitFieldInsn(GETSTATIC, full_inner_name, "old_uniq", "I");
        mv.visitInsn(I2L);

        mv.visitLdcInsn(new Integer(freevars));
        mv.visitTypeInsn(ANEWARRAY, EOBJECT_NAME);

        for (int i = 0; i < freevars; i++) {
            mv.visitInsn(DUP);

            if (i <= 5) {
                mv.visitInsn(ICONST_0 + i);
            } else {
                mv.visitLdcInsn(new Integer(i));
            }

            mv.visitVarInsn(ALOAD, 0); // load self
            mv.visitFieldInsn(GETFIELD, full_inner_name, "fv" + i, EOBJECT_DESC);

            mv.visitInsn(AASTORE);
        }

        mv.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(EOutputStream.class), "write_fun",
                "(" + EPID_TYPE.getDescriptor() + "Ljava/lang/String;" + "JI" + EBINARY_TYPE.getDescriptor()
                        + "JJ" + Type.getDescriptor(EObject[].class) + ")V");

        mv.visitInsn(RETURN);
        mv.visitMaxs(10, 3);
        mv.visitEnd();
    }

    make_constructor(cw, module, function, full_inner_name, super_class_name, lambda, exported);

    make_go_method(cw, outer_name, fname, full_inner_name, arity, proc, freevars, return_type, is_tail_call,
            is_pausable);

    make_go2_method(cw, outer_name, fname, full_inner_name, arity, proc, freevars, return_type, is_tail_call,
            is_pausable);

    return cw.toByteArray();

}

From source file:erjang.beam.CompilerVisitor.java

License:Apache License

private static void make_constructor(ClassWriter cw, String module_name, String function_name,
        String full_inner_name, String super_class_name, Lambda lambda, boolean exported) {
    StringBuilder sb = new StringBuilder("(");
    int freevars = lambda == null ? 0 : lambda.freevars;
    if (lambda != null) {
        sb.append(EPID_TYPE.getDescriptor());
        cw.visitField(ACC_PUBLIC | ACC_FINAL, "pid", EPID_TYPE.getDescriptor(), null, null);
    }/*from  ww w. j  a  va2s  .  c o  m*/
    // create the free vars
    for (int i = 0; i < freevars; i++) {
        cw.visitField(ACC_PUBLIC | ACC_FINAL, "fv" + i, EOBJECT_DESC, null, null);
        sb.append(EOBJECT_DESC);
    }
    sb.append(")V");

    MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", sb.toString(), null, null);
    mv.visitCode();

    mv.visitVarInsn(ALOAD, 0);
    if (exported) {
        mv.visitLdcInsn(module_name);
        mv.visitLdcInsn(function_name);
        mv.visitMethodInsn(INVOKESPECIAL, super_class_name, "<init>",
                "(Ljava/lang/String;Ljava/lang/String;)V");
    } else {
        mv.visitMethodInsn(INVOKESPECIAL, super_class_name, "<init>", "()V");
    }

    if (lambda != null) {
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitFieldInsn(PUTFIELD, full_inner_name, "pid", EPID_TYPE.getDescriptor());

    }

    for (int i = 0; i < freevars; i++) {
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, i + 2);
        mv.visitFieldInsn(PUTFIELD, full_inner_name, "fv" + i, EOBJECT_DESC);
    }

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

    if (lambda != null) {
        mv = cw.visitMethod(ACC_PROTECTED, "get_env", "()" + ESEQ_DESC, null, null);
        mv.visitCode();
        mv.visitFieldInsn(GETSTATIC, ERT_NAME, "NIL", ENIL_TYPE.getDescriptor());
        for (int i = freevars - 1; i >= 0; i--) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, full_inner_name, "fv" + i, EOBJECT_DESC);
            mv.visitMethodInsn(INVOKEVIRTUAL, ESEQ_NAME, "cons", "(" + EOBJECT_DESC + ")" + ESEQ_DESC);
        }
        mv.visitInsn(ARETURN);
        mv.visitMaxs(3, 3);
        mv.visitEnd();

        mv = cw.visitMethod(ACC_PROTECTED, "get_pid", "()" + EOBJECT_DESC, null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, full_inner_name, "pid", EPID_TYPE.getDescriptor());
        mv.visitInsn(ARETURN);
        mv.visitMaxs(3, 3);
        mv.visitEnd();

        mv = cw.visitMethod(ACC_PROTECTED, "get_id", "()" + Type.getDescriptor(FunID.class), null, null);
        mv.visitCode();
        mv.visitFieldInsn(GETSTATIC, full_inner_name.substring(0, full_inner_name.indexOf('$')),
                anon_fun_name(lambda), Type.getDescriptor(LocalFunID.class));
        mv.visitInsn(ARETURN);
        mv.visitMaxs(3, 3);
        mv.visitEnd();

    }
}