List of usage examples for org.objectweb.asm Label Label
public Label()
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()); }