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)
{
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;
}

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