Преглед изворни кода

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 -
svenbarth пре 10 година
родитељ
комит
d849734acd
2 измењених фајлова са 10 додато и 4 уклоњено
  1. 2 1
      compiler/pdecsub.pas
  2. 8 3
      compiler/pgenutil.pas

+ 2 - 1
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);

+ 8 - 3
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);