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