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:org.eclipse.golo.compiler.JavaBytecodeStructGenerator.java

License:Open Source 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;)L" + owner + ";", null, null);
    visitor.visitCode();//from w w w  .  ja va2s  .  c o m
    insertPrivateElementCheck(struct, visitor);
    Label nextCase = new Label();
    for (Member member : struct.getMembers()) {
        visitor.visitLdcInsn(member.getName());
        visitor.visitVarInsn(ALOAD, 1);
        visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false);
        visitor.visitJumpInsn(IFEQ, nextCase);
        visitor.visitVarInsn(ALOAD, 0);
        visitor.visitVarInsn(ALOAD, 2);
        visitor.visitMethodInsn(INVOKEVIRTUAL, owner, member.getName(), "(Ljava/lang/Object;)L" + owner + ";",
                false);
        visitor.visitInsn(ARETURN);
        visitor.visitLabel(nextCase);
        nextCase = new Label();
    }
    insertUnknowElementCode(struct, visitor);
    visitor.visitMaxs(0, 0);
    visitor.visitEnd();
}

From source file:org.eclipse.golo.compiler.JavaBytecodeStructGenerator.java

License:Open Source License

private void makeGetMethod(ClassWriter classWriter, Struct struct) {
    String owner = struct.getPackageAndClass().toJVMType();
    MethodVisitor visitor = classWriter.visitMethod(ACC_PUBLIC, "get", "(Ljava/lang/String;)Ljava/lang/Object;",
            null, null);/*from   w  w  w.jav a  2  s .  co  m*/
    visitor.visitCode();
    insertPrivateElementCheck(struct, visitor);
    Label nextCase = new Label();
    for (Member member : struct.getMembers()) {
        visitor.visitLdcInsn(member.getName());
        visitor.visitVarInsn(ALOAD, 1);
        visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false);
        visitor.visitJumpInsn(IFEQ, nextCase);
        visitor.visitVarInsn(ALOAD, 0);
        visitor.visitMethodInsn(INVOKEVIRTUAL, owner, member.getName(), "()Ljava/lang/Object;", false);
        visitor.visitInsn(ARETURN);
        visitor.visitLabel(nextCase);
        nextCase = new Label();
    }
    insertUnknowElementCode(struct, visitor);
    visitor.visitMaxs(0, 0);
    visitor.visitEnd();
}

From source file:org.eclipse.golo.compiler.JavaBytecodeStructGenerator.java

License:Open Source License

private void throwLocalized(MethodVisitor visitor, String exceptionType, String message, String structName) {
    visitor.visitTypeInsn(NEW, exceptionType);
    visitor.visitInsn(DUP);/*  w  w  w  .j  av a 2  s . c o  m*/
    visitor.visitLdcInsn(message);
    visitor.visitInsn(ICONST_1);
    visitor.visitTypeInsn(ANEWARRAY, "java/lang/Object");
    visitor.visitInsn(DUP);
    visitor.visitInsn(ICONST_0);
    visitor.visitLdcInsn(structName);
    visitor.visitInsn(AASTORE);
    visitor.visitMethodInsn(INVOKESTATIC, "gololang/Messages", "message",
            "(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;", false);
    visitor.visitMethodInsn(INVOKESPECIAL, exceptionType, "<init>", "(Ljava/lang/String;)V", false);
    visitor.visitInsn(ATHROW);
}

From source file:org.eclipse.golo.compiler.JavaBytecodeStructGenerator.java

License:Open Source License

private void insertPrivateElementCheck(Struct struct, MethodVisitor visitor) {
    Label afterPrivateCheck = new Label();
    visitor.visitVarInsn(ALOAD, 1);//from   w  w w . ja  v a 2  s .com
    visitor.visitLdcInsn("_");
    visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "startsWith", "(Ljava/lang/String;)Z", false);
    visitor.visitJumpInsn(IFEQ, afterPrivateCheck);
    throwLocalized(visitor, "java/lang/IllegalArgumentException", "struct_private_member",
            struct.getPackageAndClass().toString());
    visitor.visitLabel(afterPrivateCheck);
}

From source file:org.eclipse.golo.compiler.JavaBytecodeStructGenerator.java

License:Open Source License

private void makeToString(ClassWriter classWriter, Struct struct) {
    String owner = struct.getPackageAndClass().toJVMType();
    MethodVisitor visitor = classWriter.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null);
    visitor.visitCode();/*w  w w. ja  v a 2  s . c  o  m*/
    visitor.visitTypeInsn(NEW, "java/lang/StringBuilder");
    visitor.visitInsn(DUP);
    visitor.visitLdcInsn("struct " + struct.getPackageAndClass().className() + "{");
    visitor.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V", false);
    boolean first = true;
    for (Member member : struct.getPublicMembers()) {
        visitor.visitInsn(DUP);
        visitor.visitLdcInsn((!first ? ", " : "") + member.getName() + "=");
        first = false;
        visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
        visitor.visitInsn(DUP);
        visitor.visitVarInsn(ALOAD, 0);
        visitor.visitFieldInsn(GETFIELD, owner, member.getName(), "Ljava/lang/Object;");
        visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                "(Ljava/lang/Object;)Ljava/lang/StringBuilder;", false);
    }
    visitor.visitLdcInsn("}");
    visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
            "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
    visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;",
            false);
    visitor.visitInsn(ARETURN);
    visitor.visitMaxs(0, 0);
    visitor.visitEnd();
}

From source file:org.eclipse.golo.compiler.JavaBytecodeStructGenerator.java

License:Open Source License

private void initMembersField(Struct struct, String owner, MethodVisitor visitor) {
    int arg;/* w  w  w  . java2s. co m*/
    visitor.visitVarInsn(ALOAD, 0);
    loadInteger(visitor, struct.getPublicMembers().size());
    visitor.visitTypeInsn(ANEWARRAY, "java/lang/String");
    arg = 0;
    for (Member member : struct.getPublicMembers()) {
        visitor.visitInsn(DUP);
        loadInteger(visitor, arg);
        visitor.visitLdcInsn(member.getName());
        visitor.visitInsn(AASTORE);
        arg++;
    }
    visitor.visitFieldInsn(PUTFIELD, owner, "members", "[Ljava/lang/String;");
}

From source file:org.eclipse.golo.compiler.JavaBytecodeUnionGenerator.java

License:Open Source License

private void makeToString(ClassWriter classWriter, UnionValue value) {
    MethodVisitor visitor = classWriter.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null);
    visitor.visitCode();//from   w w w .ja  v  a2 s.com
    if (!value.hasMembers()) {
        visitor.visitLdcInsn(
                "union " + value.getUnion().getPackageAndClass().className() + "." + value.getName());
    } else {
        visitor.visitTypeInsn(NEW, "java/lang/StringBuilder");
        visitor.visitInsn(DUP);
        visitor.visitLdcInsn(
                "union " + value.getUnion().getPackageAndClass().className() + "." + value.getName() + "{");
        visitor.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V",
                false);
        visitor.visitVarInsn(ASTORE, 1);
        boolean first = true;
        for (Member member : value.getMembers()) {
            visitor.visitVarInsn(ALOAD, 1);
            visitor.visitLdcInsn((first ? "" : ", ") + member.getName() + "=");
            visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                    "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
            visitor.visitInsn(POP);

            visitor.visitVarInsn(ALOAD, 1);
            visitor.visitVarInsn(ALOAD, 0);
            visitor.visitFieldInsn(GETFIELD, value.getPackageAndClass().toJVMType(), member.getName(),
                    "Ljava/lang/Object;");
            visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                    "(Ljava/lang/Object;)Ljava/lang/StringBuilder;", false);
            visitor.visitInsn(POP);
            first = false;
        }

        visitor.visitVarInsn(ALOAD, 1);
        visitor.visitLdcInsn("}");
        visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
        visitor.visitInsn(POP);
        visitor.visitVarInsn(ALOAD, 1);
        visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;",
                false);
    }
    visitor.visitInsn(ARETURN);
    visitor.visitMaxs(0, 0);
    visitor.visitEnd();
}

From source file:org.eclipse.m2m.atl.emftvm.jit.CodeBlockJIT.java

License:Open Source License

/**
 * Generates bytecode for checking the VM monitor
 * @param mv the method visitor to generate code for
 * @param pc the current program counter
 *//*from www .j a  v a2  s  .co  m*/
protected static void generateCheckMonitor(final MethodVisitor mv, final int pc) {
    // Labels
    final Label notTerminated = new Label();
    // Generate bytecode
    mv.visitVarInsn(ALOAD, 3); // monitor: [..., monitor]
    mv.visitMethodInsn(INVOKEINTERFACE, // monitor.isTerminated(): [..., boolean]
            Type.getInternalName(VMMonitor.class), "isTerminated",
            Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[0]));
    mv.visitJumpInsn(IFEQ, notTerminated); // jump if isTerminated == false: [...]
    mv.visitTypeInsn(NEW, Type.getInternalName(VMException.class)); // new VMException: [..., vme]
    mv.visitInsn(DUP); // [..., vme, vme]
    mv.visitVarInsn(ALOAD, 1); // frame: [..., vme, vme, frame]
    mv.visitLdcInsn("Execution terminated."); // [..., vme, vme, frame, msg]
    mv.visitMethodInsn(INVOKESPECIAL, // vme.<init>(frame, msg): [..., vme]
            Type.getInternalName(VMException.class), "<init>", Type.getMethodDescriptor(Type.VOID_TYPE,
                    new Type[] { Type.getType(StackFrame.class), Type.getType(String.class) }));
    mv.visitInsn(ATHROW); // throw vme: [...]
    mv.visitLabel(notTerminated);
    mv.visitVarInsn(ALOAD, 1); // frame: [..., frame]
    generatePushInt(mv, pc); // [..., frame, pc]
    mv.visitMethodInsn(INVOKEVIRTUAL, // frame.setPc(pc): [...] 
            Type.getInternalName(StackFrame.class), "setPc",
            Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] { Type.INT_TYPE }));
    mv.visitVarInsn(ALOAD, 3); // monitor: [..., monitor]
    mv.visitVarInsn(ALOAD, 1); // frame: [..., monitor, frame]
    mv.visitMethodInsn(INVOKEINTERFACE, // monitor.step(frame): [...]
            Type.getInternalName(VMMonitor.class), "step",
            Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] { Type.getType(StackFrame.class) }));
}

From source file:org.eclipse.m2m.atl.emftvm.jit.CodeBlockJIT.java

License:Open Source License

/**
 * Generates an optimised instruction for pushing a constant integer <code>value</code>
 * onto the stack.//from   ww  w .ja va2 s.  co m
 * @param value the constant integer value to push
 */
static void generatePushInt(final MethodVisitor mv, final int value) {
    if (value >= -1 && value <= 5) {
        switch (value) {
        case -1:
            mv.visitInsn(ICONST_M1);
            break;
        case 0:
            mv.visitInsn(ICONST_0);
            break;
        case 1:
            mv.visitInsn(ICONST_1);
            break;
        case 2:
            mv.visitInsn(ICONST_2);
            break;
        case 3:
            mv.visitInsn(ICONST_3);
            break;
        case 4:
            mv.visitInsn(ICONST_4);
            break;
        default:
            mv.visitInsn(ICONST_5);
            assert value == 5;
            break;
        }
    } else if (value < Byte.MAX_VALUE && value > Byte.MIN_VALUE) {
        mv.visitIntInsn(BIPUSH, value);
    } else if (value < Short.MAX_VALUE && value > Short.MIN_VALUE) {
        mv.visitIntInsn(SIPUSH, value);
    } else {
        mv.visitLdcInsn(value);
    }
}

From source file:org.eclipse.objectteams.otredyn.bytecode.asm.AddAfterClassLoadingHook.java

License:Open Source License

void createHookCall(MethodVisitor clinit) {
    if (clazz.isTeam())
        clinit.visitLdcInsn(Type.getObjectType(clazz.getName().replace('.', '/')));
    else/*  w w w.j ava2  s .  c o  m*/
        clinit.visitInsn(Opcodes.ACONST_NULL);
    clinit.visitMethodInsn(INVOKESTATIC, TARGET_CLASS_NAME, TARGET_METHOD_NAME, TARGET_METHOD_DESC, false);
}