This commit is contained in:
Бондарев Иван 2019-12-08 12:17:54 +01:00
parent 6d94497a24
commit 02fea6b4a2
4 changed files with 54 additions and 5 deletions

View file

@ -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);

View file

@ -1809,6 +1809,10 @@ procedure Reverse<T>(a: array of T; index, count: integer);
procedure Reverse<T>(a: List<T>);
/// Изменяет порядок элементов на противоположный в диапазоне списка длины count, начиная с индекса index
procedure Reverse<T>(a: List<T>; index, count: integer);
/// Изменяет порядок символов в строке на противоположный
procedure Reverse(var s: string);
/// Изменяет порядок символов в части строки длины count на противоположный, начиная с индекса index
procedure Reverse(var s: string; index, count: integer);
/// Перемешивает динамический массив случайным образом
procedure Shuffle<T>(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<T>(a: array of T);
begin

28
TestSuite/generics31.pas Normal file
View file

@ -0,0 +1,28 @@
type
t1<T> = class
a := new integer[5];
end;
t2 = class
end;
procedure p1<T,TEl>(x: T); where T: t1<TEl>;
begin
assert(x.a.GetType.FullName = 'System.Int32[]'); // говорит что "t1<byte>", хотя должно быть "array of word"
end;
procedure p2<T>(x: T);
begin
assert(x.ToString = '2');
end;
procedure p3<T>(x: T); where T: class;
begin
assert(x.ToString = 'generics31.t2');
end;
begin
p1&<t1<byte>,byte>(new t1<byte>);
p2(2);
p3(new t2);
end.

View file

@ -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