public virtual void visit(IRecordConstantNode value)
 {
 }
Example #2
0
        private void GenerateRecordInitCode(ILGenerator il, LocalBuilder lb, IRecordConstantNode init_value)
        {
            ICommonTypeNode ctn = init_value.type as ICommonTypeNode;
            IConstantNode[] FieldValues = init_value.FieldValues;
            ICommonClassFieldNode[] Fields = ctn.fields;

            for (int i = 0; i < Fields.Length; i++)
            {
                FldInfo field = helper.GetField(Fields[i]);
                if (FieldValues[i] is IArrayConstantNode)
                {
                    TypeInfo ti = helper.GetTypeReference(FieldValues[i].type);
                    LocalBuilder alb = il.DeclareLocal(ti.tp);
                    CreateArrayLocalVariable(il, alb, ti, FieldValues[i] as IArrayConstantNode, FieldValues[i].type);
                    il.Emit(OpCodes.Ldloc, lb);
                    il.Emit(OpCodes.Ldloc, alb);
                    il.Emit(OpCodes.Stfld, field.fi);
                    //il.Emit(OpCodes.Stloc, alb);
                    //Здесь ошибка paporotnik\v2\main.pas
                    /*TypeInfo ti = helper.GetTypeReference(init_value.FieldValues[i].type);
					LocalBuilder alb = il.DeclareLocal(ti.arr_fld.FieldType);
					il.Emit(OpCodes.Ldloc, lb);
					il.Emit(OpCodes.Ldfld, field.fi);
					il.Emit(OpCodes.Ldfld, ti.arr_fld);
					il.Emit(OpCodes.Stloc, alb);
					GenerateArrayInitCode(il, alb, init_value.FieldValues[i] as IArrayConstantNode);*/
                }
                else
                    if (FieldValues[i] is IRecordConstantNode)
                    {
                        LocalBuilder llb = il.DeclareLocal(field.fi.FieldType.MakePointerType());
                        il.Emit(OpCodes.Ldloc, lb);
                        il.Emit(OpCodes.Ldflda, field.fi);
                        il.Emit(OpCodes.Stloc, llb);
                        GenerateRecordInitCode(il, llb, FieldValues[i] as IRecordConstantNode);
                    }
                    else
                    {
                        //bool tmp = is_dot_expr;

                        is_dot_expr = false;
                        il.Emit(OpCodes.Ldloc, lb);
                        ILGenerator tmp_il = this.il;
                        this.il = il;
                        FieldValues[i].visit(this);
                        this.il = tmp_il;
                        il.Emit(OpCodes.Stfld, field.fi);
                        //is_dot_expr = tmp;
                    }
            }
        }
Example #3
0
 public override void visit(IRecordConstantNode value)
 {
     if (is_dot_expr)
         il.Emit(OpCodes.Ldsflda, GetConvertedConstants(value));
     else
         il.Emit(OpCodes.Ldsfld, GetConvertedConstants(value));
 }
Example #4
0
 public void visit(IRecordConstantNode value)
 {
     string s = value.GetType().Name + ".";
     //value.FieldValues
     prepare_node(value.type, s + "type");
     //value.value
 }
Example #5
0
 public virtual void visit(IRecordConstantNode value)
 {
 	
 }
Example #6
0
 public void visit(IRecordConstantNode value)
 {
     throw new System.NotSupportedException(value.GetType().ToString());
 }