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

License:Apache License

public static EFun get_fun_with_handler(String module, String function, int arity, EFunHandler handler,
        ClassLoader loader) {/*from  ww  w.j  a  v  a  2 s  . c  o  m*/
    String signature = module + function + arity;
    Constructor<? extends EFun> h = handlers.get(signature);

    if (h == null) {

        get_fun_class(arity);

        String safe_function = JAVA_ID.matcher(function).matches() ? function : make_valid_java_id(function);
        StringBuffer sb = new StringBuffer();
        String self_type = sb.append(EFUN_TYPE.getInternalName()).append(module).append(safe_function)
                .append("Handler").append(arity).toString();

        ClassWriter cw = new ClassWriter(true);
        String super_class_name = EFUN_TYPE.getInternalName() + arity;
        cw.visit(Opcodes.V1_4, ACC_PUBLIC, self_type, null, super_class_name, null);

        // create handler field
        cw.visitField(ACC_PRIVATE, "handler", EFUNHANDLER_TYPE.getDescriptor(), null, null).visitEnd();
        cw.visitField(ACC_PRIVATE | ACC_FINAL, "module_name", EATOM_DESC, null, null).visitEnd();
        cw.visitField(ACC_PRIVATE | ACC_FINAL, "function_name", EATOM_DESC, null, null).visitEnd();

        // make constructor
        MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(" + EFUNHANDLER_TYPE.getDescriptor() + ")V",
                null, null);
        mv.visitCode();

        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, super_class_name, "<init>", "()V");

        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitFieldInsn(PUTFIELD, self_type, "handler", EFUNHANDLER_TYPE.getDescriptor());
        mv.visitVarInsn(ALOAD, 0);
        mv.visitLdcInsn(module);
        mv.visitMethodInsn(INVOKESTATIC, EATOM_TYPE.getInternalName(), "intern",
                "(Ljava/lang/String;)Lerjang/EAtom;");
        mv.visitFieldInsn(PUTFIELD, self_type, "module_name", EATOM_DESC);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitLdcInsn(function);
        mv.visitMethodInsn(INVOKESTATIC, EATOM_TYPE.getInternalName(), "intern",
                "(Ljava/lang/String;)Lerjang/EAtom;");
        mv.visitFieldInsn(PUTFIELD, self_type, "function_name", EATOM_DESC);

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

        /** forward toString to handler */
        mv = cw.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0); // load self
        mv.visitFieldInsn(GETFIELD, self_type, "handler", EFUNHANDLER_TYPE.getDescriptor());
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "toString", "()Ljava/lang/String;");
        mv.visitInsn(ARETURN);
        mv.visitMaxs(3, 3);
        mv.visitEnd();

        // make invoke_tail method
        //CompilerVisitor.make_invoketail_method(cw, self_type, arity, 0);
        make_invoke_method(cw, self_type, arity);
        make_go_method(cw, self_type, arity);
        make_encode_method(cw, self_type, arity);

        cw.visitEnd();
        byte[] data = cw.toByteArray();

        data = weave(data);

        Class<? extends EFun> clazz = ERT.defineClass(loader, self_type.replace('/', '.'), data);

        try {
            h = clazz.getConstructor(EFunHandler.class);
        } catch (Exception e) {
            throw new Error(e);
        }

        handlers.put(signature, h);
    }

    try {
        return h.newInstance(handler);
    } catch (Exception e) {
        throw new Error(e);
    }
}

From source file:erjang.EFun.java

License:Apache License

private static void make_go_method(ClassWriter cw, String self_type, int arity) {
    MethodVisitor mv;
    mv = cw.visitMethod(ACC_PUBLIC, "go", GO_DESC, null, PAUSABLE_EX);
    mv.visitCode();/*from w  w w.  j a  va 2 s  . c  o  m*/

    for (int i = 0; i < arity; i++) {
        mv.visitVarInsn(ALOAD, 1);
        mv.visitFieldInsn(GETFIELD, EPROC_NAME, "arg" + i, EOBJECT_DESC);
        mv.visitVarInsn(ASTORE, i + 2);
    }
    for (int i = 0; i < arity; i++) {
        mv.visitVarInsn(ALOAD, 1);
        mv.visitInsn(ACONST_NULL);
        mv.visitFieldInsn(PUTFIELD, EPROC_NAME, "arg" + i, EOBJECT_DESC);
    }

    // load handler
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, self_type, "handler", EFUNHANDLER_TYPE.getDescriptor());

    // load proc
    mv.visitVarInsn(ALOAD, 1);

    // create array
    mv.visitLdcInsn(new Integer(arity));
    mv.visitTypeInsn(ANEWARRAY, EOBJECT_TYPE.getInternalName());

    for (int i = 0; i < arity; i++) {
        mv.visitInsn(DUP);
        mv.visitLdcInsn(new Integer(i));
        mv.visitVarInsn(ALOAD, i + 2);
        mv.visitInsn(AASTORE);
    }

    mv.visitMethodInsn(INVOKEINTERFACE, EFUNHANDLER_TYPE.getInternalName(), "invoke",
            "(" + EPROC_TYPE.getDescriptor() + "[" + EOBJECT_DESC + ")" + EOBJECT_DESC);
    mv.visitInsn(ARETURN);
    mv.visitMaxs(arity + 2, arity + 2);
    mv.visitEnd();

    cw.visitEnd();
}

From source file:erjang.EFun.java

License:Apache License

static void make_encode_method(ClassWriter cw, String className, int arity) {
    MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "encode",
            "(" + Type.getDescriptor(EOutputStream.class) + ")V", null, null);
    mv.visitCode();/*  w w  w . jav a2  s.  com*/

    mv.visitVarInsn(ALOAD, 1);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, className, "module_name", EATOM_DESC);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, className, "function_name", EATOM_DESC);
    mv.visitLdcInsn(new Integer(arity));

    mv.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(EOutputStream.class), "write_external_fun",
            "(" + EATOM_DESC + EATOM_DESC + "I)V");

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

From source file:erjang.EFun.java

License:Apache License

static void make_encode_method_for_exported(ClassWriter cw, String className, int arity) {
    MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "encode",
            "(" + Type.getDescriptor(EOutputStream.class) + ")V", null, null);
    mv.visitCode();// www.  ja va2  s . com

    mv.visitVarInsn(ALOAD, 1);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, className, "module_name", EATOM_DESC);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, className, "function_name", EATOM_DESC);
    mv.visitLdcInsn(new Integer(arity));

    mv.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(EOutputStream.class), "write_external_fun",
            "(" + EATOM_DESC + EATOM_DESC + "I)V");

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

From source file:erjang.EFun.java

License:Apache License

/**
 * @param mv//from  www. ja v a  2s  . c  om
 * @param i
 */
private static void push_int(MethodVisitor mv, int i) {
    if (i >= -1 && i <= 5) {
        mv.visitInsn(Opcodes.ICONST_0 + i);
    } else {
        mv.visitLdcInsn(new Integer(i));
    }
}

From source file:erjang.ESmall.java

License:Apache License

@Override
public org.objectweb.asm.Type emit_const(MethodVisitor fa) {

    Type type = ESMALL_TYPE;/*from www  .j  av  a  2 s  .c  o  m*/

    fa.visitTypeInsn(Opcodes.NEW, type.getInternalName());
    fa.visitInsn(Opcodes.DUP);
    fa.visitLdcInsn(new Integer(value));
    fa.visitMethodInsn(Opcodes.INVOKESPECIAL, type.getInternalName(), "<init>", "(I)V");

    return type;
}

From source file:erjang.EStringList.java

License:Apache License

@Override
public Type emit_const(MethodVisitor fa) {

    Type type = ESTRINGLIST_TYPE;

    char[] ch = new char[len];
    for (int i = 0; i < len; i++) {
        ch[i] = (char) (0xff & (int) bytes.data[off + i]);
    }/*  ww w  .j a v  a2  s . c o m*/

    fa.visitLdcInsn(new String(ch));
    tail.emit_const(fa);
    fa.visitMethodInsn(Opcodes.INVOKESTATIC, type.getInternalName(), "fromString",
            "(" + STRING_TYPE.getDescriptor() + ESEQ_DESC + ")" + type.getDescriptor());

    return type;
}

From source file:erjang.ETuple.java

License:Apache License

private static void create_count(ClassAdapter cw, int n) {
    MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "arity", "()I", null, null);
    mv.visitCode();//from  www. j a v a  2 s.  com

    if (n <= 5) {
        mv.visitInsn(Opcodes.ICONST_0 + n);
    } else {
        mv.visitLdcInsn(new Integer(n));
    }
    mv.visitInsn(Opcodes.IRETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();
}

From source file:erjang.ETuple.java

License:Apache License

private static void create_cast(ClassAdapter cw, int n) {
    MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "cast",
            "(L" + ETUPLE_NAME + ";)L" + ETUPLE_NAME + n + ";", null, null);
    mv.visitCode();//from   w ww .  jav  a2s.  c  o  m

    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, ETUPLE_NAME, "arity", "()I");

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

    Label fail = new Label();

    mv.visitJumpInsn(Opcodes.IF_ICMPNE, fail);
    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitTypeInsn(Opcodes.CHECKCAST, ETUPLE_NAME + n);
    mv.visitInsn(Opcodes.ARETURN);

    mv.visitLabel(fail);
    mv.visitInsn(Opcodes.ACONST_NULL);
    mv.visitInsn(Opcodes.ARETURN);

    mv.visitMaxs(2, 2);
    mv.visitEnd();
}

From source file:fr.insalyon.citi.golo.compiler.JavaBytecodeStructGenerator.java

License:Apache License

private void makeSetMethod(ClassWriter classWriter, Struct struct) {
    String owner = struct.getPackageAndClass().toJVMType();
    MethodVisitor visitor = classWriter.visitMethod(ACC_PUBLIC, "set",
            "(Ljava/lang/String;Ljava/lang/Object;)Lgololang/GoloStruct;", null, null);
    visitor.visitCode();/*from ww  w  .  ja v a2 s  .  c  o  m*/
    insertPrivateElementCheck(struct, visitor);
    Label nextCase = new Label();
    for (String member : struct.getMembers()) {
        visitor.visitLdcInsn(member);
        visitor.visitVarInsn(ALOAD, 1);
        visitor.visitJumpInsn(IF_ACMPNE, nextCase);
        visitor.visitVarInsn(ALOAD, 0);
        visitor.visitVarInsn(ALOAD, 2);
        visitor.visitMethodInsn(INVOKEVIRTUAL, owner, member, "(Ljava/lang/Object;)Lgololang/GoloStruct;");
        visitor.visitInsn(ARETURN);
        visitor.visitLabel(nextCase);
        nextCase = new Label();
    }
    insertUnknowElementCode(struct, visitor);
    visitor.visitMaxs(0, 0);
    visitor.visitEnd();
}