fpc/compiler/globstat.pas
2019-01-03 20:31:34 +00:00

162 lines
4.6 KiB
ObjectPascal

{
Copyright (c) 2012 by the FPC development team
Contains functionality to save/restore the global compiler state when
switching between the compilation of different units.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
****************************************************************************
}
unit globstat;
{$i fpcdefs.inc}
interface
uses
globtype,tokens,globals,
aasmdata,
dbgbase,
symbase,symsym,
fmodule,
scanner,scandir,
procinfo;
type
pglobalstate=^tglobalstate;
tglobalstate=record
{ scanner }
oldidtoken,
oldtoken : ttoken;
oldtokenpos : tfileposinfo;
oldc : char;
oldpattern,
oldorgpattern : string;
old_block_type : tblock_type;
{ symtable }
oldsymtablestack,
oldmacrosymtablestack : TSymtablestack;
oldaktprocsym : tprocsym;
{ cg }
oldparse_only : boolean;
{ akt.. things }
oldcurrent_filepos : tfileposinfo;
old_current_module : tmodule;
oldcurrent_procinfo : tprocinfo;
old_settings : tsettings;
old_switchesstatestack : tswitchesstatestack;
old_switchesstatestackpos : Integer;
old_verbosity : longint;
{ only saved/restored if "full" is true }
old_asmdata : tasmdata;
old_debuginfo : tdebuginfo;
old_scanner : tscannerfile;
old_parser_file : string;
end;
procedure save_global_state(out state:tglobalstate;full:boolean);
procedure restore_global_state(const state:tglobalstate;full:boolean);
implementation
uses
pbase,comphook;
procedure save_global_state(out state:tglobalstate;full:boolean);
begin
with state do
begin
old_current_module:=current_module;
{ save symtable state }
oldsymtablestack:=symtablestack;
oldmacrosymtablestack:=macrosymtablestack;
oldcurrent_procinfo:=current_procinfo;
{ save scanner state }
oldc:=c;
oldpattern:=pattern;
oldorgpattern:=orgpattern;
oldtoken:=token;
oldidtoken:=idtoken;
old_block_type:=block_type;
oldtokenpos:=current_tokenpos;
old_switchesstatestack:=switchesstatestack;
old_switchesstatestackpos:=switchesstatestackpos;
{ save cg }
oldparse_only:=parse_only;
{ save akt... state }
{ handle the postponed case first }
//flushpendingswitchesstate;
oldcurrent_filepos:=current_filepos;
old_settings:=current_settings;
old_verbosity:=status.verbosity;
if full then
begin
old_asmdata:=current_asmdata;
old_debuginfo:=current_debuginfo;
old_parser_file:=parser_current_file;
old_scanner:=current_scanner;
end;
end;
end;
procedure restore_global_state(const state:tglobalstate;full:boolean);
begin
with state do
begin
{ restore scanner }
c:=oldc;
pattern:=oldpattern;
orgpattern:=oldorgpattern;
token:=oldtoken;
idtoken:=oldidtoken;
current_tokenpos:=oldtokenpos;
block_type:=old_block_type;
switchesstatestack:=old_switchesstatestack;
switchesstatestackpos:=old_switchesstatestackpos;
{ restore cg }
parse_only:=oldparse_only;
{ restore symtable state }
symtablestack:=oldsymtablestack;
macrosymtablestack:=oldmacrosymtablestack;
current_procinfo:=oldcurrent_procinfo;
current_filepos:=oldcurrent_filepos;
current_settings:=old_settings;
status.verbosity:=old_verbosity;
if full then
begin
current_module:=old_current_module; {!}
current_asmdata:=old_asmdata;
current_debuginfo:=old_debuginfo;
current_scanner:=old_scanner;
parser_current_file:=old_parser_file;
end;
end;
end;
end.