mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-11 18:06:12 +02:00
* new deref code
This commit is contained in:
parent
032762ce34
commit
24ad159d09
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user