bug fix #2147
This commit is contained in:
parent
6d94497a24
commit
02fea6b4a2
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
28
TestSuite/generics31.pas
Normal 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.
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue