fix EX: it cannot be a term and it should be a placeholder for BallTerm,

so the twp can never be alive at the same time.
This commit is contained in:
Vítor Santos Costa 2010-07-21 12:49:06 +01:00
parent 92a8e37769
commit 3dd68aa8bd
5 changed files with 36 additions and 11 deletions

View File

@ -7542,13 +7542,16 @@ Yap_absmi(int inp)
save_machine_regs(); save_machine_regs();
SREG = (CELL *) YAP_Execute(p, p->cs.f_code); SREG = (CELL *) YAP_Execute(p, p->cs.f_code);
EX = 0L;
} }
Yap_CloseSlots(); Yap_CloseSlots();
restore_machine_regs();
setregs(); setregs();
Yap_PrologMode = UserMode; Yap_PrologMode = UserMode;
restore_machine_regs();
if (EX) {
struct DB_TERM *exp = EX;
EX = NULL;
Yap_JumpToEnv(Yap_PopTermFromDB(exp));
}
if (!SREG) { if (!SREG) {
FAIL(); FAIL();
} }

View File

@ -2040,7 +2040,24 @@ YAP_GoalHasException(Term *t)
int out = FALSE; int out = FALSE;
BACKUP_MACHINE_REGS(); BACKUP_MACHINE_REGS();
if (EX) { if (EX) {
*t = EX; do {
*t = Yap_FetchTermFromDB(EX);
if (Yap_Error_TYPE == OUT_OF_ATTVARS_ERROR) {
Yap_Error_TYPE = YAP_NO_ERROR;
if (!Yap_growglobal(NULL)) {
Yap_Error(OUT_OF_ATTVARS_ERROR, TermNil, Yap_ErrorMessage);
RECOVER_MACHINE_REGS();
return FALSE;
}
} else {
Yap_Error_TYPE = YAP_NO_ERROR;
if (!Yap_growstack(EX->NOfCells*CellSize)) {
Yap_Error(OUT_OF_STACK_ERROR, TermNil, Yap_ErrorMessage);
RECOVER_MACHINE_REGS();
return FALSE;
}
}
} while (*t == (CELL)0);
out = TRUE; out = TRUE;
} }
RECOVER_MACHINE_REGS(); RECOVER_MACHINE_REGS();
@ -2051,7 +2068,11 @@ X_API void
YAP_ClearExceptions(void) YAP_ClearExceptions(void)
{ {
Yap_ResetExceptionTerm(); Yap_ResetExceptionTerm();
EX = 0L; if (EX) {
BallTerm = EX;
}
EX = NULL;
Yap_ResetExceptionTerm();
UncaughtThrow = FALSE; UncaughtThrow = FALSE;
} }

View File

@ -1007,7 +1007,7 @@ init_stack(int arity, CELL *pt, int top, choiceptr saved_b)
/* create an initial pseudo environment so that when garbage /* create an initial pseudo environment so that when garbage
collection is going up in the environment chain it doesn't get collection is going up in the environment chain it doesn't get
confused */ confused */
EX = 0L; EX = NULL;
// sl = Yap_InitSlot(t); // sl = Yap_InitSlot(t);
YENV = ASP; YENV = ASP;
YENV[E_CP] = (CELL)P; YENV[E_CP] = (CELL)P;
@ -1502,7 +1502,8 @@ JumpToEnv(Term t) {
B = handler; B = handler;
else else
previous->cp_b = handler; previous->cp_b = handler;
EX = t; EX = BallTerm;
BallTerm = NULL;
P = (yamop *)FAILCODE; P = (yamop *)FAILCODE;
HB = B->cp_h; HB = B->cp_h;
return TRUE; return TRUE;
@ -1622,7 +1623,7 @@ Yap_InitYaamRegs(void)
LOCK(SignalLock); LOCK(SignalLock);
CreepFlag = CalculateStackGap(); CreepFlag = CalculateStackGap();
UNLOCK(SignalLock); UNLOCK(SignalLock);
EX = 0L; EX = NULL;
init_stack(0, NULL, TRUE, NULL); init_stack(0, NULL, TRUE, NULL);
/* the first real choice-point will also have AP=FAIL */ /* the first real choice-point will also have AP=FAIL */
CurSlot = 0; CurSlot = 0;
@ -1725,7 +1726,7 @@ static Int
p_reset_exception(void) p_reset_exception(void)
{ {
Term t; Term t;
EX = 0L; EX = NULL;
t = GetException(); t = GetException();
if (!t) if (!t)
return FALSE; return FALSE;

View File

@ -110,7 +110,7 @@ typedef struct
CELL *AuxSp_; /* 9 Auxiliary stack pointer */ CELL *AuxSp_; /* 9 Auxiliary stack pointer */
ADDR AuxTop_; /* 10 Auxiliary stack top */ ADDR AuxTop_; /* 10 Auxiliary stack top */
/* visualc*/ /* visualc*/
CELL EX_; /* 18 */ struct DB_TERM * EX_; /* 18 */
Term CurrentModule_; Term CurrentModule_;
#if defined(SBA) || defined(TABLING) #if defined(SBA) || defined(TABLING)
CELL *H_FZ_; CELL *H_FZ_;

View File

@ -2444,7 +2444,7 @@ PL_exception(qid_t q)
X_API void X_API void
PL_clear_exception(void) PL_clear_exception(void)
{ {
EX = 0L; EX = NULL;
} }
X_API int X_API int