mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-04 07:31:39 +02:00
+ tempansilist and gettempansistringreference
This commit is contained in:
parent
982e083f76
commit
bd7f5cc3d0
@ -55,27 +55,15 @@ unit temp_gen;
|
|||||||
function gettempofsizepersistant(size : longint) : longint;
|
function gettempofsizepersistant(size : longint) : longint;
|
||||||
{ for parameter func returns }
|
{ for parameter func returns }
|
||||||
procedure persistanttemptonormal(pos : longint);
|
procedure persistanttemptonormal(pos : longint);
|
||||||
procedure ungettemp(pos : longint;size : longint);
|
{procedure ungettemp(pos : longint;size : longint);}
|
||||||
procedure ungetpersistanttemp(pos : longint;size : longint);
|
procedure ungetpersistanttemp(pos : longint;size : longint);
|
||||||
procedure gettempofsizereference(l : longint;var ref : treference);
|
procedure gettempofsizereference(l : longint;var ref : treference);
|
||||||
procedure gettempslotreference(slottype : ttemptype;var ref : treference);
|
procedure gettempslotreference(slottype : ttemptype;var ref : treference);
|
||||||
function istemp(const ref : treference) : boolean;
|
function istemp(const ref : treference) : boolean;
|
||||||
procedure ungetiftemp(const ref : treference);
|
procedure ungetiftemp(const ref : treference);
|
||||||
|
function ungetiftempansi(const ref : treference) : boolean;
|
||||||
procedure gettempansistringreference(var ref : treference);
|
procedure gettempansistringreference(var ref : treference);
|
||||||
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
uses
|
|
||||||
scanner
|
|
||||||
{$ifdef i386}
|
|
||||||
,cgai386
|
|
||||||
{$endif i386}
|
|
||||||
{$ifdef m68k}
|
|
||||||
,cga68k
|
|
||||||
{$endif m68k}
|
|
||||||
;
|
|
||||||
|
|
||||||
type
|
type
|
||||||
pfreerecord = ^tfreerecord;
|
pfreerecord = ^tfreerecord;
|
||||||
|
|
||||||
@ -84,12 +72,29 @@ unit temp_gen;
|
|||||||
pos : longint;
|
pos : longint;
|
||||||
size : longint;
|
size : longint;
|
||||||
persistant : boolean; { used for inlined procedures }
|
persistant : boolean; { used for inlined procedures }
|
||||||
|
is_ansistring : boolean;
|
||||||
|
is_freeansistring : boolean;
|
||||||
temptype : ttemptype;
|
temptype : ttemptype;
|
||||||
{$ifdef EXTDEBUG}
|
{$ifdef EXTDEBUG}
|
||||||
posinfo,releaseposinfo : tfileposinfo;
|
posinfo,releaseposinfo : tfileposinfo;
|
||||||
{$endif}
|
{$endif}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
tempansilist : pfreerecord;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
uses
|
||||||
|
scanner,systems
|
||||||
|
{$ifdef i386}
|
||||||
|
,cgai386
|
||||||
|
{$endif i386}
|
||||||
|
{$ifdef m68k}
|
||||||
|
,cga68k
|
||||||
|
{$endif m68k}
|
||||||
|
;
|
||||||
|
|
||||||
var
|
var
|
||||||
{ contains all free temps }
|
{ contains all free temps }
|
||||||
tmpfreelist : pfreerecord;
|
tmpfreelist : pfreerecord;
|
||||||
@ -136,6 +141,12 @@ unit temp_gen;
|
|||||||
dispose(hp);
|
dispose(hp);
|
||||||
end;
|
end;
|
||||||
{$endif}
|
{$endif}
|
||||||
|
while assigned(tempansilist) do
|
||||||
|
begin
|
||||||
|
hp:=tempansilist;
|
||||||
|
tempansilist:=hp^.next;
|
||||||
|
dispose(hp);
|
||||||
|
end;
|
||||||
firsttemp:=0;
|
firsttemp:=0;
|
||||||
maxtemp:=0;
|
maxtemp:=0;
|
||||||
lastoccupied:=0;
|
lastoccupied:=0;
|
||||||
@ -214,6 +225,7 @@ unit temp_gen;
|
|||||||
tl^.size:=size;
|
tl^.size:=size;
|
||||||
tl^.next:=templist;
|
tl^.next:=templist;
|
||||||
tl^.persistant:=false;
|
tl^.persistant:=false;
|
||||||
|
tl^.temptype:=tt_normal;
|
||||||
templist:=tl;
|
templist:=tl;
|
||||||
{$ifdef EXTDEBUG}
|
{$ifdef EXTDEBUG}
|
||||||
tl^.posinfo:=aktfilepos;
|
tl^.posinfo:=aktfilepos;
|
||||||
@ -266,19 +278,95 @@ unit temp_gen;
|
|||||||
ref.base:=procinfo.framepointer;
|
ref.base:=procinfo.framepointer;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function gettempansioffset : longint;
|
||||||
|
var
|
||||||
|
ofs : longint;
|
||||||
|
tl : pfreerecord;
|
||||||
|
begin
|
||||||
|
tl:=tempansilist;
|
||||||
|
while assigned(tl) do
|
||||||
|
begin
|
||||||
|
if tl^.is_freeansistring then
|
||||||
|
break;
|
||||||
|
tl:=tl^.next;
|
||||||
|
end;
|
||||||
|
if assigned(tl) then
|
||||||
|
begin
|
||||||
|
tl^.is_freeansistring:=false;
|
||||||
|
ofs:=tl^.pos;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if lastoccupied<>maxtemp then
|
||||||
|
begin
|
||||||
|
{ we cannnot use already used temp
|
||||||
|
so we need to convert that space into
|
||||||
|
a tempfreeitem ! }
|
||||||
|
new(tl);
|
||||||
|
tl^.pos:=lastoccupied;
|
||||||
|
tl^.size:=lastoccupied-maxtemp;
|
||||||
|
tl^.next:=tmpfreelist;
|
||||||
|
lastoccupied:=maxtemp;
|
||||||
|
tl^.persistant:=false;
|
||||||
|
tl^.is_ansistring:=false;
|
||||||
|
tl^.is_freeansistring:=false;
|
||||||
|
tmpfreelist:=tl;
|
||||||
|
end;
|
||||||
|
ofs:=maxtemp-target_os.size_of_pointer;
|
||||||
|
maxtemp:=maxtemp-target_os.size_of_pointer;
|
||||||
|
new(tl);
|
||||||
|
tl^.pos:=ofs;
|
||||||
|
tl^.size:=target_os.size_of_pointer;
|
||||||
|
tl^.next:=tempansilist;
|
||||||
|
tl^.persistant:=false;
|
||||||
|
tl^.is_ansistring:=true;
|
||||||
|
tl^.is_freeansistring:=false;
|
||||||
|
tempansilist:=tl;
|
||||||
|
end;
|
||||||
|
gettempansioffset:=ofs;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure gettempansistringreference(var ref : treference);
|
procedure gettempansistringreference(var ref : treference);
|
||||||
|
|
||||||
begin
|
begin
|
||||||
{ do a reset, because the reference isn't used }
|
{ do a reset, because the reference isn't used }
|
||||||
reset_reference(ref);
|
reset_reference(ref);
|
||||||
ref.offset:=gettempofsize(4);
|
ref.offset:=gettempansioffset;
|
||||||
ref.base:=procinfo.framepointer;
|
ref.base:=procinfo.framepointer;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function ungetiftempansi(const ref : treference) : boolean;
|
||||||
|
var
|
||||||
|
tl : pfreerecord;
|
||||||
|
begin
|
||||||
|
ungetiftempansi:=false;
|
||||||
|
tl:=tempansilist;
|
||||||
|
while assigned(tl) do
|
||||||
|
begin
|
||||||
|
if tl^.pos=ref.offset then
|
||||||
|
if tl^.is_ansistring and not tl^.is_freeansistring then
|
||||||
|
begin
|
||||||
|
tl^.is_freeansistring:=true;
|
||||||
|
ungetiftempansi:=true;
|
||||||
|
exit;
|
||||||
|
end
|
||||||
|
{$ifdef EXTDEBUG}
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
Comment(V_Debug,'temp ansi managment problem : ungetiftempansi()'+
|
||||||
|
' at pos '+tostr(ref.offset)+ ' already free !');
|
||||||
|
end;
|
||||||
|
{$endif}
|
||||||
|
tl:=tl^.next;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure gettempslotreference(slottype : ttemptype;var ref : treference);
|
procedure gettempslotreference(slottype : ttemptype;var ref : treference);
|
||||||
begin
|
begin
|
||||||
{ do a reset, because the reference isn't used }
|
{ do a reset, because the reference isn't used }
|
||||||
reset_reference(ref);
|
reset_reference(ref);
|
||||||
|
{ this is not enough in my opinion PM }
|
||||||
|
{ because it still can mix different types !! }
|
||||||
ref.offset:=gettempofsize(4);
|
ref.offset:=gettempofsize(4);
|
||||||
ref.base:=procinfo.framepointer;
|
ref.base:=procinfo.framepointer;
|
||||||
templist^.temptype:=slottype;
|
templist^.temptype:=slottype;
|
||||||
@ -320,42 +408,6 @@ unit temp_gen;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure ungetpersistanttemp(pos : longint;size : longint);
|
|
||||||
var
|
|
||||||
prev,hp : pfreerecord;
|
|
||||||
|
|
||||||
begin
|
|
||||||
ungettemp(pos,size);
|
|
||||||
prev:=nil;
|
|
||||||
hp:=templist;
|
|
||||||
while assigned(hp) do
|
|
||||||
begin
|
|
||||||
if (hp^.persistant) and (hp^.pos=pos) and (hp^.size=size) then
|
|
||||||
begin
|
|
||||||
if assigned(prev) then
|
|
||||||
prev^.next:=hp^.next
|
|
||||||
else
|
|
||||||
templist:=hp^.next;
|
|
||||||
{$ifdef EXTDEBUG}
|
|
||||||
Comment(V_Debug,'temp managment : ungetpersistanttemp()'+
|
|
||||||
' at pos '+tostr(pos)+ ' found !');
|
|
||||||
hp^.next:=tempfreedlist;
|
|
||||||
tempfreedlist:=hp;
|
|
||||||
hp^.releaseposinfo:=aktfilepos;
|
|
||||||
{$else}
|
|
||||||
dispose(hp);
|
|
||||||
{$endif}
|
|
||||||
exit;
|
|
||||||
end;
|
|
||||||
prev:=hp;
|
|
||||||
hp:=hp^.next;
|
|
||||||
end;
|
|
||||||
{$ifdef EXTDEBUG}
|
|
||||||
Comment(V_Warning,'temp managment problem : ungetpersistanttemp()'+
|
|
||||||
' at pos '+tostr(pos)+ ' not found !');
|
|
||||||
{$endif}
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure ungettemp(pos : longint;size : longint);
|
procedure ungettemp(pos : longint;size : longint);
|
||||||
|
|
||||||
var
|
var
|
||||||
@ -451,6 +503,42 @@ unit temp_gen;
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure ungetpersistanttemp(pos : longint;size : longint);
|
||||||
|
var
|
||||||
|
prev,hp : pfreerecord;
|
||||||
|
|
||||||
|
begin
|
||||||
|
ungettemp(pos,size);
|
||||||
|
prev:=nil;
|
||||||
|
hp:=templist;
|
||||||
|
while assigned(hp) do
|
||||||
|
begin
|
||||||
|
if (hp^.persistant) and (hp^.pos=pos) and (hp^.size=size) then
|
||||||
|
begin
|
||||||
|
if assigned(prev) then
|
||||||
|
prev^.next:=hp^.next
|
||||||
|
else
|
||||||
|
templist:=hp^.next;
|
||||||
|
{$ifdef EXTDEBUG}
|
||||||
|
Comment(V_Debug,'temp managment : ungetpersistanttemp()'+
|
||||||
|
' at pos '+tostr(pos)+ ' found !');
|
||||||
|
hp^.next:=tempfreedlist;
|
||||||
|
tempfreedlist:=hp;
|
||||||
|
hp^.releaseposinfo:=aktfilepos;
|
||||||
|
{$else}
|
||||||
|
dispose(hp);
|
||||||
|
{$endif}
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
prev:=hp;
|
||||||
|
hp:=hp^.next;
|
||||||
|
end;
|
||||||
|
{$ifdef EXTDEBUG}
|
||||||
|
Comment(V_Warning,'temp managment problem : ungetpersistanttemp()'+
|
||||||
|
' at pos '+tostr(pos)+ ' not found !');
|
||||||
|
{$endif}
|
||||||
|
end;
|
||||||
|
|
||||||
procedure ungetiftemp(const ref : treference);
|
procedure ungetiftemp(const ref : treference);
|
||||||
|
|
||||||
var
|
var
|
||||||
@ -459,6 +547,9 @@ unit temp_gen;
|
|||||||
begin
|
begin
|
||||||
if istemp(ref) then
|
if istemp(ref) then
|
||||||
begin
|
begin
|
||||||
|
{ first check if ansistring }
|
||||||
|
if ungetiftempansi(ref) then
|
||||||
|
exit;
|
||||||
prev:=nil;
|
prev:=nil;
|
||||||
tl:=templist;
|
tl:=templist;
|
||||||
while assigned(tl) do
|
while assigned(tl) do
|
||||||
@ -538,7 +629,10 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.11 1999-04-08 20:59:44 florian
|
Revision 1.12 1999-04-08 23:52:59 pierre
|
||||||
|
+ tempansilist and gettempansistringreference
|
||||||
|
|
||||||
|
Revision 1.11 1999/04/08 20:59:44 florian
|
||||||
* fixed problem with default properties which are a class
|
* fixed problem with default properties which are a class
|
||||||
* case bug (from the mailing list with -O2) fixed, the
|
* case bug (from the mailing list with -O2) fixed, the
|
||||||
distance of the case labels can be greater than the positive
|
distance of the case labels can be greater than the positive
|
||||||
|
Loading…
Reference in New Issue
Block a user