bug fix in NETGenerator

This commit is contained in:
Бондарев Иван 2017-03-28 21:34:50 +02:00
parent 65744db1fa
commit bf05947619
3 changed files with 56 additions and 17 deletions

View file

@ -5114,14 +5114,14 @@ namespace PascalABCCompiler.NETGenerator
public override void visit(SemanticTree.ICompiledFieldReferenceNode value) public override void visit(SemanticTree.ICompiledFieldReferenceNode value)
{ {
bool tmp_dot = is_dot_expr; bool tmp_dot = is_dot_expr;
if (tmp_dot == false) if (!tmp_dot)
is_dot_expr = true; is_dot_expr = true;
if (value.field.compiled_field.IsLiteral == false) if (value.field.compiled_field.IsLiteral == false)
{ {
value.obj.visit(this); 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); il.Emit(OpCodes.Ldflda, value.field.compiled_field);
} }
@ -5145,24 +5145,38 @@ namespace PascalABCCompiler.NETGenerator
public override void visit(SemanticTree.IStaticCommonClassFieldReferenceNode value) public override void visit(SemanticTree.IStaticCommonClassFieldReferenceNode value)
{ {
FieldInfo fi = helper.GetField(value.static_field).fi; bool tmp_dot = is_dot_expr;
if (is_addr == false) FldInfo fi_info = helper.GetField(value.static_field);
il.Emit(OpCodes.Ldsfld, fi); 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 else
il.Emit(OpCodes.Ldsflda, fi); il.Emit(OpCodes.Ldsflda, fi);
if (is_dot_expr) /*if (is_dot_expr)
{ {
//здесь в условии ошибка //здесь в условии ошибка
//(ssyy) интересно, какая:) Добавил проверку для generics //(ssyy) интересно, какая:) Добавил проверку для generics
if (fi.FieldType.IsValueType && fi.FieldType.IsPrimitive || fi.FieldType.IsGenericParameter) if (fi.FieldType.IsValueType && fi.FieldType.IsPrimitive || fi.FieldType.IsGenericParameter)
il.Emit(OpCodes.Box, fi.FieldType); il.Emit(OpCodes.Box, fi.FieldType);
} }*/
} }
public override void visit(SemanticTree.ICommonClassFieldReferenceNode value) public override void visit(SemanticTree.ICommonClassFieldReferenceNode value)
{ {
bool tmp_dot = is_dot_expr; bool tmp_dot = is_dot_expr;
if (tmp_dot == false) if (!tmp_dot)
is_dot_expr = true; is_dot_expr = true;
bool temp_is_addr = is_addr; bool temp_is_addr = is_addr;
is_addr = false; is_addr = false;
@ -5171,21 +5185,24 @@ namespace PascalABCCompiler.NETGenerator
is_addr = temp_is_addr; is_addr = temp_is_addr;
FldInfo fi_info = helper.GetField(value.field); FldInfo fi_info = helper.GetField(value.field);
FieldInfo fi = fi_info.fi; 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); 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; is_dot_expr = false;
} }

23
TestSuite/classfield2.pas Normal file
View file

@ -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.

View file

@ -2239,5 +2239,4 @@ namespace PascalABCCompiler.TreeRealization
} }
} }
} }