From eb7bff3077a8b2ea313737255cde78f81887cad6 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, 20 May 2018 14:18:29 +0200 Subject: [PATCH] bug fix #833 --- NETGenerator/NETGenerator.cs | 38 ++++++----------------------------- TestSuite/generics20.pas | 14 +++++++++++++ bin/TestRunner.exe | Bin 31232 -> 30720 bytes bin/TestRunner.pas | 3 +-- 4 files changed, 21 insertions(+), 34 deletions(-) create mode 100644 TestSuite/generics20.pas diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index cbea68f95..43bf96125 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -6850,37 +6850,6 @@ namespace PascalABCCompiler.NETGenerator bool is_comp_gen = false; IParameterNode[] parameters = value.static_method.parameters; EmitArguments(parameters, real_parameters); - /*for (int i = 0; i < real_parameters.Length; i++) - { - if (parameters[i].parameter_type == parameter_type.var) - is_addr = true; - ITypeNode ctn = real_parameters[i].type; - TypeInfo ti = helper.GetTypeReference(ctn); - - //(ssyy) moved up - ITypeNode tn2 = parameters[i].type; - ICompiledTypeNode ctn2 = tn2 as ICompiledTypeNode; - ITypeNode ctn3 = real_parameters[i].type; - //(ssyy) 07.12.2007 При боксировке нужно вызывать Ldsfld вместо Ldsflda. - //Дополнительная проверка введена именно для этого. - bool box_awaited = - (ctn2 != null && ctn2.compiled_type == TypeFactory.ObjectType || tn2.IsInterface) && !(real_parameters[i] is SemanticTree.INullConstantNode) && (ctn3.is_value_type || ctn3.is_generic_parameter); - - if (ti.clone_meth != null && ti.tp != null && ti.tp.IsValueType && !box_awaited && !parameters[i].is_const) - is_dot_expr = true; - is_comp_gen = CheckForCompilerGenerated(real_parameters[i]); - //if (save_debug_info) MarkSequencePoint(il, 0xFeeFee, 1, 0xFeeFee, 1); - //вызов фактического параметра - real_parameters[i].visit(this); - - is_dot_expr = false; - CallCloneIfNeed(il, parameters[i], real_parameters[i]); - if (box_awaited) - il.Emit(OpCodes.Box, helper.GetTypeReference(ctn3).tp); - is_addr = false; - }*/ - //if (save_debug_info && need_fee) - // MarkSequencePoint(il, value.Location); il.EmitCall(OpCodes.Call, mi, null); if (tmp_dot) { @@ -6950,7 +6919,12 @@ namespace PascalABCCompiler.NETGenerator { il.Emit(OpCodes.Box, helper.GetTypeReference(value.obj.conversion_type).tp); } - + else if (value.obj.type.is_value_type && !(value.obj is IAddressedExpressionNode) && !(value.obj is IThisNode)) + { + LocalBuilder lb = il.DeclareLocal(helper.GetTypeReference(value.obj.type).tp); + il.Emit(OpCodes.Stloc, lb); + il.Emit(OpCodes.Ldloca, lb); + } is_dot_expr = false; //bool is_comp_gen = false; //bool need_fee = false; diff --git a/TestSuite/generics20.pas b/TestSuite/generics20.pas new file mode 100644 index 000000000..bd416fd40 --- /dev/null +++ b/TestSuite/generics20.pas @@ -0,0 +1,14 @@ +function Deconstruct(d: Dictionary): (K, V); +begin + var kk := d.First.Key; + var vv := d.First.Value; + Result := (kk, vv); +end; + +begin + var d := new Dictionary; + d[1] := 2; + var t := Deconstruct(d); + assert(t.Item1 = 1); + assert(t.Item2 = 2); +end. \ No newline at end of file diff --git a/bin/TestRunner.exe b/bin/TestRunner.exe index 365eceafdcf6e53dd6a12f0800a18ba618cb7812..10777a946a76ba9c8bb2a57217a932c1d917a515 100644 GIT binary patch delta 5918 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
>3<5tcs#|Q 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 diff --git a/bin/TestRunner.pas b/bin/TestRunner.pas index 50d00f34b..76cf4d6ad 100644 --- a/bin/TestRunner.pas +++ b/bin/TestRunner.pas @@ -95,11 +95,10 @@ begin end; if i mod 20 = 0 then begin - Print(i); System.GC.Collect(); end; end; - Println; + //Println; end; procedure CompileAllCompilationTests(dir: string; withdll: boolean);