Forráskód Böngészése

* overload chaining checks if the procdef is in the same symtable, this
prevents keeping references to staticsymtable only procdefs that are
not accessible through the globalsymtable. And can cause crashes when
the staticsymtable is already released.

git-svn-id: trunk@644 -

peter 20 éve
szülő
commit
24f6bb1594
2 módosított fájl, 16 hozzáadás és 13 törlés
  1. 0 1
      compiler/symdef.pas
  2. 16 12
      compiler/symsym.pas

+ 0 - 1
compiler/symdef.pas

@@ -634,7 +634,6 @@ interface
        tprocdeflist = record
          def  : tprocdef;
          defderef : tderef;
-         own  : boolean;
          next : pprocdeflist;
        end;
 

+ 16 - 12
compiler/symsym.pas

@@ -665,8 +665,7 @@ implementation
            begin
              { only write the proc definitions that belong
                to this procsym and are in the global symtable }
-             if p^.own and
-                (p^.def.owner.symtabletype in [globalsymtable,objectsymtable]) then
+             if p^.def.owner=owner then
                inc(n);
              p:=p^.next;
            end;
@@ -677,8 +676,7 @@ implementation
            begin
              { only write the proc definitions that belong
                to this procsym and are in the global symtable }
-             if p^.own and
-                (p^.def.owner.symtabletype in [globalsymtable,objectsymtable]) then
+             if p^.def.owner=owner then
                ppufile.putderef(p^.defderef);
              p:=p^.next;
            end;
@@ -717,7 +715,7 @@ implementation
          p:=pdlistfirst;
          while assigned(p) do
            begin
-              if p^.own and (p^.def.forwarddef) then
+              if (p^.def.owner=owner) and (p^.def.forwarddef) then
                 begin
                    if (m_mac in aktmodeswitches) and (p^.def.interfacedef) then
                      import_implict_external(p^.def)
@@ -740,7 +738,7 @@ implementation
          p:=pdlistfirst;
          while assigned(p) do
            begin
-             if p^.own then
+             if p^.def.owner=owner then
                p^.defderef.build(p^.def);
              p:=p^.next;
            end;
@@ -760,7 +758,10 @@ implementation
          p:=pdlistfirst;
          while assigned(p) do
            begin
-             if not p^.own then
+             if not(
+                    (p^.def=nil) or
+                    (p^.def.owner=owner)
+                   ) then
                internalerror(200310291);
              p^.def:=tprocdef(p^.defderef.resolve);
              p:=p^.next;
@@ -776,7 +777,6 @@ implementation
         pd^.def:=p;
         pd^.defderef.reset;
         pd^.next:=nil;
-        pd^.own:=(pd^.def.procsym=self);
         { Add at end of list to keep always
           a correct order, also after loading from ppu }
         if assigned(pdlistlast) then
@@ -801,7 +801,6 @@ implementation
         pd^.def:=nil;
         pd^.defderef:=d;
         pd^.next:=nil;
-        pd^.own:=true;
         { Add at end of list to keep always
           a correct order, also after loading from ppu }
         if assigned(pdlistlast) then
@@ -1066,7 +1065,7 @@ implementation
          p:=pdlistfirst;
          while assigned(p) do
            begin
-              if p^.own then
+              if p^.def.owner=owner then
                 p^.def.write_references(ppufile,locals);
               p:=p^.next;
            end;
@@ -1087,7 +1086,12 @@ implementation
          while assigned(p) do
            begin
               hp:=p^.next;
-              if p^.own then
+             { only keep the proc definitions:
+                - are not deref'd (def=nil)
+                - are in the same symtable as the procsym (for example both
+                  are in the staticsymtable) }
+             if (p^.def=nil) or
+                (p^.def.owner=owner) then
                 begin
                   { keep, add to list }
                   if assigned(pdlistlast) then
@@ -1123,7 +1127,7 @@ implementation
         p:=pdlistfirst;
         while assigned(p) do
           begin
-             if p^.own and
+             if (p^.def.owner=owner) and
                 p^.def.is_visible_for_object(tobjectdef(currobjdef)) then
                begin
                  result:=true;