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 } } - }