bug fix in NETGenerator
This commit is contained in:
parent
65744db1fa
commit
bf05947619
|
|
@ -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
23
TestSuite/classfield2.pas
Normal 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.
|
||||
|
|
@ -2239,5 +2239,4 @@ namespace PascalABCCompiler.TreeRealization
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue