From c95b0aa94d36fa9f2d8983adeb32b256c81cc2f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Mon, 10 Jun 2019 14:02:31 +0200 Subject: [PATCH] bug fix #1978 --- NETGenerator/NETGenerator.cs | 26 ++++++++++++++++---------- TestSuite/pointers11.pas | 24 ++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 TestSuite/pointers11.pas diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index 9cfb12884..0843ecea9 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -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) diff --git a/TestSuite/pointers11.pas b/TestSuite/pointers11.pas new file mode 100644 index 000000000..ca42084fd --- /dev/null +++ b/TestSuite/pointers11.pas @@ -0,0 +1,24 @@ +type + t0 = class end; + t1 = class(t0) + + 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. \ No newline at end of file