fix longjmp RestartEnv to be performed by a single function.
This commit is contained in:
parent
0b1c98d3f6
commit
123ef47171
19
C/errors.c
19
C/errors.c
@ -30,6 +30,15 @@
|
||||
#include "Foreign.h"
|
||||
|
||||
|
||||
void
|
||||
Yap_RestartYap ( int flag )
|
||||
{
|
||||
#if PUSH_REGS
|
||||
restore_absmi_regs(&Yap_standard_regs);
|
||||
#endif
|
||||
siglongjmp(LOCAL_RestartEnv,1);
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
STATIC_PROTO (int hidden, (Atom));
|
||||
STATIC_PROTO (int legal_env, (CELL * CACHE_TYPE));
|
||||
@ -1810,10 +1819,7 @@ E);
|
||||
LOCAL_InterruptsDisabled = 0;
|
||||
LOCAL_UncaughtThrow = TRUE;
|
||||
UNLOCK(LOCAL_SignalLock);
|
||||
#if PUSH_REGS
|
||||
restore_absmi_regs(&Yap_standard_regs);
|
||||
#endif
|
||||
siglongjmp(LOCAL_RestartEnv,1);
|
||||
Yap_RestartYap( 1 );
|
||||
}
|
||||
UNLOCK(LOCAL_SignalLock);
|
||||
/* wait if we we are in user code,
|
||||
@ -1822,10 +1828,7 @@ E);
|
||||
if (LOCAL_PrologMode & UserCCallMode) {
|
||||
if (!(EX = Yap_StoreTermInDB(Yap_MkApplTerm(fun, 2, nt), 0))) {
|
||||
/* fat chance */
|
||||
#if PUSH_REGS
|
||||
restore_absmi_regs(&Yap_standard_regs);
|
||||
#endif
|
||||
siglongjmp(LOCAL_RestartEnv,1);
|
||||
Yap_RestartYap( 1 );
|
||||
}
|
||||
} else {
|
||||
if (type == PURE_ABORT) {
|
||||
|
11
C/exec.c
11
C/exec.c
@ -1472,11 +1472,7 @@ JumpToEnv(Term t USES_REGS) {
|
||||
return FALSE;
|
||||
/* just keep the throwed object away, we don't need to care about it */
|
||||
if (!(LOCAL_BallTerm = Yap_StoreTermInDB(t, 0))) {
|
||||
/* fat chance */
|
||||
#if PUSH_REGS
|
||||
restore_absmi_regs(&Yap_standard_regs);
|
||||
#endif
|
||||
siglongjmp(LOCAL_RestartEnv,1);
|
||||
Yap_RestartYap( 1 );
|
||||
}
|
||||
/* careful, previous step may have caused a stack shift,
|
||||
so get pointers here */
|
||||
@ -1534,10 +1530,7 @@ JumpToEnv(Term t USES_REGS) {
|
||||
/* uncaught throw */
|
||||
if (handler == NULL) {
|
||||
LOCAL_UncaughtThrow = TRUE;
|
||||
#if PUSH_REGS
|
||||
restore_absmi_regs(&Yap_standard_regs);
|
||||
#endif
|
||||
siglongjmp(LOCAL_RestartEnv,1);
|
||||
Yap_RestartYap( 1 );
|
||||
}
|
||||
/* is it a continuation? */
|
||||
env = handler->cp_env;
|
||||
|
5
C/grow.c
5
C/grow.c
@ -83,10 +83,7 @@ LeaveGrowMode(prolog_exec_mode grow_mode)
|
||||
#if _MSC_VER || defined(__MINGW32__)
|
||||
/* don't even think about trying this */
|
||||
#else
|
||||
#if PUSH_REGS
|
||||
restore_absmi_regs(&Yap_standard_regs);
|
||||
#endif
|
||||
siglongjmp (LOCAL_RestartEnv, 1);
|
||||
Yap_RestartYap( 1 );
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
5
C/qlyr.c
5
C/qlyr.c
@ -999,10 +999,7 @@ p_read_program( USES_REGS1 )
|
||||
/* back to the top level we go */
|
||||
Yap_CloseSlots(PASS_REGS1);
|
||||
|
||||
#if PUSH_REGS
|
||||
restore_absmi_regs(&Yap_standard_regs);
|
||||
#endif
|
||||
siglongjmp(LOCAL_RestartEnv, 3);
|
||||
Yap_RestartYap( 3 );
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
6
C/save.c
6
C/save.c
@ -1831,11 +1831,7 @@ p_restore( USES_REGS1 )
|
||||
return(FALSE);
|
||||
}
|
||||
if ((mode = Restore(s, NULL PASS_REGS)) == DO_ONLY_CODE) {
|
||||
#if PUSH_REGS
|
||||
restore_absmi_regs(&Yap_standard_regs);
|
||||
#endif
|
||||
/* back to the top level we go */
|
||||
siglongjmp(LOCAL_RestartEnv,3);
|
||||
Yap_RestartYap( 3 );
|
||||
}
|
||||
return(mode != FAIL_RESTORE);
|
||||
}
|
||||
|
@ -1564,10 +1564,7 @@ InteractSIGINT(int ch) {
|
||||
/* in case someone mangles the P register */
|
||||
}
|
||||
LOCAL_PrologMode &= ~AsyncIntMode;
|
||||
#if PUSH_REGS
|
||||
restore_absmi_regs(&Yap_standard_regs);
|
||||
#endif
|
||||
siglongjmp(LOCAL_RestartEnv,1);
|
||||
Yap_RestartYap( 1 );
|
||||
return -1;
|
||||
case 'b':
|
||||
/* continue */
|
||||
|
@ -163,6 +163,7 @@ void STD_PROTO(Yap_InitBackDB,(void));
|
||||
void STD_PROTO(Yap_InitDBPreds,(void));
|
||||
|
||||
/* errors.c */
|
||||
void STD_PROTO(Yap_RestartYap,(int));
|
||||
void STD_PROTO(Yap_exit,(int));
|
||||
yamop *STD_PROTO(Yap_Error,(yap_error_number,Term,char *msg, ...));
|
||||
yamop *STD_PROTO(Yap_NilError,(yap_error_number,char *msg, ...));
|
||||
|
Reference in New Issue
Block a user