diff --git a/compiler/symdef.inc b/compiler/symdef.inc index 908d85e299..79f1108185 100644 --- a/compiler/symdef.inc +++ b/compiler/symdef.inc @@ -1386,7 +1386,6 @@ begin { be careful, tclassdefref inherits from tpointerdef } tdef.load; - deftype:=classrefdef; definition:=readdefref; is_far:=false; savesize:=target_os.size_of_pointer; @@ -3380,7 +3379,10 @@ Const local_symtable_index : longint = $8001; { $Log$ - Revision 1.114 1999-05-13 21:59:41 peter + Revision 1.115 1999-05-14 17:52:26 peter + * new deref code + + Revision 1.114 1999/05/13 21:59:41 peter * removed oldppu code * warning if objpas is loaded from uses * first things for new deref writing diff --git a/compiler/symppu.inc b/compiler/symppu.inc index e5e5a961de..298a53c7ae 100644 --- a/compiler/symppu.inc +++ b/compiler/symppu.inc @@ -103,7 +103,6 @@ end; -{$ifndef OLDDEREF} procedure writederef(p : psymtableentry); begin if p=nil then @@ -113,20 +112,20 @@ { Static symtable ? } if p^.owner^.symtabletype=staticsymtable then begin - current_ppu^.putbyte(ord(derefaktstatic)); + current_ppu^.putbyte(ord(derefaktstaticindex)); current_ppu^.putword(p^.indexnr); end { Local record/object symtable ? } else if (p^.owner=aktrecordsymtable) then begin - current_ppu^.putbyte(ord(derefaktrecord)); + current_ppu^.putbyte(ord(derefaktrecordindex)); current_ppu^.putword(p^.indexnr); end else { else if p^.owner^.unitid>$8000 then current_ppu^.putword(p^.owner^.unitid) } begin - current_ppu^.putbyte(ord(dereflocal)); + current_ppu^.putbyte(ord(derefindex)); current_ppu^.putword(p^.indexnr); { Current unit symtable ? } repeat @@ -142,9 +141,9 @@ objectsymtable, recordsymtable : begin + p:=p^.owner^.defowner; current_ppu^.putbyte(ord(derefrecord)); current_ppu^.putword(p^.indexnr); - p:=p^.owner^.defowner; end; else internalerror(556656); @@ -153,44 +152,16 @@ end; end; end; -{$else} + procedure writedefref(p : pdef); begin - if p=nil then - current_ppu^.putlongint(-1) - else - begin - if p^.owner^.symtabletype=staticsymtable then - current_ppu^.putword($fffe) - else if (p^.owner=aktrecordsymtable) then - current_ppu^.putword($ffff) - else if p^.owner^.unitid>$8000 then - current_ppu^.putword(p^.owner^.unitid) - else - current_ppu^.putword(p^.owner^.unitid); - current_ppu^.putword(p^.indexnr); - end; + writederef(p); end; procedure writesymref(p : psym); begin - if p=nil then - current_ppu^.putlongint(-1) - else - begin - if p^.owner^.symtabletype=staticsymtable then - current_ppu^.putword($fffe) - else if (p^.owner=aktrecordsymtable) then - current_ppu^.putword($ffff) - else if p^.owner^.unitid>$8000 then - current_ppu^.putword(p^.owner^.unitid) - else - current_ppu^.putword(p^.owner^.unitid); - current_ppu^.putword(p^.indexnr); - end; + writederef(p); end; -{$endif} - procedure writesourcefiles; @@ -413,27 +384,33 @@ derefnil : break; derefunit, - derefaktrecord, - derefaktstatic : + derefaktrecordindex, + derefaktstaticindex : begin - new(p); - p^.dereftype:=b; - p^.index:=current_ppu^.getword; + new(p,init(b,current_ppu^.getword)); p^.next:=hp; break; end; - dereflocal, + derefindex, derefrecord : begin - new(p); - p^.dereftype:=derefrecord; - p^.index:=current_ppu^.getword; + new(p,init(b,current_ppu^.getword)); p^.next:=hp; end; end; until false; readderef:=p; end; + + function readdefref : pdef; + begin + readdefref:=pdef(readderef); + end; + + function readsymref : psym; + begin + readsymref:=psym(readderef); + end; {$else} function readdefref : pdef; var @@ -583,7 +560,10 @@ { $Log$ - Revision 1.40 1999-05-13 21:59:44 peter + Revision 1.41 1999-05-14 17:52:28 peter + * new deref code + + Revision 1.40 1999/05/13 21:59:44 peter * removed oldppu code * warning if objpas is loaded from uses * first things for new deref writing diff --git a/compiler/symtable.pas b/compiler/symtable.pas index 69415b960f..b6de1d9654 100644 --- a/compiler/symtable.pas +++ b/compiler/symtable.pas @@ -24,8 +24,6 @@ {$endif} unit symtable; -{$define OLDDEREF} - interface uses @@ -97,13 +95,15 @@ unit symtable; end; { Deref entry options } - tdereftype = (derefnil,derefaktrecord,derefaktstatic,derefunit,derefrecord,dereflocal); + tdereftype = (derefnil,derefaktrecordindex,derefaktstaticindex,derefunit,derefrecord,derefindex); pderef = ^tderef; - tderef = record + tderef = object dereftype : tdereftype; index : word; next : pderef; + constructor init(typ:tdereftype;i:word); + destructor done; end; psymtableentry = ^tsymtableentry; @@ -580,6 +580,23 @@ implementation end; +{**************************************************************************** + TDeref +****************************************************************************} + + constructor tderef.init(typ:tdereftype;i:word); + begin + dereftype:=typ; + index:=i; + next:=nil; + end; + + + destructor tderef.done; + begin + end; + + {***************************************************************************** PPU Reading Writing *****************************************************************************} @@ -644,30 +661,28 @@ const localsymtablestack : psymtable = nil; find_local_symtable:=p; end; -{$ifndef OLDDEREF} - function resolvedef(var p:pderef):pdef; + + procedure resolvederef(var p:pderef;var st:psymtable;var idx:word); var - st : psymtable; - idx : longint; - hp : pderef; - pd : pdef; + hp : pderef; + pd : pdef; begin st:=nil; - idx:=-1; + idx:=0; while assigned(p) do begin case p^.dereftype of - derefaktrecord : + derefaktrecordindex : begin st:=aktrecordsymtable; idx:=p^.index; end; - derefaktstatic : + derefaktstaticindex : begin st:=aktstaticsymtable; - idx:=p^.index + idx:=p^.index; end; - derefunit : + derefunit : begin {$ifdef NEWMAP} st:=psymtable(current_module^.map^[p^.index]^.globalsymtable); @@ -687,123 +702,41 @@ const localsymtablestack : psymtable = nil; internalerror(556658); end; end; - dereflocal : + derefindex : begin idx:=p^.index; end; end; hp:=p; p:=p^.next; - dispose(hp); + dispose(hp,done); end; - if assigned(st) then - resolvedef:=st^.getdefnr(idx) - else - resolvedef:=nil; end; - function resolvesym(var p:pderef):psym; + procedure resolvedef(var def:pdef); var - st : psymtable; - idx : longint; - hp : pderef; - pd : pdef; + st : psymtable; + idx : word; begin - st:=nil; - idx:=-1; - while assigned(p) do - begin - case p^.dereftype of - derefaktrecord : - begin - st:=aktrecordsymtable; - idx:=p^.index; - end; - derefaktstatic : - begin - st:=aktstaticsymtable; - idx:=p^.index - end; - derefunit : - begin -{$ifdef NEWMAP} - st:=psymtable(current_module^.map^[p^.index]^.globalsymtable); -{$else NEWMAP} - st:=psymtable(current_module^.map^[p^.index]); -{$endif NEWMAP} - end; - derefrecord : - begin - pd:=st^.getdefnr(p^.index); - case pd^.deftype of - recorddef : - st:=precdef(pd)^.symtable; - objectdef : - st:=pobjectdef(pd)^.publicsyms; - else - internalerror(556658); - end; - end; - dereflocal : - begin - idx:=p^.index; - end; - end; - hp:=p; - p:=p^.next; - dispose(hp); - end; + resolvederef(pderef(def),st,idx); if assigned(st) then - resolvesym:=st^.getsymnr(idx) + def:=st^.getdefnr(idx) else - resolvesym:=nil; - end; -{$else} - procedure resolvesym(var d : psym); - begin - if longint(d)=-1 then - d:=nil - else - begin - if (longint(d) and $ffff)=$ffff then - d:=aktrecordsymtable^.getsymnr(longint(d) shr 16) - else - if (longint(d) and $ffff)=$fffe then - d:=aktstaticsymtable^.getsymnr(longint(d) shr 16) - else if (longint(d) and $ffff)>$8000 then - d:=find_local_symtable(longint(d) and $ffff)^.getsymnr(longint(d) shr 16) - else -{$ifdef NEWMAP} - d:=psymtable(current_module^.map^[longint(d) and $ffff]^.globalsymtable)^.getsymnr(longint(d) shr 16); -{$else NEWMAP} - d:=psymtable(current_module^.map^[longint(d) and $ffff])^.getsymnr(longint(d) shr 16); -{$endif NEWMAP} - end; + def:=nil; end; - procedure resolvedef(var d : pdef); + procedure resolvesym(var sym:psym); + var + st : psymtable; + idx : word; begin - if longint(d)=-1 then - d:=nil + resolvederef(pderef(sym),st,idx); + if assigned(st) then + sym:=st^.getsymnr(idx) else - begin - if (longint(d) and $ffff)=$ffff then - d:=aktrecordsymtable^.getdefnr(longint(d) shr 16) - else - if (longint(d) and $ffff)=$fffe then - d:=aktstaticsymtable^.getdefnr(longint(d) shr 16) - else if (longint(d) and $ffff)>$8000 then - d:=find_local_symtable(longint(d) and $ffff)^.getdefnr(longint(d) shr 16) - else -{$ifdef NEWMAP} - d:=psymtable(current_module^.map^[longint(d) and $ffff]^.globalsymtable)^.getdefnr(longint(d) shr 16); -{$else NEWMAP} - d:=psymtable(current_module^.map^[longint(d) and $ffff])^.getdefnr(longint(d) shr 16); -{$endif NEWMAP} - end; + sym:=nil; end; -{$endif} {***************************************************************************** @@ -1631,9 +1564,6 @@ const localsymtablestack : psymtable = nil; sym : psym; prdef : pdef; oldrecsyms : psymtable; -{$ifndef OLDDEREF} - p : pderef; -{$endif} begin if symtabletype in [recordsymtable,objectsymtable, parasymtable,localsymtable] then @@ -1650,24 +1580,14 @@ const localsymtablestack : psymtable = nil; b:=current_ppu^.readentry; case b of ibsymref : begin -{$ifndef OLDDEREF} - p:=readderef; - sym:=resolvesym(p); -{$else} sym:=readsymref; resolvesym(sym); -{$endif} if assigned(sym) then sym^.load_references; end; ibdefref : begin -{$ifndef OLDDEREF} - p:=readderef; - prdef:=resolvedef(p); -{$else} prdef:=readdefref; resolvedef(prdef); -{$endif} if assigned(prdef) then begin if prdef^.deftype<>procdef then @@ -2429,7 +2349,10 @@ const localsymtablestack : psymtable = nil; end. { $Log$ - Revision 1.13 1999-05-13 21:59:48 peter + Revision 1.14 1999-05-14 17:52:29 peter + * new deref code + + Revision 1.13 1999/05/13 21:59:48 peter * removed oldppu code * warning if objpas is loaded from uses * first things for new deref writing