public virtual void visit(IRecordInitializer value) { }
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); } } }
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); }
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); }
public void visit(IRecordInitializer value) { }
public void visit(IRecordInitializer value) { throw new System.NotSupportedException(value.GetType().ToString()); }