This commit is contained in:
Бондарев Иван 2017-10-22 14:12:03 +02:00
parent 43f8deb104
commit 252e89fde7
2 changed files with 32 additions and 6 deletions

View file

@ -7550,11 +7550,11 @@ namespace PascalABCCompiler.NETGenerator
private void BoxAssignToParameter(IExpressionNode to, IExpressionNode from)
{
ICompiledTypeNode ctn2 = to.type as ICompiledTypeNode;
if ((from.type.is_value_type || from.type.is_generic_parameter) && ctn2 != null && ctn2.compiled_type == TypeFactory.ObjectType)
if ((from.type.is_value_type || from.type.is_generic_parameter) && ctn2 != null && (ctn2.compiled_type == TypeFactory.ObjectType || ctn2.IsInterface))
{
il.Emit(OpCodes.Box, helper.GetTypeReference(from.type).tp);
}
else if (from.conversion_type != null && (from.type.is_value_type || from.type.is_generic_parameter) && ctn2 != null && ctn2.compiled_type == TypeFactory.ObjectType)
else if (from.conversion_type != null && (from.type.is_value_type || from.type.is_generic_parameter) && ctn2 != null && (ctn2.compiled_type == TypeFactory.ObjectType || ctn2.IsInterface))
{
il.Emit(OpCodes.Box, helper.GetTypeReference(from.conversion_type).tp);
}
@ -7940,11 +7940,15 @@ namespace PascalABCCompiler.NETGenerator
return;
}
ICompiledTypeNode ctn2 = to.type as ICompiledTypeNode;
if ((from.type.is_value_type || from.type.is_generic_parameter) && ctn2 != null && ctn2.compiled_type == TypeFactory.ObjectType)
if ((from.type.is_value_type || from.type.is_generic_parameter) && ctn2 != null && (ctn2.compiled_type == TypeFactory.ObjectType || ctn2.IsInterface))
{
il.Emit(OpCodes.Box, helper.GetTypeReference(from.type).tp);
}
else if (from.conversion_type != null && (from.conversion_type.is_value_type || from.conversion_type.is_generic_parameter) && ctn2 != null && ctn2.compiled_type == TypeFactory.ObjectType)
else if ((from.type.is_value_type || from.type.is_generic_parameter) && to.type.IsInterface)
{
il.Emit(OpCodes.Box, helper.GetTypeReference(from.type).tp);
}
else if (from.conversion_type != null && (from.conversion_type.is_value_type || from.conversion_type.is_generic_parameter) && ctn2 != null && (ctn2.compiled_type == TypeFactory.ObjectType || ctn2.IsInterface))
{
il.Emit(OpCodes.Box, helper.GetTypeReference(from.conversion_type).tp);
}
@ -7977,11 +7981,11 @@ namespace PascalABCCompiler.NETGenerator
}
//ICompiledTypeNode ctn = from.type as ICompiledTypeNode;
ICompiledTypeNode ctn2 = to.type as ICompiledTypeNode;
if ((from.type.is_value_type || from.type.is_generic_parameter) && ctn2 != null && ctn2.compiled_type == TypeFactory.ObjectType)
if ((from.type.is_value_type || from.type.is_generic_parameter) && ctn2 != null && (ctn2.compiled_type == TypeFactory.ObjectType || (ctn2.compiled_type == TypeFactory.ObjectType || ctn2.compiled_type.IsInterface)))
{
il.Emit(OpCodes.Box, helper.GetTypeReference(from.type).tp);
}
else if (from.conversion_type != null && (from.conversion_type.is_value_type || from.conversion_type.is_generic_parameter) && ctn2 != null && ctn2.compiled_type == TypeFactory.ObjectType)
else if (from.conversion_type != null && (from.conversion_type.is_value_type || from.conversion_type.is_generic_parameter) && ctn2 != null && (ctn2.compiled_type == TypeFactory.ObjectType || ctn2.compiled_type.IsInterface))
{
il.Emit(OpCodes.Box, helper.GetTypeReference(from.conversion_type).tp);
}

22
TestSuite/boxing2.pas Normal file
View file

@ -0,0 +1,22 @@
type
Ir1=interface end;
r1=record(Ir1)
i: integer;
end;
procedure Test(i: Ir1);
begin
assert(r1(i).i = 2);
end;
begin
var a := new Ir1[1];
var rrr: r1;
rrr.i := 2;
a[0] := rrr;
var i1: Ir1 := rrr;
assert(r1(a[0]).i = 2);
assert(r1(i1).i = 2);
Test(a[0]);
end.