support for making sure exceptions are reset when they should be reset (obs from Nuno Fonseca, #159)

This commit is contained in:
Vítor Manuel de Morais Santos Costa 2009-12-03 17:48:25 +00:00
parent 71e4d73a75
commit 1176f71f3a
7 changed files with 16 additions and 33 deletions

View File

@ -1939,7 +1939,7 @@ YAP_GoalHasException(Term *t)
X_API void
YAP_ClearExceptions(void)
{
Yap_DeleteGlobal(AtomCatch);
Yap_ResetExceptionTerm();
EX = 0L;
UncaughtThrow = FALSE;
}

View File

@ -4947,35 +4947,7 @@ Term
Yap_PopTermFromDB(DBTerm *ref)
{
Term t = GetDBTerm(ref);
DBRef *cp = ref->DBRefs;
if (cp) {
DBRef eref;
while ((eref = *--cp) != NIL) {
if (eref->Flags & LogUpdMask) {
LogUpdClause *cl = (LogUpdClause *)eref;
cl->ClRefCount--;
if (cl->ClFlags & ErasedMask &&
!(cl->ClFlags & InUseMask) &&
!(cl->ClRefCount)) {
EraseLogUpdCl(cl);
}
} else {
LOCK(eref->lock);
eref->NOfRefsTo--;
if (eref->Flags & ErasedMask &&
!(eref->Flags & InUseMask) &&
eref->NOfRefsTo) {
UNLOCK(eref->lock);
ErDBE(eref);
} else {
UNLOCK(eref->lock);
}
}
}
}
Yap_FreeCodeSpace((char *)ref);
ReleaseTermFromDB(ref);
return t;
}
@ -5395,6 +5367,8 @@ p_resize_int_keys(void)
static void
ReleaseTermFromDB(DBTerm *ref)
{
if (!ref)
return;
keepdbrefs(ref);
ErasePendingRefs(ref);
FreeDBSpace((char *) ref);

View File

@ -1587,7 +1587,7 @@ Yap_InitYaamRegs(void)
Yap_regp = &Yap_standard_regs;
#endif
#endif /* PUSH_REGS */
Yap_DeleteGlobal (AtomCatch);
Yap_ResetExceptionTerm ();
Yap_PutValue (AtomBreak, MkIntTerm (0));
TR = (tr_fr_ptr)Yap_TrailBase;
if (Yap_AttsSize > (Yap_LocalBase-Yap_GlobalBase)/8)
@ -1728,6 +1728,13 @@ p_reset_exception(void)
return Yap_unify(t, ARG1);
}
void
Yap_ResetExceptionTerm(void)
{
Yap_ReleaseTermFromDB(BallTerm);
BallTerm = NULL;
}
static Int
p_get_exception(void)
{

View File

@ -176,6 +176,7 @@ Term STD_PROTO(Yap_ExecuteCallMetaCall,(Term));
void STD_PROTO(Yap_InitExecFs,(void));
Int STD_PROTO(Yap_JumpToEnv,(Term));
Term STD_PROTO(Yap_RunTopGoal,(Term));
void STD_PROTO(Yap_ResetExceptionTerm,(void));
Int STD_PROTO(Yap_execute_goal,(Term, int, Term));
int STD_PROTO(Yap_exec_absmi,(int));
void STD_PROTO(Yap_trust_last,(void));

@ -1 +1 @@
Subproject commit f6a79007615bf46dc79712c41d61289834f28ba3
Subproject commit c325e4564bb8d4e32c27f2061df85f13d315974e

@ -1 +1 @@
Subproject commit eb6d27251c2548c25e6d37fff2a27a014caaa7aa
Subproject commit a2d2f03107eecd45462cd61a678035132cf06326

View File

@ -30,3 +30,4 @@ test(append) :-
X == "aapnoot".
:- end_tests(lists).