From 70d9fc52bbe289335eea4a03834946b56bf4e6d4 Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Sun, 21 Nov 2021 14:37:34 +0100 Subject: [PATCH] #2562 --- NETGenerator/NETGenerator.cs | 39 +++++++++++++++++------ TestSuite/lambdas_generics15.pas | 11 +++++++ TreeConverter/TreeRealization/generics.cs | 8 +++++ 3 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 TestSuite/lambdas_generics15.pas diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index 41567c291..7d51b80d5 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -9033,11 +9033,13 @@ namespace PascalABCCompiler.NETGenerator Label lb_true = il.DefineLabel(); Label lb_end = il.DefineLabel(); Label lb_common = il.DefineLabel(); - LocalBuilder lb_left = il.DeclareLocal(ti_left.tp); - LocalBuilder lb_right = il.DeclareLocal(ti_right.tp); + LocalBuilder lb_left = null; + LocalBuilder lb_right = null; if (!(real_parameters[0] is IDefaultOperatorNode) && !(real_parameters[1] is IDefaultOperatorNode)) { - is_dot_expr = true; + //is_dot_expr = true; + lb_left = il.DeclareLocal(ti_left.tp); + lb_right = il.DeclareLocal(ti_right.tp); real_parameters[0].visit(this); il.Emit(OpCodes.Stloc, lb_left); il.Emit(OpCodes.Ldloca, lb_left); @@ -9049,7 +9051,7 @@ namespace PascalABCCompiler.NETGenerator LocalBuilder tmp_lb = il.DeclareLocal(TypeFactory.BoolType); il.Emit(OpCodes.Stloc, tmp_lb); il.Emit(OpCodes.Ldloc, tmp_lb); - is_dot_expr = true; + //is_dot_expr = true; real_parameters[1].visit(this); il.Emit(OpCodes.Stloc, lb_right); il.Emit(OpCodes.Ldloca, lb_right); @@ -9131,15 +9133,32 @@ namespace PascalABCCompiler.NETGenerator if (!(real_parameters[0] is IDefaultOperatorNode)) { - is_dot_expr = true; - il.Emit(OpCodes.Ldloca, lb_left); - il.Emit(OpCodes.Call, mi_left); + if (lb_left != null) + { + il.Emit(OpCodes.Ldloca, lb_left); + il.Emit(OpCodes.Call, mi_left); + } + else + { + is_dot_expr = true; + real_parameters[0].visit(this); + il.Emit(OpCodes.Call, mi_left); + } } if (!(real_parameters[1] is IDefaultOperatorNode)) { - is_dot_expr = true; - il.Emit(OpCodes.Ldloca, lb_right); - il.Emit(OpCodes.Call, mi_right); + if (lb_right != null) + { + il.Emit(OpCodes.Ldloca, lb_right); + il.Emit(OpCodes.Call, mi_right); + } + else + { + is_dot_expr = true; + real_parameters[1].visit(this); + il.Emit(OpCodes.Call, mi_right); + } + } MethodInfo eq_mi = null; if (real_parameters[0].type is IGenericTypeInstance) diff --git a/TestSuite/lambdas_generics15.pas b/TestSuite/lambdas_generics15.pas new file mode 100644 index 000000000..d539394db --- /dev/null +++ b/TestSuite/lambdas_generics15.pas @@ -0,0 +1,11 @@ +type + Container = record + val: integer; + end; + +begin + var c: Container; + c.val := 2; + var s: sequence of Container := Arr(c); + assert(s.Max(a->a.val) = 2); +end. \ No newline at end of file diff --git a/TreeConverter/TreeRealization/generics.cs b/TreeConverter/TreeRealization/generics.cs index 9c9702b46..54db1cf96 100644 --- a/TreeConverter/TreeRealization/generics.cs +++ b/TreeConverter/TreeRealization/generics.cs @@ -2414,6 +2414,14 @@ namespace PascalABCCompiler.TreeRealization } } + public override bool is_extension_method + { + get + { + return _original_function.is_extension_method; + } + } + public override bool is_generic_function_instance { get