diff --git a/src/gap.c b/src/gap.c index 9445ba563f..e6f767a226 100644 --- a/src/gap.c +++ b/src/gap.c @@ -1103,11 +1103,14 @@ Obj FuncCALL_WITH_CATCH( Obj self, Obj func, volatile Obj args ) return res; } -Obj FuncJUMP_TO_CATCH( Obj self, Obj payload) +Obj FuncJUMP_TO_CATCH(Obj self, Obj payload) { - STATE(ThrownObject) = payload; - syLongjmp(&(STATE(ReadJmpError)), 1); - return 0; + STATE(ThrownObject) = payload; + if (STATE(JumpToCatchCallback) != 0) { + (*STATE(JumpToCatchCallback))(); + } + syLongjmp(&(STATE(ReadJmpError)), 1); + return 0; } Obj FuncSetUserHasQuit( Obj Self, Obj value) @@ -3047,10 +3050,12 @@ void InitializeGap ( STATE(ThrownObject) = 0; STATE(UserHasQUIT) = 0; STATE(UserHasQuit) = 0; + STATE(JumpToCatchCallback) = 0; NrImportedGVars = 0; NrImportedFuncs = 0; + sysenviron = environ; /* get info structures for the built in modules */ diff --git a/src/gapstate.h b/src/gapstate.h index a1b7fb1c36..3419c38364 100644 --- a/src/gapstate.h +++ b/src/gapstate.h @@ -123,6 +123,9 @@ typedef struct GAPState { Obj BaseShellContext; Obj ErrorLVars; // ErrorLVars as modified by DownEnv / UpEnv Int ErrorLLevel; // record where on the stack ErrorLVars is relative to the top, i.e. BaseShellContext + void (*JumpToCatchCallback)(); // This callback is called in FuncJUMP_TO_CATCH, + // this is not used by GAP itself but by programs + // that use GAP as a library to handle errors /* From objects.c */ Int PrintObjIndex;