bug fix #1978
This commit is contained in:
parent
27d40ffd2d
commit
c95b0aa94d
|
|
@ -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
24
TestSuite/pointers11.pas
Normal 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.
|
||||
Loading…
Reference in a new issue