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.getLine()); 036 cont.writeOut(bc, MODE_VALUE); 037 adapter.visitJumpInsn(Opcodes.IFEQ, yes); 038 039 // left 040 ExpressionUtil.visitLine(bc, left.getLine()); 041 left.writeOut(bc, MODE_REF); 042 adapter.visitJumpInsn(Opcodes.GOTO, end); 043 044 // right 045 ExpressionUtil.visitLine(bc, right.getLine()); 046 adapter.visitLabel(yes); 047 right.writeOut(bc, MODE_REF); 048 adapter.visitLabel(end); 049 050 return Types.OBJECT; 051 052 } 053 054 055 056 057 058 059 060 private OpContional(Expression cont, Expression left, Expression right) { 061 super(cont.getLine()); 062 this.cont=CastBoolean.toExprBoolean(cont); 063 this.left=left; 064 this.right=right; 065 } 066 067 068 public static Expression toExpr(Expression cont, Expression left, Expression right) { 069 return new OpContional(cont,left,right); 070 } 071 072 073 /* * 074 * @see railo.transformer.bytecode.expression.Expression#getType() 075 * / 076 public int getType() { 077 return Types._BOOLEAN; 078 }*/ 079 } 080