public virtual void visit(IRecordInitializer value)
 {
 }
示例#2
0
        private void GenerateRecordInitCode(ILGenerator il, LocalBuilder lb, IRecordInitializer init_value, bool is_in_arr)
        {
            ICommonTypeNode ctn = init_value.type as ICommonTypeNode;
            IExpressionNode[] 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 IArrayInitializer)
                {
                    TypeInfo ti = helper.GetTypeReference(FieldValues[i].type);
                    LocalBuilder alb = il.DeclareLocal(ti.tp);
                    CreateArrayLocalVariable(il, alb, ti, FieldValues[i] as IArrayInitializer, FieldValues[i].type);
                    il.Emit(OpCodes.Ldloc, lb);
                    il.Emit(OpCodes.Ldloc, alb);
                    il.Emit(OpCodes.Stfld, field.fi);
                }
                else
                    if (FieldValues[i] is IRecordInitializer)
                    {
                        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 IRecordInitializer, false);
                    }
                    else
                    {
                        is_dot_expr = false;
                        if (is_in_arr)
                            il.Emit(OpCodes.Ldloc, lb);
                        else
                            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);
                    }
            }
        }
示例#3
0
 private void CreateRecordLocalVariable(ILGenerator il, LocalBuilder lb, TypeInfo ti, IRecordInitializer InitalValue)
 {
     if (ti.init_meth != null)
     {
         il.Emit(OpCodes.Ldloca, lb);
         il.Emit(OpCodes.Call, ti.init_meth);
     }
     LocalBuilder llb = il.DeclareLocal(lb.LocalType.MakePointerType());
     il.Emit(OpCodes.Ldloca, lb);
     il.Emit(OpCodes.Stloc, llb);
     GenerateRecordInitCode(il, llb, InitalValue, false);
 }
示例#4
0
 public override void visit(IRecordInitializer value)
 {
     TypeInfo ti = helper.GetTypeReference(value.type);
     LocalBuilder lb = il.DeclareLocal(ti.tp);
     CreateRecordLocalVariable(il, lb, ti, value);
     il.Emit(OpCodes.Ldloc, lb);
 }
示例#5
0
		public void visit(IRecordInitializer value)
		{
			
		}
示例#6
0
		public void visit(IRecordInitializer value)
		{
            throw new System.NotSupportedException(value.GetType().ToString());
		}