From d849734acdd088bda03ee5f8ecb13b95570e5fc3 Mon Sep 17 00:00:00 2001 From: svenbarth Date: Fri, 20 Feb 2015 16:28:44 +0000 Subject: [PATCH] Specialize the correct generic if it has the same name as another generic that is located at another place of the type hierarchy. pgenutils.pas: + generate_generic_name: new parameter owner_hierarchy to further influence the specialization name * generate_specialization: pass the ownerhierarchy name to generate_generic_name pdecsub.pas, parse_proc_head: * parse_generic_interface: for now pass '' to the hierarchy parameter; it needs to be checked whether Delphi allows nested interfaces there as well git-svn-id: trunk@29769 - --- compiler/pdecsub.pas | 3 ++- compiler/pgenutil.pas | 11 ++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/compiler/pdecsub.pas b/compiler/pdecsub.pas index ded36ed2bd..74f94b91ad 100644 --- a/compiler/pdecsub.pas +++ b/compiler/pdecsub.pas @@ -736,7 +736,8 @@ implementation begin str(genparalist.count,gencount); genname:=sp+'$'+gencount; - genname:=generate_generic_name(genname,specializename); + { ToDo: handle nested interfaces } + genname:=generate_generic_name(genname,specializename,''); ugenname:=upper(genname); srsym:=search_object_name(ugenname,false); diff --git a/compiler/pgenutil.pas b/compiler/pgenutil.pas index 0e506eff4d..ce82464bbb 100644 --- a/compiler/pgenutil.pas +++ b/compiler/pgenutil.pas @@ -40,7 +40,7 @@ uses function parse_generic_specialization_types(genericdeflist:tfpobjectlist;poslist:tfplist;out prettyname,specializename:ansistring):boolean; procedure insert_generic_parameter_types(def:tstoreddef;genericdef:tstoreddef;genericlist:tfphashobjectlist); procedure maybe_insert_generic_rename_symbol(const name:tidstring;genericlist:tfphashobjectlist); - function generate_generic_name(const name:tidstring;specializename:ansistring):tidstring; + function generate_generic_name(const name:tidstring;specializename:ansistring;owner_hierarchy:string):tidstring; procedure split_generic_name(const name:tidstring;out nongeneric:string;out count:longint); function resolve_generic_dummysym(const name:tidstring):tsym; function could_be_generic(const name:tidstring):boolean;inline; @@ -650,7 +650,7 @@ uses end; { build the new type's name } - finalspecializename:=generate_generic_name(genname,specializename); + finalspecializename:=generate_generic_name(genname,specializename,genericdef.ownerhierarchyname); ufinalspecializename:=upper(finalspecializename); prettyname:=genericdef.typesym.prettyname+'<'+prettyname+'>'; @@ -1220,7 +1220,7 @@ uses end; end; - function generate_generic_name(const name:tidstring;specializename:ansistring):tidstring; + function generate_generic_name(const name:tidstring;specializename:ansistring;owner_hierarchy:string):tidstring; var crc : cardinal; begin @@ -1229,6 +1229,11 @@ uses { build the new type's name } crc:=UpdateCrc32(0,specializename[1],length(specializename)); result:=name+'$crc'+hexstr(crc,8); + if owner_hierarchy<>'' then + begin + crc:=UpdateCrc32(0,owner_hierarchy[1],length(owner_hierarchy)); + result:=result+'$crc'+hexstr(crc,8); + end; end; procedure split_generic_name(const name:tidstring;out nongeneric:string;out count:longint);