public virtual void visit(IRecordConstantNode value) { }
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; } } }
public override void visit(IRecordConstantNode value) { if (is_dot_expr) il.Emit(OpCodes.Ldsflda, GetConvertedConstants(value)); else il.Emit(OpCodes.Ldsfld, GetConvertedConstants(value)); }
public void visit(IRecordConstantNode value) { string s = value.GetType().Name + "."; //value.FieldValues prepare_node(value.type, s + "type"); //value.value }
public void visit(IRecordConstantNode value) { throw new System.NotSupportedException(value.GetType().ToString()); }