001 package railo.transformer.bytecode.statement; 002 003 import java.util.ArrayList; 004 import java.util.Iterator; 005 006 import org.objectweb.asm.commons.GeneratorAdapter; 007 008 import railo.transformer.bytecode.Body; 009 import railo.transformer.bytecode.BytecodeContext; 010 import railo.transformer.bytecode.BytecodeException; 011 import railo.transformer.bytecode.Statement; 012 import railo.transformer.bytecode.expression.ExprBoolean; 013 import railo.transformer.bytecode.expression.Expression; 014 import railo.transformer.bytecode.literal.LitBoolean; 015 import railo.transformer.bytecode.util.ExpressionUtil; 016 import railo.transformer.bytecode.visitor.ConditionVisitor; 017 018 public final class Condition extends StatementBase implements HasBodies { 019 020 private ArrayList ifs=new ArrayList(); 021 private Pair _else; 022 023 /** 024 * Constructor of the class 025 * @param condition 026 * @param body 027 * @param line 028 */ 029 public Condition(int line) { 030 super(line); 031 } 032 033 /** 034 * Constructor of the class 035 * @param condition 036 * @param body 037 * @param line 038 */ 039 public Condition(ExprBoolean condition, Statement body, int line) { 040 super(line); 041 addElseIf(condition,body,line); 042 body.setParent(this); 043 } 044 045 public Condition(boolean b, Statement body, int line) { 046 this(LitBoolean.toExprBoolean(b, -1),body,line); 047 } 048 049 /** 050 * adds a else statment 051 * @param condition 052 * @param body 053 */ 054 public void addElseIf(ExprBoolean condition, Statement body, int line) { 055 ifs.add(new Pair(condition,body,line)); 056 body.setParent(this); 057 } 058 059 /** 060 * sets the else Block of the condition 061 * @param body 062 */ 063 public void setElse(Statement body, int line) { 064 _else=new Pair(null,body,line); 065 body.setParent(this); 066 } 067 068 public final class Pair { 069 private ExprBoolean condition; 070 private Statement body; 071 private int line; 072 073 public Pair(ExprBoolean condition, Statement body, int line) { 074 this.condition=condition; 075 this.body=body; 076 this.line=line; 077 } 078 } 079 080 081 082 public void _writeOut(BytecodeContext bc) throws BytecodeException { 083 GeneratorAdapter adapter = bc.getAdapter(); 084 Iterator it = ifs.iterator(); 085 Pair pair; 086 ConditionVisitor cv=new ConditionVisitor(); 087 cv.visitBefore(); 088 // ifs 089 while(it.hasNext()) { 090 pair=(Pair) it.next(); 091 ExpressionUtil.visitLine(bc, pair.line); 092 cv.visitWhenBeforeExpr(); 093 pair. condition.writeOut(bc,Expression.MODE_VALUE); 094 cv.visitWhenAfterExprBeforeBody(bc); 095 pair.body.writeOut(bc); 096 cv.visitWhenAfterBody(bc); 097 } 098 // else 099 if(_else!=null && _else.body!=null) { 100 cv.visitOtherviseBeforeBody(); 101 _else.body.writeOut(bc); 102 cv.visitOtherviseAfterBody(); 103 } 104 105 cv.visitAfter(bc); 106 } 107 108 /** 109 * @see railo.transformer.bytecode.statement.HasBodies#getBodies() 110 */ 111 public Body[] getBodies() { 112 int len=ifs.size(),count=0; 113 if(_else!=null)len++; 114 Body[] bodies=new Body[len]; 115 Pair p; 116 Iterator it = ifs.iterator(); 117 while(it.hasNext()) { 118 p=(Pair) it.next(); 119 bodies[count++]=(Body) p.body; 120 } 121 if(_else!=null)bodies[count++]=(Body) _else.body; 122 123 return bodies; 124 } 125 }