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:com.weibo.lodil.mmap.impl.GenerateHugeArrays.java

License:Apache License

private static void appendToStringHashCodeEqualsCopyOf(final TypeModel tm, final ClassWriter cw,
        final String name2, final boolean hasListField) {
    final String name = tm.bcType();
    MethodVisitor mv;
    {/* w  w  w.jav a2s .c  o  m*/
        mv = cw.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(176, l0);
        mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V");
        mv.visitLdcInsn(tm.type().getSimpleName() + "{");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                "(Ljava/lang/String;)Ljava/lang/StringBuilder;");

        String sep = "";
        for (final FieldModel fm : tm.fields()) {
            final boolean text = CharSequence.class.isAssignableFrom(tm.type());

            mv.visitLdcInsn(sep + fm.fieldName() + "=" + (text ? "'" : ""));
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                    "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType());
            String appendType = "Ljava/lang/Object;";
            final Class fmType = fm.type();
            if (fmType.isPrimitive()) {
                if ((fmType == byte.class) || (fmType == short.class)) {
                    appendType = "I";
                } else {
                    appendType = fm.bcLFieldType();
                }
            }
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                    "(" + appendType + ")Ljava/lang/StringBuilder;");
            sep = text ? "', " : ", ";
        }
        if (sep.startsWith("'")) {
            mv.visitIntInsn(BIPUSH, 39);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                    "(C)Ljava/lang/StringBuilder;");
        }
        mv.visitIntInsn(BIPUSH, 125);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(C)Ljava/lang/StringBuilder;");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;");
        mv.visitInsn(ARETURN);
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l1, 0);
        mv.visitMaxs(3, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "equals", "(Ljava/lang/Object;)Z", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(194, l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        final Label l1 = new Label();
        mv.visitJumpInsn(IF_ACMPNE, l1);
        mv.visitInsn(ICONST_1);
        mv.visitInsn(IRETURN);
        mv.visitLabel(l1);
        mv.visitLineNumber(195, l1);
        mv.visitVarInsn(ALOAD, 1);
        final Label l2 = new Label();
        mv.visitJumpInsn(IFNULL, l2);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;");
        final Label l3 = new Label();
        mv.visitJumpInsn(IF_ACMPEQ, l3);
        mv.visitLabel(l2);
        mv.visitInsn(ICONST_0);
        mv.visitInsn(IRETURN);
        mv.visitLabel(l3);
        mv.visitLineNumber(197, l3);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitTypeInsn(CHECKCAST, name2);
        mv.visitVarInsn(ASTORE, 2);
        final Label l4 = new Label();
        mv.visitLabel(l4);
        mv.visitLineNumber(199, l4);
        final FieldModel[] fieldModels = tm.fields().clone();
        Arrays.sort(fieldModels, new Comparator<FieldModel>() {
            // reverse sort the preferences to optimise the
            public int compare(final FieldModel o1, final FieldModel o2) {
                return o2.equalsPreference() - o1.equalsPreference();
            }
        });
        for (final FieldModel fm : fieldModels) {
            // System.out.println(fm.fieldName());
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType());
            mv.visitVarInsn(ALOAD, 2);
            mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType());
            final Label l5 = new Label();
            if (fm.isCallsNotEquals()) {
                mv.visitMethodInsn(INVOKESTATIC, fm.bcLModelType(), "notEquals",
                        "(" + fm.bcLSetType() + fm.bcLSetType() + ")Z");
                mv.visitJumpInsn(IFEQ, l5);
            } else {
                mv.visitJumpInsn(IF_ICMPEQ, l5);
            }
            mv.visitInsn(ICONST_0);
            mv.visitInsn(IRETURN);
            mv.visitLabel(l5);
        }

        mv.visitInsn(ICONST_1);
        mv.visitInsn(IRETURN);
        final Label l17 = new Label();
        mv.visitLabel(l17);
        mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l17, 0);
        mv.visitLocalVariable("o", "Ljava/lang/Object;", null, l0, l17, 1);
        mv.visitLocalVariable("that", "L" + name2 + ";", null, l4, l17, 2);
        mv.visitMaxs(4, 3);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "hashCode", "()I", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        int count = 0;
        for (final FieldModel fm : tm.fields()) {
            // if (count > 5) break;
            // System.out.println(fm.fieldName());
            if (count > 0) {
                mv.visitIntInsn(BIPUSH, 31);
                mv.visitInsn(IMUL);
            }
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType());
            if (fm.isCallsHashCode()) {
                mv.visitMethodInsn(INVOKESTATIC, fm.bcLModelType(), "hashCode", "(" + fm.bcLSetType() + ")I");
            }

            if (count > 0) {
                mv.visitInsn(IADD);
            }
            count++;
        }
        mv.visitInsn(IRETURN);
        final Label l3 = new Label();
        mv.visitLabel(l3);
        mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l3, 0);
        mv.visitMaxs(6, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "copyOf", "(L" + name + ";)V", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(240, l0);

        boolean copySimpleValues = false;
        for (final FieldModel fm : tm.fields()) {
            if (!fm.copySimpleValue() || !hasListField) {
                // if (true) {
                mv.visitVarInsn(ALOAD, 0);
                mv.visitVarInsn(ALOAD, 1);
                mv.visitMethodInsn(INVOKEINTERFACE, name, "get" + fm.titleFieldName(),
                        "()" + fm.bcLFieldType());
                mv.visitMethodInsn(INVOKEVIRTUAL, name2, "set" + fm.titleFieldName(),
                        "(" + fm.bcLFieldType() + ")V");
            } else {
                copySimpleValues = true;
            }
        }
        final Label l4 = new Label();
        final Label l6 = new Label();
        if (copySimpleValues) {
            final Label l3 = new Label();
            mv.visitLabel(l3);
            mv.visitLineNumber(243, l3);
            mv.visitVarInsn(ALOAD, 1);
            mv.visitTypeInsn(INSTANCEOF, name2);
            mv.visitJumpInsn(IFEQ, l4);
            final Label l5 = new Label();
            mv.visitLabel(l5);
            mv.visitLineNumber(238, l5);
            mv.visitVarInsn(ALOAD, 1);
            mv.visitTypeInsn(CHECKCAST, name2);
            mv.visitVarInsn(ASTORE, 2);
            mv.visitLabel(l6);
            mv.visitLineNumber(239, l6);
            mv.visitVarInsn(ALOAD, 2);
            mv.visitFieldInsn(GETFIELD, name2, "container", "L" + collections + "impl/AbstractHugeContainer;");
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, name2, "container", "L" + collections + "impl/AbstractHugeContainer;");
            mv.visitJumpInsn(IF_ACMPNE, l4);
            for (final FieldModel fm : tm.fields()) {
                if (fm.copySimpleValue()) {
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitFieldInsn(GETFIELD, name2, "allocation", "L" + name + "Allocation;");
                    mv.visitFieldInsn(GETFIELD, name + "Allocation", "m_" + fm.fieldName(), fm.bcLStoreType());
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitFieldInsn(GETFIELD, name2, "offset", "I");
                    mv.visitVarInsn(ALOAD, 2);
                    mv.visitFieldInsn(GETFIELD, name2, "allocation", "L" + name + "Allocation;");
                    mv.visitFieldInsn(GETFIELD, name + "Allocation", "m_" + fm.fieldName(), fm.bcLStoreType());
                    mv.visitVarInsn(ALOAD, 2);
                    mv.visitFieldInsn(GETFIELD, name2, "offset", "I");
                    mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcStoreType(), "get", "(I)" + fm.bcLStoredType());
                    mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcStoreType(), "put",
                            "(I" + fm.bcLStoredType() + ")" + fm.bcLStoreType());
                    mv.visitInsn(POP);
                }
            }
        }
        final Label l16 = new Label();
        mv.visitLabel(l16);
        mv.visitLineNumber(238, l16);
        final Label l17 = new Label();
        mv.visitJumpInsn(GOTO, l17);
        mv.visitLabel(l4);
        mv.visitLineNumber(241, l4);
        for (final FieldModel fm : tm.fields()) {
            if (fm.copySimpleValue()) {
                mv.visitVarInsn(ALOAD, 0);
                mv.visitVarInsn(ALOAD, 1);
                mv.visitMethodInsn(INVOKEINTERFACE, name, "get" + fm.titleFieldName(),
                        "()" + fm.bcLFieldType());
                mv.visitMethodInsn(INVOKEVIRTUAL, name2, "set" + fm.titleFieldName(),
                        "(" + fm.bcLFieldType() + ")V");
            }
        }
        mv.visitLabel(l17);
        mv.visitLineNumber(251, l17);
        mv.visitInsn(RETURN);
        final Label l27 = new Label();
        mv.visitLabel(l27);
        mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l27, 0);
        mv.visitLocalVariable("t", "L" + name + ";", null, l0, l27, 1);
        if (copySimpleValues) {
            mv.visitLocalVariable("mte", "L" + name + "Element;", null, l6, l4, 2);
        }
        mv.visitMaxs(4, 3);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_BRIDGE + ACC_SYNTHETIC, "copyOf", "(Ljava/lang/Object;)V", null,
                null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(275, l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitTypeInsn(CHECKCAST, name);
        mv.visitMethodInsn(INVOKEVIRTUAL, name2, "copyOf", "(L" + name + ";)V");
        mv.visitInsn(RETURN);
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l1, 0);
        mv.visitLocalVariable("x0", "Ljava/lang/Object;", null, l0, l1, 1);
        mv.visitMaxs(2, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "writeExternal", "(Ljava/io/ObjectOutput;)V", null,
                new String[] { "java/io/IOException" });
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(185, l0);
        for (final FieldModel fm : tm.fields()) {
            mv.visitVarInsn(ALOAD, 1);
            if (fm.bcLSetType().equals(fm.bcLFieldType())) {
                mv.visitVarInsn(ALOAD, 0);
                mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType());
                mv.visitMethodInsn(INVOKESTATIC, fm.bcModelType(), "write",
                        "(Ljava/io/ObjectOutput;" + fm.bcLSetType() + ")V");
            } else {
                mv.visitLdcInsn(Type.getType(fm.bcLFieldType()));
                mv.visitVarInsn(ALOAD, 0);
                mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType());
                mv.visitMethodInsn(INVOKESTATIC, fm.bcModelType(), "write",
                        "(Ljava/io/ObjectOutput;Ljava/lang/Class;" + fm.bcLSetType() + ")V");
            }
        }
        final Label l13 = new Label();
        mv.visitLabel(l13);
        mv.visitLineNumber(288, l13);
        mv.visitInsn(RETURN);
        final Label l14 = new Label();
        mv.visitLabel(l14);
        mv.visitLocalVariable("this", "L" + name2 + ';', null, l0, l14, 0);
        mv.visitLocalVariable("out", "Ljava/io/ObjectOutput;", null, l0, l14, 1);
        mv.visitMaxs(4, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "readExternal", "(Ljava/io/ObjectInput;)V", null,
                new String[] { "java/io/IOException", "java/lang/ClassNotFoundException" });
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(287, l0);
        for (final FieldModel fm : tm.fields()) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(ALOAD, 1);
            if (fm.bcLSetType().equals(fm.bcLFieldType())) {
                mv.visitMethodInsn(INVOKESTATIC, fm.bcModelType(), "read",
                        "(Ljava/io/ObjectInput;)" + fm.bcLSetType());
            } else {
                mv.visitLdcInsn(Type.getType(fm.bcLFieldType()));
                mv.visitMethodInsn(INVOKESTATIC, fm.bcModelType(), "read",
                        "(Ljava/io/ObjectInput;Ljava/lang/Class;)" + fm.bcLSetType());
                mv.visitTypeInsn(CHECKCAST, fm.bcFieldType());
            }
            mv.visitMethodInsn(INVOKEVIRTUAL, name2, "set" + fm.titleFieldName(),
                    "(" + fm.bcLFieldType() + ")V");
        }
        final Label l13 = new Label();
        mv.visitLabel(l13);
        mv.visitLineNumber(305, l13);
        mv.visitInsn(RETURN);
        final Label l14 = new Label();
        mv.visitLabel(l14);
        mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l14, 0);
        mv.visitLocalVariable("in", "Ljava/io/ObjectInput;", null, l0, l14, 1);
        mv.visitMaxs(3, 2);
        mv.visitEnd();
    }
}

From source file:com.weibo.lodil.mmap.impl.GenerateHugeArrays.java

License:Apache License

public static byte[] dumpImpl(final TypeModel tm) {

    final ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;//  w w  w.  j  ava  2  s  .  c  o  m
    MethodVisitor mv;

    final String name = tm.bcType();

    cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, name + "Impl",
            "Ljava/lang/Object;L" + name + ";L" + collections + "api/HugeElement<L" + name
                    + ";>;Ljava/io/Externalizable;",
            "java/lang/Object",
            new String[] { name, collections + "api/HugeElement", "java/io/Externalizable" });

    cw.visitSource(tm.getClass().getSimpleName() + "Impl.java", null);

    for (final FieldModel fm : tm.fields()) {
        fv = cw.visitField(ACC_PRIVATE, "m_" + fm.fieldName(), fm.bcLFieldType(), null, null);
        fv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(30, l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
        mv.visitInsn(RETURN);
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + name + "Impl;", null, l0, l1, 0);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    for (final FieldModel fm : tm.fields()) {
        mv = cw.visitMethod(ACC_PUBLIC, "set" + fm.titleFieldName(), "(" + fm.bcLFieldType() + ")V", null,
                null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(47, l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(loadFor(fm.bcType()), 1);
        mv.visitFieldInsn(PUTFIELD, name + "Impl", "m_" + fm.fieldName(), fm.bcLFieldType());
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLineNumber(48, l1);
        mv.visitInsn(RETURN);
        final Label l2 = new Label();
        mv.visitLabel(l2);
        mv.visitLocalVariable("this", "L" + name + "Impl;", null, l0, l2, 0);
        mv.visitLocalVariable("b", fm.bcLFieldType(), null, l0, l2, 1);
        mv.visitMaxs(1 + fm.bcFieldSize(), 1 + fm.bcFieldSize());
        mv.visitEnd();

        mv = cw.visitMethod(ACC_PUBLIC, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType(), null, null);
        mv.visitCode();
        final Label l3 = new Label();
        mv.visitLabel(l3);
        mv.visitLineNumber(45, l3);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, name + "Impl", "m_" + fm.fieldName(), fm.bcLFieldType());
        mv.visitInsn(returnFor(fm.bcType()));
        final Label l4 = new Label();
        mv.visitLabel(l4);
        mv.visitLocalVariable("this", "L" + name + "Impl;", null, l3, l4, 0);
        mv.visitMaxs(1 + fm.bcFieldSize(), 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "index", "(J)V", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(175, l0);
        mv.visitTypeInsn(NEW, "java/lang/UnsupportedOperationException");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/UnsupportedOperationException", "<init>", "()V");
        mv.visitInsn(ATHROW);
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + name + "Impl;", null, l0, l1, 0);
        mv.visitLocalVariable("n", "J", null, l0, l1, 1);
        mv.visitMaxs(2, 3);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "index", "()J", null, null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(180, l0);
        mv.visitInsn(LCONST_0);
        mv.visitInsn(LRETURN);
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + name + "Impl;", null, l0, l1, 0);
        mv.visitMaxs(2, 1);
        mv.visitEnd();
    }
    appendToStringHashCodeEqualsCopyOf(tm, cw, name + "Impl", false);

    {
        mv = cw.visitMethod(ACC_PUBLIC, "hugeElementType", "()L" + collections + "api/HugeElementType;", null,
                null);
        mv.visitCode();
        final Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(236, l0);
        mv.visitFieldInsn(GETSTATIC, collections + "api/HugeElementType", "BeanImpl",
                "L" + collections + "api/HugeElementType;");
        mv.visitInsn(ARETURN);
        final Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + name + "Impl;", null, l0, l1, 0);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    cw.visitEnd();

    final byte[] bytes = cw.toByteArray();
    // ClassReader cr = new ClassReader(bytes);
    // cr.accept(new ASMifierClassVisitor(new PrintWriter(System.out)), 0);

    return bytes;
}

From source file:com.yahoo.yqlplus.engine.internal.bytecode.ClassAdapterGenerator.java

private void generateGetProperty(TypeWidget targetType, final PropertyAdapter propertyAdapter) {
    MethodGenerator method = createStaticMethod("getProperty");
    method.setReturnType(AnyTypeWidget.getInstance());
    final BytecodeExpression targetExpr = method.addArgument("target", targetType).read();
    final BytecodeExpression propertyName = method.addArgument("property", BaseTypeAdapter.STRING).read();
    method.add(new BytecodeSequence() {
        @Override/*from  w w w . j av a  2 s  .c o m*/
        public void generate(CodeEmitter code) {
            Map<String, Label> labelMap = Maps.newLinkedHashMap();
            Label defaultCase = new Label();
            Label done = new Label();
            for (PropertyAdapter.Property property : propertyAdapter.getProperties()) {
                labelMap.put(property.name, new Label());
            }
            propertyName.generate(code);
            code.emitStringSwitch(labelMap, defaultCase, true);
            MethodVisitor mv = code.getMethodVisitor();
            for (PropertyAdapter.Property property : propertyAdapter.getProperties()) {
                mv.visitLabel(labelMap.get(property.name));
                propertyAdapter.property(targetExpr, property.name).read().generate(code);
                code.box(property.type);
                mv.visitJumpInsn(Opcodes.GOTO, done);
            }
            mv.visitLabel(defaultCase);
            new NullExpr(AnyTypeWidget.getInstance()).generate(code);
            mv.visitLabel(done);
            mv.visitInsn(Opcodes.ARETURN);
        }
    });
}

From source file:com.yahoo.yqlplus.engine.internal.bytecode.ClassAdapterGenerator.java

private void generatePutProperty(TypeWidget targetType, final PropertyAdapter propertyAdapter) {
    MethodGenerator method = createStaticMethod("putProperty");
    final BytecodeExpression targetExpr = method.addArgument("target", targetType).read();
    final BytecodeExpression propertyName = method.addArgument("property", BaseTypeAdapter.STRING).read();
    final BytecodeExpression valueExpr = method.addArgument("value", AnyTypeWidget.getInstance()).read();
    method.add(new BytecodeSequence() {
        @Override//from  w  ww. j  a v  a 2s. c om
        public void generate(CodeEmitter code) {
            Map<String, Label> labelMap = Maps.newLinkedHashMap();
            Label done = new Label();
            for (PropertyAdapter.Property property : propertyAdapter.getProperties()) {
                labelMap.put(property.name, new Label());
            }
            propertyName.generate(code);
            code.emitStringSwitch(labelMap, done, true);
            MethodVisitor mv = code.getMethodVisitor();
            for (PropertyAdapter.Property property : propertyAdapter.getProperties()) {
                mv.visitLabel(labelMap.get(property.name));
                AssignableValue av = propertyAdapter.property(targetExpr, property.name);
                try {
                    code.exec(av.write(new BytecodeCastExpression(property.type, valueExpr)));
                } catch (UnsupportedOperationException ignored) {
                    // can't write what isn't writable
                }
                mv.visitJumpInsn(Opcodes.GOTO, done);
            }
            mv.visitLabel(done);
            mv.visitInsn(Opcodes.RETURN);
        }
    });
}

From source file:com.yahoo.yqlplus.engine.internal.bytecode.types.gambit.BlockAdapter.java

@Override
public void jump(BytecodeExpression test, final BytecodeExpression result) {
    final BytecodeExpression testExpr = test;
    final TypeWidget type = testExpr.getType();
    body.add(new BytecodeSequence() {
        @Override/*w  ww  . j  a v a 2 s . com*/
        public void generate(CodeEmitter code) {
            code.exec(testExpr);
            Label isTrue = new Label();
            Label isFalse = new Label();
            type.getComparisionAdapter().coerceBoolean(code, isTrue, isFalse, isFalse);
            MethodVisitor mv = code.getMethodVisitor();
            mv.visitLabel(isTrue);
            code.exec(result);
            mv.visitJumpInsn(Opcodes.GOTO, body.getEnd());
            mv.visitLabel(isFalse);
        }
    });
}

From source file:com.yahoo.yqlplus.engine.internal.bytecode.types.gambit.BytecodeCatchBuilder.java

@Override
public BytecodeSequence build() {
    return new BytecodeSequence() {
        @Override//w w  w  .  j ava2s .  co m
        public void generate(CodeEmitter code) {
            MethodVisitor mv = code.getMethodVisitor();
            for (CatchClause catchClause : catchClauses) {
                if (catchClause.exceptionInternalNames.isEmpty()) {
                    mv.visitTryCatchBlock(body.getStart(), body.getEnd(), catchClause.getStart(), null);
                } else {
                    for (String name : catchClause.exceptionInternalNames) {
                        mv.visitTryCatchBlock(body.getStart(), body.getEnd(), catchClause.getStart(), name);
                    }
                }
            }
            Label done = new Label();
            body.generate(code);
            mv.visitJumpInsn(Opcodes.GOTO, done);
            for (CatchClause catchClause : catchClauses.subList(0, catchClauses.size() - 1)) {
                catchClause.generate(code);
                mv.visitJumpInsn(Opcodes.GOTO, done);
            }
            catchClauses.get(catchClauses.size() - 1).generate(code);
            mv.visitLabel(done);
        }
    };
}

From source file:com.yahoo.yqlplus.engine.internal.bytecode.types.gambit.CaseAdapter.java

@Override
public void when(final BytecodeExpression test, final BytecodeExpression value) {
    final TypeWidget type = test.getType();
    resultTypes.add(value.getType());//from   w  w w . j  a va2s . c  om
    body.add(new BytecodeSequence() {
        @Override
        public void generate(CodeEmitter code) {
            code.exec(test);
            Label isTrue = new Label();
            Label isFalse = new Label();
            type.getComparisionAdapter().coerceBoolean(code, isTrue, isFalse, isFalse);
            MethodVisitor mv = code.getMethodVisitor();
            mv.visitLabel(isTrue);
            code.exec(value);
            code.cast(unifiedOutputType, value.getType());
            mv.visitJumpInsn(Opcodes.GOTO, end);
            mv.visitLabel(isFalse);
        }
    });
}

From source file:com.yahoo.yqlplus.engine.internal.bytecode.types.gambit.ExpressionHandler.java

@Override
public BytecodeExpression and(Location loc, final List<BytecodeExpression> inputs) {
    return new BaseTypeExpression(BaseTypeAdapter.BOOLEAN) {
        @Override/*from  ww w .jav a 2  s .c  o m*/
        public void generate(CodeEmitter code) {
            MethodVisitor mv = code.getMethodVisitor();
            Label done = new Label();
            Label isFalse = new Label();
            for (BytecodeExpression input : inputs) {
                Label isTrue = new Label();
                code.exec(input);
                input.getType().getComparisionAdapter().coerceBoolean(code, isTrue, isFalse, isFalse);
                mv.visitLabel(isTrue);
            }
            code.emitBooleanConstant(true);
            mv.visitJumpInsn(Opcodes.GOTO, done);
            mv.visitLabel(isFalse);
            code.emitBooleanConstant(false);
            mv.visitLabel(done);
        }
    };
}

From source file:com.yahoo.yqlplus.engine.internal.bytecode.types.gambit.ExpressionHandler.java

@Override
public BytecodeExpression or(Location loc, final List<BytecodeExpression> inputs) {
    return new BaseTypeExpression(BaseTypeAdapter.BOOLEAN) {
        @Override// w  ww.  j  av  a2  s  .c o m
        public void generate(CodeEmitter code) {
            MethodVisitor mv = code.getMethodVisitor();
            Label done = new Label();
            Label isTrue = new Label();
            for (BytecodeExpression input : inputs) {
                Label isFalse = new Label();
                code.exec(input);
                input.getType().getComparisionAdapter().coerceBoolean(code, isTrue, isFalse, isFalse);
                mv.visitLabel(isFalse);
            }
            code.emitBooleanConstant(false);
            mv.visitJumpInsn(Opcodes.GOTO, done);
            mv.visitLabel(isTrue);
            code.emitBooleanConstant(true);
            mv.visitLabel(done);
        }
    };
}

From source file:com.yahoo.yqlplus.engine.internal.bytecode.types.gambit.ExpressionHandler.java

@Override
public BytecodeExpression not(Location loc, final BytecodeExpression input) {
    return new BaseTypeExpression(BaseTypeAdapter.BOOLEAN) {
        @Override/* ww  w . java2  s .  c  o  m*/
        public void generate(CodeEmitter code) {
            MethodVisitor mv = code.getMethodVisitor();
            Label done = new Label();
            Label isTrue = new Label();
            Label isFalse = new Label();
            code.exec(input);
            input.getType().getComparisionAdapter().coerceBoolean(code, isTrue, isFalse, isFalse);
            mv.visitLabel(isFalse);
            code.emitBooleanConstant(true);
            mv.visitJumpInsn(Opcodes.GOTO, done);
            mv.visitLabel(isTrue);
            code.emitBooleanConstant(false);
            mv.visitLabel(done);
        }
    };
}