* new deref code

This commit is contained in:
peter 1999-05-14 17:52:26 +00:00
parent 032762ce34
commit 24ad159d09
3 changed files with 80 additions and 175 deletions

View File

@ -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

View File

@ -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

View File

@ -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