diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index 39257e2a0..763016827 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -5208,10 +5208,13 @@ namespace PascalABCCompiler.NETGenerator public override void visit(SemanticTree.ICommonParameterReferenceNode value) { bool must_push_addr = false;//должен ли упаковываться, но это если после идет точка - if (is_dot_expr == true)//если после идет точка + if (is_dot_expr)//если после идет точка { if (value.type.is_value_type || value.type.is_generic_parameter) - must_push_addr = true; + { + if (!(value.type.is_generic_parameter && value.type.base_type != null && value.type.base_type.is_class && value.type.base_type.base_type != null)) + must_push_addr = true; + } } ParamInfo pi = helper.GetParameter(value.parameter); if (pi.kind == ParamKind.pkNone) @@ -5227,7 +5230,7 @@ namespace PascalABCCompiler.NETGenerator if (value.parameter.parameter_type == parameter_type.value) { //напомним, что is_addr - передается ли он в качестве факт. параметра по ссылке - if (is_addr == false) + if (!is_addr) { if (must_push_addr) { @@ -5244,7 +5247,7 @@ namespace PascalABCCompiler.NETGenerator { //это var-параметр PushParameter(pos); - if (is_addr == false && !must_push_addr) + if (!is_addr && !must_push_addr) { TypeInfo ti = helper.GetTypeReference(value.parameter.type); NETGeneratorTools.PushParameterDereference(il, ti.tp); diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas index c1a184684..ddd4eb6c7 100644 --- a/TestSuite/CompilationSamples/PABCSystem.pas +++ b/TestSuite/CompilationSamples/PABCSystem.pas @@ -1809,6 +1809,10 @@ procedure Reverse(a: array of T; index, count: integer); procedure Reverse(a: List); /// Изменяет порядок элементов на противоположный в диапазоне списка длины count, начиная с индекса index procedure Reverse(a: List; index, count: integer); +/// Изменяет порядок символов в строке на противоположный +procedure Reverse(var s: string); +/// Изменяет порядок символов в части строки длины count на противоположный, начиная с индекса index +procedure Reverse(var s: string; index, count: integer); /// Перемешивает динамический массив случайным образом procedure Shuffle(a: array of T); /// Перемешивает список случайным образом @@ -7637,6 +7641,19 @@ begin a.Reverse(index, count) end; +procedure Reverse(var s: string); +begin + var cc := s.ToCharArray; + Reverse(cc); + s := new string(cc); +end; + +procedure Reverse(var s: string; index, count: integer); +begin + var cc := s.ToCharArray; + Reverse(cc,index-1,count); + s := new string(cc); +end; procedure Shuffle(a: array of T); begin diff --git a/TestSuite/generics31.pas b/TestSuite/generics31.pas new file mode 100644 index 000000000..f02b18bd1 --- /dev/null +++ b/TestSuite/generics31.pas @@ -0,0 +1,28 @@ +type + t1 = class + a := new integer[5]; + end; + + t2 = class + end; + +procedure p1(x: T); where T: t1; +begin + assert(x.a.GetType.FullName = 'System.Int32[]'); // говорит что "t1", хотя должно быть "array of word" +end; + +procedure p2(x: T); +begin + assert(x.ToString = '2'); +end; + +procedure p3(x: T); where T: class; +begin + assert(x.ToString = 'generics31.t2'); +end; + +begin + p1&,byte>(new t1); + p2(2); + p3(new t2); +end. \ No newline at end of file diff --git a/TreeConverter/TreeRealization/types.cs b/TreeConverter/TreeRealization/types.cs index 194fc7456..ccb844ab8 100644 --- a/TreeConverter/TreeRealization/types.cs +++ b/TreeConverter/TreeRealization/types.cs @@ -4504,7 +4504,8 @@ namespace PascalABCCompiler.TreeRealization { common_type_node del = type_constructor.instance.create_delegate(compilation_context.instance.get_delegate_type_name(), this.proper_methods[0].simple_function_node.return_value_type, this.proper_methods[0].simple_function_node.parameters, compilation_context.instance.converted_namespace, null); - compilation_context.instance.converted_namespace.types.AddElement(del); + if (compilation_context.instance.converted_namespace != null) + compilation_context.instance.converted_namespace.types.AddElement(del); ii = del.get_internal_interface(internal_interface_kind.delegate_interface); } else