CurSlot maintenance

This commit is contained in:
Vítor Santos Costa 2013-01-19 22:13:43 +00:00
parent eea91f782f
commit 014a0ec5bc
2 changed files with 6 additions and 4 deletions

View File

@ -2510,11 +2510,13 @@ YAP_RunGoalOnce(Term t)
Term out; Term out;
yamop *old_CP = CP; yamop *old_CP = CP;
Int oldPrologMode = LOCAL_PrologMode; Int oldPrologMode = LOCAL_PrologMode;
Int oldSlot = CurSlot;
BACKUP_MACHINE_REGS(); BACKUP_MACHINE_REGS();
LOCAL_PrologMode = UserMode; LOCAL_PrologMode = UserMode;
out = Yap_RunTopGoal(t); out = Yap_RunTopGoal(t);
LOCAL_PrologMode = oldPrologMode; LOCAL_PrologMode = oldPrologMode;
CurSlot = oldSlot;
if (!(oldPrologMode & UserCCallMode)) { if (!(oldPrologMode & UserCCallMode)) {
/* called from top-level */ /* called from top-level */
LOCAL_AllowRestart = FALSE; LOCAL_AllowRestart = FALSE;
@ -2545,10 +2547,9 @@ YAP_RunGoalOnce(Term t)
B = cut_pt; B = cut_pt;
} }
ASP = B->cp_env; ASP = B->cp_env;
Yap_PopSlots( PASS_REGS1 );
ENV = (CELL *)ASP[E_E]; ENV = (CELL *)ASP[E_E];
B = (choiceptr)ASP[E_CB]; B = (choiceptr)ASP[E_CB];
#ifdef DEPTH_LIMIT #ifdef DEPTH_LIMITxs
DEPTH = ASP[E_DEPTH]; DEPTH = ASP[E_DEPTH];
#endif #endif
P = (yamop *)ASP[E_CP]; P = (yamop *)ASP[E_CP];

View File

@ -1198,6 +1198,7 @@ static int
execute_pred(PredEntry *ppe, CELL *pt USES_REGS) execute_pred(PredEntry *ppe, CELL *pt USES_REGS)
{ {
yamop *saved_p, *saved_cp; yamop *saved_p, *saved_cp;
Int saved_slot = CurSlot;
yamop *CodeAdr; yamop *CodeAdr;
Int out; Int out;
@ -1214,6 +1215,7 @@ execute_pred(PredEntry *ppe, CELL *pt USES_REGS)
UNLOCK(ppe->PELock); UNLOCK(ppe->PELock);
out = do_goal(CodeAdr, ppe->ArityOfPE, pt, FALSE PASS_REGS); out = do_goal(CodeAdr, ppe->ArityOfPE, pt, FALSE PASS_REGS);
} }
CurSlot = saved_slot;
if (out == 1) { if (out == 1) {
choiceptr cut_B; choiceptr cut_B;
@ -1252,13 +1254,12 @@ execute_pred(PredEntry *ppe, CELL *pt USES_REGS)
DEPTH= ENV[E_DEPTH]; DEPTH= ENV[E_DEPTH];
#endif #endif
ENV = (CELL *)(ENV[E_E]); ENV = (CELL *)(ENV[E_E]);
Yap_StartSlots( PASS_REGS1 );
/* we have failed, and usually we would backtrack to this B, /* we have failed, and usually we would backtrack to this B,
trouble is, we may also have a delayed cut to do */ trouble is, we may also have a delayed cut to do */
if (B != NULL) if (B != NULL)
HB = B->cp_h; HB = B->cp_h;
YENV = ENV; YENV = ENV;
return(TRUE); return TRUE;
} else if (out == 0) { } else if (out == 0) {
P = saved_p; P = saved_p;
CP = saved_cp; CP = saved_cp;