Browse Source

* forward type declaration rewritten

peter 26 years ago
parent
commit
49fcd8aceb

+ 4 - 3
compiler/parser.pas

@@ -67,8 +67,6 @@ unit parser;
 
     procedure initparser;
       begin
-         forwardsallowed:=false;
-
          { ^M means a string or a char, because we don't parse a }
          { type declaration                                      }
          ignore_equal:=false;
@@ -485,7 +483,10 @@ unit parser;
 end.
 {
   $Log$
-  Revision 1.85  1999-09-16 08:02:39  pierre
+  Revision 1.86  1999-10-01 08:02:45  peter
+    * forward type declaration rewritten
+
+  Revision 1.85  1999/09/16 08:02:39  pierre
    + old_compiled_module to avoid wrong file info when load PPU files
 
   Revision 1.84  1999/09/15 22:09:23  florian

+ 4 - 6
compiler/pbase.pas

@@ -28,11 +28,6 @@ unit pbase;
        cobjects,tokens,globals,symtable;
 
     const
-       { forward types should only be possible inside  }
-       { a TYPE statement, this crashed the compiler   }
-       { when trying to dispose local symbols          }
-       typecanbeforward : boolean = false;
-
        { true, if we are after an assignement }
        afterassignment : boolean = false;
 
@@ -165,7 +160,10 @@ end.
 
 {
   $Log$
-  Revision 1.25  1999-09-02 18:47:44  daniel
+  Revision 1.26  1999-10-01 08:02:46  peter
+    * forward type declaration rewritten
+
+  Revision 1.25  1999/09/02 18:47:44  daniel
     * Could not compile with TP, some arrays moved to heap
     * NOAG386BIN default for TP
     * AG386* files were not compatible with TP, fixed.

+ 129 - 108
compiler/pdecl.pas

@@ -28,10 +28,9 @@ unit pdecl;
       globtype,tokens,globals,symtable;
 
     var
-       { pointer to the last read type symbol, (for "forward" }
-       { types)                                        }
-       lasttypesym : ptypesym;
-       readtypesym : ptypesym; { ttypesym read by read_type }
+       { ttypesym read by read_type, this is needed to be
+         stored in the ppu for resolving purposed }
+       readtypesym : ptypesym;
 
        { hack, which allows to use the current parsed }
        { object type as function argument type  }
@@ -45,7 +44,7 @@ unit pdecl;
 
     { reads a string, file type or a type id and returns a name and }
     { pdef                                                        }
-    function single_type(var s : string) : pdef;
+    function single_type(var s : string;isforwarddef:boolean) : pdef;
 
     { reads the declaration blocks }
     procedure read_declarations(islibrary : boolean);
@@ -73,39 +72,66 @@ unit pdecl;
        ,hcodegen,hcgdata
        ;
 
+    const
+       { forward types should only be possible inside a TYPE statement }
+       typecanbeforward : boolean = false;
+
     function read_type(const name : stringid) : pdef;forward;
 
     { search in symtablestack used, but not defined type }
-    procedure testforward_type(p : pnamedindexobject);{$ifndef FPC}far;{$endif}
+    procedure resolve_type_forward(p : pnamedindexobject);{$ifndef FPC}far;{$endif}
       var
-        reaktvarsymtable : psymtable;
-        oldaktfilepos : tfileposinfo;
+        hpd,pd : pdef;
       begin
-         if not(psym(p)^.typ=typesym) then
-          exit;
-         if (sp_forwarddef in psym(p)^.symoptions) then
-           begin
-             oldaktfilepos:=aktfilepos;
-             aktfilepos:=psym(p)^.fileinfo;
-             Message1(sym_e_forward_type_not_resolved,p^.name);
-             aktfilepos:=oldaktfilepos;
-             { try to recover }
-             ptypesym(p)^.definition:=generrordef;
-{$ifdef INCLUDEOK}
-             exclude(psym(p)^.symoptions,sp_forwarddef);
-{$else}
-             psym(p)^.symoptions:=psym(p)^.symoptions-[sp_forwarddef];
-{$endif}
-           end
-         else
-          if (ptypesym(p)^.definition^.deftype in [recorddef,objectdef]) then
-           begin
-             if (ptypesym(p)^.definition^.deftype=recorddef) then
-               reaktvarsymtable:=precorddef(ptypesym(p)^.definition)^.symtable
+         { Check only typesyms or record/object fields }
+         case psym(p)^.typ of
+           typesym :
+             pd:=ptypesym(p)^.definition;
+           varsym :
+             if (psym(p)^.owner^.symtabletype in [objectsymtable,recordsymtable]) then
+               pd:=pvarsym(p)^.definition
              else
-               reaktvarsymtable:=pobjectdef(ptypesym(p)^.definition)^.symtable;
-             reaktvarsymtable^.foreach({$ifndef TP}@{$endif}testforward_type);
-           end;
+               exit;
+           else
+             exit;
+         end;
+         case pd^.deftype of
+           pointerdef,
+           classrefdef :
+             begin
+               { classrefdef inherits from pointerdef }
+               hpd:=ppointerdef(pd)^.definition;
+               { still a forward def ? }
+               if hpd^.deftype=forwarddef then
+                begin
+                  { try to resolve the forward }
+                  getsym(pforwarddef(hpd)^.tosymname,false);
+                  { we don't need the forwarddef anymore, dispose it }
+                  dispose(hpd,done);
+                  { was a type sym found ? }
+                  if assigned(srsym) and
+                     (srsym^.typ=typesym) then
+                   begin
+                     ppointerdef(pd)^.definition:=ptypesym(srsym)^.definition;
+                     { we need a class type for classrefdef }
+                     if (pd^.deftype=classrefdef) and
+                        not((ptypesym(srsym)^.definition^.deftype=objectdef) and
+                            pobjectdef(ptypesym(srsym)^.definition)^.is_class) then
+                       Message1(type_e_class_type_expected,ptypesym(srsym)^.definition^.typename);
+                   end
+                  else
+                   begin
+                     MessagePos1(psym(p)^.fileinfo,sym_e_forward_type_not_resolved,p^.name);
+                     { try to recover }
+                     ppointerdef(pd)^.definition:=generrordef;
+                   end;
+                end;
+             end;
+           recorddef :
+             precorddef(pd)^.symtable^.foreach({$ifndef TP}@{$endif}resolve_type_forward);
+           objectdef :
+             pobjectdef(pd)^.symtable^.foreach({$ifndef TP}@{$endif}resolve_type_forward);
+        end;
       end;
 
 
@@ -723,10 +749,12 @@ unit pdecl;
        end;
 
 
-    function id_type(var s : string) : pdef;
+    function id_type(var s : string;isforwarddef:boolean) : pdef;
     { reads a type definition and returns a pointer }
     { to a appropriating pdef, s gets the name of   }
     { the type to allow name mangling          }
+      var
+        is_unit_specific : boolean;
       begin
          s:=pattern;
          consume(_ID);
@@ -742,38 +770,50 @@ unit pdecl;
               id_type:=aktobjectdef;
               exit;
            end;
-         getsym(s,true);
-         if assigned(srsym) then
+         { try to load the symbol to see if it's a unitsym }
+         is_unit_specific:=false;
+         getsym(s,false);
+         if assigned(srsym) and
+            (srsym^.typ=unitsym) then
            begin
-              if srsym^.typ=unitsym then
-                begin
-                   consume(_POINT);
-                   getsymonlyin(punitsym(srsym)^.unitsymtable,pattern);
-                   s:=pattern;
-                   consume(_ID);
-                end;
-              if not assigned(srsym) or
-                 (srsym^.typ<>typesym) then
-                begin
-                   Message(type_e_type_id_expected);
-                   lasttypesym:=ptypesym(srsym);
-                   id_type:=generrordef;
-                   exit;
-                end;
-              if not forwardsallowed then
-                testforward_type(srsym);
+              consume(_POINT);
+              getsymonlyin(punitsym(srsym)^.unitsymtable,pattern);
+              s:=pattern;
+              consume(_ID);
+              is_unit_specific:=true;
            end;
-         lasttypesym:=ptypesym(srsym);
+         { are we parsing a possible forward def ? }
+         if isforwarddef and
+            not(is_unit_specific) then
+          begin
+            id_type:=new(pforwarddef,init(s));
+            exit;
+          end;
+         { unknown sym ? }
+         if not assigned(srsym) then
+          begin
+            Message1(sym_e_id_not_found,s);
+            id_type:=generrordef;
+            exit;
+          end;
+         if (srsym^.typ<>typesym) then
+          begin
+            Message(type_e_type_id_expected);
+            id_type:=generrordef;
+            exit;
+          end;
+         { can't use in [] here, becuase unitid can be > 255 }
          if (ptypesym(srsym)^.owner^.unitid=0) or
             (ptypesym(srsym)^.owner^.unitid=1) then
           readtypesym:=nil
          else
           readtypesym:=ptypesym(srsym);
+         { return the definition of the type }
          id_type:=ptypesym(srsym)^.definition;
       end;
 
 
-    function single_type(var s : string) : pdef;
+    function single_type(var s : string;isforwarddef:boolean) : pdef;
     { reads a string, file type or a type id and returns a name and }
     { pdef                                                        }
        var
@@ -785,7 +825,6 @@ unit pdecl;
                 begin
                    single_type:=stringtype;
                    s:='STRING';
-                   lasttypesym:=nil;
                    readtypesym:=nil;
                 end;
             _FILE:
@@ -794,7 +833,7 @@ unit pdecl;
                    if token=_OF then
                      begin
                         consume(_OF);
-                        single_type:=new(pfiledef,init(ft_typed,single_type(hs)));
+                        single_type:=new(pfiledef,init(ft_typed,single_type(hs,false)));
                         s:='FILE$OF$'+hs;
                      end
                    else
@@ -803,12 +842,11 @@ unit pdecl;
                         single_type:=cfiledef;
                         s:='FILE';
                      end;
-                   lasttypesym:=nil;
                    readtypesym:=nil;
                 end;
             else
               begin
-                single_type:=id_type(s);
+                single_type:=id_type(s,isforwarddef);
               end;
          end;
       end;
@@ -1012,10 +1050,10 @@ unit pdecl;
                                  { define range and type of range }
                                  hp:=new(parraydef,init(0,-1,s32bitdef));
                                  { define field type }
-                                 parraydef(hp)^.definition:=single_type(s);
+                                 parraydef(hp)^.definition:=single_type(s,false);
                               end
                             else
-                              hp:=single_type(s);
+                              hp:=single_type(s,false);
                          end
                        else
                          hp:=cformaldef;
@@ -1041,7 +1079,7 @@ unit pdecl;
                 if (token=_COLON) or assigned(propertyparas) then
                   begin
                      consume(_COLON);
-                     p^.proptype:=single_type(hs);
+                     p^.proptype:=single_type(hs,false);
                      if (idtoken=_INDEX) then
                        begin
                           consume(_INDEX);
@@ -1397,7 +1435,7 @@ unit pdecl;
          oldparse_only : boolean;
          methodnametable,intmessagetable,
          strmessagetable,classnamelabel : pasmlabel;
-         storetypeforwardsallowed : boolean;
+         storetypecanbeforward : boolean;
          vmtlist : taasmoutput;
 
       begin
@@ -1419,7 +1457,8 @@ unit pdecl;
            (symtablestack^.symtabletype<>staticsymtable) then
            Message(parser_e_no_local_objects);
 
-         storetypeforwardsallowed:=typecanbeforward;
+         storetypecanbeforward:=typecanbeforward;
+         { for tp mode don't allow forward types }
          if m_tp in aktmodeswitches then
            typecanbeforward:=false;
 
@@ -1438,31 +1477,21 @@ unit pdecl;
                    { a hack, but it's easy to handle }
                    { class reference type }
                    consume(_OF);
-                   if typecanbeforward then
-                     forwardsallowed:=true;
-                   hp1:=single_type(hs);
-
-                   { accept hp1, if is a forward def ...}
-                   if ((lasttypesym<>nil) and
-                       (sp_forwarddef in lasttypesym^.symoptions)) or
-                   { or a class
-                     (if the foward defined type is a class is checked, when
-                      the forward is resolved)
-                   }
-                     ((hp1^.deftype=objectdef) and pobjectdef(hp1)^.is_class) then
+                   hp1:=single_type(hs,typecanbeforward);
+
+                   { accept hp1, if is a forward def or a class }
+                   if (hp1^.deftype=forwarddef) or
+                      ((hp1^.deftype=objectdef) and pobjectdef(hp1)^.is_class) then
                      begin
                         pcrd:=new(pclassrefdef,init(hp1));
                         object_dec:=pcrd;
-                        if assigned(lasttypesym) and (sp_forwarddef in lasttypesym^.symoptions) then
-                         lasttypesym^.addforwardpointer(ppointerdef(pcrd));
-                        forwardsallowed:=false;
                      end
                    else
                      begin
                         object_dec:=generrordef;
                         Message1(type_e_class_type_expected,generrordef^.typename);
                      end;
-                   typecanbeforward:=storetypeforwardsallowed;
+                   typecanbeforward:=storetypecanbeforward;
                    exit;
                 end
               { forward class }
@@ -1486,7 +1515,7 @@ unit pdecl;
                      aktclass^.insertvmt;
 
                    object_dec:=aktclass;
-                   typecanbeforward:=storetypeforwardsallowed;
+                   typecanbeforward:=storetypecanbeforward;
                    exit;
                 end;
            end;
@@ -1499,7 +1528,7 @@ unit pdecl;
          if token=_LKLAMMER then
            begin
               consume(_LKLAMMER);
-              childof:=pobjectdef(id_type(pattern));
+              childof:=pobjectdef(id_type(pattern,false));
               if (childof^.deftype<>objectdef) then
                begin
                  Message1(type_e_class_type_expected,childof^.typename);
@@ -1727,7 +1756,7 @@ unit pdecl;
           end;
          testcurobject:=0;
          curobjectname:='';
-         typecanbeforward:=storetypeforwardsallowed;
+         typecanbeforward:=storetypecanbeforward;
 
          { generate vmt space if needed }
          if not(oo_has_vmt in aktclass^.objectoptions) and
@@ -1852,7 +1881,7 @@ unit pdecl;
 
       var
          symtable : psymtable;
-         storetypeforwardsallowed : boolean;
+         storetypecanbeforward : boolean;
 
       begin
          { create recdef }
@@ -1863,12 +1892,13 @@ unit pdecl;
          symtablestack:=symtable;
          { parse record }
          consume(_RECORD);
-         storetypeforwardsallowed:=typecanbeforward;
+         storetypecanbeforward:=typecanbeforward;
+         { for tp mode don't allow forward types }
          if m_tp in aktmodeswitches then
            typecanbeforward:=false;
          read_var_decs(true,false,false);
          consume(_END);
-         typecanbeforward:=storetypeforwardsallowed;
+         typecanbeforward:=storetypecanbeforward;
          { may be scale record size to a size of n*4 ? }
          symtablestack^.datasize:=align(symtablestack^.datasize,symtablestack^.dataalignment);
          { restore symtable stack }
@@ -1910,7 +1940,7 @@ unit pdecl;
 {$endif}
                      consume(idtoken);
                      consume(_COLON);
-                     p:=single_type(hs1);
+                     p:=single_type(hs1,false);
                      procvardef^.concatdef(p,vs_value);
                    end
                   else
@@ -1940,11 +1970,11 @@ unit pdecl;
                               else
                                begin
                                { define field type }
-                                 Parraydef(p)^.definition:=single_type(s);
+                                 Parraydef(p)^.definition:=single_type(s,false);
                                end;
                             end
                           else
-                            p:=single_type(s);
+                            p:=single_type(s,false);
                        end
                      else
                        p:=cformaldef;
@@ -2129,7 +2159,7 @@ unit pdecl;
          case token of
             _STRING,_FILE:
               begin
-                p:=single_type(hs);
+                p:=single_type(hs,false);
                 readtypesym:=nil;
               end;
            _LKLAMMER:
@@ -2215,14 +2245,8 @@ unit pdecl;
            _CARET:
               begin
                 consume(_CARET);
-                { forwards allowed only inside TYPE statements }
-                if typecanbeforward then
-                  forwardsallowed:=true;
-                hp1:=single_type(hs);
+                hp1:=single_type(hs,typecanbeforward);
                 p:=new(ppointerdef,init(hp1));
-                if (lasttypesym<>nil) and (sp_forwarddef in lasttypesym^.symoptions) then
-                  lasttypesym^.addforwardpointer(ppointerdef(p));
-                forwardsallowed:=false;
                 readtypesym:=nil;
               end;
             _RECORD:
@@ -2274,7 +2298,7 @@ unit pdecl;
                 consume(_FUNCTION);
                 p:=handle_procvar;
                 consume(_COLON);
-                pprocvardef(p)^.retdef:=single_type(hs);
+                pprocvardef(p)^.retdef:=single_type(hs,false);
                 if token=_OF then
                   begin
                     consume(_OF);
@@ -2350,13 +2374,7 @@ unit pdecl;
                          { the definition is modified }
                          object_dec(typename,pobjectdef(ptypesym(sym)^.definition));
                          newtype:=ptypesym(sym);
-                       end
-                      else
-                       if (sp_forwarddef in sym^.symoptions) then
-                        begin
-                          ptypesym(sym)^.updateforwarddef(read_type(typename));
-                          newtype:=ptypesym(sym);
-                        end;
+                       end;
                     end;
                  end;
                 { no old type reused ? Then insert this new type }
@@ -2367,12 +2385,12 @@ unit pdecl;
                  end;
              end;
            consume(_SEMICOLON);
-           if assigned(newtype^.definition) and (newtype^.definition^.deftype=procvardef) then
+           if assigned(newtype^.definition) and
+              (newtype^.definition^.deftype=procvardef) then
              parse_var_proc_directives(newtype);
          until token<>_ID;
          typecanbeforward:=false;
-         symtablestack^.foreach({$ifndef TP}@{$endif}testforward_type);
-         resolve_forwards;
+         symtablestack^.foreach({$ifndef TP}@{$endif}resolve_type_forward);
          block_type:=bt_general;
       end;
 
@@ -2549,7 +2567,10 @@ unit pdecl;
 end.
 {
   $Log$
-  Revision 1.157  1999-09-27 23:44:53  peter
+  Revision 1.158  1999-10-01 08:02:46  peter
+    * forward type declaration rewritten
+
+  Revision 1.157  1999/09/27 23:44:53  peter
     * procinfo is now a pointer
     * support for result setting in sub procedure
 

+ 9 - 16
compiler/psub.pas

@@ -132,7 +132,7 @@ begin
             inc(procinfo^.ESI_offset,vs^.address);
             consume(idtoken);
             consume(_COLON);
-            p:=single_type(hs1);
+            p:=single_type(hs1,false);
             if assigned(readtypesym) then
              aktprocsym^.definition^.concattypesym(readtypesym,vs_value)
             else
@@ -173,7 +173,7 @@ begin
                else
                 begin
                 { define field type }
-                  Parraydef(p)^.definition:=single_type(hs1);
+                  Parraydef(p)^.definition:=single_type(hs1,false);
                   hs1:='array_of_'+hs1;
                   { we don't need the typesym anymore }
                   readtypesym:=nil;
@@ -197,7 +197,7 @@ begin
              end
             { everything else }
             else
-             p:=single_type(hs1);
+             p:=single_type(hs1,false);
           end
          else
           begin
@@ -561,7 +561,7 @@ begin
                     begin
                       consume(_COLON);
                       inc(testcurobject);
-                      aktprocsym^.definition^.retdef:=single_type(hs);
+                      aktprocsym^.definition^.retdef:=single_type(hs,false);
                       aktprocsym^.definition^.test_if_fpu_result;
                       dec(testcurobject);
                     end;
@@ -626,7 +626,7 @@ begin
                    else
                     begin
                       aktprocsym^.definition^.retdef:=
-                       single_type(hs);
+                       single_type(hs,false);
                       aktprocsym^.definition^.test_if_fpu_result;
                       if (optoken in [_EQUAL,_GT,_LT,_GTE,_LTE]) and
                          ((aktprocsym^.definition^.retdef^.deftype<>
@@ -697,11 +697,6 @@ end;
 procedure pd_forward(const procnames:Tstringcontainer);
 begin
   aktprocsym^.definition^.forwarddef:=true;
-{$ifdef INCLUDEOK}
-  include(aktprocsym^.symoptions,sp_forwarddef);
-{$else}
-  aktprocsym^.symoptions:=aktprocsym^.symoptions+[sp_forwarddef];
-{$endif}
 end;
 
 procedure pd_stdcall(const procnames:Tstringcontainer);
@@ -1933,11 +1928,6 @@ begin
 { set the default function options }
    if parse_only then
     begin
-{$ifdef INCLUDEOK}
-      include(aktprocsym^.symoptions,sp_forwarddef);
-{$else}
-      aktprocsym^.symoptions:=aktprocsym^.symoptions+[sp_forwarddef];
-{$endif}
       aktprocsym^.definition^.forwarddef:=true;
       { set also the interface flag, for better error message when the
         implementation doesn't much this header }
@@ -2054,7 +2044,10 @@ end.
 
 {
   $Log$
-  Revision 1.23  1999-09-27 23:44:56  peter
+  Revision 1.24  1999-10-01 08:02:47  peter
+    * forward type declaration rewritten
+
+  Revision 1.23  1999/09/27 23:44:56  peter
     * procinfo is now a pointer
     * support for result setting in sub procedure
 

+ 4 - 2
compiler/symconst.pas

@@ -32,7 +32,6 @@ type
     sp_private,
     sp_published,
     sp_protected,
-    sp_forwarddef,
     sp_static,
     sp_primary_typesym    { this is for typesym, to know who is the primary symbol of a def }
   );
@@ -180,7 +179,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.2  1999-08-04 13:45:29  florian
+  Revision 1.3  1999-10-01 08:02:48  peter
+    * forward type declaration rewritten
+
+  Revision 1.2  1999/08/04 13:45:29  florian
     + floating point register variables !!
     * pairegalloc is now generated for register variables
 

+ 41 - 1
compiler/symdef.inc

@@ -1413,6 +1413,18 @@
       end;
 
 
+    destructor tpointerdef.done;
+      begin
+        if assigned(definition) and
+           (definition^.deftype=forwarddef) then
+         begin
+           dispose(definition,done);
+           definition:=nil;
+         end;
+        inherited done;
+      end;
+
+
     procedure tpointerdef.deref;
       begin
          resolvedef(definition);
@@ -3753,6 +3765,31 @@ Const local_symtable_index : longint = $8001;
          get_rtti_label:=rtti_name;
       end;
 
+{****************************************************************************
+                                TFORWARDDEF
+****************************************************************************}
+
+   constructor tforwarddef.init(const s:string);
+     var
+       oldregisterdef : boolean;
+     begin
+        { never register the forwarddefs, they are disposed at the
+          end of the type declaration block }
+        oldregisterdef:=registerdef;
+        registerdef:=false;
+        inherited init;
+        registerdef:=oldregisterdef;
+        deftype:=forwarddef;
+        tosymname:=s;
+     end;
+
+
+    function tforwarddef.gettypename:string;
+      begin
+        gettypename:='unresolved forward to '+tosymname;
+      end;
+
+
 {****************************************************************************
                                   TERRORDEF
 ****************************************************************************}
@@ -3779,7 +3816,10 @@ Const local_symtable_index : longint = $8001;
 
 {
   $Log$
-  Revision 1.166  1999-09-26 21:30:21  peter
+  Revision 1.167  1999-10-01 08:02:48  peter
+    * forward type declaration rewritten
+
+  Revision 1.166  1999/09/26 21:30:21  peter
     + constant pointer support which can happend with typecasting like
       const p=pointer(1)
     * better procvar parsing in typed consts

+ 13 - 2
compiler/symdefh.inc

@@ -28,7 +28,7 @@
        tdeftype = (abstractdef,arraydef,recorddef,pointerdef,orddef,
                    stringdef,enumdef,procdef,objectdef,errordef,
                    filedef,formaldef,setdef,procvardef,floatdef,
-                   classrefdef);
+                   classrefdef,forwarddef);
 
        pdef = ^tdef;
        tdef = object(tsymtableentry)
@@ -138,6 +138,13 @@
 {$endif GDB}
        end;
 
+       pforwarddef = ^tforwarddef;
+       tforwarddef = object(tdef)
+          tosymname : string;
+          constructor init(const s:string);
+          function  gettypename:string;virtual;
+       end;
+
        perrordef = ^terrordef;
        terrordef = object(tdef)
           constructor init;
@@ -161,6 +168,7 @@
           constructor init(def : pdef);
           constructor initfar(def : pdef);
           constructor load;
+          destructor  done;virtual;
           procedure write;virtual;
           procedure deref;virtual;
           function  gettypename:string;virtual;
@@ -522,7 +530,10 @@
 
 {
   $Log$
-  Revision 1.41  1999-08-10 12:34:49  pierre
+  Revision 1.42  1999-10-01 08:02:48  peter
+    * forward type declaration rewritten
+
+  Revision 1.41  1999/08/10 12:34:49  pierre
    + procsym field in tprocdef to allow correct gdb info generation
 
   Revision 1.40  1999/08/09 22:19:57  peter

+ 5 - 37
compiler/symsym.inc

@@ -399,7 +399,6 @@
                    { Turn futher error messages off }
                    pd^.forwarddef:=false;
                 end;
-
               pd:=pd^.nextoverloaded;
            end;
       end;
@@ -1906,7 +1905,6 @@
 {$ifdef GDB}
          isusedinstab := false;
 {$endif GDB}
-         forwardpointer:=nil;
          if assigned(definition) then
           begin
              if not(assigned(definition^.sym)) then
@@ -1927,12 +1925,11 @@
           end;
       end;
 
-    constructor ttypesym.load;
 
+    constructor ttypesym.load;
       begin
          tsym.load;
          typ:=typesym;
-         forwardpointer:=nil;
          synonym:=nil;
 {$ifdef GDB}
          isusedinstab := false;
@@ -2034,38 +2031,6 @@
       end;
 
 
-    procedure ttypesym.addforwardpointer(p:ppointerdef);
-      var
-        hfp : pforwardpointer;
-      begin
-        new(hfp);
-        hfp^.next:=forwardpointer;
-        hfp^.def:=p;
-        forwardpointer:=hfp;
-      end;
-
-
-    procedure ttypesym.updateforwarddef(p:pdef);
-      var
-        lasthfp,hfp : pforwardpointer;
-      begin
-        definition:=p;
-        symoptions:=current_object_option;
-        fileinfo:=tokenpos;
-        if assigned(definition) and not(assigned(definition^.sym)) then
-          definition^.sym:=@self;
-        { update all forwardpointers to this definition }
-        hfp:=forwardpointer;
-        while assigned(hfp) do
-         begin
-           lasthfp:=hfp;
-           hfp^.def^.definition:=definition;
-           hfp:=hfp^.next;
-           dispose(lasthfp);
-         end;
-      end;
-
-
 {$ifdef BrowserLog}
     procedure ttypesym.add_to_browserlog;
       begin
@@ -2166,7 +2131,10 @@
 
 {
   $Log$
-  Revision 1.120  1999-09-27 23:44:58  peter
+  Revision 1.121  1999-10-01 08:02:48  peter
+    * forward type declaration rewritten
+
+  Revision 1.120  1999/09/27 23:44:58  peter
     * procinfo is now a pointer
     * support for result setting in sub procedure
 

+ 4 - 11
compiler/symsymh.inc

@@ -134,12 +134,6 @@
 {$endif GDB}
        end;
 
-       pforwardpointer=^tforwardpointer;
-       tforwardpointer=record
-         next : pforwardpointer;
-         def  : ppointerdef;
-       end;
-
        ttypesym = object(tsym)
           definition : pdef;
           synonym    : ptypesym;
@@ -151,8 +145,6 @@
           destructor done;virtual;
           procedure write;virtual;
           procedure deref;virtual;
-          procedure addforwardpointer(p:ppointerdef);
-          procedure updateforwarddef(p:pdef);
           procedure load_references;virtual;
           function  write_references : boolean;virtual;
 {$ifdef BrowserLog}
@@ -162,8 +154,6 @@
           function stabstring : pchar;virtual;
           procedure concatstabto(asmlist : paasmoutput);virtual;
 {$endif GDB}
-       private
-          forwardpointer : pforwardpointer;
        end;
 
        pvarsym = ^tvarsym;
@@ -338,7 +328,10 @@
 
 {
   $Log$
-  Revision 1.35  1999-09-26 21:30:22  peter
+  Revision 1.36  1999-10-01 08:02:48  peter
+    * forward type declaration rewritten
+
+  Revision 1.35  1999/09/26 21:30:22  peter
     + constant pointer support which can happend with typecasting like
       const p=pointer(1)
     * better procvar parsing in typed consts

+ 10 - 66
compiler/symtable.pas

@@ -254,9 +254,6 @@ unit symtable;
        lastsrsymtable : psymtable;
        lastsymknown : boolean;
 
-       forwardsallowed : boolean;  { true, wenn forward pointers can be
-                                     inserted }
-
        constsymtable : psymtable;  { symtable were the constants can be
                                      inserted }
 
@@ -384,10 +381,6 @@ unit symtable;
     procedure getsym(const s : stringid;notfounderror : boolean);
     procedure getsymonlyin(p : psymtable;const s : stringid);
 
-{*** Forwards ***}
-    procedure save_forward(ppd : ppointerdef;typesym : ptypesym);
-    procedure resolve_forwards;
-
 {*** PPU Write/Loading ***}
     procedure writeunitas(const s : string;unittable : punitsymtable;only_crc : boolean);
     procedure closecurrentppu;
@@ -819,7 +812,7 @@ implementation
            psym(p)^.deref;
       end;
 
-    procedure check_procsym_forward(sym : pnamedindexobject);
+    procedure check_forward(sym : pnamedindexobject);
       begin
          if psym(sym)^.typ=procsym then
            pprocsym(sym)^.check_forward
@@ -936,48 +929,6 @@ implementation
 {$endif UseBrowser}
 
 
-{****************************************************************************
-                             Forward Resolving
-****************************************************************************}
-
-    type
-       presolvelist = ^tresolvelist;
-       tresolvelist = record
-          p : ppointerdef;
-          typ : ptypesym;
-          next : presolvelist;
-       end;
-
-    var
-       sroot : presolvelist;
-    procedure save_forward(ppd : ppointerdef;typesym : ptypesym);
-      var
-         p : presolvelist;
-      begin
-         new(p);
-         p^.next:=sroot;
-         p^.p:=ppd;
-         ppd^.defsym := typesym;
-         p^.typ:=typesym;
-         sroot:=p;
-      end;
-
-
-    procedure resolve_forwards;
-      var
-         p : presolvelist;
-      begin
-         p:=sroot;
-         while p<>nil do
-           begin
-              sroot:=sroot^.next;
-              p^.p^.definition:=p^.typ^.definition;
-              dispose(p);
-              p:=sroot;
-           end;
-      end;
-
-
 {*****************************************************************************
                           Search Symtables for Syms
 *****************************************************************************}
@@ -997,21 +948,13 @@ implementation
               else
                 srsymtable:=srsymtable^.next;
            end;
-         if forwardsallowed then
-           begin
-              srsymtable:=symtablestack;
-              while (srsymtable^.symtabletype in [objectsymtable,recordsymtable]) do
-                   srsymtable:=srsymtable^.next;
-              srsym:=new(ptypesym,init(s,nil));
-              srsym^.symoptions:=[sp_forwarddef];
-              srsymtable^.insert(srsym);
-           end
-         else if notfounderror then
+         if notfounderror then
            begin
               Message1(sym_e_id_not_found,s);
               srsym:=generrorsym;
            end
-         else srsym:=nil;
+         else
+           srsym:=nil;
       end;
 
 
@@ -1493,8 +1436,7 @@ implementation
                    if hp^.symtabletype in [staticsymtable,globalsymtable] then
                     begin
                        hsym:=hp^.search(sym^.name);
-                       if assigned(hsym) and
-                          not(sp_forwarddef in hsym^.symoptions) then
+                       if assigned(hsym) then
                          DuplicateSym(hsym);
                     end;
                   hp:=hp^.next;
@@ -1745,7 +1687,7 @@ implementation
     { checks, if all procsyms and methods are defined }
     procedure tsymtable.check_forwards;
       begin
-         foreach({$ifndef TP}@{$endif}check_procsym_forward);
+         foreach({$ifndef TP}@{$endif}check_forward);
       end;
 
     procedure tsymtable.checklabels;
@@ -2375,7 +2317,6 @@ implementation
         symtablestack:=nil;
         systemunit:=nil;
         objpasunit:=nil;
-        sroot:=nil;
 {$ifdef GDB}
         firstglobaldef:=nil;
         lastglobaldef:=nil;
@@ -2409,7 +2350,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.50  1999-09-28 20:48:25  florian
+  Revision 1.51  1999-10-01 08:02:49  peter
+    * forward type declaration rewritten
+
+  Revision 1.50  1999/09/28 20:48:25  florian
     * fixed bug 610
     + added $D- for TP in symtable.pas else it can't be compiled anymore
       (too much symbols :()

+ 6 - 3
compiler/types.pas

@@ -806,7 +806,7 @@ implementation
              begin
                 { here a problem detected in tabsolutesym }
                 { the types can be forward type !!        }
-                if assigned(def1^.sym) and (sp_forwarddef in def1^.sym^.symoptions) then
+                if assigned(def1^.sym) and (ppointerdef(def1)^.definition^.deftype=forwarddef) then
                   b:=(def1^.sym=def2^.sym)
                 else
                   b:=ppointerdef(def1)^.definition=ppointerdef(def2)^.definition;
@@ -923,7 +923,7 @@ implementation
            if (def1^.deftype=classrefdef) and (def2^.deftype=classrefdef) then
              begin
                 { similar to pointerdef: }
-                if assigned(def1^.sym) and (sp_forwarddef in def1^.sym^.symoptions) then
+                if assigned(def1^.sym) and (pclassrefdef(def1)^.definition^.deftype=forwarddef) then
                   b:=(def1^.sym=def2^.sym)
                 else
                   b:=is_equal(pclassrefdef(def1)^.definition,pclassrefdef(def2)^.definition);
@@ -993,7 +993,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.87  1999-09-15 22:09:27  florian
+  Revision 1.88  1999-10-01 08:02:51  peter
+    * forward type declaration rewritten
+
+  Revision 1.87  1999/09/15 22:09:27  florian
     + rtti is now automatically generated for published classes, i.e.
       they are handled like an implicit property