Example usage for org.objectweb.asm Label Label

List of usage examples for org.objectweb.asm Label Label

Introduction

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

Prototype

public Label() 

Source Link

Document

Constructs a new label.

Usage

From source file:com.xruby.compiler.codegen.RubyCompilerImpl.java

License:BSD License

public Object visitAfterWhenConditionNotNil(Object case_value) {
    int i = (Integer) case_value;
    MethodGenerator mg = cg_.getMethodGenerator();
    mg.loadLocal(i);/*from  w  ww .  jav  a2 s.c om*/
    mg.RubyAPI_testCaseEqualNotNil();

    Label label = new Label();
    mg.ifZCmp(GeneratorAdapter.EQ, label);
    return label;
}

From source file:com.xruby.compiler.codegen.RubyCompilerImpl.java

License:BSD License

public Object visitAfterUnlessCondition() {
    MethodGenerator mg = cg_.getMethodGenerator();
    mg.RubyValue_isTrue();/*from w  w  w .jav a2  s. c om*/
    Label label = new Label();
    mg.ifZCmp(GeneratorAdapter.NE, label);
    return label;
}

From source file:com.xruby.compiler.codegen.RubyCompilerImpl.java

License:BSD License

public Object visitBodyBegin(boolean has_ensure) {
    //once exceptio is thrown, everything already on the stack will be destoried. so if we have begin..end
    //in the method parameter. e.g. f(..., begin ..end, ...), the method receiver and parameter is already on the list.
    MethodGenerator mg = cg_.getMethodGenerator();
    mg.saveCurrentVariablesOnStack();/* ww  w . jav  a  2  s  .  c  o m*/

    mg.getEnsureLabelManager().openNewScope();
    if (has_ensure) {
        mg.getEnsureLabelManager().setCurrentFinally(new Label());
    }
    mg.mark(mg.getEnsureLabelManager().getCurrentRetry());
    return mg.getEnsureLabelManager().getCurrentRetry();
}

From source file:com.xruby.compiler.codegen.RubyCompilerImpl.java

License:BSD License

public Object visitPrepareEnsure1() {
    Label label = new Label();
    MethodGenerator mg = cg_.getMethodGenerator();
    mg.visitJumpInsn(Opcodes.JSR, mg.getEnsureLabelManager().getCurrentFinally());
    return label;
}

From source file:com.xruby.compiler.codegen.RubyCompilerImpl.java

License:BSD License

public Object visitPrepareEnsure() {
    Label after_exception = new Label();
    cg_.getMethodGenerator().goTo(after_exception);
    return after_exception;
}

From source file:com.xruby.compiler.codegen.RubyCompilerImpl.java

License:BSD License

public Object visitRescueVariable(String name, int exception_variable) {
    MethodGenerator mg = cg_.getMethodGenerator();
    mg.loadLocal(exception_variable);//w ww  .j  av a  2 s.c o  m
    mg.RubyAPI_testExceptionType();
    Label label = new Label();
    mg.ifZCmp(GeneratorAdapter.EQ, label);

    if (null != name) {
        mg.loadLocal(exception_variable);
        mg.RubyAPI_convertRubyException2RubyValue();
        cg_.storeVariable(name);
    }

    return label;
}

From source file:com.xruby.compiler.codegen.RubyCompilerImpl.java

License:BSD License

public void visitPotentialProcCall() {
    MethodGenerator mg = cg_.getMethodGenerator();
    mg.dup();//  w  ww  .ja  v  a 2  s  .  co  m
    mg.instanceOf(Types.RUBY_PROC_TYPE);

    Label label1 = new Label();
    mg.ifZCmp(GeneratorAdapter.EQ, label1);

    mg.dup();
    mg.checkCast(Types.RUBY_PROC_TYPE);

    //check if in the right context
    //TODO have not considered all the situations
    mg.dup();
    mg.RubyProc_isDefinedInAnotherBlock();
    Label label2 = new Label();
    mg.ifZCmp(GeneratorAdapter.NE, label2);

    cg_.addVariableToBinding();//TODO should we use updateBinding()?
    mg.mark(label2);
    mg.pop();

    mg.mark(label1);
}

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//  ww w .  j a  va2 s .c  om
        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 ww  w  .  jav a  2 s.com
        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.CodeEmitterTest.java

@Test
public void requireSimpleAdd() throws Exception {
    UnitGenerator unit = new UnitGenerator("foo", source);
    unit.addInterface(Callable.class);
    MethodGenerator gen = unit.createMethod("call");
    gen.setReturnType(AnyTypeWidget.getInstance());
    final BytecodeExpression leftExpr = source.constant(1);
    final BytecodeExpression rightExpr = source.constant(1);

    gen.add(new BytecodeSequence() {
        @Override/*from w ww  . j  av  a  2s  .c  om*/
        public void generate(CodeEmitter code) {
            Label hasNull = new Label();
            CodeEmitter.Unification unify = code.unifiedEmit(leftExpr, rightExpr, hasNull);
            code.getMethodVisitor().visitInsn(Opcodes.IADD);
            code.box(BaseTypeAdapter.INT32);
            code.getMethodVisitor().visitInsn(Opcodes.ARETURN);
            if (unify.nullPossible) {
                code.getMethodVisitor().visitLabel(hasNull);
                code.getMethodVisitor().visitInsn(Opcodes.ACONST_NULL);
                code.getMethodVisitor().visitInsn(Opcodes.ARETURN);
            }
        }
    });

    source.build();
    Class<? extends Callable> clazz = (Class<? extends Callable>) source.getGeneratedClass(unit);
    Callable c = clazz.newInstance();
    Assert.assertEquals(2, c.call());
}