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    }