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