Example usage for org.objectweb.asm MethodVisitor visitLabel

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

Introduction

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

Prototype

public void visitLabel(final Label label) 

Source Link

Document

Visits a label.

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  .  jav  a2s.  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. ja v  a  2s  . c o  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 insertPrivateElementCheck(Struct struct, MethodVisitor visitor) {
    Label afterPrivateCheck = new Label();
    visitor.visitVarInsn(ALOAD, 1);/* w w w  .j a  v  a 2s  .c  o m*/
    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 makeEquals(ClassWriter classWriter, Struct struct) {
    String owner = struct.getPackageAndClass().toJVMType();
    MethodVisitor visitor = classWriter.visitMethod(ACC_PUBLIC, "equals", "(Ljava/lang/Object;)Z", null, null);
    Label notFrozenLabel = new Label();
    Label falseLabel = new Label();
    Label sameTypeLabel = new Label();
    visitor.visitCode();/*w w  w  .  jav  a2 s. c om*/
    visitor.visitVarInsn(ALOAD, 0);
    visitor.visitFieldInsn(GETFIELD, owner, $_frozen, "Z");
    visitor.visitJumpInsn(IFNE, notFrozenLabel);
    // super.equals()
    visitor.visitVarInsn(ALOAD, 0);
    visitor.visitVarInsn(ALOAD, 1);
    visitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "equals", "(Ljava/lang/Object;)Z", false);
    visitor.visitInsn(IRETURN);
    // The receiver is frozen
    visitor.visitLabel(notFrozenLabel);
    visitor.visitVarInsn(ALOAD, 1);
    visitor.visitTypeInsn(INSTANCEOF, owner);
    visitor.visitJumpInsn(IFNE, sameTypeLabel);
    visitor.visitJumpInsn(GOTO, falseLabel);
    // The argument is of the same type, too
    visitor.visitLabel(sameTypeLabel);
    visitor.visitVarInsn(ALOAD, 1);
    visitor.visitTypeInsn(CHECKCAST, owner);
    visitor.visitFieldInsn(GETFIELD, owner, $_frozen, "Z");
    visitor.visitJumpInsn(IFEQ, falseLabel);
    // The argument is not frozen
    for (Member member : struct.getMembers()) {
        visitor.visitVarInsn(ALOAD, 0);
        visitor.visitFieldInsn(GETFIELD, owner, member.getName(), "Ljava/lang/Object;");
        visitor.visitVarInsn(ALOAD, 1);
        visitor.visitTypeInsn(CHECKCAST, owner);
        visitor.visitFieldInsn(GETFIELD, owner, member.getName(), "Ljava/lang/Object;");
        visitor.visitMethodInsn(INVOKESTATIC, "java/util/Objects", "equals",
                "(Ljava/lang/Object;Ljava/lang/Object;)Z", false);
        visitor.visitJumpInsn(IFEQ, falseLabel);
    }
    visitor.visitInsn(ICONST_1);
    visitor.visitInsn(IRETURN);
    // False
    visitor.visitLabel(falseLabel);
    visitor.visitInsn(ICONST_0);
    visitor.visitInsn(IRETURN);
    visitor.visitMaxs(0, 0);
    visitor.visitEnd();
}

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

License:Open Source License

private void makeHashCode(ClassWriter classWriter, Struct struct) {
    String owner = struct.getPackageAndClass().toJVMType();
    MethodVisitor visitor = classWriter.visitMethod(ACC_PUBLIC, "hashCode", "()I", null, null);
    Label notFrozenLabel = new Label();
    visitor.visitCode();//from   w w  w  .  java 2 s .c  o m
    visitor.visitVarInsn(ALOAD, 0);
    visitor.visitFieldInsn(GETFIELD, owner, $_frozen, "Z");
    visitor.visitJumpInsn(IFNE, notFrozenLabel);
    // super.hashCode()
    visitor.visitVarInsn(ALOAD, 0);
    visitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "hashCode", "()I", false);
    visitor.visitInsn(IRETURN);
    // The receiver is frozen
    visitor.visitLabel(notFrozenLabel);
    loadInteger(visitor, struct.getMembers().size());
    visitor.visitTypeInsn(ANEWARRAY, "java/lang/Object");
    int i = 0;
    for (Member member : struct.getMembers()) {
        visitor.visitInsn(DUP);
        loadInteger(visitor, i);
        visitor.visitVarInsn(ALOAD, 0);
        visitor.visitFieldInsn(GETFIELD, owner, member.getName(), "Ljava/lang/Object;");
        visitor.visitInsn(AASTORE);
        i++;
    }
    visitor.visitMethodInsn(INVOKESTATIC, "java/util/Objects", "hash", "([Ljava/lang/Object;)I", false);
    visitor.visitInsn(IRETURN);
    visitor.visitMaxs(0, 0);
    visitor.visitEnd();
}

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

License:Open Source License

private void makeSetter(ClassWriter classWriter, String owner, String name, Struct struct) {
    int accessFlag = name.startsWith("_") ? ACC_PRIVATE : ACC_PUBLIC;
    MethodVisitor visitor = classWriter.visitMethod(accessFlag, name,
            "(Ljava/lang/Object;)L" + struct.getPackageAndClass().toJVMType() + ";", null, null);
    visitor.visitCode();/*from   w ww  .j a va  2s  . co m*/
    visitor.visitVarInsn(ALOAD, 0);
    visitor.visitFieldInsn(GETFIELD, owner, $_frozen, "Z");
    Label setLabel = new Label();
    visitor.visitJumpInsn(IFEQ, setLabel);
    throwLocalized(visitor, "java/lang/IllegalStateException", "frozen_struct",
            struct.getPackageAndClass().toString());
    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:org.eclipse.golo.compiler.JavaBytecodeUnionGenerator.java

License:Open Source License

private void makeMatchlikeTestMethod(ClassWriter classWriter, UnionValue value, boolean result) {
    String methName = "is" + value.getName();
    MethodVisitor mv = classWriter.visitMethod(ACC_PUBLIC, methName, "()Z", null, null);
    mv.visitCode();/*  w  w  w. j  a  va 2s  .c om*/
    mv.visitInsn(result ? ICONST_1 : ICONST_0);
    mv.visitInsn(IRETURN);
    mv.visitMaxs(0, 0);
    mv.visitEnd();

    if (value.hasMembers()) {
        mv = classWriter.visitMethod(ACC_PUBLIC, methName, argsSignature(value.getMembers().size()) + "Z", null,
                null);
        for (Member member : value.getMembers()) {
            mv.visitParameter(member.getName(), ACC_FINAL);
        }
        mv.visitCode();
        if (!result) {
            mv.visitInsn(ICONST_0);
        } else {
            int i = 1;
            Label allEquals = new Label();
            Label notEqual = new Label();
            String target = value.getPackageAndClass().toJVMType();
            for (Member member : value.getMembers()) {
                mv.visitVarInsn(ALOAD, i);
                mv.visitVarInsn(ALOAD, 0);
                mv.visitFieldInsn(GETFIELD, target, member.getName(), "Ljava/lang/Object;");
                mv.visitMethodInsn(INVOKESTATIC, "java/util/Objects", "equals",
                        "(Ljava/lang/Object;Ljava/lang/Object;)Z", false);
                mv.visitJumpInsn(IFEQ, notEqual);
                i++;
            }
            mv.visitInsn(ICONST_1);
            mv.visitJumpInsn(GOTO, allEquals);
            mv.visitLabel(notEqual);
            mv.visitInsn(ICONST_0);
            mv.visitLabel(allEquals);
        }
        mv.visitInsn(IRETURN);
        mv.visitMaxs(0, 0);
        mv.visitEnd();
    }
}

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

License:Open Source License

private void makeEquals(ClassWriter cw, UnionValue value) {
    String target = value.getPackageAndClass().toJVMType();
    MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "equals", "(Ljava/lang/Object;)Z", null, null);
    Label notSameInstance = new Label();
    Label notNull = new Label();
    Label sameType = new Label();
    Label allAttrsEquals = new Label();
    Label attrNotEqual = new Label();
    mv.visitCode();/*from  www. ja v a 2s .c o  m*/

    // if (other == this) { return true; }
    mv.visitVarInsn(ALOAD, 1);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitJumpInsn(IF_ACMPNE, notSameInstance);
    mv.visitInsn(ICONST_1);
    mv.visitInsn(IRETURN);
    mv.visitLabel(notSameInstance);

    // if (other == null) { return false; }
    mv.visitVarInsn(ALOAD, 1);
    mv.visitJumpInsn(IFNONNULL, notNull);
    mv.visitInsn(ICONST_0);
    mv.visitInsn(IRETURN);
    mv.visitLabel(notNull);

    // if (!(other instanceof <value>)) { return false; }
    mv.visitVarInsn(ALOAD, 1);
    mv.visitTypeInsn(INSTANCEOF, target);
    mv.visitJumpInsn(IFNE, sameType);
    mv.visitInsn(ICONST_0);
    mv.visitInsn(IRETURN);
    mv.visitLabel(sameType);

    // cast other to <value>
    mv.visitVarInsn(ALOAD, 1);
    mv.visitTypeInsn(CHECKCAST, target);
    mv.visitVarInsn(ASTORE, 2);

    // java.util.Objects.equals(<member>, other.<member>)
    for (Member member : value.getMembers()) {
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, target, member.getName(), "Ljava/lang/Object;");
        mv.visitVarInsn(ALOAD, 2);
        mv.visitFieldInsn(GETFIELD, target, member.getName(), "Ljava/lang/Object;");
        mv.visitMethodInsn(INVOKESTATIC, "java/util/Objects", "equals",
                "(Ljava/lang/Object;Ljava/lang/Object;)Z", false);
        mv.visitJumpInsn(IFEQ, attrNotEqual);
    }
    mv.visitInsn(ICONST_1);
    mv.visitJumpInsn(GOTO, allAttrsEquals);
    mv.visitLabel(attrNotEqual);
    mv.visitInsn(ICONST_0);
    mv.visitLabel(allAttrsEquals);
    mv.visitInsn(IRETURN);
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}

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

License:Open Source License

static Label visitLine(GoloElement<?> element, MethodVisitor visitor) {
    Label label = new Label();
    visitor.visitLabel(label);
    if (element.hasPosition()) {
        visitor.visitLineNumber(element.positionInSourceCode().getStartLine(), label);
    }/*from  w ww  .  j a v a2s  .  c  o m*/
    return label;
}

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

License:Open Source License

/**
 * Generates a constructor for the {@link JITCodeBlock}.
 * @param init the constructor visitor/*from w  w  w  .ja  v a  2s  .  c  o m*/
 * @param className the name of the generated class
 */
protected static void generateConstructor(final MethodVisitor init, final String className) {
    init.visitCode();
    // Generate labels
    final Label start = new Label();
    final Label end = new Label();
    // Generate bytecode
    init.visitLabel(start);
    init.visitVarInsn(ALOAD, 0); // this
    init.visitVarInsn(ALOAD, 1); // cb
    init.visitMethodInsn(INVOKESPECIAL, // super(cb) 
            Type.getInternalName(JITCodeBlock.class), "<init>",
            Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] { Type.getType(CodeBlock.class) }));
    init.visitInsn(RETURN);
    init.visitLabel(end);
    // Create local variable table
    init.visitLocalVariable("this", "L" + className + ";", null, start, end, 0);
    init.visitLocalVariable("cb", Type.getDescriptor(CodeBlock.class), null, start, end, 1);
    // Finalise
    init.visitMaxs(2, 2);
    init.visitEnd();
}