001 package railo.transformer.bytecode.op; 002 003 import org.objectweb.asm.Label; 004 import org.objectweb.asm.Opcodes; 005 import org.objectweb.asm.Type; 006 import org.objectweb.asm.commons.GeneratorAdapter; 007 008 import railo.transformer.bytecode.BytecodeContext; 009 import railo.transformer.bytecode.BytecodeException; 010 import railo.transformer.bytecode.cast.CastBoolean; 011 import railo.transformer.bytecode.expression.ExprBoolean; 012 import railo.transformer.bytecode.expression.Expression; 013 import railo.transformer.bytecode.expression.ExpressionBase; 014 import railo.transformer.bytecode.util.ExpressionUtil; 015 import railo.transformer.bytecode.util.Types; 016 017 public final class OpContional extends ExpressionBase { 018 019 private ExprBoolean cont; 020 private Expression left; 021 private Expression right; 022 023 /** 024 * 025 * @see railo.transformer.bytecode.expression.ExpressionBase#_writeOut(org.objectweb.asm.commons.GeneratorAdapter, int) 026 */ 027 public Type _writeOut(BytecodeContext bc, int mode) throws BytecodeException { 028 GeneratorAdapter adapter = bc.getAdapter(); 029 030 031 Label yes = new Label(); 032 Label end = new Label(); 033 034 // cont 035 ExpressionUtil.visitLine(bc, cont.getStart()); 036 cont.writeOut(bc, MODE_VALUE); 037 ExpressionUtil.visitLine(bc, cont.getEnd()); 038 adapter.visitJumpInsn(Opcodes.IFEQ, yes); 039 040 // left 041 ExpressionUtil.visitLine(bc, left.getStart()); 042 left.writeOut(bc, MODE_REF); 043 ExpressionUtil.visitLine(bc, left.getEnd()); 044 adapter.visitJumpInsn(Opcodes.GOTO, end); 045 046 // right 047 ExpressionUtil.visitLine(bc, right.getStart()); 048 adapter.visitLabel(yes); 049 right.writeOut(bc, MODE_REF); 050 ExpressionUtil.visitLine(bc, right.getEnd()); 051 adapter.visitLabel(end); 052 053 return Types.OBJECT; 054 055 } 056 057 058 059 060 061 062 063 private OpContional(Expression cont, Expression left, Expression right) { 064 super(left.getStart(),right.getEnd()); 065 this.cont=CastBoolean.toExprBoolean(cont); 066 this.left=left; 067 this.right=right; 068 } 069 070 071 public static Expression toExpr(Expression cont, Expression left, Expression right) { 072 return new OpContional(cont,left,right); 073 } 074 075 076 /* * 077 * @see railo.transformer.bytecode.expression.Expression#getType() 078 * / 079 public int getType() { 080 return Types._BOOLEAN; 081 }*/ 082 } 083