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