001 package railo.transformer.bytecode.expression.var; 002 003 import org.objectweb.asm.Type; 004 import org.objectweb.asm.commons.GeneratorAdapter; 005 import org.objectweb.asm.commons.Method; 006 007 import railo.transformer.bytecode.BytecodeContext; 008 import railo.transformer.bytecode.BytecodeException; 009 import railo.transformer.bytecode.cast.CastString; 010 import railo.transformer.bytecode.expression.ExprString; 011 import railo.transformer.bytecode.expression.Expression; 012 import railo.transformer.bytecode.expression.ExpressionBase; 013 import railo.transformer.bytecode.util.Types; 014 015 public final class DynAssign extends ExpressionBase { 016 017 private ExprString name; 018 private Expression value; 019 020 // Object setVariable(String, Object) 021 private final static Method METHOD_SET_VARIABLE = new Method("setVariable", 022 Types.OBJECT, 023 new Type[]{Types.STRING,Types.OBJECT}); 024 025 public DynAssign(int line) { 026 super(line); 027 } 028 029 /** 030 * Constructor of the class 031 * @param name 032 * @param value 033 */ 034 public DynAssign(Expression name, Expression value) { 035 super(name.getLine()); 036 this.name=CastString.toExprString(name); 037 this.value=value; 038 } 039 040 /** 041 * 042 * @see railo.transformer.bytecode.expression.ExpressionBase#_writeOut(org.objectweb.asm.commons.GeneratorAdapter, int) 043 */ 044 public Type _writeOut(BytecodeContext bc, int mode) throws BytecodeException { 045 GeneratorAdapter adapter = bc.getAdapter(); 046 adapter.loadArg(0); 047 name.writeOut(bc, Expression.MODE_REF); 048 value.writeOut(bc, Expression.MODE_REF); 049 adapter.invokeVirtual(Types.PAGE_CONTEXT,METHOD_SET_VARIABLE); 050 return Types.OBJECT; 051 } 052 053 /* * 054 * 055 * @see railo.transformer.bytecode.expression.Expression#getType() 056 * / 057 public int getType() { 058 return Types._OBJECT; 059 }*/ 060 061 /** 062 * @return the name 063 */ 064 public ExprString getName() { 065 return name; 066 } 067 068 /** 069 * @return the value 070 */ 071 public Expression getValue() { 072 return value; 073 } 074 075 }