mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 10:49:09 +02:00
* new deref code
This commit is contained in:
parent
032762ce34
commit
24ad159d09
@ -1386,7 +1386,6 @@
|
|||||||
begin
|
begin
|
||||||
{ be careful, tclassdefref inherits from tpointerdef }
|
{ be careful, tclassdefref inherits from tpointerdef }
|
||||||
tdef.load;
|
tdef.load;
|
||||||
deftype:=classrefdef;
|
|
||||||
definition:=readdefref;
|
definition:=readdefref;
|
||||||
is_far:=false;
|
is_far:=false;
|
||||||
savesize:=target_os.size_of_pointer;
|
savesize:=target_os.size_of_pointer;
|
||||||
@ -3380,7 +3379,10 @@ Const local_symtable_index : longint = $8001;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* removed oldppu code
|
||||||
* warning if objpas is loaded from uses
|
* warning if objpas is loaded from uses
|
||||||
* first things for new deref writing
|
* first things for new deref writing
|
||||||
|
@ -103,7 +103,6 @@
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
{$ifndef OLDDEREF}
|
|
||||||
procedure writederef(p : psymtableentry);
|
procedure writederef(p : psymtableentry);
|
||||||
begin
|
begin
|
||||||
if p=nil then
|
if p=nil then
|
||||||
@ -113,20 +112,20 @@
|
|||||||
{ Static symtable ? }
|
{ Static symtable ? }
|
||||||
if p^.owner^.symtabletype=staticsymtable then
|
if p^.owner^.symtabletype=staticsymtable then
|
||||||
begin
|
begin
|
||||||
current_ppu^.putbyte(ord(derefaktstatic));
|
current_ppu^.putbyte(ord(derefaktstaticindex));
|
||||||
current_ppu^.putword(p^.indexnr);
|
current_ppu^.putword(p^.indexnr);
|
||||||
end
|
end
|
||||||
{ Local record/object symtable ? }
|
{ Local record/object symtable ? }
|
||||||
else if (p^.owner=aktrecordsymtable) then
|
else if (p^.owner=aktrecordsymtable) then
|
||||||
begin
|
begin
|
||||||
current_ppu^.putbyte(ord(derefaktrecord));
|
current_ppu^.putbyte(ord(derefaktrecordindex));
|
||||||
current_ppu^.putword(p^.indexnr);
|
current_ppu^.putword(p^.indexnr);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
{ else if p^.owner^.unitid>$8000 then
|
{ else if p^.owner^.unitid>$8000 then
|
||||||
current_ppu^.putword(p^.owner^.unitid) }
|
current_ppu^.putword(p^.owner^.unitid) }
|
||||||
begin
|
begin
|
||||||
current_ppu^.putbyte(ord(dereflocal));
|
current_ppu^.putbyte(ord(derefindex));
|
||||||
current_ppu^.putword(p^.indexnr);
|
current_ppu^.putword(p^.indexnr);
|
||||||
{ Current unit symtable ? }
|
{ Current unit symtable ? }
|
||||||
repeat
|
repeat
|
||||||
@ -142,9 +141,9 @@
|
|||||||
objectsymtable,
|
objectsymtable,
|
||||||
recordsymtable :
|
recordsymtable :
|
||||||
begin
|
begin
|
||||||
|
p:=p^.owner^.defowner;
|
||||||
current_ppu^.putbyte(ord(derefrecord));
|
current_ppu^.putbyte(ord(derefrecord));
|
||||||
current_ppu^.putword(p^.indexnr);
|
current_ppu^.putword(p^.indexnr);
|
||||||
p:=p^.owner^.defowner;
|
|
||||||
end;
|
end;
|
||||||
else
|
else
|
||||||
internalerror(556656);
|
internalerror(556656);
|
||||||
@ -153,44 +152,16 @@
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
{$else}
|
|
||||||
procedure writedefref(p : pdef);
|
procedure writedefref(p : pdef);
|
||||||
begin
|
begin
|
||||||
if p=nil then
|
writederef(p);
|
||||||
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;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure writesymref(p : psym);
|
procedure writesymref(p : psym);
|
||||||
begin
|
begin
|
||||||
if p=nil then
|
writederef(p);
|
||||||
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;
|
|
||||||
end;
|
end;
|
||||||
{$endif}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
procedure writesourcefiles;
|
procedure writesourcefiles;
|
||||||
@ -413,27 +384,33 @@
|
|||||||
derefnil :
|
derefnil :
|
||||||
break;
|
break;
|
||||||
derefunit,
|
derefunit,
|
||||||
derefaktrecord,
|
derefaktrecordindex,
|
||||||
derefaktstatic :
|
derefaktstaticindex :
|
||||||
begin
|
begin
|
||||||
new(p);
|
new(p,init(b,current_ppu^.getword));
|
||||||
p^.dereftype:=b;
|
|
||||||
p^.index:=current_ppu^.getword;
|
|
||||||
p^.next:=hp;
|
p^.next:=hp;
|
||||||
break;
|
break;
|
||||||
end;
|
end;
|
||||||
dereflocal,
|
derefindex,
|
||||||
derefrecord :
|
derefrecord :
|
||||||
begin
|
begin
|
||||||
new(p);
|
new(p,init(b,current_ppu^.getword));
|
||||||
p^.dereftype:=derefrecord;
|
|
||||||
p^.index:=current_ppu^.getword;
|
|
||||||
p^.next:=hp;
|
p^.next:=hp;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
until false;
|
until false;
|
||||||
readderef:=p;
|
readderef:=p;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function readdefref : pdef;
|
||||||
|
begin
|
||||||
|
readdefref:=pdef(readderef);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function readsymref : psym;
|
||||||
|
begin
|
||||||
|
readsymref:=psym(readderef);
|
||||||
|
end;
|
||||||
{$else}
|
{$else}
|
||||||
function readdefref : pdef;
|
function readdefref : pdef;
|
||||||
var
|
var
|
||||||
@ -583,7 +560,10 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* removed oldppu code
|
||||||
* warning if objpas is loaded from uses
|
* warning if objpas is loaded from uses
|
||||||
* first things for new deref writing
|
* first things for new deref writing
|
||||||
|
@ -24,8 +24,6 @@
|
|||||||
{$endif}
|
{$endif}
|
||||||
unit symtable;
|
unit symtable;
|
||||||
|
|
||||||
{$define OLDDEREF}
|
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
@ -97,13 +95,15 @@ unit symtable;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
{ Deref entry options }
|
{ Deref entry options }
|
||||||
tdereftype = (derefnil,derefaktrecord,derefaktstatic,derefunit,derefrecord,dereflocal);
|
tdereftype = (derefnil,derefaktrecordindex,derefaktstaticindex,derefunit,derefrecord,derefindex);
|
||||||
|
|
||||||
pderef = ^tderef;
|
pderef = ^tderef;
|
||||||
tderef = record
|
tderef = object
|
||||||
dereftype : tdereftype;
|
dereftype : tdereftype;
|
||||||
index : word;
|
index : word;
|
||||||
next : pderef;
|
next : pderef;
|
||||||
|
constructor init(typ:tdereftype;i:word);
|
||||||
|
destructor done;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
psymtableentry = ^tsymtableentry;
|
psymtableentry = ^tsymtableentry;
|
||||||
@ -580,6 +580,23 @@ implementation
|
|||||||
end;
|
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
|
PPU Reading Writing
|
||||||
*****************************************************************************}
|
*****************************************************************************}
|
||||||
@ -644,30 +661,28 @@ const localsymtablestack : psymtable = nil;
|
|||||||
find_local_symtable:=p;
|
find_local_symtable:=p;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{$ifndef OLDDEREF}
|
|
||||||
function resolvedef(var p:pderef):pdef;
|
procedure resolvederef(var p:pderef;var st:psymtable;var idx:word);
|
||||||
var
|
var
|
||||||
st : psymtable;
|
hp : pderef;
|
||||||
idx : longint;
|
pd : pdef;
|
||||||
hp : pderef;
|
|
||||||
pd : pdef;
|
|
||||||
begin
|
begin
|
||||||
st:=nil;
|
st:=nil;
|
||||||
idx:=-1;
|
idx:=0;
|
||||||
while assigned(p) do
|
while assigned(p) do
|
||||||
begin
|
begin
|
||||||
case p^.dereftype of
|
case p^.dereftype of
|
||||||
derefaktrecord :
|
derefaktrecordindex :
|
||||||
begin
|
begin
|
||||||
st:=aktrecordsymtable;
|
st:=aktrecordsymtable;
|
||||||
idx:=p^.index;
|
idx:=p^.index;
|
||||||
end;
|
end;
|
||||||
derefaktstatic :
|
derefaktstaticindex :
|
||||||
begin
|
begin
|
||||||
st:=aktstaticsymtable;
|
st:=aktstaticsymtable;
|
||||||
idx:=p^.index
|
idx:=p^.index;
|
||||||
end;
|
end;
|
||||||
derefunit :
|
derefunit :
|
||||||
begin
|
begin
|
||||||
{$ifdef NEWMAP}
|
{$ifdef NEWMAP}
|
||||||
st:=psymtable(current_module^.map^[p^.index]^.globalsymtable);
|
st:=psymtable(current_module^.map^[p^.index]^.globalsymtable);
|
||||||
@ -687,123 +702,41 @@ const localsymtablestack : psymtable = nil;
|
|||||||
internalerror(556658);
|
internalerror(556658);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
dereflocal :
|
derefindex :
|
||||||
begin
|
begin
|
||||||
idx:=p^.index;
|
idx:=p^.index;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
hp:=p;
|
hp:=p;
|
||||||
p:=p^.next;
|
p:=p^.next;
|
||||||
dispose(hp);
|
dispose(hp,done);
|
||||||
end;
|
end;
|
||||||
if assigned(st) then
|
|
||||||
resolvedef:=st^.getdefnr(idx)
|
|
||||||
else
|
|
||||||
resolvedef:=nil;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
function resolvesym(var p:pderef):psym;
|
procedure resolvedef(var def:pdef);
|
||||||
var
|
var
|
||||||
st : psymtable;
|
st : psymtable;
|
||||||
idx : longint;
|
idx : word;
|
||||||
hp : pderef;
|
|
||||||
pd : pdef;
|
|
||||||
begin
|
begin
|
||||||
st:=nil;
|
resolvederef(pderef(def),st,idx);
|
||||||
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;
|
|
||||||
if assigned(st) then
|
if assigned(st) then
|
||||||
resolvesym:=st^.getsymnr(idx)
|
def:=st^.getdefnr(idx)
|
||||||
else
|
else
|
||||||
resolvesym:=nil;
|
def:=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;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure resolvedef(var d : pdef);
|
procedure resolvesym(var sym:psym);
|
||||||
|
var
|
||||||
|
st : psymtable;
|
||||||
|
idx : word;
|
||||||
begin
|
begin
|
||||||
if longint(d)=-1 then
|
resolvederef(pderef(sym),st,idx);
|
||||||
d:=nil
|
if assigned(st) then
|
||||||
|
sym:=st^.getsymnr(idx)
|
||||||
else
|
else
|
||||||
begin
|
sym:=nil;
|
||||||
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;
|
|
||||||
end;
|
end;
|
||||||
{$endif}
|
|
||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
{*****************************************************************************
|
||||||
@ -1631,9 +1564,6 @@ const localsymtablestack : psymtable = nil;
|
|||||||
sym : psym;
|
sym : psym;
|
||||||
prdef : pdef;
|
prdef : pdef;
|
||||||
oldrecsyms : psymtable;
|
oldrecsyms : psymtable;
|
||||||
{$ifndef OLDDEREF}
|
|
||||||
p : pderef;
|
|
||||||
{$endif}
|
|
||||||
begin
|
begin
|
||||||
if symtabletype in [recordsymtable,objectsymtable,
|
if symtabletype in [recordsymtable,objectsymtable,
|
||||||
parasymtable,localsymtable] then
|
parasymtable,localsymtable] then
|
||||||
@ -1650,24 +1580,14 @@ const localsymtablestack : psymtable = nil;
|
|||||||
b:=current_ppu^.readentry;
|
b:=current_ppu^.readentry;
|
||||||
case b of
|
case b of
|
||||||
ibsymref : begin
|
ibsymref : begin
|
||||||
{$ifndef OLDDEREF}
|
|
||||||
p:=readderef;
|
|
||||||
sym:=resolvesym(p);
|
|
||||||
{$else}
|
|
||||||
sym:=readsymref;
|
sym:=readsymref;
|
||||||
resolvesym(sym);
|
resolvesym(sym);
|
||||||
{$endif}
|
|
||||||
if assigned(sym) then
|
if assigned(sym) then
|
||||||
sym^.load_references;
|
sym^.load_references;
|
||||||
end;
|
end;
|
||||||
ibdefref : begin
|
ibdefref : begin
|
||||||
{$ifndef OLDDEREF}
|
|
||||||
p:=readderef;
|
|
||||||
prdef:=resolvedef(p);
|
|
||||||
{$else}
|
|
||||||
prdef:=readdefref;
|
prdef:=readdefref;
|
||||||
resolvedef(prdef);
|
resolvedef(prdef);
|
||||||
{$endif}
|
|
||||||
if assigned(prdef) then
|
if assigned(prdef) then
|
||||||
begin
|
begin
|
||||||
if prdef^.deftype<>procdef then
|
if prdef^.deftype<>procdef then
|
||||||
@ -2429,7 +2349,10 @@ const localsymtablestack : psymtable = nil;
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* removed oldppu code
|
||||||
* warning if objpas is loaded from uses
|
* warning if objpas is loaded from uses
|
||||||
* first things for new deref writing
|
* first things for new deref writing
|
||||||
|
Loading…
Reference in New Issue
Block a user