Browse Source

* Tsymbol and Ancestor fixes

pierre 25 years ago
parent
commit
f05d1bb02d
1 changed files with 70 additions and 24 deletions
  1. 70 24
      compiler/browcol.pas

+ 70 - 24
compiler/browcol.pas

@@ -42,6 +42,7 @@ const
     sfRecord        = $00000001;
     sfRecord        = $00000001;
     sfObject        = $00000002;
     sfObject        = $00000002;
     sfClass         = $00000004;
     sfClass         = $00000004;
+    sfPointer       = $00000008;
     sfHasMemInfo    = $80000000;
     sfHasMemInfo    = $80000000;
 
 
 type
 type
@@ -89,8 +90,8 @@ type
       Items      : PSymbolCollection;
       Items      : PSymbolCollection;
       DType      : PString;
       DType      : PString;
       VType      : PString;
       VType      : PString;
-      ObjectID   : longint;
-      AncestorID : longint;
+      TypeID     : longint;
+      RelatedTypeID : longint;
       Ancestor   : PSymbol;
       Ancestor   : PSymbol;
       Flags      : longint;
       Flags      : longint;
       MemInfo    : PSymbolMemInfo;
       MemInfo    : PSymbolMemInfo;
@@ -426,8 +427,8 @@ var K1: PSymbol absolute Key1;
     K2: PSymbol absolute Key2;
     K2: PSymbol absolute Key2;
     R: Sw_integer;
     R: Sw_integer;
 begin
 begin
-  if K1^.ObjectID<K2^.ObjectID then R:=-1 else
-  if K1^.ObjectID>K2^.ObjectID then R:=1 else
+  if K1^.TypeID<K2^.TypeID then R:=-1 else
+  if K1^.TypeID>K2^.TypeID then R:=1 else
   R:=0;
   R:=0;
   Compare:=R;
   Compare:=R;
 end;
 end;
@@ -442,7 +443,7 @@ var S: TSymbol;
     Index: sw_integer;
     Index: sw_integer;
     P: PSymbol;
     P: PSymbol;
 begin
 begin
-  S.ObjectID:=AID;
+  S.TypeID:=AID;
   if Search(@S,Index)=false then P:=nil else
   if Search(@S,Index)=false then P:=nil else
     P:=At(Index);
     P:=At(Index);
   SearchSymbolByID:=P;
   SearchSymbolByID:=P;
@@ -695,8 +696,8 @@ begin
   TObject.Init;
   TObject.Init;
 
 
   S.Read(Typ,SizeOf(Typ));
   S.Read(Typ,SizeOf(Typ));
-  S.Read(ObjectID, SizeOf(ObjectID));
-  S.Read(AncestorID, SizeOf(AncestorID));
+  S.Read(TypeID, SizeOf(TypeID));
+  S.Read(RelatedTypeID, SizeOf(RelatedTypeID));
   S.Read(Flags, SizeOf(Flags));
   S.Read(Flags, SizeOf(Flags));
   Name:=S.ReadStr;
   Name:=S.ReadStr;
   Params:=S.ReadStr;
   Params:=S.ReadStr;
@@ -716,15 +717,15 @@ begin
   { --- items needing fixup --- }
   { --- items needing fixup --- }
   S.Read(DType, SizeOf(DType));
   S.Read(DType, SizeOf(DType));
   S.Read(VType, SizeOf(VType));
   S.Read(VType, SizeOf(VType));
-  S.Read(Ancestor, SizeOf(Ancestor));
+  {S.Read(Ancestor, SizeOf(Ancestor));}
 end;
 end;
 
 
 procedure TSymbol.Store(var S: TStream);
 procedure TSymbol.Store(var S: TStream);
 var W: word;
 var W: word;
 begin
 begin
   S.Write(Typ,SizeOf(Typ));
   S.Write(Typ,SizeOf(Typ));
-  S.Write(ObjectID, SizeOf(ObjectID));
-  S.Write(AncestorID, SizeOf(AncestorID));
+  S.Write(TypeID, SizeOf(TypeID));
+  S.Write(RelatedTypeID, SizeOf(RelatedTypeID));
   S.Write(Flags, SizeOf(Flags));
   S.Write(Flags, SizeOf(Flags));
   S.WriteStr(Name);
   S.WriteStr(Name);
   S.WriteStr(Params);
   S.WriteStr(Params);
@@ -742,7 +743,7 @@ begin
   { --- items needing fixup --- }
   { --- items needing fixup --- }
   S.Write(DType, SizeOf(DType));
   S.Write(DType, SizeOf(DType));
   S.Write(VType, SizeOf(VType));
   S.Write(VType, SizeOf(VType));
-  S.Write(Ancestor, SizeOf(Ancestor));
+  {S.Write(Ancestor, SizeOf(Ancestor));}
 end;
 end;
 
 
 
 
@@ -1166,6 +1167,13 @@ end;
                  else
                  else
                    SetVType(Symbol,GetDefinitionStr(vartype.def));
                    SetVType(Symbol,GetDefinitionStr(vartype.def));
                ProcessDefIfStruct(vartype.def);
                ProcessDefIfStruct(vartype.def);
+               if assigned(vartype.def) then
+                 if (vartype.def^.deftype=pointerdef) and
+                    assigned(ppointerdef(vartype.def)^.pointertype.def) then
+                 begin
+                   Symbol^.Flags:=(Symbol^.Flags or sfPointer);
+                   Symbol^.RelatedTypeID:=longint(ppointerdef(vartype.def)^.pointertype.def);
+                 end;
                MemInfo.Addr:=address;
                MemInfo.Addr:=address;
                if assigned(localvarsym) then
                if assigned(localvarsym) then
                  MemInfo.LocalAddr:=localvarsym^.address
                  MemInfo.LocalAddr:=localvarsym^.address
@@ -1225,6 +1233,8 @@ end;
             begin
             begin
             with ptypesym(sym)^ do
             with ptypesym(sym)^ do
               if assigned(restype.def) then
               if assigned(restype.def) then
+               begin
+                Symbol^.TypeID:=longint(restype.def);
                 case restype.def^.deftype of
                 case restype.def^.deftype of
                   arraydef :
                   arraydef :
                     SetDType(Symbol,GetArrayDefStr(parraydef(restype.def)));
                     SetDType(Symbol,GetArrayDefStr(parraydef(restype.def)));
@@ -1238,9 +1248,8 @@ end;
                     with pobjectdef(restype.def)^ do
                     with pobjectdef(restype.def)^ do
                     begin
                     begin
                       ObjDef:=childof;
                       ObjDef:=childof;
-                      Symbol^.ObjectID:=longint(restype.def);
                       if ObjDef<>nil then
                       if ObjDef<>nil then
-                        Symbol^.AncestorID:=longint(ObjDef);{TypeNames^.Add(S);}
+                        Symbol^.RelatedTypeID:=longint(ObjDef);{TypeNames^.Add(S);}
                       Symbol^.Flags:=(Symbol^.Flags or sfObject);
                       Symbol^.Flags:=(Symbol^.Flags or sfObject);
                       if is_class then
                       if is_class then
                         Symbol^.Flags:=(Symbol^.Flags or sfClass);
                         Symbol^.Flags:=(Symbol^.Flags or sfClass);
@@ -1251,11 +1260,18 @@ end;
                       Symbol^.Flags:=(Symbol^.Flags or sfRecord);
                       Symbol^.Flags:=(Symbol^.Flags or sfRecord);
                       ProcessSymTable(Symbol,Symbol^.Items,precorddef(restype.def)^.symtable);
                       ProcessSymTable(Symbol,Symbol^.Items,precorddef(restype.def)^.symtable);
                     end;
                     end;
+                  pointerdef :
+                    begin
+                      Symbol^.Flags:=(Symbol^.Flags or sfPointer);
+                      Symbol^.RelatedTypeID:=longint(ppointerdef(restype.def)^.pointertype.def);{TypeNames^.Add(S);}
+                    end;
+
                   filedef :
                   filedef :
                     SetDType(Symbol,GetFileDefStr(pfiledef(restype.def)));
                     SetDType(Symbol,GetFileDefStr(pfiledef(restype.def)));
                   setdef :
                   setdef :
                     SetDType(Symbol,GetSetDefStr(psetdef(restype.def)));
                     SetDType(Symbol,GetSetDefStr(psetdef(restype.def)));
                 end;
                 end;
+               end;
             end;
             end;
         end;
         end;
         Ref:=Sym^.defref;
         Ref:=Sym^.defref;
@@ -1312,7 +1328,8 @@ begin
 end;
 end;
 
 
 procedure BuildObjectInfo;
 procedure BuildObjectInfo;
-var C: PIDSortedSymbolCollection;
+var C,D: PIDSortedSymbolCollection;
+    E : PCollection;
     ObjectC: PObjectSymbolCollection;
     ObjectC: PObjectSymbolCollection;
     ObjectsSymbol: PObjectSymbol;
     ObjectsSymbol: PObjectSymbol;
 procedure InsertSymbolCollection(Symbols: PSymbolCollection);
 procedure InsertSymbolCollection(Symbols: PSymbolCollection);
@@ -1324,6 +1341,10 @@ begin
       P:=Symbols^.At(I);
       P:=Symbols^.At(I);
       if (P^.Flags and sfObject)<>0 then
       if (P^.Flags and sfObject)<>0 then
         C^.Insert(P);
         C^.Insert(P);
+      if (P^.typ=typesym) then
+        D^.Insert(P);
+      if (P^.typ=varsym) and ((P^.flags and sfPointer)<>0) then
+        E^.Insert(P);
       if P^.Items<>nil then
       if P^.Items<>nil then
         InsertSymbolCollection(P^.Items);
         InsertSymbolCollection(P^.Items);
     end;
     end;
@@ -1370,16 +1391,42 @@ var Pass: integer;
     P: PSymbol;
     P: PSymbol;
 begin
 begin
   New(C, Init(1000,5000));
   New(C, Init(1000,5000));
+  New(D, Init(1000,5000));
+  New(E, Init(1000,5000));
   InsertSymbolCollection(Modules);
   InsertSymbolCollection(Modules);
 
 
   { --- Resolve ancestor<->descendant references --- }
   { --- Resolve ancestor<->descendant references --- }
   for I:=0 to C^.Count-1 do
   for I:=0 to C^.Count-1 do
     begin
     begin
       P:=C^.At(I);
       P:=C^.At(I);
-      if P^.AncestorID<>0 then
-        P^.Ancestor:=C^.SearchSymbolByID(P^.AncestorID);
+      if P^.RelatedTypeID<>0 then
+        P^.Ancestor:=C^.SearchSymbolByID(P^.RelatedTypeID);
     end;
     end;
 
 
+  { --- Resolve pointer definition references --- }
+  for I:=0 to D^.Count-1 do
+    begin
+      P:=D^.At(I);
+      if P^.RelatedTypeID<>0 then
+        P^.Ancestor:=D^.SearchSymbolByID(P^.RelatedTypeID);
+    end;
+
+  { --- Resolve  pointer var definition references --- }
+  for I:=0 to E^.Count-1 do
+    begin
+      P:=PSymbol(E^.At(I));
+      if P^.RelatedTypeID<>0 then
+        P^.Ancestor:=D^.SearchSymbolByID(P^.RelatedTypeID);
+    end;
+
+  { E is not needed anymore }
+  E^.DeleteAll;
+  Dispose(E,Done);
+
+  { D is not needed anymore }
+  D^.DeleteAll;
+  Dispose(D,Done);
+
   { --- Build object tree --- }
   { --- Build object tree --- }
   if assigned(ObjectTree) then Dispose(ObjectTree, Done);
   if assigned(ObjectTree) then Dispose(ObjectTree, Done);
   New(ObjectsSymbol, InitName('Objects'));
   New(ObjectsSymbol, InitName('Objects'));
@@ -1448,9 +1495,7 @@ begin
         ppu:=fexpand(m^.ppufilename^);
         ppu:=fexpand(m^.ppufilename^);
       if (m^.is_unit=false) and (m^.islibrary=false) then
       if (m^.is_unit=false) and (m^.islibrary=false) then
         ppu:=fexpand(m^.exefilename^);
         ppu:=fexpand(m^.exefilename^);
-      if assigned(p) then
-      begin
-        if assigned(m^.sourcefiles) then
+      if assigned(m^.sourcefiles) then
         begin
         begin
           s:=m^.sourcefiles^.files;
           s:=m^.sourcefiles^.files;
           while assigned(s) do
           while assigned(s) do
@@ -1468,8 +1513,6 @@ begin
             s:=s^.next;
             s:=s^.next;
           end;
           end;
         end;
         end;
-      end;
-
       m:=pmodule(m^.next);
       m:=pmodule(m^.next);
     end;
     end;
   end;
   end;
@@ -1608,7 +1651,7 @@ var I: sw_integer;
 begin
 begin
   PD^.Resolve(P^.DType);
   PD^.Resolve(P^.DType);
   PD^.Resolve(P^.VType);
   PD^.Resolve(P^.VType);
-  PD^.Resolve(P^.Ancestor);
+  {PD^.Resolve(P^.Ancestor);}
   if Assigned(P^.References) then
   if Assigned(P^.References) then
     with P^.References^ do
     with P^.References^ do
      for I:=0 to Count-1 do
      for I:=0 to Count-1 do
@@ -1707,7 +1750,10 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.33  2000-02-09 13:22:45  peter
+  Revision 1.34  2000-03-07 21:55:59  pierre
+    * Tsymbol and Ancestor fixes
+
+  Revision 1.33  2000/02/09 13:22:45  peter
     * log truncated
     * log truncated
 
 
   Revision 1.32  2000/01/20 00:24:06  pierre
   Revision 1.32  2000/01/20 00:24:06  pierre
@@ -1756,4 +1802,4 @@ end.
     * moved bitmask constants to sets
     * moved bitmask constants to sets
     * some other type/const renamings
     * some other type/const renamings
 
 
-}
+}