bug fix #2147
This commit is contained in:
parent
6d94497a24
commit
02fea6b4a2
|
|
@ -5208,11 +5208,14 @@ namespace PascalABCCompiler.NETGenerator
|
||||||
public override void visit(SemanticTree.ICommonParameterReferenceNode value)
|
public override void visit(SemanticTree.ICommonParameterReferenceNode value)
|
||||||
{
|
{
|
||||||
bool must_push_addr = false;//должен ли упаковываться, но это если после идет точка
|
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)
|
if (value.type.is_value_type || value.type.is_generic_parameter)
|
||||||
|
{
|
||||||
|
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;
|
must_push_addr = true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
ParamInfo pi = helper.GetParameter(value.parameter);
|
ParamInfo pi = helper.GetParameter(value.parameter);
|
||||||
if (pi.kind == ParamKind.pkNone)
|
if (pi.kind == ParamKind.pkNone)
|
||||||
{
|
{
|
||||||
|
|
@ -5227,7 +5230,7 @@ namespace PascalABCCompiler.NETGenerator
|
||||||
if (value.parameter.parameter_type == parameter_type.value)
|
if (value.parameter.parameter_type == parameter_type.value)
|
||||||
{
|
{
|
||||||
//напомним, что is_addr - передается ли он в качестве факт. параметра по ссылке
|
//напомним, что is_addr - передается ли он в качестве факт. параметра по ссылке
|
||||||
if (is_addr == false)
|
if (!is_addr)
|
||||||
{
|
{
|
||||||
if (must_push_addr)
|
if (must_push_addr)
|
||||||
{
|
{
|
||||||
|
|
@ -5244,7 +5247,7 @@ namespace PascalABCCompiler.NETGenerator
|
||||||
{
|
{
|
||||||
//это var-параметр
|
//это var-параметр
|
||||||
PushParameter(pos);
|
PushParameter(pos);
|
||||||
if (is_addr == false && !must_push_addr)
|
if (!is_addr && !must_push_addr)
|
||||||
{
|
{
|
||||||
TypeInfo ti = helper.GetTypeReference(value.parameter.type);
|
TypeInfo ti = helper.GetTypeReference(value.parameter.type);
|
||||||
NETGeneratorTools.PushParameterDereference(il, ti.tp);
|
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>);
|
procedure Reverse<T>(a: List<T>);
|
||||||
/// Изменяет порядок элементов на противоположный в диапазоне списка длины count, начиная с индекса index
|
/// Изменяет порядок элементов на противоположный в диапазоне списка длины count, начиная с индекса index
|
||||||
procedure Reverse<T>(a: List<T>; index, count: integer);
|
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);
|
procedure Shuffle<T>(a: array of T);
|
||||||
/// Перемешивает список случайным образом
|
/// Перемешивает список случайным образом
|
||||||
|
|
@ -7637,6 +7641,19 @@ begin
|
||||||
a.Reverse(index, count)
|
a.Reverse(index, count)
|
||||||
end;
|
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);
|
procedure Shuffle<T>(a: array of T);
|
||||||
begin
|
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,6 +4504,7 @@ namespace PascalABCCompiler.TreeRealization
|
||||||
{
|
{
|
||||||
common_type_node del =
|
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);
|
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);
|
||||||
|
if (compilation_context.instance.converted_namespace != null)
|
||||||
compilation_context.instance.converted_namespace.types.AddElement(del);
|
compilation_context.instance.converted_namespace.types.AddElement(del);
|
||||||
ii = del.get_internal_interface(internal_interface_kind.delegate_interface);
|
ii = del.get_internal_interface(internal_interface_kind.delegate_interface);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue