From 38cc2e026fe3d941c1ddf509f5e9e88edd962248 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: Sun, 1 Mar 2020 17:30:28 +0100 Subject: [PATCH] bug fix #2146 --- Compiler/PCU/PCUReader.cs | 25 ++++++++++++++++++++++--- TestSuite/units/u_where1.pas | 20 ++++++++++++++++++++ TestSuite/units/u_while1.pas | 2 +- TestSuite/usesunits/use_where1.pas | 1 + 4 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 TestSuite/units/u_where1.pas create mode 100644 TestSuite/usesunits/use_where1.pas diff --git a/Compiler/PCU/PCUReader.cs b/Compiler/PCU/PCUReader.cs index e85c100f6..8eced8003 100644 --- a/Compiler/PCU/PCUReader.cs +++ b/Compiler/PCU/PCUReader.cs @@ -1434,21 +1434,30 @@ namespace PascalABCCompiler.PCU { common_namespace_function_node orig = GetNamespaceFunctionByOffset(); List parameters = GetTypesList(); - return orig.get_instance(parameters, false, null) as generic_namespace_function_instance_node; + int tmp_pos = (int)br.BaseStream.Position; + var instance = orig.get_instance(parameters, false, null) as generic_namespace_function_instance_node; + br.BaseStream.Seek(tmp_pos, SeekOrigin.Begin); + return instance; } private function_node GetCompiledGenericMethodInstanceReference() { compiled_function_node orig = GetCompiledMethod(br.ReadInt32()); List parameters = GetTypesList(); - return orig.get_instance(parameters, false, null); + int tmp_pos = (int)br.BaseStream.Position; + var instance = orig.get_instance(parameters, false, null); + br.BaseStream.Seek(tmp_pos, SeekOrigin.Begin); + return instance; } private generic_method_instance_node GetCommonGenericMethodInstanceReference() { common_method_node orig = GetMethodByOffset(); List parameters = GetTypesList(); - return orig.get_instance(parameters, false, null) as generic_method_instance_node; + int tmp_pos = (int)br.BaseStream.Position; + var instance = orig.get_instance(parameters, false, null) as generic_method_instance_node; + br.BaseStream.Seek(tmp_pos, SeekOrigin.Begin); + return instance; } private common_type_node GetGenericParameterOfType() @@ -4553,6 +4562,16 @@ namespace PascalABCCompiler.PCU return lab; } + public int GetStreamPosition() + { + return (int)br.BaseStream.Position; + } + + public void SetStreamPosition(int pos) + { + br.BaseStream.Seek(pos, SeekOrigin.Begin); + } + /*private List CreateLabels() { int count = br.ReadInt32(); diff --git a/TestSuite/units/u_where1.pas b/TestSuite/units/u_where1.pas new file mode 100644 index 000000000..3aadbf0cd --- /dev/null +++ b/TestSuite/units/u_where1.pas @@ -0,0 +1,20 @@ +unit u_where1; + +var i: integer; + +type + t1 = class end; + +procedure p0(a: T); where T: t1; +begin + i := 1; +end; + +procedure p1; +begin + p0&,byte>(new t1); +end; +begin + p1; + assert(i = 1); +end. \ No newline at end of file diff --git a/TestSuite/units/u_while1.pas b/TestSuite/units/u_while1.pas index 5a98adea2..137dca609 100644 --- a/TestSuite/units/u_while1.pas +++ b/TestSuite/units/u_while1.pas @@ -1,4 +1,4 @@ -unit u_while1; +unit u_while1; begin var i := 1; var s := 0; diff --git a/TestSuite/usesunits/use_where1.pas b/TestSuite/usesunits/use_where1.pas new file mode 100644 index 000000000..1adc3c21b --- /dev/null +++ b/TestSuite/usesunits/use_where1.pas @@ -0,0 +1 @@ +uses u_where1; begin end. \ No newline at end of file