From fa336484990e973b631dbd7952aa104c0e49ec1f Mon Sep 17 00:00:00 2001 From: vsc Date: Tue, 18 Jun 2002 05:22:35 +0000 Subject: [PATCH] allow abolish of static procedures, even if they are being used. git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@546 b08c6af1-5177-4d33-ba66-4b1c6b8b522a --- C/cdmgr.c | 53 ++++++++++--------------------------------------- C/init.c | 1 + H/rheap.h | 2 -- changes4.3.html | 5 +++-- docs/yap.tex | 16 +++++++-------- pl/preds.yap | 3 --- 6 files changed, 21 insertions(+), 59 deletions(-) diff --git a/C/cdmgr.c b/C/cdmgr.c index 39d9e727a..dfe078f8a 100644 --- a/C/cdmgr.c +++ b/C/cdmgr.c @@ -31,7 +31,7 @@ static char SccsId[] = "@(#)cdmgr.c 1.1 05/02/98"; #endif -STATIC_PROTO(void retract_all, (PredEntry *)); +STATIC_PROTO(void retract_all, (PredEntry *, int)); STATIC_PROTO(void add_first_static, (PredEntry *, CODEADDR, int)); STATIC_PROTO(void add_first_dynamic, (PredEntry *, CODEADDR, int)); STATIC_PROTO(void asserta_stat_clause, (PredEntry *, CODEADDR, int)); @@ -291,22 +291,9 @@ RemoveIndexation(PredEntry *ap) else { Clause *cl = ClauseCodeToClause(ap->TrueCodeOfPred); if (static_in_use(ap, FALSE)) { - Int Arity = ap->ArityOfPE; - - ErrorMessage = ErrorSay; - Error_Term = TermNil; - Error_TYPE = PERMISSION_ERROR_MODIFY_STATIC_PROCEDURE; - if (Arity == 0) - sprintf(ErrorMessage, "predicate %s is in use", RepAtom((Atom)(ap->FunctorOfPred))->StrOfAE); - else - sprintf(ErrorMessage, -#if SHORT_INTS - "predicate %s/%ld is in use", -#else - "predicate %s/%d is in use", -#endif - RepAtom(NameOfFunctor(ap->FunctorOfPred))->StrOfAE, Arity); - return(FALSE); + /* This should never happen */ + cl->u.NextCl = DeadClauses; + DeadClauses = cl; } else { FreeCodeSpace((char *)cl); } @@ -339,7 +326,7 @@ RemoveIndexation(PredEntry *ap) /* p is already locked */ static void -retract_all(PredEntry *p) +retract_all(PredEntry *p, int in_use) { CODEADDR q, q1; int multifile_pred = p->PredFlags & MultiFileFlag; @@ -757,29 +744,7 @@ not_was_reconsulted(PredEntry *p, Term t, int mode) --ConsultSp; ConsultSp->p = p0; if (ConsultBase[1].mode) /* we are in reconsult mode */ { - if (static_in_use(p, TRUE)) { - Int Arity = p->ArityOfPE; - -#ifdef DEBUG - if(0) - list_all_predicates_in_use(); -#endif - ErrorMessage = ErrorSay; - Error_Term = t; - Error_TYPE = PERMISSION_ERROR_MODIFY_STATIC_PROCEDURE; - if (Arity == 0) - sprintf(ErrorMessage, "predicate %s is in use", RepAtom((Atom)(p->FunctorOfPred))->StrOfAE); - else - sprintf(ErrorMessage, -#if SHORT_INTS - "predicate %s/%ld is in use", -#else - "predicate %s/%d is in use", -#endif - RepAtom(NameOfFunctor(p->FunctorOfPred))->StrOfAE, Arity); - return(FALSE); - } - retract_all(p); + retract_all(p, static_in_use(p,TRUE)); } if (!(p->PredFlags & MultiFileFlag)) { p->OwnerFile = YapConsultingFile(); @@ -1220,7 +1185,8 @@ p_purge_clauses(void) Term t = Deref(ARG1); Term t2 = Deref(ARG2); CODEADDR q, q1; - int mod; + SMALLUNSGN mod; + int in_use; PutValue(AtomAbol, MkAtomTerm(AtomNil)); if (IsVarTerm(t)) @@ -1247,6 +1213,7 @@ p_purge_clauses(void) RemoveIndexation(pred); PutValue(AtomAbol, MkAtomTerm(AtomTrue)); q = pred->FirstClause; + in_use = static_in_use(pred,FALSE); if (q != NIL) do { q1 = q; @@ -1255,7 +1222,7 @@ p_purge_clauses(void) ErCl(ClauseCodeToClause(q1)); else { Clause *cl = ClauseCodeToClause(q1); - if (cl->ClFlags & HasBlobsMask) { + if (cl->ClFlags & HasBlobsMask || in_use) { cl->u.NextCl = DeadClauses; DeadClauses = cl; } else { diff --git a/C/init.c b/C/init.c index 2aa54cc71..8eb33caef 100644 --- a/C/init.c +++ b/C/init.c @@ -1129,6 +1129,7 @@ InitYaamRegs(void) WokenGoals = NewTimedVar(TermNil); MutableList = NewTimedVar(TermNil); AttsMutableList = NewTimedVar(TermNil); + printf("TermNil is %lx and AttsMutableList is %x\n",TermNil, AttsMutableList); #endif } diff --git a/H/rheap.h b/H/rheap.h index 361c10b5b..fbc1b0c42 100644 --- a/H/rheap.h +++ b/H/rheap.h @@ -327,14 +327,12 @@ restore_codes(void) if (heap_regs->spy_code != NULL) heap_regs->spy_code = (PredEntry *)PtoHeapCellAdjust((CELL *)(heap_regs->spy_code)); #ifdef COROUTINING -#ifdef MULTI_ASSIGNMENT_VARIABLES if (heap_regs->wake_up_code != NULL) heap_regs->wake_up_code = (PredEntry *)PtoHeapCellAdjust((CELL *)(heap_regs->wake_up_code)); heap_regs->mutable_list = AbsAppl(PtoGloAdjust(RepAppl(heap_regs->mutable_list))); heap_regs->atts_mutable_list = AbsAppl(PtoGloAdjust(RepAppl(heap_regs->atts_mutable_list))); -#endif #endif if (heap_regs->last_wtime != NULL) heap_regs->last_wtime = (void *)PtoHeapCellAdjust((CELL *)(heap_regs->last_wtime)); diff --git a/changes4.3.html b/changes4.3.html index 978896f61..9b5bb1a4b 100644 --- a/changes4.3.html +++ b/changes4.3.html @@ -17,9 +17,10 @@

Yap-4.3.23: