fix longjmp RestartEnv to be performed by a single function.

This commit is contained in:
Vítor Santos Costa 2012-02-05 12:04:29 +00:00
parent 0b1c98d3f6
commit 123ef47171
7 changed files with 18 additions and 34 deletions

View File

@ -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) {

View File

@ -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;

View File

@ -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
}
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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 */

View File

@ -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, ...));