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