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