From bf059476194c8a0f6ccef2c8318dfaa8c610df92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Tue, 28 Mar 2017 21:34:50 +0200 Subject: [PATCH] bug fix in NETGenerator --- NETGenerator/NETGenerator.cs | 49 +++++++++++++++-------- TestSuite/classfield2.pas | 23 +++++++++++ TreeConverter/TreeRealization/generics.cs | 1 - 3 files changed, 56 insertions(+), 17 deletions(-) create mode 100644 TestSuite/classfield2.pas diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index d80ed9cd7..671a86ed9 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -5114,14 +5114,14 @@ namespace PascalABCCompiler.NETGenerator public override void visit(SemanticTree.ICompiledFieldReferenceNode value) { bool tmp_dot = is_dot_expr; - if (tmp_dot == false) + if (!tmp_dot) is_dot_expr = true; if (value.field.compiled_field.IsLiteral == false) { value.obj.visit(this); - if (is_addr == false) + if (!is_addr) { - if (tmp_dot == true && value.field.compiled_field.FieldType.IsValueType) + if (tmp_dot && value.field.compiled_field.FieldType.IsValueType) { il.Emit(OpCodes.Ldflda, value.field.compiled_field); } @@ -5145,24 +5145,38 @@ namespace PascalABCCompiler.NETGenerator public override void visit(SemanticTree.IStaticCommonClassFieldReferenceNode value) { - FieldInfo fi = helper.GetField(value.static_field).fi; - if (is_addr == false) - il.Emit(OpCodes.Ldsfld, fi); + bool tmp_dot = is_dot_expr; + FldInfo fi_info = helper.GetField(value.static_field); + FieldInfo fi = fi_info.fi; + if (!is_addr) + { + if (tmp_dot) + { + if (fi_info.field_type.IsValueType || fi_info.field_type.IsGenericParameter) + { + il.Emit(OpCodes.Ldsflda, fi); + } + else + il.Emit(OpCodes.Ldsfld, fi); + } + else + il.Emit(OpCodes.Ldsfld, fi); + } else il.Emit(OpCodes.Ldsflda, fi); - if (is_dot_expr) + /*if (is_dot_expr) { //здесь в условии ошибка //(ssyy) интересно, какая:) Добавил проверку для generics if (fi.FieldType.IsValueType && fi.FieldType.IsPrimitive || fi.FieldType.IsGenericParameter) il.Emit(OpCodes.Box, fi.FieldType); - } + }*/ } public override void visit(SemanticTree.ICommonClassFieldReferenceNode value) { bool tmp_dot = is_dot_expr; - if (tmp_dot == false) + if (!tmp_dot) is_dot_expr = true; bool temp_is_addr = is_addr; is_addr = false; @@ -5171,21 +5185,24 @@ namespace PascalABCCompiler.NETGenerator is_addr = temp_is_addr; FldInfo fi_info = helper.GetField(value.field); FieldInfo fi = fi_info.fi; - if (is_addr == false) + if (!is_addr) { - if (tmp_dot == true) + if (tmp_dot) { - if (fi_info.field_type.IsValueType == true || fi_info.field_type.IsGenericParameter) + if (fi_info.field_type.IsValueType || fi_info.field_type.IsGenericParameter) { il.Emit(OpCodes.Ldflda, fi); } - else il.Emit(OpCodes.Ldfld, fi); + else + il.Emit(OpCodes.Ldfld, fi); } - else il.Emit(OpCodes.Ldfld, fi); + else + il.Emit(OpCodes.Ldfld, fi); } - else il.Emit(OpCodes.Ldflda, fi); + else + il.Emit(OpCodes.Ldflda, fi); - if (tmp_dot == false) + if (!tmp_dot) { is_dot_expr = false; } diff --git a/TestSuite/classfield2.pas b/TestSuite/classfield2.pas new file mode 100644 index 000000000..1a0ba9c80 --- /dev/null +++ b/TestSuite/classfield2.pas @@ -0,0 +1,23 @@ +type + TRec = record + a: integer; + end; + + cls = record + class i: integer := 3; + class obj: object := new object; + class rec: TRec; + end; + +begin + assert(cls.i = 3); + assert(cls.obj <> nil); + with cls do + begin + i := 2; + assert(i = 2); + rec := new TRec; + rec.a := 2; + assert(rec.a = 2); + end; +end. \ No newline at end of file diff --git a/TreeConverter/TreeRealization/generics.cs b/TreeConverter/TreeRealization/generics.cs index 7b9303f79..110563428 100644 --- a/TreeConverter/TreeRealization/generics.cs +++ b/TreeConverter/TreeRealization/generics.cs @@ -2239,5 +2239,4 @@ namespace PascalABCCompiler.TreeRealization } } - }