40#include "tab.macros.h"
63#if !defined(YAPOR) && !defined(THREADS)
67static void do_toggle_static_predicates_in_use(
int);
71static Int in_use(USES_REGS1);
77#define IN_BLOCK(P, B, SZ) \
78 ((CODEADDR)(P) >= (CODEADDR)(B) && (CODEADDR)(P) < (CODEADDR)(B) + (SZ))
81static PredEntry *get_pred(Term t, Term tmod,
char *pname) {
86 Yap_Error(INSTANTIATION_ERROR, t0, pname);
88 }
else if (IsAtomTerm(t)) {
89 return RepPredProp(Yap_GetPredPropByAtom(AtomOfTerm(t), tmod));
90 }
else if (IsIntegerTerm(t) && tmod == IDB_MODULE) {
91 return Yap_FindLUIntKey(IntegerOfTerm(t));
92 }
else if (IsApplTerm(t)) {
94 if (IsExtensionFunctor(fun)) {
95 Yap_Error(TYPE_ERROR_CALLABLE, Yap_TermToIndicator(t, tmod), pname);
98 if (fun == FunctorModule) {
99 Term tmod = ArgOfTerm(1, t);
100 if (IsVarTerm(tmod)) {
101 Yap_Error(INSTANTIATION_ERROR, t0, pname);
104 if (!IsAtomTerm(tmod)) {
105 Yap_Error(TYPE_ERROR_ATOM, t0, pname);
111 return RepPredProp(Yap_GetPredPropByFunc(fun, tmod));
116Term Yap_TermToIndicator(Term t, Term mod) {
120 t = Yap_YapStripModule(t, &mod);
121 if (IsApplTerm(t) && !IsExtensionFunctor(FunctorOfTerm(t))) {
122 ti[0] = MkAtomTerm(NameOfFunctor(FunctorOfTerm(t)));
123 ti[1] = MkIntegerTerm(ArityOfFunctor(FunctorOfTerm(t)));
124 }
else if (IsPairTerm(t)) {
125 ti[0] = MkAtomTerm(AtomDot);
126 ti[1] = MkIntTerm(2);
130 t = Yap_MkApplTerm(FunctorSlash, 2, ti);
131 if (mod != PROLOG_MODULE && mod != USER_MODULE && mod != TermProlog) {
134 return Yap_MkApplTerm(FunctorModule, 2, ti);
139Term Yap_PredicateToIndicator(
PredEntry *pe) {
143 Term mod = pe->ModuleOfPred;
144 if (mod == IDB_MODULE && pe->PredFlags & NumberDBPredFlag) {
145 Int
id = pe->src.IndxId;
147 ti[1] = MkIntTerm(
id);
148 return Yap_MkApplTerm(FunctorModule, 2, ti);
151 ti[0] = MkAtomTerm(NameOfFunctor(pe->FunctorOfPred));
152 ti[1] = MkIntegerTerm(ArityOfFunctor(pe->FunctorOfPred));
154 ti[0] = MkAtomTerm((
Atom) (pe->FunctorOfPred));
155 ti[1] = MkIntTerm(0);
157 Term t = Yap_MkApplTerm(FunctorSlash, 2, ti);
158 if (mod != PROLOG_MODULE && mod != USER_MODULE && mod != TermProlog) {
161 return Yap_MkApplTerm(FunctorModule, 2, ti);
169static int UnifyPredInfo(
PredEntry *pe,
int start_arg USES_REGS) {
170 arity_t arity = pe->ArityOfPE;
173 if (pe->ModuleOfPred != IDB_MODULE) {
174 if (pe->ModuleOfPred == PROLOG_MODULE) {
177 tmod = pe->ModuleOfPred;
179 if (pe->ArityOfPE == 0) {
180 tname = MkAtomTerm((
Atom) pe->FunctorOfPred);
183 tname = MkAtomTerm(NameOfFunctor(f));
186 tmod = pe->ModuleOfPred;
187 if (pe->PredFlags & NumberDBPredFlag) {
188 tname = MkIntegerTerm(pe->src.IndxId);
189 }
else if (pe->PredFlags & AtomDBPredFlag) {
190 tname = MkAtomTerm((
Atom) pe->FunctorOfPred);
193 tname = MkAtomTerm(NameOfFunctor(f));
197 return Yap_unify(tmod, XREGS[start_arg]) &&
198 Yap_unify(tname, XREGS[start_arg + 1]) &&
199 Yap_unify(MkIntegerTerm(arity), XREGS[start_arg + 2]);
202static PredEntry *PredForChoicePt(
yamop *p_code, op_numbers *opn) {
207 opnum = Yap_op_from_opcode(p_code->opc);
214 p_code = p_code->y_u.l.l;
218 return p_code->y_u.Otapl.p;
221 return p_code->y_u.lp.p;
225 case _count_retry_logical:
226 case _count_trust_logical:
227 case _profiled_retry_logical:
228 case _profiled_trust_logical:
229 return p_code->y_u.OtaLl.d->ClPred;
231 case _trie_trust_var:
232 case _trie_retry_var:
233 case _trie_trust_var_in_pair:
234 case _trie_retry_var_in_pair:
235 case _trie_trust_val:
236 case _trie_retry_val:
237 case _trie_trust_val_in_pair:
238 case _trie_retry_val_in_pair:
239 case _trie_trust_atom:
240 case _trie_retry_atom:
241 case _trie_trust_atom_in_pair:
242 case _trie_retry_atom_in_pair:
243 case _trie_trust_null:
244 case _trie_retry_null:
245 case _trie_trust_null_in_pair:
246 case _trie_retry_null_in_pair:
247 case _trie_trust_pair:
248 case _trie_retry_pair:
249 case _trie_trust_appl:
250 case _trie_retry_appl:
251 case _trie_trust_appl_in_pair:
252 case _trie_retry_appl_in_pair:
253 case _trie_trust_extension:
254 case _trie_retry_extension:
255 case _trie_trust_double:
256 case _trie_retry_double:
257 case _trie_trust_longint:
258 case _trie_retry_longint:
259 case _trie_trust_gterm:
260 case _trie_retry_gterm:
262 case _table_load_answer:
263 case _table_try_answer:
264 case _table_answer_resolution:
265 case _table_completion:
266#ifdef THREADS_CONSUMER_SHARING
267 case _table_answer_resolution_completion:
273 return p_code->y_u.Osblp.p0;
277 return p_code->y_u.Osblp.p0;
282 case _count_retry_me:
283 case _retry_profiled:
287 p_code = NEXTOP(p_code, l);
290 return p_code->y_u.Otapl.p;
310 return PredForChoicePt(cp->cp_ap, op);
313#if !defined(YAPOR) && !defined(THREADS)
315#if !defined(DOXYGEN) && 0
320 cl = ClauseCodeToStaticClause(pe->FirstClause);
322 if (IN_BLOCK(codeptr, cl, cl->ClSize)) {
325 if (cl->ClCode == pe->cs.p_code.LastClause)
329 Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
330 "could not find clause for indexing code");
336bool Yap_search_for_static_predicate_in_use(
PredEntry *p,
337 bool check_everything) {
341 if (check_everything && P && ENV) {
353 if (check_everything && env_ptr) {
358 while (env_ptr && b_ptr > (
choiceptr) env_ptr) {
367 if (env_ptr == (CELL *) (env_ptr[E_E]))
371 env_ptr = (CELL *) (env_ptr[E_E]);
376 pe = PredForChoicePt(b_ptr->cp_ap, NULL);
382 env_ptr = b_ptr->cp_env;
383 if (b_ptr->cp_ap == NOCODE)
385 if (b_ptr->cp_ap == EXITCODE)
388 }
while (b_ptr != NULL);
392static void mark_pred(
int mark,
PredEntry *pe) {
394 if (pe->ModuleOfPred) {
397 pe->PredFlags |= InUsePredFlag;
399 pe->PredFlags &= ~InUsePredFlag;
408static void do_toggle_static_predicates_in_use(
int mask) {
423 if (env_cp == YESCODE) {
431 pe = EnvPreg(env_cp);
434 env_ptr = (CELL *) (env_ptr[E_E]);
438 if ((pe = PredForChoicePt(b_ptr->cp_ap, NULL))) {
442 env_ptr = b_ptr->cp_env;
444 }
while (b_ptr != NULL);
446 STATIC_PREDICATES_MARKED = mask;
449static Int toggle_static_predicates_in_use(USES_REGS1) {
450#if !defined(YAPOR) && !defined(THREADS)
451 Term t = Deref(ARG1);
456 Yap_Error(INSTANTIATION_ERROR, t,
"toggle_static_predicates_in_use/1");
460 Yap_Error(TYPE_ERROR_INTEGER, t,
"toggle_static_predicates_in_use/1");
465 do_toggle_static_predicates_in_use(mask);
473 void **startp,
void **endp) {
475 if (IN_BLOCK(codeptr, icl, icl->ClSize)) {
477 *startp = (CODEADDR) icl;
479 *endp = (CODEADDR) icl + icl->ClSize;
482 cicl = icl->ChildIndex;
483 while (cicl != NULL) {
484 if (code_in_pred_lu_index(cicl, codeptr, startp, endp))
486 cicl = cicl->SiblingIndex;
491static int code_in_pred_s_index(
StaticIndex *icl,
yamop *codeptr,
void **startp,
494 if (IN_BLOCK(codeptr, icl, icl->ClSize)) {
496 *startp = (CODEADDR) icl;
498 *endp = (CODEADDR) icl + icl->ClSize;
501 cicl = icl->ChildIndex;
502 while (cicl != NULL) {
503 if (code_in_pred_s_index(cicl, codeptr, startp, endp))
505 cicl = cicl->SiblingIndex;
510static Int find_code_in_clause(
PredEntry *pp,
yamop *codeptr,
void **startp,
515 clcode = pp->cs.p_code.FirstClause;
516 if (clcode != NULL) {
517 if (pp->PredFlags & LogUpdatePredFlag) {
520 if (IN_BLOCK(codeptr, (CODEADDR) cl, cl->ClSize)) {
522 *startp = (CODEADDR) cl;
524 *endp = (CODEADDR) cl + cl->ClSize;
529 }
while (cl != NULL);
530 }
else if (pp->PredFlags & DynamicPredFlag) {
534 cl = ClauseCodeToDynamicClause(clcode);
535 if (IN_BLOCK(codeptr, cl, cl->ClSize)) {
537 *startp = (CODEADDR) cl;
539 *endp = (CODEADDR) cl + cl->ClSize;
542 if (clcode == pp->cs.p_code.LastClause)
545 clcode = NextDynamicClause(clcode);
547 }
else if (pp->PredFlags & MegaClausePredFlag) {
550 cl = ClauseCodeToMegaClause(clcode);
551 if (IN_BLOCK(codeptr, cl, cl->ClSize)) {
553 *startp = (CODEADDR) cl;
555 *endp = (CODEADDR) cl + cl->ClSize;
556 return 1 + ((
char *) codeptr - (
char *) cl->ClCode) / cl->ClItemSize;
561 cl = ClauseCodeToStaticClause(clcode);
565 if (IN_BLOCK(codeptr, cl, cl->ClSize)) {
567 *startp = (CODEADDR) cl;
569 *endp = (CODEADDR) cl + cl->ClSize;
572 if (cl->ClCode == pp->cs.p_code.LastClause)
617static Term clause_loc(
void *clcode,
PredEntry *pp) {
620 if (pp->PredFlags & LogUpdatePredFlag) {
623 if (cl->ClFlags & FactMask) {
624 return MkIntegerTerm(cl->lusl.ClLine);
626 return MkIntegerTerm(cl->lusl.ClSource->ag.line_number);
628 }
else if (pp->PredFlags & DynamicPredFlag) {
633 }
else if (pp->PredFlags & MegaClausePredFlag) {
634 MegaClause *mcl = ClauseCodeToMegaClause(pp->cs.p_code.FirstClause);
635 return MkIntTerm(mcl->ClLine);
640 if (cl->ClFlags & FactMask) {
641 return MkIntTerm(cl->usc.ClLine);
642 }
else if (cl->ClFlags & SrcMask) {
643 return MkIntTerm(cl->usc.ClSource->ag.line_number);
650static int cl_code_in_pred(
PredEntry *pp,
yamop *codeptr,
void **startp,
656 if (pp->PredFlags & IndexedPredFlag) {
657 if (pp->PredFlags & LogUpdatePredFlag) {
658 if (code_in_pred_lu_index(
659 ClauseCodeToLogUpdIndex(pp->cs.p_code.TrueCodeOfPred), codeptr,
665 if (code_in_pred_s_index(
666 ClauseCodeToStaticIndex(pp->cs.p_code.TrueCodeOfPred), codeptr,
673 if (pp->PredFlags & (CPredFlag | AsmPredFlag | UserCPredFlag)) {
674 StaticClause *cl = ClauseCodeToStaticClause(pp->CodeOfPred);
675 if (IN_BLOCK(codeptr, (CODEADDR) cl, cl->ClSize)) {
677 *startp = (CODEADDR) cl;
679 *endp = (CODEADDR) cl + cl->ClSize;
687 out = find_code_in_clause(pp, codeptr, startp, endp);
707 if (pp->PredFlags & IndexedPredFlag && pp->OpcodeOfPred != INDEX_OPCODE) {
708 if (pp->PredFlags & LogUpdatePredFlag) {
709 if (code_in_pred_lu_index(
710 ClauseCodeToLogUpdIndex(pp->cs.p_code.TrueCodeOfPred), codeptr,
716 if (code_in_pred_s_index(
717 ClauseCodeToStaticIndex(pp->cs.p_code.TrueCodeOfPred), codeptr,
724 return find_code_in_clause(pp, codeptr, NULL, NULL);
740 if ((found = code_in_pred(pp, codeptr)) != 0) {
745 pp = pp->NextPredOfModule;
789 *startp = (CODEADDR) cl;
790 *endp = (CODEADDR) cl + cl->ClSize;
797 *startp = (CODEADDR) cl;
798 *endp = (CODEADDR) cl + cl->ClSize;
803static PredEntry *found_meta_call(
void **startp,
void **endp) {
805 *startp = (CODEADDR) &(pp->OpcodeOfPred);
806 *endp = (CODEADDR) NEXTOP((
yamop *) &(pp->OpcodeOfPred), e);
812 StaticClause *cl = ClauseCodeToStaticClause(pp->CodeOfPred);
813 *startp = (CODEADDR) &(cl->ClCode);
814 *endp = (CODEADDR) &(cl->ClCode) + cl->ClSize;
820 MegaClause *mcl = ClauseCodeToMegaClause(pp->cs.p_code.FirstClause);
821 *startp = (CODEADDR) mcl;
822 *endp = (CODEADDR) mcl + mcl->ClSize;
827static PredEntry *found_idb_clause(
yamop *pc,
void **startp,
void **endp) {
830 *startp = (CODEADDR) cl;
831 *endp = (CODEADDR) cl + cl->ClSize;
836static PredEntry *found_expand_index(
yamop *pc,
void **startp,
void **endp,
837 yamop *codeptr USES_REGS) {
840 *startp = (CODEADDR) codeptr;
841 *endp = (CODEADDR) NEXTOP(codeptr, sssllp);
847static PredEntry *found_fail(
yamop *pc,
void **startp,
void **endp USES_REGS) {
848 PredEntry *pp = RepPredProp(Yap_GetPredPropByAtom(AtomFail, CurrentModule));
849 *startp = *endp = (CODEADDR) FAILCODE;
855 void **endp USES_REGS) {
857 (CELL) (&(((
PredEntry *) NULL)->OpcodeOfPred))));
858 *startp = (CODEADDR) &(pp->OpcodeOfPred);
859 *endp = (CODEADDR) NEXTOP((
yamop *) &(pp->OpcodeOfPred), e);
865 void **endp USES_REGS) {
868 (CELL) (&(((
PredEntry *) NULL)->cs.p_code.ExpandCode))));
869 *startp = (CODEADDR) &(pp->cs.p_code.ExpandCode);
870 *endp = (CODEADDR) NEXTOP((
yamop *) &(pp->cs.p_code.ExpandCode), e);
874static PredEntry *found_ystop(
yamop *pc,
int clause_code,
void **startp,
877 pp = RepPredProp(Yap_GetPredPropByAtom(AtomTrue, CurrentModule));
879 *startp = (CODEADDR) YESCODE;
881 *endp = (CODEADDR) YESCODE + (CELL) (NEXTOP((
yamop *) NULL, e));
885 yamop *o = PREVOP(pc, Osbpp);
886 if (o->opc == Yap_opcode(_execute_cpred)) {
887 pp = o->y_u.Osbpp.p0;
894 if (pp->PredFlags & LogUpdatePredFlag) {
896 LogUpdClause *cl = ClauseCodeToLogUpdClause(pc->y_u.l.l);
897 *startp = (CODEADDR) cl;
898 *endp = (CODEADDR) cl + cl->ClSize;
900 LogUpdIndex *cl = ClauseCodeToLogUpdIndex(pc->y_u.l.l);
901 *startp = (CODEADDR) cl;
902 *endp = (CODEADDR) cl + cl->ClSize;
904 }
else if (pp->PredFlags & DynamicPredFlag) {
906 *startp = (CODEADDR) cl;
907 *endp = (CODEADDR) cl + cl->ClSize;
910 StaticClause *cl = ClauseCodeToStaticClause(pc->y_u.l.l);
911 *startp = (CODEADDR) cl;
912 *endp = (CODEADDR) cl + cl->ClSize;
914 StaticIndex *cl = ClauseCodeToStaticIndex(pc->y_u.l.l);
915 *startp = (CODEADDR) cl;
916 *endp = (CODEADDR) cl + cl->ClSize;
923 void **endp USES_REGS) {
926 int clause_code = FALSE;
928 if (codeptr >= COMMA_CODE && codeptr < FAILCODE) {
929 pp = RepPredProp(Yap_GetPredPropByFunc(FunctorComma, CurrentModule));
930 *startp = (CODEADDR) COMMA_CODE;
931 *endp = (CODEADDR) (FAILCODE);
936#include "walkclause.h"
941PredEntry *Yap_PredEntryForCode(
yamop *codeptr, find_pred_type where_from,
942 void **startp,
void **endp) {
944 if (where_from == FIND_PRED_FROM_CP) {
945 PredEntry *pp = PredForChoicePt(codeptr, NULL);
946 if (cl_code_in_pred(pp, codeptr, startp, endp)) {
949 }
else if (where_from == FIND_PRED_FROM_ENV) {
951 if (cl_code_in_pred(pp, codeptr, startp, endp)) {
955 return ClauseInfoForCode(codeptr, startp, endp PASS_REGS);
968static Int in_use(USES_REGS1) {
972 pe = get_pred(Deref(ARG1), Deref(ARG2),
"$in_use");
976 out = Yap_static_in_use(pe, TRUE);
983 yamop *code_beg = cl->ClCode;
984 yamop *code_end = (
yamop *) ((
char *) cl + cl->ClSize);
986 if (code_p >= code_beg && code_p <= code_end) {
992 if ((out = find_owner_log_index(cl, code_p)) != NULL) {
995 cl = cl->SiblingIndex;
1001 yamop *code_beg = cl->ClCode;
1002 yamop *code_end = (
yamop *) ((
char *) cl + cl->ClSize);
1004 if (code_p >= code_beg && code_p <= code_end) {
1007 cl = cl->ChildIndex;
1008 while (cl != NULL) {
1010 if ((out = find_owner_static_index(cl, code_p)) != NULL) {
1013 cl = cl->SiblingIndex;
1020 if (ap->PredFlags & LogUpdatePredFlag) {
1021 LogUpdIndex *cl = ClauseCodeToLogUpdIndex(ap->cs.p_code.TrueCodeOfPred);
1022 return (
ClauseUnion *) find_owner_log_index(cl, ipc);
1024 StaticIndex *cl = ClauseCodeToStaticIndex(ap->cs.p_code.TrueCodeOfPred);
1025 return (
ClauseUnion *) find_owner_static_index(cl, ipc);
1029static Term all_envs(CELL *env_ptr USES_REGS) {
1030 Term tf = AbsPair(HR);
1039 bp[0] = MkIntegerTerm(LCL0 - env_ptr);
1040 if (HR >= ASP - 1024) {
1042 LOCAL_Error_Size = (ASP - 1024) - HR;
1044 LOCAL_Error_Size += 2;
1045 env_ptr = (CELL *) (env_ptr[E_E]);
1049 bp[1] = AbsPair(HR);
1051 env_ptr = (CELL *) (env_ptr[E_E]);
1057static Term all_cps(
choiceptr b_ptr USES_REGS) {
1060 Term tf = AbsPair(HR);
1067 bp[0] = MkIntegerTerm((Int) (LCL0 - (CELL *) b_ptr));
1068 if (HR >= ASP - 1024) {
1070 LOCAL_Error_Size = (ASP - 1024) - HR;
1072 LOCAL_Error_Size += 2;
1073 b_ptr = b_ptr->cp_b;
1077 bp[1] = AbsPair(HR);
1079 b_ptr = b_ptr->cp_b;
1080 if (!IsVarTerm((CELL) b_ptr) || (CELL *) b_ptr < HR || (CELL *) b_ptr > LCL0) {
1090static Int p_all_choicepoints(USES_REGS1) {
1092 while ((t = all_cps(B PASS_REGS)) == 0L) {
1094 Yap_Error(RESOURCE_ERROR_STACK, TermNil,
"while dumping choicepoints");
1098 return Yap_unify(ARG1, t);
1101static Int p_all_envs(USES_REGS1) {
1103 while ((t = all_envs(ENV PASS_REGS)) == 0L) {
1105 Yap_Error(RESOURCE_ERROR_STACK, TermNil,
"while dumping environments");
1109 return Yap_unify(ARG1, t);
1118 if (pp->ArityOfPE == 0) {
1119 ts[0] = MkAtomTerm((
Atom) pp->FunctorOfPred);
1120 ts[1] = MkIntTerm(0);
1122 ts[0] = MkAtomTerm(NameOfFunctor(pp->FunctorOfPred));
1123 ts[1] = MkIntegerTerm(pp->ArityOfPE);
1126 ts[0] = MkAtomTerm(pp->src.OwnerFile);
1127 Term t1 = Yap_MkApplTerm(FunctorModule, 2, ts);
1128 if ((find_code_in_clause(pp, codeptr, &begin, NULL)) <= 0) {
1129 ts[0] = clause_loc(pp->cs.p_code.FirstClause, pp);
1130 ts[1] = clause_loc(pp->cs.p_code.LastClause, pp);
1131 if (ts[0] == ts[1] && ts[1] != TermNil) {
1132 }
else if (ts[1] == TermNil && ts[0] != MkIntTerm(0))
1133 ts[0] = Yap_MkApplTerm(FunctorMinus, 2, ts);
1136 return Yap_MkApplTerm(FunctorModule, 2, ts);
1144 if (pp->ArityOfPE == 0) {
1145 t->prologPredName = AtomName((
Atom) pp->FunctorOfPred);
1146 t->prologPredArity = 0;
1148 t->prologPredName = AtomName(NameOfFunctor(pp->FunctorOfPred));
1149 t->prologPredArity = pp->ArityOfPE;
1151 t->prologPredModule =
1152 (pp->ModuleOfPred ? RepAtom(AtomOfTerm(pp->ModuleOfPred))->StrOfAE
1154 t->prologPredFile = RepAtom(pp->src.OwnerFile)->StrOfAE;
1155 if (codeptr->opc == UNDEF_OPCODE) {
1156 t->prologPredLine = 0;
1158 }
else if (pp->cs.p_code.NOfClauses) {
1159 if ((t->prologPredLine = find_code_in_clause(pp, codeptr, &begin, NULL)) <=
1161 t->prologPredLine = 0;
1163 t->prologPredLine = IntegerOfTerm(clause_loc(begin, pp));
1167 t->prologPredLine = t->errorLine;
1168 t->prologPredFile = t->errorFile;
1173static Term error_culprit(
bool internal USES_REGS) {
1176 void *startp, *endp;
1178 pe = ClauseInfoForCode(P, &startp, &endp PASS_REGS);
1187 if (pe->ModuleOfPred)
1189 curENV = (CELL *) (curENV[E_E]);
1190 curCP = (
yamop *) (curENV[E_CP]);
1191 pe = EnvPreg(curCP);
1200 void *startp, *endp;
1202 pe = ClauseInfoForCode(P, &startp, &endp PASS_REGS);
1203 if (pe && (CurrentModule == 0 || !(pe->PredFlags & HiddenPredFlag))) {
1204 return set_clause_info(t, P, pe);
1213 pe = EnvPreg(curCP);
1214 curENV = (CELL *) (curENV[E_E]);
1215 if (curENV < ASP || curENV >= LCL0) {
1218 curCP = (
yamop *) curENV[E_CP];
1222 if (pe->ModuleOfPred || !(pe->PredFlags & HiddenPredFlag))
1223 return set_clause_info(t, curCP, pe);
1224 curCP = (
yamop *) (curENV[E_CP]);
1226 if (curB->cp_ap != NOCODE && curB->cp_ap != TRUSTFAILCODE &&
1227 curB->cp_ap != FAILCODE) {
1228 pe = curB->cp_ap->y_u.Otapl.p;
1229 if (pe && (pe->ModuleOfPred || !(pe->PredFlags & HiddenPredFlag)))
1230 return set_clause_info(t, curB->cp_ap, pe);
1240static Term all_calls(
bool internal USES_REGS) {
1242 Functor f = Yap_MkFunctor(AtomLocalSp, 6);
1246 ts[0] = error_culprit(
internal PASS_REGS);
1247 ts[1] = MkAddressTerm(P);
1248 ts[2] = MkAddressTerm(CP);
1249 ts[3] = MkAddressTerm(PP);
1250 if (trueLocalPrologFlag(STACK_DUMP_ON_ERROR_FLAG)) {
1251 ts[4] = all_envs(ENV PASS_REGS);
1252 ts[5] = all_cps(B PASS_REGS);
1253 if (ts[4] == 0L || ts[5] == 0L)
1256 ts[4] = ts[5] = TermNil;
1258 return Yap_MkApplTerm(f, 6, ts);
1261Term Yap_all_calls(
void) {
1263 return all_calls(
true PASS_REGS);
1275static Int current_stack(USES_REGS1) {
1277 while ((t = all_calls(
false PASS_REGS)) == 0L) {
1279 Yap_Error(RESOURCE_ERROR_STACK, TermNil,
"while dumping stack");
1283 return Yap_unify(ARG1, t);
1289 char *code_end = (
char *) cl + cl->ClSize;
1290 Yap_inform_profiler_of_clause(cl, code_end, pp, GPROF_LU_INDEX);
1291 cl = cl->ChildIndex;
1292 while (cl != NULL) {
1293 add_code_in_lu_index(cl, pp);
1294 cl = cl->SiblingIndex;
1299 char *code_end = (
char *) cl + cl->ClSize;
1300 Yap_inform_profiler_of_clause(cl, code_end, pp, GPROF_STATIC_INDEX);
1301 cl = cl->ChildIndex;
1302 while (cl != NULL) {
1303 add_code_in_static_index(cl, pp);
1304 cl = cl->SiblingIndex;
1308static void add_code_in_pred(
PredEntry *pp) {
1315 Yap_inform_profiler_of_clause(&(pp->OpcodeOfPred), &(pp->OpcodeOfPred) + 1,
1316 pp, GPROF_INIT_OPCODE);
1317 if (pp->PredFlags & (CPredFlag | AsmPredFlag)) {
1321 clcode = pp->CodeOfPred;
1322 cl = ClauseCodeToStaticClause(clcode);
1323 code_end = (
char *) cl + cl->ClSize;
1324 Yap_inform_profiler_of_clause(cl, code_end, pp, GPROF_INIT_SYSTEM_CODE);
1328 Yap_inform_profiler_of_clause(&(pp->cs.p_code.ExpandCode),
1329 &(pp->cs.p_code.ExpandCode) + 1, pp,
1331 clcode = pp->cs.p_code.TrueCodeOfPred;
1332 if (pp->PredFlags & IndexedPredFlag) {
1333 if (pp->PredFlags & LogUpdatePredFlag) {
1334 LogUpdIndex *cl = ClauseCodeToLogUpdIndex(clcode);
1335 add_code_in_lu_index(cl, pp);
1337 StaticIndex *cl = ClauseCodeToStaticIndex(clcode);
1338 add_code_in_static_index(cl, pp);
1341 clcode = pp->cs.p_code.FirstClause;
1342 if (clcode != NULL) {
1343 if (pp->PredFlags & LogUpdatePredFlag) {
1348 code_end = (
char *) cl + cl->ClSize;
1349 Yap_inform_profiler_of_clause(cl, code_end, pp,
1350 GPROF_INIT_LOG_UPD_CLAUSE);
1352 }
while (cl != NULL);
1353 }
else if (pp->PredFlags & DynamicPredFlag) {
1358 cl = ClauseCodeToDynamicClause(clcode);
1359 code_end = (CODEADDR) cl + cl->ClSize;
1360 Yap_inform_profiler_of_clause(cl, code_end, pp,
1361 GPROF_INIT_DYNAMIC_CLAUSE);
1362 if (clcode == pp->cs.p_code.LastClause)
1364 clcode = NextDynamicClause(clcode);
1371 code_end = (
char *) cl + cl->ClSize;
1372 Yap_inform_profiler_of_clause(cl, code_end, pp,
1373 GPROF_INIT_STATIC_CLAUSE);
1374 if (cl->ClCode == pp->cs.p_code.LastClause)
1383void Yap_dump_code_area_for_profiler(
void) {
1389 while (pp != NULL) {
1400 add_code_in_pred(pp);
1401 pp = pp->NextPredOfModule;
1405 Yap_inform_profiler_of_clause(
1406 COMMA_CODE, FAILCODE, RepPredProp(Yap_GetPredPropByFunc(FunctorComma, 0 )),
1408 Yap_inform_profiler_of_clause(FAILCODE, FAILCODE + 1,
1409 RepPredProp(Yap_GetPredPropByAtom(AtomFail, 0)),
1415static Term BuildActivePred(
PredEntry *ap, CELL *vect) {
1419 if (!ap->ArityOfPE) {
1420 return MkAtomTerm((
Atom) ap->FunctorOfPred);
1422 for (i = 0; i < ap->ArityOfPE; i++) {
1423 Term t = Deref(vect[i]);
1425 CELL *pt = VarOfTerm(t);
1428 Term nt = MkVarTerm();
1433 return Yap_MkApplTerm(ap->FunctorOfPred, ap->ArityOfPE, vect);
1439 return find_code_in_clause(pe, ipc, NULL, NULL);
1442static Int env_info(USES_REGS1) {
1443 CELL *env = LCL0 - IntegerOfTerm(Deref(ARG1));
1449 env_b = MkIntegerTerm((Int) (LCL0 - (CELL *) env[E_CB]));
1450 env_cp = (
yamop *) env[E_CP];
1453 taddr = MkIntegerTerm((Int) env);
1454 return Yap_unify(ARG3, MkIntegerTerm((Int) env_cp)) &&
1455 Yap_unify(ARG2, taddr) && Yap_unify(ARG4, env_b);
1458static Int p_cpc_info(USES_REGS1) {
1460 yamop *ipc = (
yamop *) IntegerOfTerm(Deref(ARG1));
1462 pe = PREVOP(ipc, Osbpp)->y_u.Osbpp.p0;
1463 return UnifyPredInfo(pe, 2 PASS_REGS) &&
1464 Yap_unify(ARG5, MkIntegerTerm(ClauseId(ipc, pe)));
1471 yamop *ipc = cptr->cp_ap;
1476 op_numbers opnum = Yap_op_from_opcode(ipc->opc);
1480 case _table_load_answer:
1481#ifdef LOW_LEVEL_TRACER
1482 pe = LOAD_CP(cptr)->cp_pred_entry;
1488 case _table_try_answer:
1489 case _table_retry_me:
1490 case _table_trust_me:
1493 case _table_completion:
1494#ifdef THREADS_CONSUMER_SHARING
1495 case _table_answer_resolution_completion:
1497#ifdef LOW_LEVEL_TRACER
1498#ifdef DETERMINISTIC_TABLING
1499 if (IS_DET_GEN_CP(cptr)) {
1500 pe = DET_GEN_CP(cptr)->cp_pred_entry;
1505 pe = GEN_CP(cptr)->cp_pred_entry;
1506 t = BuildActivePred(pe, (CELL *) (GEN_CP(B) + 1));
1513 case _table_answer_resolution:
1514#ifdef LOW_LEVEL_TRACER
1515 pe = CONS_CP(cptr)->cp_pred_entry;
1521 case _trie_trust_var:
1522 case _trie_retry_var:
1523 case _trie_trust_var_in_pair:
1524 case _trie_retry_var_in_pair:
1525 case _trie_trust_val:
1526 case _trie_retry_val:
1527 case _trie_trust_val_in_pair:
1528 case _trie_retry_val_in_pair:
1529 case _trie_trust_atom:
1530 case _trie_retry_atom:
1531 case _trie_trust_atom_in_pair:
1532 case _trie_retry_atom_in_pair:
1533 case _trie_trust_null:
1534 case _trie_retry_null:
1535 case _trie_trust_null_in_pair:
1536 case _trie_retry_null_in_pair:
1537 case _trie_trust_pair:
1538 case _trie_retry_pair:
1539 case _trie_trust_appl:
1540 case _trie_retry_appl:
1541 case _trie_trust_appl_in_pair:
1542 case _trie_retry_appl_in_pair:
1543 case _trie_trust_extension:
1544 case _trie_retry_extension:
1545 case _trie_trust_double:
1546 case _trie_retry_double:
1547 case _trie_trust_longint:
1548 case _trie_retry_longint:
1549 case _trie_trust_gterm:
1550 case _trie_retry_gterm:
1556 case _retry_logical:
1557 case _trust_logical:
1558 case _count_retry_logical:
1559 case _count_trust_logical:
1560 case _profiled_retry_logical:
1561 case _profiled_trust_logical:
1562 ncl = ipc->y_u.OtaLl.d->ClCode;
1563 pe = ipc->y_u.OtaLl.d->ClPred;
1564 t = BuildActivePred(pe, cptr->cp_args);
1567 pe = ipc->y_u.Osblp.p0;
1569 t = Yap_MkNewApplTerm(FunctorOr, 2);
1574 pe = ipc->y_u.Osblp.p0;
1579 t = Yap_MkNewApplTerm(FunctorOr, 2);
1586 ipc = NEXTOP(ipc, l);
1588 ncl = ipc->y_u.Otapl.d;
1599 ncl = NEXTOP(ipc, OtapFs);
1600 pe = ipc->y_u.OtapFs.p;
1601 t = BuildActivePred(pe, cptr->cp_args);
1603 case _retry_profiled:
1607 ncl = ipc->y_u.Otapl.d;
1608 ipc = NEXTOP(ipc, p);
1613 case _count_retry_me:
1614 case _count_trust_me:
1615 case _profiled_retry_me:
1616 case _profiled_trust_me:
1617 case _retry_and_mark:
1618 case _profiled_retry_and_mark:
1622 ncl = ipc->y_u.Otapl.d;
1623 pe = ipc->y_u.Otapl.p;
1624 t = BuildActivePred(pe, cptr->cp_args);
1627 case _retry_all_exo:
1630 t = BuildActivePred(pe, cptr->cp_args);
1635 pe = RepPredProp(PredPropByAtom(at, CurrentModule));
1650static Int p_choicepoint_info(USES_REGS1) {
1657 pe = choicepoint_owner(cptr, &t, &ncl);
1658 return UnifyPredInfo(pe, 3 PASS_REGS);
1661static int hidden(
Atom);
1663static int legal_env(CELL *CACHE_TYPE);
1665#define ONLOCAL(ptr) \
1666 (CellPtr(ptr) > CellPtr(HR) && CellPtr(ptr) < CellPtr(LOCAL_LocalBase))
1668static int hidden(
Atom at) {
1671 READ_LOCK(INVISIBLECHAIN.AERWLock);
1672 chain = RepAtom(INVISIBLECHAIN.Entry);
1673 while (!EndOfPAEntr(chain) && AbsAtom(chain) != at)
1674 chain = RepAtom(chain->NextOfAE);
1675 READ_UNLOCK(INVISIBLECHAIN.AERWLock);
1676 if (EndOfPAEntr(chain))
1681static int legal_env(CELL *ep USES_REGS) {
1684 if (!ONLOCAL(ep) || Unsigned(ep) & 3)
1689 ps = *((CELL *) (Addr(cp) - CellSize));
1692 if (!ONHEAP(pe) || Unsigned(pe) & 3 || pe->KindOfPE & 0xff00) {
1701static Int program_continuation(USES_REGS1) {
1703 if (pe->ModuleOfPred) {
1704 if (!Yap_unify(ARG1, pe->ModuleOfPred))
1707 if (!Yap_unify(ARG1, TermProlog))
1710 if (pe->ArityOfPE) {
1711 if (!Yap_unify(ARG2, MkAtomTerm(NameOfFunctor(pe->FunctorOfPred))))
1713 if (!Yap_unify(ARG3, MkIntegerTerm(ArityOfFunctor(pe->FunctorOfPred))))
1716 if (!Yap_unify(ARG2, MkAtomTerm((
Atom) pe->FunctorOfPred)))
1718 if (!Yap_unify(ARG3, MkIntTerm(0)))
1724static bool handled_exception(USES_REGS1) {
1725 yamop *pos = NEXTOP(PredCatch->cs.p_code.TrueCodeOfPred, l);
1726 bool found_handler =
false;
1731 yamop *ap = gc_b->cp_ap;
1735 }
else if (ap == pos) {
1738 found_handler =
true;
1743 return !found_handler;
1754#define buf bufp->buf_
1755#define lbuf bufp->lbuf_
1756#define bufsize bufp->bufsize_
1757#define lbufsz bufp->lbufsz_
1760#define ADDBUF(CMD) { \
1763 if (sz < lbufsz-256) { \
1768 char *nbuf = realloc(buf, bufsize += 1024); \
1769 lbuf = nbuf + (lbuf-buf); \
1776static char *ADDSTR(
const char *STR,
struct buf_struct_t *bufp) {
1780 size_t sz = strlen(STR); \
1781 if (sz < lbufsz - 256) {
1790 char *nbuf = realloc(buf, bufsize += 1024); \
1791 lbuf = nbuf + (lbuf - buf); \
1803 int max_count = 200;
1804 int lvl = push_text_stack();
1805 while (b_ptr != NULL) {
1806 while (env_ptr && env_ptr <= (CELL *)b_ptr) {
1808 if (env_ptr == (CELL *)b_ptr && (
choiceptr)env_ptr[E_CB] > b_ptr) {
1809 b_ptr = b_ptr->cp_b;
1810 ADDBUF(snprintf(lbuf, lbufsz ,
"%% %s\n", tp));
1812 ADDBUF(snprintf(lbuf, lbufsz ,
"%% %s\n", tp));
1815 ADDBUF(snprintf(lbuf, lbufsz ,
"%% .....\n"));
1816 return pop_output_text_stack(lvl, buf);
1818 ipc = (
yamop *)(env_ptr[E_CP]);
1819 env_ptr = (CELL *)(env_ptr[E_E]);
1823 ADDBUF(snprintf(lbuf, lbufsz ,
"// .....\n"));
1824 return pop_output_text_stack(lvl, buf);
1827 b_ptr->cp_ap->opc != Yap_opcode(_or_else) &&
1828 b_ptr->cp_ap->opc != Yap_opcode(_or_last) &&
1829 b_ptr->cp_ap->opc != Yap_opcode(_Nstop)) {
1832 ADDBUF(snprintf(lbuf, lbufsz ,
"%% %s (%luKB--%luKB)\n!!!", tp,
1833 (
unsigned long int)((b_ptr->cp_h - H0) *
sizeof(CELL) / 1024),
1834 (
unsigned long int)((ADDR)LCL0 - (ADDR)b_ptr) / 1024));
1836 b_ptr = b_ptr->cp_b;
1842const char *Yap_dump_stack(
void) {
1844 int lvl = push_text_stack();
1849 lbufsz = bufsize - 256;
1854 ADDBUF(snprintf(lbuf, lbufsz,
1855 "%% YAP regs: P=%p, CP=%p, ASP=%p, H=%p, TR=%p, HeapTop=%p\n", P,
1856 CP, ASP, HR, TR, HeapTop));
1858 ADDSTR(
"%% \n%% =====================================\n%%\n", bufp);
1859 ADDSTR(
"%% \n%% YAP Status:\n", bufp);
1860 ADDSTR(
"%% \n%% -------------------------------------\n%%\n", bufp);
1861 yap_error_number errnbr = LOCAL_Error_TYPE;
1862 yap_error_class_number classno = Yap_errorClass(errnbr);
1864 ADDBUF(snprintf(lbuf, lbufsz,
"%% Error STATUS: %s/%s\n\n", Yap_errorName(errnbr),
1865 Yap_errorClassName(classno)));
1867 ADDSTR(
"%% Execution mode\n", bufp);
1868 if (LOCAL_PrologMode & BootMode)
1869 ADDSTR(
"%% Bootstrap\n", bufp);
1870 if (LOCAL_PrologMode & UserMode)
1871 ADDSTR(
"%% User Prologg\n", bufp);
1872 if (LOCAL_PrologMode & CritMode)
1873 ADDSTR(
"%% Exclusive Access Mode\n", bufp);
1874 if (LOCAL_PrologMode & AbortMode)
1875 ADDSTR(
"%% Abort\n", bufp);
1876 if (LOCAL_PrologMode & InterruptMode)
1877 ADDSTR(
"%% Interrupt\n", bufp);
1878 if (LOCAL_PrologMode & InErrorMode)
1879 ADDSTR(
"%% Error\n", bufp);
1880 if (LOCAL_PrologMode & ConsoleGetcMode)
1881 ADDSTR(
"%% Prompt Console\n", bufp);
1882 if (LOCAL_PrologMode & ExtendStackMode)
1883 ADDSTR(
"%% Stack expansion \n", bufp);
1884 if (LOCAL_PrologMode & GrowHeapMode)
1885 ADDSTR(
"%% Data Base Expansion\n", bufp);
1886 if (LOCAL_PrologMode & GrowStackMode)
1887 ADDSTR(
"%% User Prolog\n", bufp);
1888 if (LOCAL_PrologMode & GCMode)
1889 ADDSTR(
"%% Garbage Collection\n", bufp);
1890 if (LOCAL_PrologMode & ErrorHandlingMode)
1891 ADDSTR(
"%% Error handler\n", bufp);
1892 if (LOCAL_PrologMode & CCallMode)
1893 ADDSTR(
"%% System Foreign Code\n", bufp);
1894 if (LOCAL_PrologMode & UnifyMode)
1895 ADDSTR(
"%% Off-line Foreign Code\n", bufp);
1896 if (LOCAL_PrologMode & UserCCallMode)
1897 ADDSTR(
"%% User Foreig C\n", bufp);
1898 if (LOCAL_PrologMode & MallocMode)
1899 ADDSTR(
"%% Heap Allocaror\n", bufp);
1900 if (LOCAL_PrologMode & SystemMode)
1901 ADDSTR(
"%% Prolog Internals\n", bufp);
1902 if (LOCAL_PrologMode & AsyncIntMode)
1903 ADDSTR(
"%% Async Interruot mode\n", bufp);
1904 if (LOCAL_PrologMode & InReadlineMode)
1905 ADDSTR(
"%% Readline Console\n", bufp);
1906 if (LOCAL_PrologMode & TopGoalMode)
1907 ADDSTR(
"%% Creating new query\n", bufp);
1909 ADDSTR(
"%% \n%% -------------------------------------\n%%\n", bufp);
1910 ADDSTR(
"%% \n%% YAP Program:\n", bufp);
1911 ADDSTR(
"%% \n%% -------------------------------------\n%%\n", bufp);
1912 ADDBUF(snprintf(lbuf, lbufsz,
"%% Program Position: %s\n\n", Yap_errorName(errno)));
1914 ADDBUF(snprintf(lbuf, lbufsz,
"%% PC: %s\n", o));
1916 ADDBUF(snprintf(lbuf, lbufsz,
"%% Continuation: %s\n", o));
1918 ADDBUF(snprintf(lbuf, lbufsz,
"%% Alternative: %s\n", o));
1920 ADDSTR(
"%% \n%% -------------------------------------\n%%\n", bufp);
1921 ADDSTR(
"%% \n%% YAP Stack Usage:\n", bufp);
1922 ADDSTR(
"%% \n%% -------------------------------------\n%%\n", bufp);
1923 if (HR > ASP || HR > LCL0) {
1924 ADDBUF(snprintf(lbuf, lbufsz,
"%% YAP ERROR: Global Collided against Local (%p--%p)\n",
1926 }
else if (HeapTop > (ADDR) LOCAL_GlobalBase) {
1927 ADDBUF(snprintf(lbuf, lbufsz,
1928 "%% YAP ERROR: Code Space Collided against Global (%p--%p)\n",
1929 HeapTop, LOCAL_GlobalBase));
1931#if !USE_SYSTEM_MALLOC
1932 ADDBUF(snprintf(lbuf, lbufsz,
"%%ldKB of Code Space (%p--%p)\n",
1933 (
long int) ((CELL) HeapTop - (CELL) Yap_HeapBase) / 1024, Yap_HeapBase,
1936 if (Yap_NOfMemoryHoles) {
1939 for (i = 0; i < Yap_NOfMemoryHoles; i++)
1940 ADDBUF(snprintf(lbuf, lbufsz ,
" Current hole: %p--%p\n", Yap_MemoryHoles[i].start,
1941 Yap_MemoryHoles[i].end));
1945 ADDBUF(snprintf(lbuf, lbufsz,
"%% %luKB of Global Stack (%p--%p)\n",
1946 (
unsigned long int) (
sizeof(CELL) * (HR - H0)) / 1024, H0, HR));
1947 ADDBUF(snprintf(lbuf, lbufsz,
"%% %luKB of Local Stack (%p--%p)\n",
1948 (
unsigned long int) (
sizeof(CELL) * (LCL0 - ASP)) / 1024, ASP, LCL0));
1949 ADDBUF(snprintf(lbuf, lbufsz,
"%% %luKB of Trail (%p--%p)\n",
1950 (
unsigned long int) ((ADDR) TR - LOCAL_TrailBase) / 1024,
1951 LOCAL_TrailBase, TR));
1952 ADDBUF(snprintf(lbuf, lbufsz,
"%% Performed %ld garbage collections\n",
1953 (
unsigned long int) LOCAL_GcCalls));
1956 extern unsigned long long vsc_count;
1959 ADDBUF(snprintf(lbuf, lbufsz ,
"Trace Counter at %I64d\n", vsc_count));
1961 ADDBUF(snprintf(lbuf, lbufsz,
"Trace Counter at %lld\n", vsc_count));
1966 ADDSTR(
"%% \n%% -------------------------------------\n%%\n", bufp);
1967 ADDSTR(
"%% \n%% YAP Stack:\n", bufp);
1968 ADDSTR(
"%% \n%% -------------------------------------\n%%\n", bufp);
1969 ADDSTR(
"%% All Active Calls and\n", bufp);
1970 ADDSTR(
"%% Goals With Alternatives Open (Global In "
1971 "Use--Local In Use)\n%%\n", bufp);
1973 return pop_output_text_stack(lvl, buf);
1977static bool outputep(CELL *ep,
struct buf_struct_t *bufp) {
1979 if (!ONLOCAL(ep) || (Unsigned(ep) & (
sizeof(CELL) - 1)))
1983 f = pe->FunctorOfPred;
1984 if (pe->KindOfPE && hidden(NameOfFunctor(f))) {
1987 Term mod = pe->ModuleOfPred;
1988 if (mod == PROLOG_MODULE)
1990 arity_t arity = ArityOfFunctor(f);
1993 ADDSTR(RepAtom(AtomOfTerm(mod))->StrOfAE, bufp);
1995 ADDSTR(RepAtom(((
Atom) f))->StrOfAE, bufp);
1998 Atom At = NameOfFunctor(f);
1999 ADDBUF(snprintf(lbuf, lbufsz,
"%s(", RepAtom(At)->StrOfAE));
2000 for (i = 0; i < arity; i++) {
2001 if (i > 0) ADDSTR(
"...,", bufp);
2003 ADDSTR(
"...)", bufp);
2010 ADDBUF(snprintf(lbuf, lbufsz,
"%% %p ", cp));
2011 op_numbers opnum = Yap_op_from_opcode(b_ptr->cp_ap->opc);
2012 if (opnum == _Nstop) {
2013 bool rc = outputep((CELL *) cp, bufp);
2014 ADDSTR(
" ********** C-Code Interface Boundary ***********\n", bufp);
2018 Term mod = PROLOG_MODULE;
2020 f = pe->FunctorOfPred;
2021 if (pe->ModuleOfPred)
2022 mod = pe->ModuleOfPred;
2025 if (mod != TermProlog && mod != MkAtomTerm(AtomUser)) {
2026 ADDBUF(snprintf(lbuf, lbufsz,
"%s:", RepAtom(AtomOfTerm(mod))->StrOfAE));
2028 if (mod == IDB_MODULE) {
2029 if (pe->PredFlags & NumberDBPredFlag) {
2030 Term t = MkIntegerTerm(pe->src.IndxId);
2031 char *b = Yap_TermToBuffer(t, 0);
2035 }
else if (pe->PredFlags & AtomDBPredFlag) {
2036 Atom At = (
Atom) pe->FunctorOfPred;
2037 ADDSTR(RepAtom(At)->StrOfAE, bufp);
2039 Functor f = pe->FunctorOfPred;
2040 arity_t arity = ArityOfFunctor(f);
2043 ADDBUF(snprintf(lbuf, lbufsz,
"%s(", RepAtom((
Atom) f)->StrOfAE));
2044 for (i = 0; i < arity; i++) {
2045 if (i > 0) ADDSTR(
"_,", bufp);
2047 ADDSTR(
"), ", bufp);
2049 char *b = Yap_TermToBuffer(b_ptr->cp_a2, 0);
2053 ADDSTR(
",_)", bufp);
2055 ADDSTR(RepAtom((
Atom) f)->StrOfAE, bufp);
2056 if (pe->ArityOfPE == 0) {
2057 Int i = 0, arity = pe->ArityOfPE;
2058 if (opnum == _or_last || opnum == _or_else) {
2071 Term *args = &(b_ptr->cp_a1);
2072 ADDBUF(snprintf(lbuf, lbufsz,
"%s(", RepAtom(NameOfFunctor(pe->FunctorOfPred))->StrOfAE));
2073 for (i = 0; i < arity; i++) {
2077 char *b = Yap_TermToBuffer(args[i], 0);
2090char *DumpActiveGoals(USES_REGS1) {
2095 int lvl = push_text_stack();
2101 lbufsz = bufsize - 256;
2102 if (legal_env(YENV PASS_REGS) && YENV < ENV)
2104 else if (legal_env(ENV PASS_REGS))
2107 if (!ONHEAP(cp) || (Unsigned(cp) & (
sizeof(CELL) - 1)))
2110 if (pe->KindOfPE & 0xff00) {
2116 pe = choicepoint_owner(p, NULL, NULL);
2121 ep = (
void *) e[E_E];
2126 pe = EnvPreg((
yamop *) e);
2127 if (!outputep(e, bufp))
2129 ep = (
void *) e[E_E];
2132 return pop_output_text_stack(lvl, buf);
2135char *DumpStack(USES_REGS1) {
2136 char *s = DumpActiveGoals(PASS_REGS1);
2156 snprintf(o, 255,
"%% %s",
"meta-call");
2158 pred_arity = pred->ArityOfPE;
2159 pred_module = pred->ModuleOfPred;
2160 pred_name = NameOfPred(pred);
2161 if (pred_module == 0) {
2162 snprintf(o, 255,
"in prolog:%s/%lu", RepAtom(pred_name)->StrOfAE,
2163 (
unsigned long int) pred_arity);
2164 }
else if (cl < 0) {
2165 snprintf(o, 255,
"%% %s:%s/%lu", RepAtom(AtomOfTerm(pred_module))->StrOfAE,
2166 RepAtom(pred_name)->StrOfAE, (
unsigned long int) pred_arity);
2168 snprintf(o, 255,
"%% %s:%s/%lu at clause %lu",
2169 RepAtom(AtomOfTerm(pred_module))->StrOfAE,
2170 RepAtom(pred_name)->StrOfAE, (
unsigned long int) pred_arity,
2171 (
unsigned long int) cl);
2180 if (pe->ModuleOfPred == PROLOG_MODULE)
2181 p->prologPredModule = AtomName(AtomProlog);
2183 p->prologPredModule = AtomName(AtomOfTerm(pe->ModuleOfPred));
2185 p->prologPredName = AtomName(NameOfFunctor(pe->FunctorOfPred));
2187 p->prologPredName = AtomName((
Atom) (pe->FunctorOfPred));
2188 p->prologPredArity = pe->ArityOfPE;
2189 p->prologPredFile = AtomName(pe->src.OwnerFile);
2190 p->prologPredLine = 0;
2191 if (pe->src.OwnerFile) {
2192 if (pe->PredFlags & MegaClausePredFlag) {
2194 mcl = ClauseCodeToMegaClause(pe->cs.p_code.FirstClause);
2195 p->prologPredLine = mcl->ClLine;
2198 if (find_code_in_clause(pe, codeptr, &clcode, NULL) > 0) {
2199 if (pe->PredFlags & LogUpdatePredFlag) {
2202 if (cl->ClFlags & FactMask) {
2203 p->prologPredLine = cl->lusl.ClSource->ag.line_number;
2205 }
else if (pe->PredFlags & DynamicPredFlag) {
2207 p->prologPredLine = 0;
2212 if (cl->ClFlags & FactMask) {
2213 p->prologPredLine = MkIntTerm(cl->usc.ClLine);
2214 }
else if (cl->ClFlags & SrcMask) {
2215 p->prologPredLine = cl->usc.ClSource->ag.line_number;
2217 p->prologPredLine = 0;
2220 p->prologPredLine = 0;
2223 }
else if (pe->OpcodeOfPred == UNDEF_OPCODE) {
2224 p->prologPredFile =
"undefined";
2227 p->prologPredFile = AtomName(AtomUserIn);
2228 p->prologPredLine = 0;
2234 void *pc0,
void *b_ptr0,
2251 return add_bug_location(t, xc, pe);
2257 void *cp0,
void *b_ptr0,
2258 void *env0, YAP_Int ignore_first) {
2263 if (b_ptr == NULL || env == NULL)
2268 if (ignore_first <= 0 &&
2271 && !(pe->PredFlags & HiddenPredFlag)) {
2272 return add_bug_location(t, cp, pe);
2274 if (NULL && b_ptr && b_ptr->cp_env < env) {
2276 env = b_ptr->cp_env;
2277 b_ptr = b_ptr->cp_b;
2279 cp = (
yamop *) env[E_CP];
2280 env = ENV_Parent(env);
2316parent_pred(USES_REGS1) {
2324 return UnifyPredInfo(pe, 2);
2327static Int clause_location(USES_REGS1) {
2330 return Yap_unify(mkloc(Yap_pc_add_location(&t, P, B, ENV)), ARG1) &&
2331 Yap_unify(mkloc(Yap_env_add_location(&t, CP, B, ENV, 1)), ARG2);
2334 static Int ancestor_location(USES_REGS1) {
2337 return Yap_unify(mkloc(Yap_env_add_location(&t, CP, B, ENV, 2)), ARG2) &&
2338 Yap_unify(mkloc(Yap_env_add_location(&t, CP, B, ENV, 3)), ARG2);
2342static int Yap_DebugDepthMax = 4;
2344void ShowTerm(Term *tp,
int depth) {
2345 if (depth == Yap_DebugDepthMax)
return;
2348 fprintf(stderr,
"R%ld", tp - HR);
2349 if (t == *(CELL *) t) fprintf(stderr,
"->V ");
2351 fprintf(stderr,
"->");
2352 ShowTerm((CELL *) t, depth);
2354 }
else if (IsAtomTerm(t)) {
2355 fprintf(stderr,
"A:%ld(%s) ", tp - HR, RepAtom(AtomOfTerm(t))->StrOfAE);
2356 }
else if (IsIntTerm(t)) {
2357 fprintf(stderr,
"I:%ld(%ld) ", tp - HR, IntOfTerm(t));
2358 }
else if (IsPairTerm(t)) {
2359 fprintf(stderr,
"A:%ld([...]) ", tp - HR);
2360 fprintf(stderr,
"\n%*c", depth << 2,
' ');
2361 ShowTerm(RepPair(t), depth + 1);
2362 fprintf(stderr,
"\n%*c", depth << 2,
' ');
2363 ShowTerm(RepPair(t) + 1, depth + 1);
2365 fprintf(stderr,
"A:%ld(%lx) ", tp - HR, *RepAppl(t));
2366 if (!IsVarTerm(*RepAppl(t)))
return;
2368 arity_t n = ArityOfFunctor(f);
2370 fprintf(stderr,
"\n%*c", depth << 2,
' ');
2371 if (IsExtensionFunctor(f)) Yap_DebugPlWriteln(t);
2374 fprintf(stderr,
"\n%*c", depth << 2,
' ');
2375 fprintf(stderr,
"%s/%ld\n", RepAtom(NameOfFunctor(f))->StrOfAE, n);
2376 for (i = 0; i < n; i++) {
2377 fprintf(stderr,
"\n%*c", depth << 2,
' ');
2378 ShowTerm(RepPair(t) + (i + 1), depth + 1);
2385void Yap_ShowTerm(Term t) {
2387 ShowTerm(HR - 1, 0);
2394#define NOGC(t) (t & ~(MBIT|RBIT))
2397static void line(
int c,
bool hid,
int lvl,
void *src,
void *tgt,
const char s0[],
const char s[]) {
2398 fprintf(stderr,
"%c %c%p%*c %s%s\n", c, hid ?
'*' :
' ', src, lvl,
' ', s0, s);
2401static void entry(
int c,
bool hid,
int lvl,
void *src,
void *tgt,
const char is0[],
char is[]) {
2406 Term t = NOGC(*(CELL*)tgt);
2408 CELL *v = (CELL *) t;
2409 if (
false && IsAttVar(v)) {
2410 fputs(
"ATT V:\n", stderr);
2414 if (t == (CELL) v) {
2420 sprintf(s+strlen(s),
"_H%ld\n", v - (CELL*)tgt);
2422 sprintf(s+strlen(s),
"_L%ld\n", v-(CELL*)tgt);
2423 line(c, hid, lvl, v, v, s0, s);
2424 }
else if (IsAtomTerm(t)) {
2425 sprintf(s+strlen(s),
"%s", RepAtom(AtomOfTerm(t))->StrOfAE);
2426 line(c, hid, lvl, tgt, tgt,
"at=", s);
2427 }
else if (IsIntTerm(t)) {
2429 sprintf(s+strlen(s),
"%ld", IntOfTerm(t));
2430 line(c, hid, lvl, tgt, tgt,
"int=", s);
2431 }
else if (IsApplTerm(t)) {
2433 if (IsExtensionFunctor(f)) {
2434 line(c, hid, lvl, tgt, RepAppl(t),
"( blob )",
"");
2436 CELL *v = RepAppl(t);
2437 sprintf(s+strlen(s),
"%ld\n", v - (CELL*)tgt);
2438 line(c, hid, lvl, tgt, tgt,
"appl=", s);
2440 CELL *v = RepPair(t);
2441 sprintf(s+strlen(s),
"%ld\n", v - (CELL*)tgt);
2442 line(c, hid, lvl, tgt, tgt,
"list=", s);
2446void pp__(Term *tp,
int lvl,
char *s0,
char *s) {
2450 Term t = NOGC(tp[0]);
2452 s[10] = s0[0] =
'\0';
2453 if (t == *tp) c =
'G';
2455 if (IsPairTerm(t)) {
2463 entry(c, hid, lvl, tp, RepPair(t),
"",
"[");
2464 entry(c, hid, lvl, tp, RepPair(t)+1,
"",
"]");
2465 pp__(RepPair(t), lvl + 2, s0, s);
2466 pp__(RepPair(t) + 1, lvl + 2, s0, s);
2469 if (IsPairTerm((CELL) f)) {
2474 if (!IsExtensionFunctor(f)) {
2475 arity_t a = ArityOfFunctor(f);
2476 snprintf(s, 4095,
"%s/%ld(", RepAtom(NameOfFunctor(f))->StrOfAE, a);
2477 for (i = 1; i < a; i++) {
2478 entry(c, hid, lvl, tp, RepPair(t)+i,
"",
"");
2480 entry(c, hid, lvl, tp,RepPair(t)+i ,
"",
")");
2481 for (i = 1; i <= a; i++) {
2482 pp__(RepAppl(t) + i, lvl + 2, s0, s);
2489 char *s = malloc(4096), *s0 = malloc(4096);
2496static bool JumpToEnv(USES_REGS1) {
2503 if (LOCAL_PrologMode & AsyncIntMode) {
2504 Yap_signal(YAP_FAIL_SIGNAL);
2518 LOCAL_DoingUndefp =
false;
2520 if ( B->cp_ap->y_u.Otapl.p == PredCatch &&
2521 LOCAL_ActiveError->errorNo != ABORT_EVENT) {
2524 if (B->cp_ap == NOCODE) {
2542bool Yap_JumpToEnv(
void ) {
2546 JumpToEnv(PASS_REGS);
2550static Int yap_throw(USES_REGS1) {
2553 if (t == TermDAbort)
2554 Yap_ThrowError( ABORT_EVENT, TermDAbort, NULL);
2556 Yap_ThrowError(INSTANTIATION_ERROR, t,
2557 "throw/1 must be called instantiated");
2559 memset(LOCAL_ActiveError, 0,
sizeof(
yap_error_descriptor_t));
if (IsApplTerm(t) && FunctorOfTerm(t) == FunctorError) {
2560 Term t2 = ArgOfTerm(2,t);
2561 if (IsVarTerm(t2)) {
2562 LOCAL_ActiveError->errorUserTerm = ARG1;
2565 t = Yap_MkPrologError(t,NULL);
2567 LOCAL_ActiveError->errorNo = USER_DEFINED_EVENT;
2568 LOCAL_ActiveError->errorUserTerm = Yap_SaveTerm(t);
2569 t = Yap_MkPrologError(t,NULL);
2575void Yap_InitStInfo(
void) {
2577 Term cm = CurrentModule;
2579 Yap_InitCPred(
"throw", 1, yap_throw,
2580 TestPredFlag | SafePredFlag | SyncPredFlag);
2581 Yap_InitCPred(
"in_use", 2, in_use,
2582 HiddenPredFlag | TestPredFlag | SafePredFlag | SyncPredFlag);
2584 Yap_InitCPred(
"toggle_static_predicates_in_use", 0,
2585 toggle_static_predicates_in_use,
2586 HiddenPredFlag | SafePredFlag | SyncPredFlag);
2588 CurrentModule = HACKS_MODULE;
2589 Yap_InitCPred(
"current_choice_points", 1, p_all_choicepoints, 0);
2590 Yap_InitCPred(
"current_continuations", 1, p_all_envs, 0);
2591 Yap_InitCPred(
"choicepoint", 7, p_choicepoint_info, 0);
2592 Yap_InitCPred(
"continuation", 4, env_info, 0);
2593 Yap_InitCPred(
"cp_to_predicate", 5, p_cpc_info, 0);
2595 Yap_InitCPred(
"current_stack", 1, current_stack, HiddenPredFlag);
void * Malloc(size_t sz USES_REGS)
allocate a temporary text block
PredEntry * Yap_PredForCode(yamop *codeptr, find_pred_type hint, Int *cl)
given an arbitrary code point codeptr search the database for the owner predicate pp identifying the ...
PredEntry * Yap_PredForChoicePt(choiceptr cp, op_numbers *op)
Yap_v<<ChoicePt(): find out the predicate who generated a CP.
char * Yap_output_bug_location(yamop *yap_pc, int where_from, int psize)
Used for debugging.
Module property: low-level data used to manage modes.
struct mod_entry * NextME
Module local flags (from SWI compat)
struct pred_entry * PredForME
kind of property
all we need to know about an error/throw