Example usage for org.objectweb.asm MethodVisitor visitMaxs

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

Introduction

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

Prototype

public void visitMaxs(final int maxStack, final int maxLocals) 

Source Link

Document

Visits the maximum stack size and the maximum number of local variables of the method.

Usage

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 2  s .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();/*from  w ww .j  a va2  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 generateInit(ClassWriter cw, String proxyName, String fieldDesc) {
    /* Generation start */
    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(" + fieldDesc + ")V", null, null);
    mv.visitCode();/* www. j a v a 2s .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();/*from w ww  .  j  ava  2s. co 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   w  w  w . j a  v a 2 s . co  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();/* w  ww .j av  a2s  .  c  om*/

    /* 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

/**
 * /*from w  w  w  .  jav  a2 s  . 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//from   w w w  .  ja v a2  s .c om
        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   w ww. j  ava2  s.c om
    // 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();

    }
}

From source file:erjang.beam.CompilerVisitor.java

License:Apache License

private static void make_invoke_method(ClassWriter cw, String outer_name, String mname, int arity, boolean proc,
        int freevars, Type returnType, boolean isTailCall) {
    MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "invoke", EUtil.getSignature(arity - freevars, true), null,
            PAUSABLE_EX);/*  www.ja  v a2 s. c  o  m*/
    mv.visitCode();
    if (proc) {
        mv.visitVarInsn(ALOAD, 1);
    }
    for (int i = 0; i < arity - freevars; i++) {
        mv.visitVarInsn(ALOAD, i + 2);
    }
    for (int i = 0; i < freevars; i++) {
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, outer_name + "$FN_" + mname, "fv" + i, EOBJECT_DESC);
    }
    mv.visitMethodInsn(INVOKESTATIC, outer_name, mname, EUtil.getSignature(arity, proc, returnType));

    if (isTailCall) {
        mv.visitVarInsn(ASTORE, arity + 2);

        Label done = new Label();
        Label loop = new Label();
        mv.visitLabel(loop);
        mv.visitVarInsn(ALOAD, arity + 2);
        if (EProc.TAIL_MARKER == null) {
            mv.visitJumpInsn(IFNONNULL, done);
        } else {
            mv.visitFieldInsn(GETSTATIC, EPROC_NAME, "TAIL_MARKER", EOBJECT_DESC);
            mv.visitJumpInsn(IF_ACMPNE, done);
        }

        // load proc
        mv.visitVarInsn(ALOAD, 1);
        mv.visitFieldInsn(GETFIELD, EPROC_NAME, "tail", EFUN_DESCRIPTOR);
        mv.visitVarInsn(ALOAD, 1);

        mv.visitMethodInsn(INVOKEVIRTUAL, EFUN_NAME, "go", GO_DESC);
        mv.visitVarInsn(ASTORE, arity + 2);

        mv.visitJumpInsn(GOTO, loop);

        mv.visitLabel(done);
        mv.visitVarInsn(ALOAD, arity + 2);
    }

    mv.visitInsn(ARETURN);
    mv.visitMaxs(arity + 2, arity + 2);
    mv.visitEnd();
}