From 65744db1fa77017de5b6a2b783d842b811bbe44f 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: Wed, 22 Mar 2017 21:22:29 +0100 Subject: [PATCH] bug fix #350 --- TestSuite/generics11.pas | 11 +++++++++++ .../TreeConversion/syntax_tree_visitor.cs | 1 + TreeConverter/TreeRealization/generics.cs | 14 ++++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 TestSuite/generics11.pas diff --git a/TestSuite/generics11.pas b/TestSuite/generics11.pas new file mode 100644 index 000000000..e08ee19bb --- /dev/null +++ b/TestSuite/generics11.pas @@ -0,0 +1,11 @@ +var i: integer; +procedure Right; +begin + Inc(i); +end; +begin + var t1 := Arr(Right,Right); + t1[0]; + t1[1]; + assert(i=2); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 8e138b834..e6c4aba0c 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -168,6 +168,7 @@ namespace PascalABCCompiler.TreeConverter init_properties); SystemLibrary.SystemLibrary.system_unit = _system_unit; generic_convertions.reset_generics(); + generic_convertions.visitor = this; _record_created = false; RefTypesForCheckPointersTypeForDotNetFramework.Clear(); reset_for_interface(); diff --git a/TreeConverter/TreeRealization/generics.cs b/TreeConverter/TreeRealization/generics.cs index 909e52f55..7b9303f79 100644 --- a/TreeConverter/TreeRealization/generics.cs +++ b/TreeConverter/TreeRealization/generics.cs @@ -196,6 +196,7 @@ namespace PascalABCCompiler.TreeRealization } //Вспомогательный класс для создания псевдо-инстанций generic-типов. + //TODO: sdelat singletonom. staticheskie klassy eto gadost public static class generic_convertions { //Список, хранящий все псевдо-инстанции generic-типов, нужен для NetGenerator. @@ -207,6 +208,8 @@ namespace PascalABCCompiler.TreeRealization public static Hashtable generic_instances = new Hashtable(); + public static syntax_tree_visitor visitor; + public static List get_type_instances(type_node original_generic_type) { List instances = generic_instances[original_generic_type] as List; @@ -1005,12 +1008,23 @@ namespace PascalABCCompiler.TreeRealization //Этот тип-параметр ещё не был выведен. if (fact_type is delegated_methods && (fact_type as delegated_methods).empty_param_method != null && (fact_type as delegated_methods).empty_param_method.ret_type != null) fact_type = (fact_type as delegated_methods).empty_param_method.ret_type; + //if (fact_type is delegated_methods) + // fact_type = visitor.CreateDelegate((fact_type as delegated_methods).proper_methods[0].simple_function_node); deduced[par_num] = fact_type; return true; } //Этот тип-параметр уже был выведен. Сравниваем с выведенным. if (!convertion_data_and_alghoritms.eq_type_nodes(fact_type, deduced[par_num], true)) { + if (fact_type is delegated_methods && deduced[par_num].IsDelegate) + { + delegate_internal_interface d1 = deduced[par_num].get_internal_interface(internal_interface_kind.delegate_interface) as delegate_internal_interface; + return convertion_data_and_alghoritms.function_eq_params_and_result((fact_type as delegated_methods).proper_methods[0].simple_function_node, d1.invoke_method); + } + else if (fact_type is delegated_methods && deduced[par_num] is delegated_methods) + { + return convertion_data_and_alghoritms.function_eq_params_and_result((fact_type as delegated_methods).proper_methods[0].simple_function_node, (deduced[par_num] as delegated_methods).proper_methods[0].simple_function_node); + } return false; } return true;