mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-15 20:29:17 +02:00
+ added two level of longjump to
allow clean freeing of used memory on errors
This commit is contained in:
parent
5d8f48b46d
commit
c4bc24c00b
@ -89,6 +89,10 @@ const
|
|||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
{$ifdef USEEXCEPT}
|
||||||
|
uses tpexcept;
|
||||||
|
{$endif USEEXCEPT}
|
||||||
|
|
||||||
{****************************************************************************
|
{****************************************************************************
|
||||||
Helper Routines
|
Helper Routines
|
||||||
****************************************************************************}
|
****************************************************************************}
|
||||||
@ -126,7 +130,11 @@ end;
|
|||||||
{ predefined handler when then compiler stops }
|
{ predefined handler when then compiler stops }
|
||||||
procedure def_stop;
|
procedure def_stop;
|
||||||
begin
|
begin
|
||||||
|
{$ifndef USEEXCEPT}
|
||||||
Halt(1);
|
Halt(1);
|
||||||
|
{$else USEEXCEPT}
|
||||||
|
Halt(1);
|
||||||
|
{$endif USEEXCEPT}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -245,7 +253,11 @@ end;
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.8 1998-09-15 10:49:32 pierre
|
Revision 1.9 1998-10-26 17:15:16 pierre
|
||||||
|
+ added two level of longjump to
|
||||||
|
allow clean freeing of used memory on errors
|
||||||
|
|
||||||
|
Revision 1.8 1998/09/15 10:49:32 pierre
|
||||||
merged from fixes branch
|
merged from fixes branch
|
||||||
|
|
||||||
Revision 1.7.2.1 1998/09/15 10:30:17 pierre
|
Revision 1.7.2.1 1998/09/15 10:30:17 pierre
|
||||||
|
@ -94,21 +94,20 @@ uses
|
|||||||
|
|
||||||
function Compile(const cmd:string):longint;
|
function Compile(const cmd:string):longint;
|
||||||
|
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
|
||||||
var
|
var
|
||||||
CompilerInited : boolean;
|
CompilerInited : boolean;
|
||||||
{$ifdef USEEXCEPT}
|
|
||||||
recoverpos : jmp_buf;
|
|
||||||
{$endif USEEXCEPT}
|
|
||||||
|
|
||||||
|
|
||||||
{$ifdef USEEXCEPT}
|
{$ifdef USEEXCEPT}
|
||||||
|
|
||||||
procedure RecoverStop;{$ifndef FPC}far;{$endif}
|
procedure RecoverStop;{$ifndef FPC}far;{$endif}
|
||||||
begin
|
begin
|
||||||
LongJmp(recoverpos,1);
|
if assigned(recoverpospointer) then
|
||||||
|
LongJmp(recoverpospointer^,1)
|
||||||
|
else
|
||||||
|
Halt(1);
|
||||||
end;
|
end;
|
||||||
{$endif USEEXCEPT}
|
{$endif USEEXCEPT}
|
||||||
|
|
||||||
@ -121,11 +120,11 @@ procedure DoneCompiler;
|
|||||||
begin
|
begin
|
||||||
if not CompilerInited then
|
if not CompilerInited then
|
||||||
exit;
|
exit;
|
||||||
|
CompilerInited:=false;
|
||||||
{ Free memory }
|
{ Free memory }
|
||||||
DoneSymtable;
|
DoneSymtable;
|
||||||
DoneGlobals;
|
DoneGlobals;
|
||||||
linker.done;
|
linker.done;
|
||||||
CompilerInited:=false;
|
|
||||||
doneparser;
|
doneparser;
|
||||||
DoneImport;
|
DoneImport;
|
||||||
{$ifdef UseBrowser}
|
{$ifdef UseBrowser}
|
||||||
@ -168,6 +167,7 @@ function Compile(const cmd:string):longint;
|
|||||||
var
|
var
|
||||||
starttime : real;
|
starttime : real;
|
||||||
{$ifdef USEEXCEPT}
|
{$ifdef USEEXCEPT}
|
||||||
|
recoverpos : jmp_buf;
|
||||||
olddo_stop : tstopprocedure;
|
olddo_stop : tstopprocedure;
|
||||||
{$endif}
|
{$endif}
|
||||||
{$IfDef Extdebug}
|
{$IfDef Extdebug}
|
||||||
@ -199,10 +199,11 @@ begin
|
|||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
{$ifdef USEEXCEPT}
|
{$ifdef USEEXCEPT}
|
||||||
olddo_stop:=do_stop;
|
|
||||||
do_stop:=recoverstop;
|
|
||||||
if setjmp(recoverpos)=0 then
|
if setjmp(recoverpos)=0 then
|
||||||
begin
|
begin
|
||||||
|
olddo_stop:=do_stop;
|
||||||
|
recoverpospointer:=@recoverpos;
|
||||||
|
do_stop:=recoverstop;
|
||||||
{$endif USEEXCEPT}
|
{$endif USEEXCEPT}
|
||||||
starttime:=getrealtime;
|
starttime:=getrealtime;
|
||||||
parser.compile(inputdir+inputfile+inputextension,false);
|
parser.compile(inputdir+inputfile+inputextension,false);
|
||||||
@ -215,7 +216,9 @@ begin
|
|||||||
{ Stop the compiler, frees also memory }
|
{ Stop the compiler, frees also memory }
|
||||||
DoneCompiler;
|
DoneCompiler;
|
||||||
{$ifdef USEEXCEPT}
|
{$ifdef USEEXCEPT}
|
||||||
end;
|
end
|
||||||
|
else
|
||||||
|
DoneCompiler;
|
||||||
{ Stop is always called, so we come here when a program is compiled or not }
|
{ Stop is always called, so we come here when a program is compiled or not }
|
||||||
do_stop:=olddo_stop;
|
do_stop:=olddo_stop;
|
||||||
{$endif USEEXCEPT}
|
{$endif USEEXCEPT}
|
||||||
@ -239,7 +242,11 @@ end;
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.12 1998-10-09 16:36:02 pierre
|
Revision 1.13 1998-10-26 17:15:17 pierre
|
||||||
|
+ added two level of longjump to
|
||||||
|
allow clean freeing of used memory on errors
|
||||||
|
|
||||||
|
Revision 1.12 1998/10/09 16:36:02 pierre
|
||||||
* some memory leaks specific to usebrowser define fixed
|
* some memory leaks specific to usebrowser define fixed
|
||||||
* removed tmodule.implsymtable (was like tmodule.localsymtable)
|
* removed tmodule.implsymtable (was like tmodule.localsymtable)
|
||||||
|
|
||||||
|
@ -25,6 +25,17 @@
|
|||||||
{$endif}
|
{$endif}
|
||||||
unit parser;
|
unit parser;
|
||||||
|
|
||||||
|
{ Use exception catching so the compiler goes futher after a Stop }
|
||||||
|
{$ifdef i386}
|
||||||
|
{$define USEEXCEPT}
|
||||||
|
{$endif}
|
||||||
|
|
||||||
|
{$ifdef TP}
|
||||||
|
{$ifdef DPMI}
|
||||||
|
{$undef USEEXCEPT}
|
||||||
|
{$endif}
|
||||||
|
{$endif}
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
procedure compile(const filename:string;compile_system:boolean);
|
procedure compile(const filename:string;compile_system:boolean);
|
||||||
@ -41,6 +52,9 @@ unit parser;
|
|||||||
{$ifdef UseBrowser}
|
{$ifdef UseBrowser}
|
||||||
browser,
|
browser,
|
||||||
{$endif UseBrowser}
|
{$endif UseBrowser}
|
||||||
|
{$ifdef UseExcept}
|
||||||
|
tpexcept,compiler,
|
||||||
|
{$endif UseExcept}
|
||||||
tree,scanner,pbase,pdecl,psystem,pmodules;
|
tree,scanner,pbase,pdecl,psystem,pmodules;
|
||||||
|
|
||||||
|
|
||||||
@ -144,6 +158,10 @@ unit parser;
|
|||||||
oldaktoptprocessor : tprocessors;
|
oldaktoptprocessor : tprocessors;
|
||||||
oldaktasmmode : tasmmode;
|
oldaktasmmode : tasmmode;
|
||||||
|
|
||||||
|
{$ifdef USEEXCEPT}
|
||||||
|
recoverpos : jmp_buf;
|
||||||
|
oldrecoverpos : pjmp_buf;
|
||||||
|
{$endif useexcept}
|
||||||
{$ifdef usebrowser}
|
{$ifdef usebrowser}
|
||||||
{$ifdef dummydebug}
|
{$ifdef dummydebug}
|
||||||
hp : pmodule;
|
hp : pmodule;
|
||||||
@ -254,6 +272,12 @@ unit parser;
|
|||||||
|
|
||||||
{ If the compile level > 1 we get a nice "unit expected" error
|
{ If the compile level > 1 we get a nice "unit expected" error
|
||||||
message if we are trying to use a program as unit.}
|
message if we are trying to use a program as unit.}
|
||||||
|
{$ifdef USEEXCEPT}
|
||||||
|
if setjmp(recoverpos)=0 then
|
||||||
|
begin
|
||||||
|
oldrecoverpos:=recoverpospointer;
|
||||||
|
recoverpospointer:=@recoverpos;
|
||||||
|
{$endif USEEXCEPT}
|
||||||
if (token=_UNIT) or (compile_level>1) then
|
if (token=_UNIT) or (compile_level>1) then
|
||||||
begin
|
begin
|
||||||
current_module^.is_unit:=true;
|
current_module^.is_unit:=true;
|
||||||
@ -262,6 +286,12 @@ unit parser;
|
|||||||
else
|
else
|
||||||
proc_program(token=_LIBRARY);
|
proc_program(token=_LIBRARY);
|
||||||
|
|
||||||
|
{$ifdef USEEXCEPT}
|
||||||
|
recoverpospointer:=oldrecoverpos;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
recoverpospointer:=oldrecoverpos;
|
||||||
|
{$endif USEEXCEPT}
|
||||||
{ clear memory }
|
{ clear memory }
|
||||||
{$ifdef Splitheap}
|
{$ifdef Splitheap}
|
||||||
if testsplit then
|
if testsplit then
|
||||||
@ -384,7 +414,11 @@ unit parser;
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.58 1998-10-16 08:50:02 peter
|
Revision 1.59 1998-10-26 17:15:18 pierre
|
||||||
|
+ added two level of longjump to
|
||||||
|
allow clean freeing of used memory on errors
|
||||||
|
|
||||||
|
Revision 1.58 1998/10/16 08:50:02 peter
|
||||||
* reset_gdb_info -> reset_global_def becuase it also resets rangenr !
|
* reset_gdb_info -> reset_global_def becuase it also resets rangenr !
|
||||||
|
|
||||||
Revision 1.57 1998/10/08 17:17:23 pierre
|
Revision 1.57 1998/10/08 17:17:23 pierre
|
||||||
|
@ -39,6 +39,8 @@ type
|
|||||||
{$endif TP}
|
{$endif TP}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
pjmp_buf = ^jmp_buf;
|
||||||
|
|
||||||
{$ifdef TP}
|
{$ifdef TP}
|
||||||
function setjmp(var rec : jmp_buf) : integer;
|
function setjmp(var rec : jmp_buf) : integer;
|
||||||
procedure longjmp(const rec : jmp_buf;return_value : integer);
|
procedure longjmp(const rec : jmp_buf;return_value : integer);
|
||||||
@ -47,6 +49,8 @@ type
|
|||||||
procedure longjmp(const rec : jmp_buf;return_value : longint);
|
procedure longjmp(const rec : jmp_buf;return_value : longint);
|
||||||
{$endif TP}
|
{$endif TP}
|
||||||
|
|
||||||
|
var
|
||||||
|
recoverpospointer : pjmp_buf;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
@ -331,7 +335,11 @@ implementation
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.2 1998-08-28 10:57:03 peter
|
Revision 1.3 1998-10-26 17:15:19 pierre
|
||||||
|
+ added two level of longjump to
|
||||||
|
allow clean freeing of used memory on errors
|
||||||
|
|
||||||
|
Revision 1.2 1998/08/28 10:57:03 peter
|
||||||
* removed warnings
|
* removed warnings
|
||||||
|
|
||||||
Revision 1.1 1998/08/10 10:18:36 peter
|
Revision 1.1 1998/08/10 10:18:36 peter
|
||||||
|
Loading…
Reference in New Issue
Block a user