Example #1
0
        /// <summary>
        /// Emit the code to generate the assignment of an expression
        /// to an identifier. Various forms are permitted:
        /// 
        ///   identifier = value
        ///   identifier(array_indexes) = value
        ///   array = another_array
        ///   identifier(substring) = value
        /// 
        /// </summary>
        /// <param name="cg">A code generator object</param>
        public override void Generate(CodeGenerator cg)
        {
            if (cg == null) {
                throw new ArgumentNullException("cg");
            }

            Symbol sym = Identifier.Symbol;

            if (sym.IsArray) {
                GenerateSaveToArray(cg);
                return;
            }
            if (Identifier.HasSubstring) {
                if (sym.IsParameter) {
                    cg.Emitter.LoadParameter(sym.ParameterIndex);
                } else {
                    cg.Emitter.LoadLocal(sym.Index);
                }
                SymType exprType = cg.GenerateExpression(SymType.NONE, ValueExpression);
                GenerateSaveSubstring(cg, exprType);
                return;
            }
            if (!sym.IsValueType) {
                if (sym.IsParameter) {
                    cg.Emitter.LoadParameter(sym.ParameterIndex);
                } else {
                    cg.Emitter.LoadLocal(sym.Index);
                }
                SymType exprType = cg.GenerateExpression(SymType.NONE, ValueExpression);
                if (sym.Type == SymType.FIXEDCHAR) {
                    MethodInfo meth = cg.GetMethodForType(typeof(JComLib.FixedString), "Set", new [] { Symbol.SymTypeToSystemType(exprType) });
                    cg.Emitter.Call(meth);
                }
                return;
            }
            if (sym.IsLocal) {
                cg.GenerateExpression(sym.Type, ValueExpression);
                cg.StoreLocal(sym);
                return;
            }
            GenerateStoreArgument(cg, sym);
        }