This commit is contained in:
Бондарев Иван 2019-06-10 14:02:31 +02:00
parent 27d40ffd2d
commit c95b0aa94d
2 changed files with 40 additions and 10 deletions

View file

@ -7363,25 +7363,31 @@ namespace PascalABCCompiler.NETGenerator
MethInfo meth = helper.GetMethod(value.namespace_function);
IExpressionNode[] real_parameters = value.real_parameters;
//если это стандартная (New или Dispose)
if (meth == null || meth.stand == true)
if (meth == null || meth.stand)
{
if (GenerateStandardFuncCall(value, il))
return;
if (meth == null)
meth = MakeStandardFunc(value);
IRefTypeNode rtn = (IRefTypeNode)real_parameters[0].type;
TypeInfo ti = helper.GetTypeReference(rtn.pointed_type);
//int size = 0;
//if (ti.tp.IsPointer == true) size = Marshal.SizeOf(TypeFactory.Int32Type);
//else size = GetTypeSize(ti.tp, rtn.pointed_type);
Type ptrt = null;
TypeInfo ti = null;
if (real_parameters[0].type is IRefTypeNode)
{
IRefTypeNode rtn = (IRefTypeNode)real_parameters[0].type;
ti = helper.GetTypeReference(rtn.pointed_type);
ptrt = ti.tp;
}
else
{
ti = helper.GetTypeReference(real_parameters[0].type);
ptrt = ti.tp.GetElementType();
}
is_addr = true;
real_parameters[0].visit(this);
is_addr = false;
//il.Emit(OpCodes.Ldc_I4, size);
//NETGeneratorTools.LdcIntConst(il, size);
PushSize(ti.tp);
PushSize(ptrt);
il.Emit(OpCodes.Call, meth.mi);
if (value.namespace_function.SpecialFunctionKind == SpecialFunctionKind.New)
if (value.namespace_function.SpecialFunctionKind == SpecialFunctionKind.New && real_parameters[0].type is IRefTypeNode)
{
ITypeNode tn = (real_parameters[0].type as IRefTypeNode).pointed_type;
if (tn.type_special_kind == type_special_kind.array_wrapper)

24
TestSuite/pointers11.pas Normal file
View file

@ -0,0 +1,24 @@
type
t0<T> = class end;
t1 = class(t0<byte>)
ptr: ^byte;
ptr2: ^string[5];
procedure p1;
begin
New(ptr);
ptr^ := 2;
New(ptr2);
ptr2^ := 'abcdef';
end;
end;
begin
var o := new t1;
o.p1;
assert(o.ptr^ = 2);
assert(o.ptr2^ = 'abcde');
dispose(o.ptr);
dispose(o.ptr2);
end.