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:fr.insalyon.citi.golo.compiler.JavaBytecodeStructGenerator.java

License:Apache 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);//ww w.j  av a2s  .com
    visitor.visitCode();
    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.visitMethodInsn(INVOKEVIRTUAL, owner, member, "()Ljava/lang/Object;");
        visitor.visitInsn(ARETURN);
        visitor.visitLabel(nextCase);
        nextCase = new Label();
    }
    insertUnknowElementCode(struct, visitor);
    visitor.visitMaxs(0, 0);
    visitor.visitEnd();
}

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

License:Apache License

private void insertPrivateElementCheck(Struct struct, MethodVisitor visitor) {
    Label afterPrivateCheck = new Label();
    visitor.visitVarInsn(ALOAD, 1);// w  ww  .  j a  v  a 2 s .c  o  m
    visitor.visitLdcInsn("_");
    visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "startsWith", "(Ljava/lang/String;)Z");
    visitor.visitJumpInsn(IFEQ, afterPrivateCheck);
    visitor.visitTypeInsn(NEW, "java/lang/IllegalArgumentException");
    visitor.visitInsn(DUP);
    visitor.visitLdcInsn("Private member of " + struct.getPackageAndClass().toString());
    visitor.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalArgumentException", "<init>",
            "(Ljava/lang/String;)V");
    visitor.visitInsn(ATHROW);
    visitor.visitLabel(afterPrivateCheck);
}

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

License:Apache License

private void insertUnknowElementCode(Struct struct, MethodVisitor visitor) {
    visitor.visitTypeInsn(NEW, "java/lang/IllegalArgumentException");
    visitor.visitInsn(DUP);/*  w  w  w  .  ja  v a 2s . c  om*/
    visitor.visitLdcInsn("Unknown member in " + struct.getPackageAndClass().toString());
    visitor.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalArgumentException", "<init>",
            "(Ljava/lang/String;)V");
    visitor.visitInsn(ATHROW);
}

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

License:Apache 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();//from  w  ww  . j a  v a  2s  .  co  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");
    boolean first = true;
    for (String member : struct.getPublicMembers()) {
        visitor.visitInsn(DUP);
        visitor.visitLdcInsn((!first ? ", " : "") + member + "=");
        first = false;
        visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
        visitor.visitInsn(DUP);
        visitor.visitVarInsn(ALOAD, 0);
        visitor.visitFieldInsn(GETFIELD, owner, member, "Ljava/lang/Object;");
        visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                "(Ljava/lang/Object;)Ljava/lang/StringBuilder;");
    }
    visitor.visitLdcInsn("}");
    visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
            "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
    visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;");
    visitor.visitInsn(ARETURN);
    visitor.visitMaxs(0, 0);
    visitor.visitEnd();
}

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

License:Apache License

private void initMembersField(Struct struct, String owner, MethodVisitor visitor) {
    int arg;//w ww  .  j  av  a2 s.c om
    visitor.visitVarInsn(ALOAD, 0);
    loadInteger(visitor, struct.getPublicMembers().size());
    visitor.visitTypeInsn(ANEWARRAY, "java/lang/String");
    arg = 0;
    for (String name : struct.getPublicMembers()) {
        visitor.visitInsn(DUP);
        loadInteger(visitor, arg);
        visitor.visitLdcInsn(name);
        visitor.visitInsn(AASTORE);
        arg = arg + 1;
    }
    visitor.visitFieldInsn(PUTFIELD, owner, "members", "[Ljava/lang/String;");
}

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

License:Apache License

private void makeSetter(ClassWriter classWriter, String owner, String name) {
    int accessFlag = name.startsWith("_") ? ACC_PRIVATE : ACC_PUBLIC;
    MethodVisitor visitor = classWriter.visitMethod(accessFlag, name,
            "(Ljava/lang/Object;)Lgololang/GoloStruct;", null, null);
    visitor.visitCode();/*w  w  w.j a va  2s.  co  m*/
    visitor.visitVarInsn(ALOAD, 0);
    visitor.visitFieldInsn(GETFIELD, owner, $_frozen, "Z");
    Label setLabel = new Label();
    visitor.visitJumpInsn(IFEQ, setLabel);
    visitor.visitTypeInsn(NEW, "java/lang/IllegalStateException");
    visitor.visitInsn(DUP);
    visitor.visitLdcInsn("The struct instance is frozen");
    visitor.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalStateException", "<init>",
            "(Ljava/lang/String;)V");
    visitor.visitInsn(ATHROW);
    visitor.visitLabel(setLabel);
    visitor.visitVarInsn(ALOAD, 0);
    visitor.visitVarInsn(ALOAD, 1);
    visitor.visitFieldInsn(PUTFIELD, owner, name, "Ljava/lang/Object;");
    visitor.visitVarInsn(ALOAD, 0);
    visitor.visitInsn(ARETURN);
    visitor.visitMaxs(0, 0);
    visitor.visitEnd();
}

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

License:Apache License

private void makeToString(ClassWriter classWriter, Union.Value value) {
    MethodVisitor visitor = classWriter.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null);
    visitor.visitCode();//from  www. ja  va 2  s.c  o m
    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 (String member : value.getMembers()) {
            visitor.visitVarInsn(ALOAD, 1);
            visitor.visitLdcInsn((first ? "" : ", ") + member + "=");
            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,
                    "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:fr.insalyon.citi.golo.compiler.JavaBytecodeUtils.java

License:Apache License

static void loadInteger(MethodVisitor methodVisitor, int value) {
    if (between(value, Short.MIN_VALUE, Short.MAX_VALUE)) {
        if (between(value, Byte.MIN_VALUE, Byte.MAX_VALUE)) {
            if (between(value, -1, 5)) {
                methodVisitor.visitInsn(ICONST[value + 1]);
            } else {
                methodVisitor.visitIntInsn(BIPUSH, value);
            }/*from   w  w w . j a v  a2 s  .  co m*/
        } else {
            methodVisitor.visitIntInsn(SIPUSH, value);
        }
    } else {
        methodVisitor.visitLdcInsn(value);
    }
}

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

License:Apache License

static void loadLong(MethodVisitor methodVisitor, long value) {
    if (value == 0) {
        methodVisitor.visitInsn(LCONST_0);
    } else if (value == 1) {
        methodVisitor.visitInsn(LCONST_1);
    } else {/*from w  w w  . j av a2 s . co m*/
        methodVisitor.visitLdcInsn(value);
    }
}

From source file:fr.liglab.adele.cilia.dependency.ProxyGenerator.java

License:Apache License

/**
 * Generates a delegated method./* w  w  w  .j  av  a 2s  .c om*/
 *
 * @param cw        the class writer
 * @param method    the method object to delegate
 * @param className the generated class name
 * @param itfName   the internal specification class name
 */
private static void generateDelegator(ClassWriter cw, Method method, String className, String itfName) {
    String methodName = method.getName();
    String desc = Type.getMethodDescriptor(method);
    String[] exceptions = getInternalClassNames(method.getExceptionTypes());
    int modifiers = method.getModifiers() & ~(Modifier.ABSTRACT | Modifier.NATIVE | Modifier.SYNCHRONIZED);
    Type[] types = Type.getArgumentTypes(method);

    int freeRoom = 1;
    for (int t = 0; t < types.length; t++) {
        freeRoom = freeRoom + types[t].getSize();
    }

    MethodVisitor mv = cw.visitMethod(modifiers, methodName, desc, null, exceptions);
    mv.visitCode();

    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, className, DEPENDENCY, DEPENDENCY_DESC); // The dependency is on the stack.
    mv.visitMethodInsn(INVOKEVIRTUAL, DEPENDENCY_INTERNAL_NAME, "getService", // Call getService
            "()Ljava/lang/Object;"); // The service object is on the stack.
    int varSvc = freeRoom;
    freeRoom = freeRoom + 1; // Object Reference.
    mv.visitVarInsn(ASTORE, varSvc); // Store the service object.

    Label notNull = new Label();
    Label isNull = new Label();
    mv.visitVarInsn(ALOAD, varSvc); // Load the service
    mv.visitJumpInsn(IFNONNULL, notNull); // If not null go to not null
    // Null branch - throw the exception
    mv.visitLabel(isNull);
    mv.visitTypeInsn(NEW, "java/lang/RuntimeException");
    mv.visitInsn(DUP);
    mv.visitLdcInsn("No service available");
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/String;)V");
    mv.visitInsn(ATHROW);
    // End of the null branch

    // Not null, go one the execution
    mv.visitLabel(notNull);

    // Invoke the method on the service object.
    mv.visitVarInsn(ALOAD, varSvc);
    // Push argument on the stack.
    int i = 1; // Arguments. (non static method)
    for (int t = 0; t < types.length; t++) {
        mv.visitVarInsn(types[t].getOpcode(ILOAD), i);
        i = i + types[t].getSize();
    }
    // Invocation
    mv.visitMethodInsn(INVOKEINTERFACE, itfName, methodName, desc);

    // Return the result
    Type returnType = Type.getReturnType(desc);
    if (returnType.getSort() != Type.VOID) {
        mv.visitInsn(returnType.getOpcode(IRETURN));
    } else {
        mv.visitInsn(RETURN);
    }

    // End of the method.
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}