fix predicate location in error messages

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@226 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
vsc 2001-12-11 19:12:41 +00:00
parent 2e2ddf394b
commit 3924f4662a

121
C/cdmgr.c
View File

@ -50,7 +50,6 @@ STATIC_PROTO(void mark_pred, (int, PredEntry *));
STATIC_PROTO(void do_toggle_static_predicates_in_use, (int)); STATIC_PROTO(void do_toggle_static_predicates_in_use, (int));
#endif #endif
STATIC_PROTO(void recover_log_upd_clause, (Clause *)); STATIC_PROTO(void recover_log_upd_clause, (Clause *));
STATIC_PROTO(PredEntry *NextPred, (PredEntry *,AtomEntry *));
STATIC_PROTO(Int p_number_of_clauses, (void)); STATIC_PROTO(Int p_number_of_clauses, (void));
STATIC_PROTO(Int p_compile, (void)); STATIC_PROTO(Int p_compile, (void));
STATIC_PROTO(Int p_compile_dynamic, (void)); STATIC_PROTO(Int p_compile_dynamic, (void));
@ -1850,96 +1849,66 @@ p_toggle_static_predicates_in_use(void)
} }
/* given a pointer P to someone's code, find out the clause
this belongs to */
static PredEntry *
NextPred(PredEntry *pp, AtomEntry *ae)
{
READ_LOCK(ae->ARWLock);
while (!EndOfPAEntr(pp) &&
(pp->KindOfPE & 0x8000))
pp = RepPredProp(pp->NextOfPE);
READ_UNLOCK(ae->ARWLock);
return (pp);
}
static Int static Int
check_code_in_atom(AtomEntry *ae, CODEADDR codeptr, Int *parity, SMALLUNSGN *pmodule) { code_in_pred(PredEntry *pp, Atom *pat, Int *parity, CODEADDR codeptr) {
PredEntry *pp; CODEADDR clcode, cl;
for (pp = NextPred(RepPredProp(ae->PropsOfAE),ae); int i = 1;
!EndOfPAEntr(pp);
pp = NextPred(RepPredProp(pp->NextOfPE),ae)) {
CODEADDR clcode, cl;
int i = 1;
READ_LOCK(pp->PRWLock); READ_LOCK(pp->PRWLock);
clcode = pp->FirstClause; clcode = pp->FirstClause;
if (clcode != NIL) { if (clcode != NIL) {
/* check if the codeptr comes from the indexing code */ /* check if the codeptr comes from the indexing code */
if ((pp->PredFlags & IndexedPredFlag) && if ((pp->PredFlags & IndexedPredFlag) &&
codeptr > pp->TrueCodeOfPred && codeptr > pp->TrueCodeOfPred &&
codeptr <= pp->TrueCodeOfPred + SizeOfBlock(pp->TrueCodeOfPred)) { codeptr <= pp->TrueCodeOfPred + SizeOfBlock(pp->TrueCodeOfPred)) {
*parity = pp->ArityOfPE;
if (pp->ArityOfPE) {
*pat = (Atom)(pp->FunctorOfPred);
} else {
*pat = NameOfFunctor(pp->FunctorOfPred);
}
READ_UNLOCK(pp->PRWLock);
return(-1);
}
cl = (CODEADDR)ClauseCodeToClause(clcode);
do {
if (codeptr > cl && codeptr <= cl + SizeOfBlock(cl)) {
/* we found it */
*parity = pp->ArityOfPE; *parity = pp->ArityOfPE;
if (pp->ModuleOfPred == 0) if (pp->ArityOfPE) {
*pmodule = pp->ModuleOfPred; *pat = (Atom)(pp->FunctorOfPred);
else } else {
*pmodule = IntOfTerm(pp->ModuleOfPred); *pat = NameOfFunctor(pp->FunctorOfPred);
READ_UNLOCK(pp->PRWLock);
return(-1);
}
cl = (CODEADDR)ClauseCodeToClause(clcode);
do {
if (codeptr > cl && codeptr <= cl + SizeOfBlock(cl)) {
/* we found it */
*parity = pp->ArityOfPE;
if (pp->ModuleOfPred == 0)
*pmodule = pp->ModuleOfPred;
else
*pmodule = IntOfTerm(pp->ModuleOfPred);
READ_UNLOCK(pp->PRWLock);
return(i);
} }
if (clcode == pp->LastClause) READ_UNLOCK(pp->PRWLock);
break; return(i);
cl = (CODEADDR)ClauseCodeToClause(clcode = NextClause(clcode)); }
i++; if (clcode == pp->LastClause)
} while (TRUE); break;
} cl = (CODEADDR)ClauseCodeToClause(clcode = NextClause(clcode));
READ_UNLOCK(pp->PRWLock); i++;
} while (TRUE);
} }
READ_UNLOCK(pp->PRWLock);
return(0); return(0);
} }
Int Int
PredForCode(CODEADDR codeptr, Atom *pat, Int *parity, SMALLUNSGN *pmodule) { PredForCode(CODEADDR codeptr, Atom *pat, Int *parity, SMALLUNSGN *pmodule) {
Int found;
Int i_table; Int i_table;
Int val;
AtomEntry *chain;
for (i_table = 0; i_table < MaxHash; i_table++) { for (i_table = 0; i_table < NoOfModules; ++i_table) {
Atom a; PredEntry *pp = ModulePred[i_table];
while (pp != NULL) {
READ_LOCK(HashChain[i_table].AERWLock); if ((found = code_in_pred(pp, pat, parity, codeptr)) != 0) {
a = HashChain[i_table].Entry; break;
while (a != NIL) {
AtomEntry *ae = RepAtom(a);
if ((val = check_code_in_atom(ae, codeptr, parity, pmodule)) != 0) {
*pat = a;
return(val);
} }
a = ae->NextOfAE; pp = pp->NextPredOfModule;
} }
READ_UNLOCK(HashChain[i_table].AERWLock);
} }
chain = RepAtom(INVISIBLECHAIN.Entry); /* should we allow the user to see hidden predicates? */
while (!EndOfPAEntr(chain) != 0) { return(found);
if ((val = check_code_in_atom(chain, codeptr, parity, pmodule)) != 0) {
*pat = AbsAtom(chain);
return(val);
}
chain = RepAtom(chain->NextOfAE);
}
return(0);
} }
static Int static Int