public override void GenerateCode(ILCodeGenerator cg)
        {
            LValue.LoadVariableInTheStack = false;
            LValue.GenerateCode(cg);
            LValue.LoadVariableInTheStack = true;

            //generamos Expression
            Expression.GenerateCode(cg);

            if (LValue is LValueIdNode)
            {
                LValueIdNode  id  = LValue as LValueIdNode;
                ILElementInfo ile = cg.ILContextTable.GetDefinedVarOrFunction(id.VariableName);

                if (!Object.Equals(ile.FieldBuilder, null))
                {
                    cg.ILGenerator.Emit(OpCodes.Stsfld, ile.FieldBuilder);
                }
                else if (!Object.Equals(ile.LocalBuilder, null))
                {
                    cg.ILGenerator.Emit(OpCodes.Stloc, ile.LocalBuilder);
                }
            }
            else if (LValue is ArrayIndexAccessNode)
            {
                ArrayIndexAccessNode arrayElement = LValue as ArrayIndexAccessNode;
                cg.ILGenerator.Emit(OpCodes.Stelem, arrayElement.NodeInfo.Type.ILType);
            }
            else
            {
                RecordDotAccessNode recordAccess = (LValue as RecordDotAccessNode);
                ILElementInfo       ile          = cg.ILContextTable.GetDefinedType(recordAccess.RecordName);
                FieldInfo           fi           = ile.TypeBuilder.GetField(recordAccess.ID);
                cg.ILGenerator.Emit(OpCodes.Stfld, fi);
            }
        }
Exemplo n.º 2
0
 public override void GenerateCode(StringBuilder sb, int tabsOffset)
 {
     LValue.GenerateCode(sb, tabsOffset);
     sb.AppendFormat(" {0} ", GetValue(Operator));
     Value.GenerateCode(sb, 0);
 }