Browse Source

* adjust generate_specialization() so that it always takes a symbol name and its symtable

Sven/Sarah Barth 1 month ago
parent
commit
9d8624b6b5
2 changed files with 33 additions and 6 deletions
  1. 10 3
      compiler/pgenutil.pas
  2. 23 3
      compiler/ptype.pas

+ 10 - 3
compiler/pgenutil.pas

@@ -39,7 +39,7 @@ uses
   symtype,symdef,symbase;
   symtype,symdef,symbase;
 
 
     procedure generate_specialization(var tt:tdef;enforce_unit:boolean;parse_class_parent:boolean;const _prettyname:string;parsedtype:tdef;const symname:string;parsedpos:tfileposinfo);inline;
     procedure generate_specialization(var tt:tdef;enforce_unit:boolean;parse_class_parent:boolean;const _prettyname:string;parsedtype:tdef;const symname:string;parsedpos:tfileposinfo);inline;
-    procedure generate_specialization(var tt:tdef;enforce_unit:boolean;parse_class_parent:boolean;const _prettyname:string);inline;
+    procedure generate_specialization(var tt:tdef;enforce_unit:boolean;parse_class_parent:boolean;const _prettyname:string;const symname:string;symtable:tsymtable);inline;
     function generate_specialization_phase1(out context:tspecializationcontext;genericdef:tdef;enforce_unit:boolean):tdef;inline;
     function generate_specialization_phase1(out context:tspecializationcontext;genericdef:tdef;enforce_unit:boolean):tdef;inline;
     function generate_specialization_phase1(out context:tspecializationcontext;genericdef:tdef;enforce_unit:boolean;const symname:string;symtable:tsymtable):tdef;inline;
     function generate_specialization_phase1(out context:tspecializationcontext;genericdef:tdef;enforce_unit:boolean;const symname:string;symtable:tsymtable):tdef;inline;
     function generate_specialization_phase1(out context:tspecializationcontext;genericdef:tdef;enforce_unit:boolean;parsedtype:tdef;const symname:string;symtable:tsymtable;parsedpos:tfileposinfo):tdef;
     function generate_specialization_phase1(out context:tspecializationcontext;genericdef:tdef;enforce_unit:boolean;parsedtype:tdef;const symname:string;symtable:tsymtable;parsedpos:tfileposinfo):tdef;
@@ -661,12 +661,19 @@ uses
       end;
       end;
 
 
 
 
-    procedure generate_specialization(var tt:tdef;enforce_unit:boolean;parse_class_parent:boolean;const _prettyname:string);
+    procedure generate_specialization(var tt:tdef;enforce_unit:boolean;parse_class_parent:boolean;const _prettyname:string;const symname:string;symtable:tsymtable);
       var
       var
+        context : tspecializationcontext;
+        genericdef : tstoreddef;
         dummypos : tfileposinfo;
         dummypos : tfileposinfo;
       begin
       begin
         FillChar(dummypos, SizeOf(tfileposinfo), 0);
         FillChar(dummypos, SizeOf(tfileposinfo), 0);
-        generate_specialization(tt,enforce_unit,parse_class_parent,_prettyname,nil,'',dummypos);
+        genericdef:=tstoreddef(generate_specialization_phase1(context,tt,enforce_unit,nil,symname,symtable,dummypos));
+        if genericdef<>generrordef then
+          genericdef:=tstoreddef(generate_specialization_phase2(context,genericdef,parse_class_parent,_prettyname));
+        tt:=genericdef;
+        if assigned(context) then
+          context.free;
       end;
       end;
 
 
 
 

+ 23 - 3
compiler/ptype.pas

@@ -299,7 +299,7 @@ implementation
                        begin
                        begin
                          if not allowspecialization then
                          if not allowspecialization then
                            Message(parser_e_no_local_para_def);
                            Message(parser_e_no_local_para_def);
-                         generate_specialization(t2,isunitspecific,false,'');
+                         generate_specialization(t2,isunitspecific,false,'',srsym.name,srsymtable);
                        end;
                        end;
                      def:=t2;
                      def:=t2;
                    end;
                    end;
@@ -486,6 +486,7 @@ implementation
          again : boolean;
          again : boolean;
          srsym : tsym;
          srsym : tsym;
          srsymtable : tsymtable;
          srsymtable : tsymtable;
+         symname : tsymstr;
        begin
        begin
          dospecialize:=false;
          dospecialize:=false;
          isunitspecific:=false;
          isunitspecific:=false;
@@ -572,7 +573,24 @@ implementation
           begin
           begin
             if def.typ=forwarddef then
             if def.typ=forwarddef then
               def:=ttypesym(srsym).typedef;
               def:=ttypesym(srsym).typedef;
-            generate_specialization(def,isunitspecific,stoParseClassParent in options,'');
+            if assigned(srsym) then
+              symname:=srsym.name
+            else if assigned(def.typesym) then
+              begin
+                symname:=def.typesym.name;
+                srsymtable:=def.typesym.owner;
+              end
+            else if (def.typ=objectdef) then
+              begin
+                symname:=tobjectdef(def).objname^;
+                if assigned(def.owner) then
+                  srsymtable:=def.owner
+                else
+                  srsymtable:=symtablestack.top;
+              end
+            else
+              symname:='';
+            generate_specialization(def,isunitspecific,stoParseClassParent in options,'',symname,srsymtable);
             parse_nested_types(def,stoIsForwardDef in options,[stoAllowSpecialization,stoAllowTypeDef]*options<>[],nil);
             parse_nested_types(def,stoIsForwardDef in options,[stoAllowSpecialization,stoAllowTypeDef]*options<>[],nil);
           end
           end
         else
         else
@@ -1297,7 +1315,9 @@ implementation
                      end;
                      end;
                    if dospecialize then
                    if dospecialize then
                      begin
                      begin
-                       generate_specialization(def,false,false,name);
+                       if not assigned(ttypenode(pt1).typesym) then
+                         internalerror(2025103102);
+                       generate_specialization(def,false,false,name,ttypenode(pt1).typesym.name,ttypenode(pt1).typesym.owner);
                        { handle nested types }
                        { handle nested types }
                        if assigned(def) then
                        if assigned(def) then
                          post_comp_expr_gendef(def);
                          post_comp_expr_gendef(def);