Przeglądaj źródła

* fixed crash with loading overridden properties of forward-declared
classes from ppu files

git-svn-id: trunk@2758 -

Jonas Maebe 19 lat temu
rodzic
commit
e5ebc40446
4 zmienionych plików z 58 dodań i 6 usunięć
  1. 18 0
      compiler/symdef.pas
  2. 12 6
      compiler/symsym.pas
  3. 22 0
      compiler/symtable.pas
  4. 6 0
      compiler/symtype.pas

+ 18 - 0
compiler/symdef.pas

@@ -185,6 +185,8 @@ interface
           symtable : tsymtable;
           procedure reset;override;
           function  getsymtable(t:tgetsymtable):tsymtable;override;
+          procedure buildderefimpl;override;
+          procedure derefimpl;override;
        end;
 
        trecorddef = class(tabstractrecorddef)
@@ -2638,6 +2640,22 @@ implementation
       end;
 
 
+    procedure tabstractrecorddef.buildderefimpl;
+      begin
+        inherited buildderefimpl;
+        tstoredsymtable(symtable).buildderefimpl;
+      end;
+
+
+   procedure tabstractrecorddef.derefimpl;
+     var
+       storesymtable : tsymtable;
+     begin
+       inherited derefimpl;
+       tstoredsymtable(symtable).derefimpl;
+     end;
+
+
 
 {***************************************************************************
                                   trecorddef

+ 12 - 6
compiler/symsym.pas

@@ -245,6 +245,7 @@ interface
           function  gettypedef:tdef;override;
           procedure buildderef;override;
           procedure deref;override;
+          procedure derefimpl;override;
           procedure dooverride(overriden:tpropertysym);
        end;
 
@@ -1129,12 +1130,7 @@ implementation
 
     procedure tpropertysym.deref;
       begin
-        if (ppo_is_override in propoptions) then
-         begin
-           propoverriden:=tpropertysym(propoverridenderef.resolve);
-           dooverride(propoverriden);
-         end
-        else
+        if not(ppo_is_override in propoptions) then
          begin
            proptype.resolve;
            indextype.resolve;
@@ -1145,6 +1141,16 @@ implementation
       end;
 
 
+    procedure tpropertysym.derefimpl;
+      begin
+        if (ppo_is_override in propoptions) then
+         begin
+           propoverriden:=tpropertysym(propoverridenderef.resolve);
+           dooverride(propoverriden);
+         end
+      end;
+
+
     function tpropertysym.getsize : longint;
       begin
          getsize:=0;

+ 22 - 0
compiler/symtable.pas

@@ -91,6 +91,7 @@ interface
           procedure ppuwrite(ppufile:tcompilerppufile);override;
           procedure load_references(ppufile:tcompilerppufile;locals:boolean);override;
           procedure write_references(ppufile:tcompilerppufile;locals:boolean);override;
+          procedure derefimpl; override;
           procedure addfield(sym:tfieldvarsym);
           procedure insertfield(sym:tfieldvarsym);
           procedure addalignmentpadding;
@@ -565,6 +566,7 @@ implementation
     procedure tstoredsymtable.derefimpl;
       var
         hp : tdef;
+        hs: tsym;
       begin
         { definitions }
         hp:=tdef(defindex.first);
@@ -573,6 +575,13 @@ implementation
            hp.derefimpl;
            hp:=tdef(hp.indexnext);
          end;
+        { symbols }
+        hs:=tsym(symindex.first);
+        while assigned(hs) do
+         begin
+           hs.derefimpl;
+           hs:=tsym(hs.indexnext);
+         end;
       end;
 
 
@@ -877,6 +886,19 @@ implementation
       end;
 
 
+   procedure tabstractrecordsymtable.derefimpl;
+     var
+       storesymtable : tsymtable;
+     begin
+       storesymtable:=aktrecordsymtable;
+       aktrecordsymtable:=self;
+
+       inherited derefimpl;
+
+       aktrecordsymtable:=storesymtable;
+     end;
+
+
     procedure tabstractrecordsymtable.addfield(sym:tfieldvarsym);
       var
         l      : aint;

+ 6 - 0
compiler/symtype.pas

@@ -118,6 +118,7 @@ interface
          function  mangledname:string; virtual;
          procedure buildderef;virtual;
          procedure deref;virtual;
+         procedure derefimpl; virtual;
          function  gettypedef:tdef;virtual;
          procedure load_references(ppufile:tcompilerppufile;locals:boolean);virtual;
          function  write_references(ppufile:tcompilerppufile;locals:boolean):boolean;virtual;
@@ -355,6 +356,11 @@ implementation
       end;
 
 
+    procedure Tsym.derefimpl;
+      begin
+      end;
+
+
     function tsym.realname : string;
       begin
         if assigned(_realname) then