mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-24 20:40:55 +01:00
* Place old data in compile() in the heap to save stack
This commit is contained in:
parent
2a8cff3e51
commit
e08206f2dc
@ -233,7 +233,9 @@ implementation
|
||||
|
||||
|
||||
procedure compile(const filename:string);
|
||||
var
|
||||
type
|
||||
polddata=^tolddata;
|
||||
tolddata=record
|
||||
{ scanner }
|
||||
oldidtoken,
|
||||
oldtoken : ttoken;
|
||||
@ -282,23 +284,29 @@ implementation
|
||||
old_compiled_module : tmodule;
|
||||
oldaktdefproccall : tproccalloption;
|
||||
oldsourcecodepage : tcodepagestring;
|
||||
{ will only be increased once we start parsing blocks in the }
|
||||
{ implementation, so doesn't need to be saved/restored (JM) }
|
||||
{ oldexceptblockcounter : integer; }
|
||||
oldstatement_level : integer;
|
||||
{$ifdef GDB}
|
||||
store_dbx : plongint;
|
||||
{$endif GDB}
|
||||
end;
|
||||
|
||||
var
|
||||
olddata : polddata;
|
||||
{$ifdef USEEXCEPT}
|
||||
{$ifndef Delphi}
|
||||
recoverpos : jmp_buf;
|
||||
oldrecoverpos : pjmp_buf;
|
||||
{$endif Delphi}
|
||||
{$endif useexcept}
|
||||
{$ifdef GDB}
|
||||
store_dbx : plongint;
|
||||
{$endif GDB}
|
||||
|
||||
begin
|
||||
inc(compile_level);
|
||||
parser_current_file:=filename;
|
||||
{ Uses heap memory instead of placing everything on the
|
||||
stack. This is needed because compile() can be called
|
||||
recursively }
|
||||
new(olddata);
|
||||
with olddata^ do
|
||||
begin
|
||||
old_compiled_module:=compiled_module;
|
||||
{ save symtable state }
|
||||
oldsymtablestack:=symtablestack;
|
||||
@ -354,11 +362,11 @@ implementation
|
||||
oldaktfilepos:=aktfilepos;
|
||||
oldaktmodeswitches:=aktmodeswitches;
|
||||
oldstatement_level:=statement_level;
|
||||
{ oldexceptblockcounter:=exceptblockcounter; }
|
||||
{$ifdef GDB}
|
||||
store_dbx:=dbx_counter;
|
||||
dbx_counter:=nil;
|
||||
{$endif GDB}
|
||||
end;
|
||||
{ show info }
|
||||
Message1(parser_i_compiling,filename);
|
||||
|
||||
@ -482,9 +490,8 @@ implementation
|
||||
|
||||
if (compile_level>1) then
|
||||
begin
|
||||
{$ifdef GDB}
|
||||
dbx_counter:=store_dbx;
|
||||
{$endif GDB}
|
||||
with olddata^ do
|
||||
begin
|
||||
{ restore scanner }
|
||||
c:=oldc;
|
||||
pattern:=oldpattern;
|
||||
@ -540,6 +547,10 @@ implementation
|
||||
statement_level:=oldstatement_level;
|
||||
aktexceptblock:=0;
|
||||
exceptblockcounter:=0;
|
||||
{$ifdef GDB}
|
||||
dbx_counter:=store_dbx;
|
||||
{$endif GDB}
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
@ -594,7 +605,10 @@ implementation
|
||||
end;
|
||||
|
||||
dec(compile_level);
|
||||
compiled_module:=old_compiled_module;
|
||||
compiled_module:=olddata^.old_compiled_module;
|
||||
|
||||
dispose(olddata);
|
||||
|
||||
{$ifdef USEEXCEPT}
|
||||
if longjump_used then
|
||||
longjmp(recoverpospointer^,1);
|
||||
@ -604,7 +618,10 @@ implementation
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.44 2002-09-05 19:27:06 peter
|
||||
Revision 1.45 2002-10-07 19:29:52 peter
|
||||
* Place old data in compile() in the heap to save stack
|
||||
|
||||
Revision 1.44 2002/09/05 19:27:06 peter
|
||||
* fixed crash when current_module becomes nil
|
||||
|
||||
Revision 1.43 2002/08/18 19:58:28 peter
|
||||
|
||||
Loading…
Reference in New Issue
Block a user