Procházet zdrojové kódy

Merged revisions 2758 via svnmerge from
svn+ssh://[email protected]/FPC/svn/fpc/trunk

........
r2758 | jonas | 2006-03-05 14:34:43 +0100 (Sun, 05 Mar 2006) | 3 lines

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

........

git-svn-id: branches/fixes_2_0@3281 -

Jonas Maebe před 19 roky
rodič
revize
b02a8d371a
5 změnil soubory, kde provedl 60 přidání a 7 odebrání
  1. 1 1
      compiler/ppu.pas
  2. 18 0
      compiler/symdef.pas
  3. 12 6
      compiler/symsym.pas
  4. 23 0
      compiler/symtable.pas
  5. 6 0
      compiler/symtype.pas

+ 1 - 1
compiler/ppu.pas

@@ -43,7 +43,7 @@ type
 {$endif Test_Double_checksum}
 
 const
-  CurrentPPUVersion=51;
+  CurrentPPUVersion=52;
 
 { buffer sizes }
   maxentrysize = 1024;

+ 18 - 0
compiler/symdef.pas

@@ -219,6 +219,8 @@ interface
        public
           symtable : tsymtable;
           function  getsymtable(t:tgetsymtable):tsymtable;override;
+          procedure buildderefimpl;override;
+          procedure derefimpl;override;
        end;
 
        trecorddef = class(tabstractrecorddef)
@@ -3357,6 +3359,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

@@ -278,6 +278,7 @@ interface
           function  gettypedef:tdef;override;
           procedure buildderef;override;
           procedure deref;override;
+          procedure derefimpl;override;
           procedure dooverride(overriden:tpropertysym);
        end;
 
@@ -1237,12 +1238,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;
@@ -1253,6 +1249,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;

+ 23 - 0
compiler/symtable.pas

@@ -97,6 +97,7 @@ interface
           procedure load_references(ppufile:tcompilerppufile;locals:boolean);override;
           procedure write_references(ppufile:tcompilerppufile;locals:boolean);override;
           procedure insertfield(sym:tfieldvarsym;addsym:boolean);
+          procedure derefimpl; override;
           procedure addalignmentpadding;
        end;
 
@@ -571,6 +572,7 @@ implementation
     procedure tstoredsymtable.derefimpl;
       var
         hp : tdef;
+        hs: tsym;
       begin
         { definitions }
         hp:=tdef(defindex.first);
@@ -579,6 +581,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;
 
 
@@ -998,6 +1007,20 @@ implementation
       end;
 
 
+
+   procedure tabstractrecordsymtable.derefimpl;
+     var
+       storesymtable : tsymtable;
+     begin
+       storesymtable:=aktrecordsymtable;
+       aktrecordsymtable:=self;
+
+       inherited derefimpl;
+
+       aktrecordsymtable:=storesymtable;
+     end;
+
+
     procedure tabstractrecordsymtable.insertfield(sym : tfieldvarsym;addsym:boolean);
       var
         l      : aint;

+ 6 - 0
compiler/symtype.pas

@@ -116,6 +116,7 @@ interface
          function  realname:string;
          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;
@@ -395,6 +396,11 @@ implementation
 {$endif GDB}
 
 
+    procedure Tsym.derefimpl;
+      begin
+      end;
+
+
     function tsym.realname : string;
       begin
         if assigned(_realname) then