19static char SccsId[] =
"@(#)cdmgr.c 1.1 05/02/98";
34static bool EnterCreepMode(Term, Term CACHE_TYPE);
36static Int current_choice_point(USES_REGS1);
38static Int execute(USES_REGS1);
40static Int execute0(USES_REGS1);
42static Term cp_as_integer(
choiceptr cp USES_REGS)
44 return (MkIntegerTerm(LCL0 - (CELL *)cp));
47static choiceptr cp_from_integer(Term cpt USES_REGS)
49 return (
choiceptr)(LCL0 - IntegerOfTerm(cpt));
65PredEntry *Yap_track_cpred(op_numbers op,
yamop *ip,
size_t min,
void *v)
71 CalculateStackGap(PASS_REGS1);
72 i->gc_min = 2 * MinStackGap;
73 yamop *ip0 = PREVOP(ip, Osbpp);
76 op_numbers op1 = Yap_op_from_opcode(ip0->opc);
78 if (op1 == _call_cpred || op1 == _call_usercpred)
82 op = Yap_op_from_opcode(ip->opc);
86 else if (ip->opc == Yap_opcode(op))
95 i->p_env = NEXTOP(ip, Osbpp);
96 i->a = i->p->y_u.Osbpp.p->ArityOfPE;
97 i->env_size = -i->p->y_u.Osbpp.s /
sizeof(CELL);
98 i->callee = i->p->y_u.Osbpp.p;
99 return i->p->y_u.Osbpp.p0;
101 case _call_usercpred:
103 i->p_env = NEXTOP(ip0, Osbpp);
104 i->a = ip0->y_u.Osbpp.p->ArityOfPE;
106 i->env_size = -ip0->y_u.Osbpp.s /
sizeof(CELL);
107 i->callee = i->p->y_u.Osbpp.p;
108 return ip0->y_u.Osbpp.p0;
112 i->a = ip0->y_u.Osbpp.p->ArityOfPE;
116 i->env_size = -ip0->y_u.Osbpp.s /
sizeof(CELL);
117 i->callee = i->p->y_u.Osbpp.p;
118 return ip0->y_u.Osbpp.p0;
121 i->a = P->y_u.Osbpp.p->ArityOfPE;
122 i->p_env = NEXTOP(ip, Osbpp);
125 i->env_size = EnvSizeInCells;
126 i->callee = i->p->y_u.Osbpp.p;
127 return ip->y_u.Osbpp.p0;
133 i->a = i->p->y_u.OtapFs.s + i->p->y_u.OtapFs.extra;
136 i->env_size = EnvSizeInCells;
144 i->env_size = EnvSizeInCells;
151 i->a = P->y_u.Osbpa.p->ArityOfPE;
152 i->op = _ensure_space;
153 i->env_size = EnvSizeInCells;
161 i->op = _p_func2s_vv;
162 i->env_size = -NEXTOP(P, xxx)->y_u.Osbpp.s /
sizeof(CELL);
170 i->op = _p_func2s_vc;
171 i->env_size = -NEXTOP(P, xxc)->y_u.Osbpp.s /
sizeof(CELL);
179 i->op = _p_func2s_cv;
180 i->env_size = -NEXTOP(P, xxn)->y_u.Osbpp.s /
sizeof(CELL);
188 i->op = _p_func2s_y_vv;
189 i->env_size = -NEXTOP(P, yxx)->y_u.Osbpp.s /
sizeof(CELL);
196 i->op = _p_func2s_y_vc;
197 i->env_size = -NEXTOP(P, yxc)->y_u.Osbpp.s /
sizeof(CELL);
205 i->op = _p_func2s_y_cv;
206 i->env_size = -NEXTOP(P, yxn)->y_u.Osbpp.s /
sizeof(CELL);
215 i->env_size = -NEXTOP(P, yxx)->y_u.Osbpp.s /
sizeof(CELL);
224 i->env_size = EnvSizeInCells;
238 yamop *code USES_REGS)
240#ifdef LOW_LEVEL_TRACER
241 if (Yap_do_low_level_trace)
242 low_level_trace(enter_pred, pen, XREGS + 1);
245 if (DEPTH <= MkIntTerm(1))
247 if (pen->ModuleOfPred)
249 if (DEPTH == MkIntTerm(0))
255 DEPTH = RESET_DEPTH();
258 else if (pen->ModuleOfPred)
259 DEPTH -= MkIntConstant(2);
261 if (P->opc != EXECUTE_CPRED_OP_CODE)
274 YENV[E_CB] = (CELL)cut_pt;
285inline static bool CallMetaCall(Term t, Term mod USES_REGS)
290 ARG2 = cp_as_integer(B PASS_REGS);
300 if (Yap_GetGlobal(AtomDebugMeta) == TermOn)
302 return CallPredicate(PredTraceMetaCall, B,
303 PredTraceMetaCall->CodeOfPred PASS_REGS);
307 return CallPredicate(PredMetaCall, B, PredMetaCall->CodeOfPred PASS_REGS);
316Term Yap_ExecuteCallMetaCall(Term g, Term mod)
321 ts[1] = cp_as_integer(B PASS_REGS);
324 if (Yap_GetGlobal(AtomDebugMeta) == TermOn)
326 return Yap_MkApplTerm(PredTraceMetaCall->FunctorOfPred, 3, ts);
328 return Yap_MkApplTerm(PredMetaCall->FunctorOfPred, 4, ts);
331Term Yap_PredicateIndicator(Term t, Term mod)
336 t = Yap_YapStripModule(t, &mod);
337 if (IsApplTerm(t) && !IsExtensionFunctor(FunctorOfTerm(t)))
339 ti[0] = MkAtomTerm(NameOfFunctor(FunctorOfTerm(t)));
340 ti[1] = MkIntegerTerm(ArityOfFunctor(FunctorOfTerm(t)));
342 else if (IsPairTerm(t))
344 ti[0] = MkAtomTerm(AtomDot);
345 ti[1] = MkIntTerm(2);
350 ti[1] = MkIntTerm(0);
352 t = Yap_MkApplTerm(FunctorSlash, 2, ti);
353 if (mod != CurrentModule)
357 return Yap_MkApplTerm(FunctorModule, 2, ti);
362static bool CallError(yap_error_number err, Term t, Term mod USES_REGS)
364 if (err == TYPE_ERROR_CALLABLE)
366 t = Yap_YapStripModule(t, &mod);
368 Yap_ThrowError(err, t,
"call/1");
380static Int current_choice_point(USES_REGS1)
382 Term t = Deref(ARG1);
385 register CELL *HBREG = HB;
390 while (b && b->cp_ap == TRUSTFAILCODE && b->cp_b)
392 td = cp_as_integer(b PASS_REGS);
393 YapBind((CELL *)t, td);
397static Int save_env_b(USES_REGS1)
399 Term t = Deref(ARG1);
402 register CELL *HBREG = HB;
406 td = cp_as_integer((
choiceptr)YENV[E_CB] PASS_REGS);
407 YapBind((CELL *)t, td);
412bool comma_goal(Term t1, Term t0[4],
bool first) {
413 Term ts[2], m1 = t0[3];
416 CallError(INSTANTIATION_ERROR, t0[0], t0[3] PASS_REGS);
420 t1 = Yap_MkApplTerm(FunctorModule,2,ts);
421 t0[1] = Yap_MkApplTerm(FunctorCall,1,&t1);
425 }
else if (IsAtomTerm(t1)) {
427 if (first) t1 = TermTrue;
432 else if (IsPairTerm(t1)) {
435 ts[1] = (CurrentModule == 0 ? TermProlog : CurrentModule);
436 t0[1] = Yap_MkApplTerm(FunctorCsult, 2, ts);
438 }
else if (IsApplTerm(t1)) {
440 if (f==FunctorComma) {
441 Term l = Yap_YapStripModule(ArgOfTerm(1,t1),t0+3);
442 comma_goal(l, t0, first);
444 t0[2] = ArgOfTerm(2,t1);
446 }
else if (IsExtensionFunctor(f)) {
447 return CallError(TYPE_ERROR_CALLABLE, t0[0], t0[3] PASS_REGS);
455inline static bool do_execute(Term t, Term mod USES_REGS)
463 if (Yap_has_a_signal() && !LOCAL_InterruptsDisabled &&
464 !(LOCAL_PrologMode & (AbortMode | InterruptMode | SystemMode)))
466 return EnterCreepMode(t, mod PASS_REGS);
468 Term t0 = t, mod0 = mod;
469 t = Yap_YapStripModule(t, &mod);
470 if (IsVarTerm(t) || IsVarTerm(mod))
472 return CallError(INSTANTIATION_ERROR, t0, mod0 PASS_REGS);
477 ts[1] = (CurrentModule == 0 ? TermProlog : CurrentModule);
478 t = Yap_MkApplTerm(FunctorCsult, 2, ts);
482 register Functor f = FunctorOfTerm(t);
483 if (f == FunctorCall) {
494 while((comma = comma_goal((t1=Yap_YapStripModule(t1, ts+3)), ts, first))) {
498 sreg[0]=(CELL)FunctorComma;
508 f = FunctorOfTerm(t);
509 arity = ArityOfFunctor(f);
510 if (arity > MaxTemps)
512 return CallError(TYPE_ERROR_CALLABLE, t0, mod0 PASS_REGS);
514 pen = RepPredProp(PredPropByFunc(f, mod));
521 if (pen->PredFlags & (MetaPredFlag | UndefPredFlag))
523 return CallMetaCall(t0, mod0 PASS_REGS);
526 for (i = 1; i <= arity; i++)
531 XREGS[i] = (CELL)(pt - 1);
539 return CallPredicate(pen, B, pen->CodeOfPred PASS_REGS);
541 else if (IsAtomTerm(t))
544 Atom a = AtomOfTerm(t);
547 pen = RepPredProp(PredPropByAtom(a, mod));
550 return (CallPredicate(pen, B, pen->CodeOfPred PASS_REGS));
552 return CallMetaCall(t0, mod0 PASS_REGS);
556static bool EnterCreepMode(Term t, Term mod USES_REGS)
560 if (Yap_get_signal(YAP_CDOVF_SIGNAL))
563 if (!Yap_locked_growheap(FALSE, 0, NULL))
565 Yap_Error(RESOURCE_ERROR_HEAP, TermNil,
566 "YAP failed to grow heap at meta-call");
568 if (!Yap_has_a_signal())
570 return do_execute(ARG1, mod PASS_REGS);
573 PredCreep = RepPredProp(PredPropByFunc(FunctorCreep, 1));
575 if (!IsVarTerm(t) && IsApplTerm(t) && FunctorOfTerm(t) == FunctorModule)
591 ARG1 = Yap_MkApplTerm(FunctorModule, 2, ts);
593 CalculateStackGap(PASS_REGS1);
595 return CallPredicate(PredCreep, B, PredCreep->CodeOfPred PASS_REGS);
598static Int execute(USES_REGS1)
600 Term t = Deref(ARG1);
601 return do_execute(t, CurrentModule PASS_REGS);
604bool Yap_Execute(Term t USES_REGS)
606 return do_execute(t, CurrentModule PASS_REGS);
609static void heap_store(Term t USES_REGS)
613 if (VarOfTerm(t) < HR)
620 Bind_Local(VarOfTerm(t), (CELL)HR);
630static Int do_execute_n(arity_t n, Term g, Term mod)
634 g = Yap_YapStripModule(g, &mod);
636 Yap_ThrowError(INSTANTIATION_ERROR, g, NULL);
641 if (IsExtensionFunctor(f)) {
642 return CallError(TYPE_ERROR_CALLABLE, g, mod PASS_REGS);
644 arity = f->ArityOfFE;
645 name = NameOfFunctor(f);
646 memmove( &ARG1+arity, &ARG2, n*
sizeof(CELL));
647 memcpy(&ARG1,RepAppl(g)+1, arity*
sizeof(CELL));
648 }
else if (IsAtomTerm(g)) {
650 name = AtomOfTerm(g);
651 memmove( &ARG1, &ARG2, n*
sizeof(CELL));
652 }
else if (IsPairTerm(g)) {
655 memmove( &ARG1+2, &ARG2, n*
sizeof(CELL));
656 memcpy(&ARG1,RepAppl(g)+1, 2*
sizeof(CELL));
658 Yap_ThrowError(TYPE_ERROR_CALLABLE,g,NULL);
661 Functor f = Yap_MkFunctor(name, arity+n);
662 PredEntry * pen = RepPredProp(PredPropByFunc(f, mod));
669 return CallPredicate(pen, B, pen->CodeOfPred PASS_REGS);
672static Int execute2(USES_REGS1)
674 return do_execute_n(1, ARG1, CurrentModule PASS_REGS);
677static Int execute3(USES_REGS1)
679 return do_execute_n(2, ARG1, CurrentModule PASS_REGS);
682static Int execute4(USES_REGS1)
684 return do_execute_n(3, ARG1, CurrentModule PASS_REGS);
687static Int execute5(USES_REGS1)
689 return do_execute_n(4, ARG1, CurrentModule PASS_REGS);
692static Int execute6(USES_REGS1)
694 return do_execute_n(5, ARG1, CurrentModule PASS_REGS);
697static Int execute7(USES_REGS1)
699 return do_execute_n(6, ARG1, CurrentModule PASS_REGS);
702static Int execute8(USES_REGS1)
704 return do_execute_n(7, ARG1, CurrentModule PASS_REGS);
707static Int execute9(USES_REGS1)
709 return do_execute_n(8, ARG1, CurrentModule PASS_REGS);
712static Int execute10(USES_REGS1)
714 return do_execute_n(9, ARG1, CurrentModule PASS_REGS);
717static Int execute11(USES_REGS1)
719 return do_execute_n(10, ARG1, CurrentModule PASS_REGS);
722static Int execute12(USES_REGS1)
724 return do_execute_n(11, ARG1, CurrentModule PASS_REGS);
727static Int execute_clause(USES_REGS1)
729 Term t = Deref(ARG1);
730 Term mod = Deref(ARG2);
731 choiceptr cut_cp = cp_from_integer(Deref(ARG4) PASS_REGS);
735 Term clt = Deref(ARG3);
740 Yap_Error(INSTANTIATION_ERROR, ARG3,
"call/1");
743 else if (IsAtomTerm(t))
745 Atom a = AtomOfTerm(t);
746 pe = PredPropByAtom(a, mod);
748 else if (IsApplTerm(t))
750 register Functor f = FunctorOfTerm(t);
751 register unsigned int i;
754 if (IsExtensionFunctor(f))
756 if (f == FunctorModule)
758 Term tmod = ArgOfTerm(1, t);
759 if (!IsVarTerm(tmod) && IsAtomTerm(tmod))
766 pe = PredPropByFunc(f, mod);
767 arity = ArityOfFunctor(f);
768 if (arity > MaxTemps)
770 return CallError(TYPE_ERROR_CALLABLE, t, mod PASS_REGS);
776 for (i = 1; i <= arity; ++i)
781 XREGS[i] = (CELL)(pt - 1);
791 return CallError(TYPE_ERROR_CALLABLE, t, mod PASS_REGS);
795 if (RepPredProp(pe)->PredFlags & MegaClausePredFlag)
797 code = Yap_MegaClauseFromTerm(clt);
801 code = Yap_ClauseFromTerm(clt)->ClCode;
803 if (Yap_get_signal(YAP_CREEP_SIGNAL))
805 Yap_signal(YAP_CREEP_SIGNAL);
807 return CallPredicate(RepPredProp(pe), cut_cp, code PASS_REGS);
810static Int execute_in_mod(USES_REGS1)
812 return do_execute(Deref(ARG1), Deref(ARG2) PASS_REGS);
819static void prune_inner_computation(
choiceptr parent)
823 yamop *oP = P, *oCP = CP;
824 Int oENV = LCL0 - ENV;
827 while (cut_pt->cp_b && cut_pt->cp_b < parent)
829 cut_pt = cut_pt->cp_b;
832 CUT_prune_to(cut_pt);
836 LOCAL_AllowRestart = FALSE;
847static void complete_inner_computation(
choiceptr old_B)
854 else if (myB->cp_b == old_B)
858 DEPTH = myB->cp_depth;
861 else if (myB->cp_b && myB->cp_b < old_B)
863 while (myB->cp_b < old_B)
878static Int Yap_ignore(Term t,
bool fail USES_REGS)
880 yamop *oP = P, *oCP = CP;
881 Int oENV = LCL0 - ENV;
882 Int oYENV = LCL0 - YENV;
883 Int oB = LCL0 - (CELL *)B;
885 bool rc = Yap_RunTopGoal(t,
true);
889 complete_inner_computation((
choiceptr)(LCL0 - oB));
893 prune_inner_computation((
choiceptr)(LCL0 - oB));
909extern void *Yap_blob_info(Term t);
911static bool set_watch(Int Bv, Term task)
914 Term t = Yap_AllocExternalDataInStack((CELL)setup_call_catcher_cleanup_tag,
sizeof(Int), &pt);
920 TrailTerm(TR) = AbsPair(HR - 2);
925static bool watch_cut(Term ext USES_REGS)
929 Term task = TailOfTerm(ext);
930 Term cleanup = ArgOfTerm(3, task);
932 bool complete = IsNonVarTerm(Deref(ArgOfTerm(4, task)));
933 bool active = ArgOfTerm(5, task) == TermTrue;
934 bool ex_mode =
false;
941 CELL *port_pt = deref_ptr(RepAppl(task) + 2);
942 CELL *completion_pt = deref_ptr(RepAppl(task) + 4);
943 if ((ex_mode = Yap_HasException()))
945 CELL *hold = Yap_ArenaPt(LOCAL_GlobalArena);
946 CELL *max = Yap_ArenaLimit(LOCAL_GlobalArena);
948 hold[1] = MkAddressTerm(&old);
952 hold[0] = Yap_MkApplTerm(FunctorException, 1, &e);
956 hold[0] = Yap_MkApplTerm(FunctorExternalException, 1, &e);
960 LOCAL_GlobalArena = Yap_MkArena(hold+2,max);
961 completion_pt[0] = TermException;
965 completion_pt[0] = port_pt[0] = TermCut;
969 Yap_ignore(cleanup,
false);
970 CELL *complete_pt = deref_ptr(RepAppl(task) + 4);
971 complete_pt[0] = TermTrue;
974 LOCAL_PrologMode |= InErrorMode;
994static bool watch_retry(Term d0 USES_REGS)
998 Term task = TailOfTerm(d0);
999 bool box = ArgOfTerm(1, task) == TermTrue;
1000 Term cleanup = ArgOfTerm(3, task);
1001 bool complete = !IsVarTerm(ArgOfTerm(4, task));
1002 bool active = ArgOfTerm(5, task) == TermTrue;
1007 CELL *port_pt = deref_ptr(RepAppl(Deref(task)) + 2);
1008 CELL *complete_pt = deref_ptr(RepAppl(Deref(task)) + 4);
1010 bool ex_mode =
false;
1011 while (B->cp_ap->opc == FAIL_OPCODE ||
1012 B->cp_ap == TRUSTFAILCODE)
1016 if (B >= B0 && !ex_mode && !active)
1018 if ((ex_mode = Yap_HasException()))
1020 CELL *hold = Yap_ArenaPt(LOCAL_GlobalArena);
1021 CELL *max = Yap_ArenaLimit(LOCAL_GlobalArena);
1023 hold[1] = MkAddressTerm(&old);
1027 hold[0] = Yap_MkApplTerm(FunctorException, 1, &e);
1031 hold[0] = Yap_MkApplTerm(FunctorExternalException, 1, &e);
1035 LOCAL_GlobalArena = Yap_MkArena(hold+2,max);
1036 completion_pt[0] = TermException;
1040 completion_pt[0] = port_pt[0] = TermCut;
1056 Yap_ignore(cleanup,
true);
1057 RESET_VARIABLE(port_pt);
1076static Int setup_call_catcher_cleanup(USES_REGS1)
1078 Term Setup = Deref(ARG1);
1080 yamop *oP = P, *oCP = CP;
1081 Int oENV = LCL0 - ENV;
1082 Int oYENV = LCL0 - YENV;
1085 Yap_DisableInterrupts(worker_id);
1086 rc = Yap_RunTopGoal(Setup,
true);
1087 Yap_EnableInterrupts(worker_id);
1095 complete_inner_computation(B0);
1102 prune_inner_computation(B0);
1107 YENV = LCL0 - oYENV;
1111static Int tag_cleanup(USES_REGS1)
1113 Int iB = LCL0 - (CELL *)B;
1114 set_watch(iB, Deref(ARG2));
1115 return Yap_unify(ARG1, MkIntegerTerm(iB));
1118static Int cleanup_on_exit(USES_REGS1)
1122 Term task = Deref(ARG2);
1123 bool box = ArgOfTerm(1, task) == TermTrue;
1124 Term cleanup = ArgOfTerm(3, task);
1125 Term complete = IsNonVarTerm(ArgOfTerm(4, task));
1127 while (B->cp_ap->opc == FAIL_OPCODE ||
1128 B->cp_ap == TRUSTFAILCODE)
1134 CELL *catcher_pt = deref_ptr(RepAppl(Deref(task)) + 2);
1135 CELL *complete_pt = deref_ptr(RepAppl(Deref(task)) + 4);
1139 set_watch(LCL0 - (CELL *)B, task);
1144 catcher_pt[0] = TermAnswer;
1148 catcher_pt[0] = TermExit;
1149 complete_pt[0] = TermExit;
1152 if ((tq = Yap_ReadTimedVar(LOCAL_WokenGoals)) == 0 ||
1155 Yap_UpdateTimedVar(LOCAL_WokenGoals, TermTrue);
1158 cleanup = Yap_MkApplTerm(FunctorComma, 1, tg);
1160 Yap_ignore(cleanup,
false);
1168static bool complete_ge(
bool out, Term omod, yhandle_t sl,
bool creeping)
1173 Yap_signal(YAP_CREEP_SIGNAL);
1175 CurrentModule = omod;
1183static Int _user_expand_goal(USES_REGS1)
1185 yhandle_t sl = Yap_StartSlots();
1186 Int creeping = Yap_get_signal(YAP_CREEP_SIGNAL);
1188 Term cmod = CurrentModule, omod = cmod;
1190 Term g = Yap_YapStripModule(ARG1, &cmod);
1191 yhandle_t h1 = Yap_InitSlot(g), h2 = Yap_InitSlot(ARG2);
1195 if ((pe = RepPredProp(Yap_GetPredPropByFunc(FunctorGoalExpansion2, cmod))) &&
1196 pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
1197 Yap_execute_pred(pe, NULL,
true PASS_REGS))
1199 return complete_ge(
true, omod, sl, creeping);
1203 mg_args[1] = Yap_GetFromSlot(h1);
1204 ARG1 = Yap_MkApplTerm(FunctorModule, 2, mg_args);
1205 ARG2 = Yap_GetFromSlot(h2);
1206 if ((pe = RepPredProp(
1207 Yap_GetPredPropByFunc(FunctorGoalExpansion2, SYSTEM_MODULE))) &&
1208 pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
1209 Yap_execute_pred(pe, NULL,
true PASS_REGS))
1211 return complete_ge(
true, omod, sl, creeping);
1213 ARG1 = Yap_GetFromSlot(h1);
1215 ARG3 = Yap_GetFromSlot(h2);
1217 if ((pe = RepPredProp(
1218 Yap_GetPredPropByFunc(FunctorGoalExpansion, USER_MODULE))) &&
1219 pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
1220 Yap_execute_pred(pe, NULL PASS_REGS,
true))
1222 return complete_ge(
true, omod, sl, creeping);
1225 mg_args[1] = Yap_GetFromSlot(h1);
1226 ARG1 = Yap_MkApplTerm(FunctorModule, 2, mg_args);
1227 ARG2 = Yap_GetFromSlot(h2);
1229 if (cmod != USER_MODULE &&
1231 Yap_GetPredPropByFunc(FunctorGoalExpansion2, USER_MODULE))) &&
1232 pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
1233 Yap_execute_pred(pe, NULL PASS_REGS,
true))
1235 return complete_ge(
true, omod, sl, creeping);
1237 return complete_ge(
false, omod, sl, creeping);
1240static Int do_term_expansion(USES_REGS1)
1242 yhandle_t sl = Yap_StartSlots();
1243 Int creeping = Yap_get_signal(YAP_CREEP_SIGNAL);
1245 Term cmod = CurrentModule, omod = cmod;
1247 Term g = Yap_YapStripModule(ARG1, &cmod);
1248 yhandle_t h1 = Yap_InitSlot(g), h2 = Yap_InitSlot(ARG2);
1252 if ((pe = RepPredProp(
1253 Yap_GetPredPropByFunc(FunctorTermExpansion, USER_MODULE))) &&
1254 pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
1255 Yap_execute_pred(pe, NULL,
true PASS_REGS))
1257 return complete_ge(
true, omod, sl, creeping);
1259 ARG1 = Yap_GetFromSlot(h1);
1261 ARG3 = Yap_GetFromSlot(h2);
1262 if ((pe = RepPredProp(
1263 Yap_GetPredPropByFunc(FunctorTermExpansion3, USER_MODULE))) &&
1264 pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
1265 Yap_execute_pred(pe, NULL,
true PASS_REGS))
1267 return complete_ge(
true, omod, sl, creeping);
1271 if (cmod != USER_MODULE &&
1272 (pe = RepPredProp(Yap_GetPredPropByFunc(FunctorTermExpansion, cmod))) &&
1273 pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
1274 Yap_execute_pred(pe, NULL,
true PASS_REGS))
1276 return complete_ge(
true, omod, sl, creeping);
1280 mg_args[1] = Yap_GetFromSlot(h1);
1281 ARG1 = Yap_MkApplTerm(FunctorModule, 2, mg_args);
1282 ARG2 = Yap_GetFromSlot(h2);
1283 if ((pe = RepPredProp(
1284 Yap_GetPredPropByFunc(FunctorTermExpansion, SYSTEM_MODULE))) &&
1285 pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
1286 Yap_execute_pred(pe, NULL,
true PASS_REGS))
1288 return complete_ge(
true, omod, sl, creeping);
1290 return complete_ge(
false, omod, sl, creeping);
1293static Int execute0(USES_REGS1)
1295 Term t = Deref(ARG1);
1296 Term mod = Deref(ARG2);
1300 if (Yap_has_a_signal() && !LOCAL_InterruptsDisabled)
1302 return EnterCreepMode(t, mod PASS_REGS);
1304 pe = Yap_get_pred(t, mod,
"call");
1307 arity = pe->ArityOfPE;
1310 if (arity > MaxTemps)
1312 return CallError(TYPE_ERROR_CALLABLE, t, mod PASS_REGS);
1317 CELL *pt = RepAppl(t) + 1;
1318 for (i = 1; i <= arity; ++i)
1323 XREGS[i] = (CELL)(pt - 1);
1333 return CallPredicate(pe, B,
1334 pe->CodeOfPred PASS_REGS);
1337static Int creep_step(USES_REGS1)
1340 Term t = Deref(ARG1);
1341 Term mod = Deref(ARG2);
1344 PredEntry *pe = Yap_get_pred(t, mod,
"execute0");
1347 arity = pe->ArityOfPE;
1350 CELL *pt = RepAppl(t) + 1;
1351 for (i = 1; i <= arity; ++i)
1356 XREGS[i] = (CELL)(pt - 1);
1366 if (pe->PredFlags & SpiedPredFlag)
1368 if (!LOCAL_InterruptsDisabled && Yap_get_signal(YAP_CREEP_SIGNAL))
1370 Yap_signal(YAP_CREEP_SIGNAL);
1372#if defined(YAPOR) || defined(THREADS)
1373 if (pe->PredFlags & LogUpdatePredFlag)
1379 rc = CallPredicate(pe, B,
1380 pe->cs.p_code.TrueCodeOfPred PASS_REGS);
1384 rc = CallPredicate(pe, B,
1385 pe->CodeOfPred PASS_REGS);
1387 if (!LOCAL_InterruptsDisabled &&
1388 (!(pe->PredFlags & (AsmPredFlag | CPredFlag)) ||
1389 pe->OpcodeOfPred == Yap_opcode(_call_bfunc_xx)))
1391 Yap_signal(YAP_CREEP_SIGNAL);
1396static Int execute_nonstop(USES_REGS1)
1399 Term t = Deref(ARG1);
1400 Term mod = Deref(ARG2);
1404 t = Yap_YapStripModule(t, &mod);
1407 mod = CurrentModule;
1409 else if (!IsAtomTerm(mod))
1411 Yap_Error(TYPE_ERROR_ATOM, ARG2,
"call/1");
1416 Yap_Error(INSTANTIATION_ERROR, ARG1,
"call/1");
1419 else if (IsAtomTerm(t))
1421 Atom a = AtomOfTerm(t);
1422 pe = PredPropByAtom(a, mod);
1424 else if (IsApplTerm(t))
1426 register Functor f = FunctorOfTerm(t);
1427 register unsigned int i;
1430 if (IsExtensionFunctor(f))
1432 pe = PredPropByFunc(f, mod);
1433 arity = ArityOfFunctor(f);
1434 if (arity > MaxTemps)
1436 return CallError(TYPE_ERROR_CALLABLE, t, mod PASS_REGS);
1441 pt = RepAppl(t) + 1;
1442 for (i = 1; i <= arity; ++i)
1447 XREGS[i] = (CELL)(pt - 1);
1457 Yap_Error(TYPE_ERROR_CALLABLE, t,
"call/1");
1462 if (RepPredProp(pe)->PredFlags & SpiedPredFlag)
1464 if (!LOCAL_InterruptsDisabled && Yap_get_signal(YAP_CREEP_SIGNAL))
1466 Yap_signal(YAP_CREEP_SIGNAL);
1468#if defined(YAPOR) || defined(THREADS)
1469 if (RepPredProp(pe)->PredFlags & LogUpdatePredFlag)
1471 PP = RepPredProp(pe);
1475 return CallPredicate(RepPredProp(pe), B,
1476 RepPredProp(pe)->cs.p_code.TrueCodeOfPred PASS_REGS);
1480 if (Yap_get_signal(YAP_CREEP_SIGNAL) && !LOCAL_InterruptsDisabled &&
1481 (!(RepPredProp(pe)->PredFlags & (AsmPredFlag | CPredFlag)) ||
1482 RepPredProp(pe)->OpcodeOfPred == Yap_opcode(_call_bfunc_xx)))
1484 Yap_signal(YAP_CREEP_SIGNAL);
1486 return CallPredicate(RepPredProp(pe), B,
1487 RepPredProp(pe)->CodeOfPred PASS_REGS);
1491static Int execute_0(USES_REGS1)
1493 Term mod = CurrentModule;
1494 Term t = Yap_YapStripModule(Deref(ARG1), &mod);
1497 return do_execute(t, mod PASS_REGS);
1500static bool call_with_args(
int i USES_REGS)
1502 Term mod = CurrentModule, t;
1505 t = Yap_YapStripModule(Deref(ARG1), &mod);
1508 for (j = 0; j < i; j++)
1509 heap_store(Deref(XREGS[j + 2]) PASS_REGS);
1510 return (do_execute_n(t, mod, i PASS_REGS));
1513static Int execute_1(USES_REGS1)
1515 return call_with_args(1 PASS_REGS);
1518static Int execute_2(USES_REGS1)
1520 return call_with_args(2 PASS_REGS);
1523static Int execute_3(USES_REGS1)
1525 return call_with_args(3 PASS_REGS);
1528static Int execute_4(USES_REGS1)
1530 return call_with_args(4 PASS_REGS);
1533static Int execute_5(USES_REGS1)
1535 return call_with_args(5 PASS_REGS);
1538static Int execute_6(USES_REGS1)
1540 return call_with_args(6 PASS_REGS);
1543static Int execute_7(USES_REGS1)
1545 return call_with_args(7 PASS_REGS);
1548static Int execute_8(USES_REGS1)
1550 return call_with_args(8 PASS_REGS);
1553static Int execute_9(USES_REGS1)
1555 return call_with_args(9 PASS_REGS);
1558static Int execute_10(USES_REGS1)
1560 return call_with_args(10 PASS_REGS);
1565static Int execute_depth_limit(USES_REGS1)
1567 Term d = Deref(ARG2);
1570 Yap_Error(INSTANTIATION_ERROR, d,
"depth_bound_call/2");
1573 else if (!IsIntegerTerm(d))
1575 if (IsFloatTerm(d) && isinf(FloatOfTerm(d)))
1577 DEPTH = RESET_DEPTH();
1581 Yap_Error(TYPE_ERROR_INTEGER, d,
"depth_bound_call/2");
1587 DEPTH = MkIntTerm(IntegerOfTerm(d) * 2);
1589 return execute(PASS_REGS1);
1594static int exec_absmi(
bool top, yap_reset_t reset_mode USES_REGS)
1597 Int OldBorder = LOCAL_CBorder;
1598 LOCAL_CBorder = LCL0 - (CELL *)B;
1599 sigjmp_buf signew, *sighold = LOCAL_RestartEnv;
1600 LOCAL_RestartEnv = &signew;
1601 int lvl = push_text_stack();
1604 if (top && (lval = sigsetjmp(signew, 1)) != 0)
1611 LOCAL_PrologMode |= UserMode;
1612 LOCAL_PrologMode &= ~(BootMode | CCallMode | UnifyMode | UserCCallMode);
1621 ASP = (CELL *)PROTECT_FROZEN_B(B);
1624 CalculateStackGap(PASS_REGS1);
1625 LOCAL_PrologMode |= UserMode;
1626 LOCAL_PrologMode &= ~(BootMode | CCallMode | UnifyMode | UserCCallMode);
1627 P = (
yamop *)FAILCODE;
1638 Yap_set_fpu_exceptions(
1639 getAtomicGlobalPrologFlag(ARITHMETIC_EXCEPTIONS_FLAG));
1640 P = (
yamop *)FAILCODE;
1641 LOCAL_PrologMode |= UserMode;
1642 LOCAL_PrologMode &= ~(BootMode | CCallMode | UnifyMode | UserCCallMode);
1647 LOCAL_CBorder = OldBorder;
1648 LOCAL_RestartEnv = sighold;
1655 pop_text_stack(lvl);
1656 Yap_CloseTemporaryStreams();
1660 Yap_JumpToEnv(TermDAbort);
1662 LOCAL_PrologMode &= ~AbortMode;
1663 P = (
yamop *)FAILCODE;
1664 LOCAL_RestartEnv = sighold;
1670 Yap_CloseTemporaryStreams();
1671 pop_text_stack(lvl);
1672 LOCAL_PrologMode |= UserMode;
1673 LOCAL_PrologMode &= ~(BootMode | CCallMode | UnifyMode | UserCCallMode);
1675 if (B && B->cp_b && B->cp_b <= (
choiceptr)(LCL0 - LOCAL_CBorder))
1679 LOCAL_RestartEnv = sighold;
1680 LOCAL_CBorder = OldBorder;
1684 LOCAL_PrologMode |= UserMode;
1685 LOCAL_PrologMode &= ~(BootMode | CCallMode | UnifyMode | UserCCallMode);
1686 pop_text_stack(lvl);
1691 LOCAL_PrologMode |= UserMode;
1692 LOCAL_PrologMode &= ~(BootMode | CCallMode | UnifyMode | UserCCallMode);
1693 pop_text_stack(lvl);
1697 YENV[E_CB] = Unsigned(B);
1700 Yap_get_signal(YAP_FAIL_SIGNAL);
1701 if (!Yap_has_a_signal())
1702 CalculateStackGap(PASS_REGS1);
1703 LOCAL_CBorder = OldBorder;
1705 LOCAL_RestartEnv = sighold;
1706 LOCAL_Error_TYPE = YAP_NO_ERROR;
1710void Yap_PrepGoal(arity_t arity, CELL *pt,
choiceptr saved_b USES_REGS)
1718 YENV[E_CP] = (CELL)YESCODE;
1719 YENV[E_CB] = (CELL)B;
1720 YENV[E_E] = (CELL)ENV;
1722 YENV[E_B] = (CELL)B;
1725 YENV[E_DEPTH] = DEPTH;
1728 ASP -= EnvSizeInCells;
1735 for (i = 0; i < arity; i++)
1737 XREGS[i + 1] = *pt++;
1749 B->cp_depth = DEPTH;
1751 YENV = ASP = (CELL *)B;
1752 YENV[E_CB] = (CELL)B;
1757static int do_goal(
yamop *CodeAdr,
int arity, CELL *pt,
bool top USES_REGS)
1763 Yap_PrepGoal(arity, pt, saved_b PASS_REGS);
1765 P = (
yamop *)CodeAdr;
1771 out = exec_absmi(top, YAP_EXEC_ABSMI PASS_REGS);
1777 LOCAL_PrologMode &= ~TopGoalMode;
1781bool Yap_exec_absmi(
bool top, yap_reset_t has_reset)
1784 return exec_absmi(top, has_reset PASS_REGS);
1791void Yap_fail_all(
choiceptr bb USES_REGS)
1793 yamop *saved_p, *saved_cp;
1798 while (B->cp_b && B->cp_b != bb && B->cp_ap != NOCODE)
1809 a = exec_absmi(
true, YAP_EXEC_ABSMI PASS_REGS);
1815 DEPTH = B->cp_depth;
1817 YENV = ENV = B->cp_env;
1820 DEPTH = ENV[E_DEPTH];
1823 if (POP_CHOICE_POINT(B->cp_b))
1827 ENV = (CELL *)(ENV[E_E]);
1832 YENV = ENV = (CELL *)((B->cp_env)[E_E]);
1838 HB = PROTECT_FROZEN_H(B);
1843bool Yap_execute_pred(
PredEntry *ppe, CELL *pt,
bool pass_ex USES_REGS)
1845 yamop *saved_p, *saved_cp;
1851 LOCAL_PrologMode |= TopGoalMode;
1854 CodeAdr = ppe->CodeOfPred;
1855 UNLOCK(ppe->PELock);
1856 out = do_goal(CodeAdr, ppe->ArityOfPE, pt,
true PASS_REGS);
1868 while (POP_CHOICE_POINT(ENV[E_CB]))
1874 CUT_prune_to(cut_B);
1879 while (B->cp_b < cut_B)
1884 abolish_incomplete_subgoals(B);
1893 DEPTH = ENV[E_DEPTH];
1895 ENV = (CELL *)(ENV[E_E]);
1904 if (pass_ex && Yap_HasException())
1917 DEPTH = B->cp_depth;
1923 YENV = ENV = (CELL *)((B->cp_env)[E_E]);
1926 HB = PROTECT_FROZEN_H(B);
1935 Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
"emulator crashed");
1940bool Yap_execute_goal(Term t,
int nargs, Term mod,
bool pass_ex)
1953 Atom a = AtomOfTerm(t);
1955 pe = PredPropByAtom(a, mod);
1957 else if (IsApplTerm(t))
1961 if (IsBlobFunctor(f))
1963 Yap_Error(TYPE_ERROR_CALLABLE, t,
"call/1");
1969 pt = RepAppl(t) + 1;
1970 pe = PredPropByFunc(f, mod);
1974 Yap_Error(TYPE_ERROR_CALLABLE, t,
"call/1");
1977 ppe = RepPredProp(pe);
1980 return CallMetaCall(t, mod PASS_REGS);
1982 return Yap_execute_pred(ppe, pt, pass_ex PASS_REGS);
1985void Yap_trust_last(
void)
1992 DEPTH = B->cp_depth;
1994 YENV = ASP = B->cp_env;
1995 ENV = (CELL *)((B->cp_env)[E_E]);
1997 P = (
yamop *)(ENV[E_CP]);
2001 HB = PROTECT_FROZEN_H(B);
2005Term Yap_RunTopGoal(Term t,
bool handle_errors)
2013 Term tmod = CurrentModule;
2015 LOCAL_PrologMode |= TopGoalMode;
2017 t = Yap_YapStripModule(t, &tmod);
2020 Yap_Error(INSTANTIATION_ERROR, t,
"call/1");
2021 LOCAL_PrologMode &= ~TopGoalMode;
2028 ts[1] = (CurrentModule == 0 ? TermProlog : CurrentModule);
2029 t = Yap_MkApplTerm(FunctorCsult, 2, ts);
2033 Atom a = AtomOfTerm(t);
2035 pe = Yap_GetPredPropByAtom(a, tmod);
2038 else if (IsApplTerm(t))
2042 if (IsBlobFunctor(f))
2044 Yap_Error(TYPE_ERROR_CALLABLE, t,
"call/1");
2045 LOCAL_PrologMode &= ~TopGoalMode;
2051 pe = Yap_GetPredPropByFunc(f, tmod);
2052 pt = RepAppl(t) + 1;
2053 arity = ArityOfFunctor(f);
2057 Yap_Error(TYPE_ERROR_CALLABLE, Yap_PredicateIndicator(t, tmod),
"call/1");
2058 LOCAL_PrologMode &= ~TopGoalMode;
2061 ppe = RepPredProp(pe);
2062 if (pe == NIL || ppe->cs.p_code.TrueCodeOfPred->opc == UNDEF_OPCODE ||
2063 (ppe->PredFlags & (MetaPredFlag | UndefPredFlag)))
2070 Functor f = Yap_MkFunctor(Yap_LookupAtom(
"call"), 1);
2073 t = Yap_MkApplTerm(FunctorModule, 2, ts);
2074 pe = Yap_GetPredPropByFunc(f, tmod);
2075 ppe = RepPredProp(pe);
2079 CodeAdr = ppe->CodeOfPred;
2080 UNLOCK(ppe->PELock);
2082#if !USE_SYSTEM_MALLOC
2083 if (LOCAL_TrailTop - HeapTop < 2048)
2085 Yap_Error(RESOURCE_ERROR_TRAIL, TermNil,
2086 "unable to boot because of too little Trail space");
2089 LOCAL_PrologMode &= ~TopGoalMode;
2090 goal_out = do_goal(CodeAdr, arity, pt, handle_errors PASS_REGS);
2094static void do_restore_regs(Term t,
int restore_all USES_REGS)
2099 Int max = ArityOfFunctor(FunctorOfTerm(t)) - 4;
2100 CELL *ptr = RepAppl(t) + 5;
2102 P = (
yamop *)IntegerOfTerm(ptr[-4]);
2103 CP = (
yamop *)IntegerOfTerm(ptr[-3]);
2104 ENV = (CELL *)(LCL0 - IntegerOfTerm(ptr[-2]));
2105 YENV = (CELL *)(LCL0 - IntegerOfTerm(ptr[-1]));
2106 for (i = 0; i < max; i += 2)
2108 Int j = IntOfTerm(ptr[0]);
2116static Int restore_regs(USES_REGS1)
2118 Term t = Deref(ARG1);
2121 Yap_Error(INSTANTIATION_ERROR, t,
"support for coroutining");
2126 do_restore_regs(t, FALSE PASS_REGS);
2133static Int restore_regs2(USES_REGS1)
2136 Term t = Deref(ARG1), d0;
2142 Yap_Error(INSTANTIATION_ERROR, t,
"support for coroutining");
2148 do_restore_regs(t, TRUE PASS_REGS);
2152 Yap_Error(INSTANTIATION_ERROR, d0,
"support for coroutining");
2155 if (!IsIntegerTerm(d0))
2159 d = IntegerOfTerm(d0);
2168 if ((CELL *)pt0 != LCL0 && pt0 > B)
2171 while (B->cp_b < pt0)
2173 while (POP_CHOICE_POINT(B->cp_b))
2182 abolish_incomplete_subgoals(B);
2192static Int clean_ifcp(USES_REGS1)
2194 Term t = Deref(ARG2);
2195 Term t0 = Deref(ARG1);
2198 must_be_integer(t0);
2205 pt0 = cp_from_integer(t PASS_REGS);
2214 prune(pt0 PASS_REGS);
2219 while (b != pt0 && b->cp_b != pt0 && b->cp_b)
2222 pt0->cp_ap = (
yamop *)TRUSTFAILCODE;
2228static Int drop_choice_point(USES_REGS1)
2230 Term t0 = Deref(ARG1);
2233 must_be_integer(t0);
2237 pt0 = cp_from_integer(t0 PASS_REGS);
2242 Yap_ThrowError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO,t0,NULL);
2247 prune(pt0 PASS_REGS);
2252 bool doprune =
false;
2253 while (b && b->cp_b && b->cp_b < pt0) {
2254 if (b->cp_ap != TRUSTFAILCODE) doprune =
false;
2257 if (b->cp_b == pt0) {
2259 prune(pt0 PASS_REGS);
2261 pt0->cp_ap = TRUSTFAILCODE;
2267static int disj_marker(
yamop *apc)
2269 op_numbers opnum = Yap_op_from_opcode(apc->opc);
2271 return opnum == _or_else || opnum == _or_last;
2274static Int cut_up_to_next_disjunction(USES_REGS1)
2277 CELL *qenv = (CELL *)ENV[E_E];
2279 while (pt0 && !(qenv == pt0->cp_env && disj_marker(pt0->cp_ap)))
2289 if (SHOULD_CUT_UP_TO(B, pt0))
2293 abolish_incomplete_subgoals(B);
2310bool Yap_Reset(yap_reset_t mode,
bool hard)
2323 a = exec_absmi(
true, mode PASS_REGS);
2328 Yap_InitYaamRegs(worker_id,
false);
2329 GLOBAL_Initialised =
true;
2336 Yap_RebootSlots(worker_id);
2344 if (cp_b->cp_ap->opc != ORLAST_OPCODE)
2347 pe = cp_b->cp_ap->y_u.Osblp.p0;
2349 pe = cp_b->cp_ap->y_u.p.p;
2355 return pe == PredSafeCallCleanup;
2358void Yap_InitYaamRegs(
int myworker_id,
bool full_reset)
2367 REGSTORE *rs = REMOTE_ThreadHandle(myworker_id).default_yaam_regs;
2368 pthread_setspecific(Yap_yaamregs_key, (
const void *)rs);
2369 REMOTE_ThreadHandle(myworker_id).current_yaam_regs = rs;
2373 Yap_regp = &Yap_standard_regs;
2377 Yap_PutValue(AtomBreak, MkIntTerm(0));
2379 Yap_InitPreAllocCodeSpace(myworker_id);
2380 TR = (tr_fr_ptr)REMOTE_TrailBase(myworker_id);
2381 HR = H0 = ((CELL *)REMOTE_GlobalBase(myworker_id)) ;
2382 LCL0 = ASP = (CELL *)REMOTE_LocalBase(myworker_id);
2383 CurrentTrailTop = (tr_fr_ptr)(REMOTE_TrailTop(myworker_id) - MinTrailGap);
2390 DEPTH = RESET_DEPTH();
2392 STATIC_PREDICATES_MARKED = FALSE;
2396 Yap_AllocateDefaultArena(128 * 128, 0, NULL);
2400 HR = Yap_ArenaLimit(REMOTE_GlobalArena(myworker_id));
2407 BBREG = B_FZ = (
choiceptr)REMOTE_LocalBase(myworker_id);
2408 TR = TR_FZ = (tr_fr_ptr)REMOTE_TrailBase(myworker_id);
2410 REMOTE_GcGeneration(myworker_id) = Yap_NewCompactTimedVar(MkIntTerm(0));
2411 REMOTE_GcCurrentPhase(myworker_id) = MkIntTerm(0L);
2412 REMOTE_GcPhase(myworker_id) = Yap_NewCompactTimedVar(MkIntTerm(0L));
2413 REMOTE_WokenGoals(myworker_id) = Yap_NewTimedVar(TermTrue);
2414 REMOTE_AttsMutableList(myworker_id) = Yap_NewEmptyTimedVar();
2416 CalculateStackGap(PASS_REGS1);
2419#if defined(YAPOR) || defined(THREADS)
2420 LOCAL = REMOTE(myworker_id);
2421 worker_id = myworker_id;
2423 Yap_RebootSlots(myworker_id);
2424#if defined(YAPOR) || defined(THREADS)
2428 cut_c_initialize(myworker_id);
2429 Yap_PrepGoal(0, NULL, NULL PASS_REGS);
2435 BBREG = B_FZ = (
choiceptr)REMOTE_LocalBase(myworker_id);
2436 TR = TR_FZ = (tr_fr_ptr)REMOTE_TrailBase(myworker_id);
2438 CalculateStackGap(PASS_REGS1);
2441 if (REMOTE_top_dep_fr(myworker_id))
2442 DepFr_cons_cp(REMOTE_top_dep_fr(myworker_id)) = NORM_CP(B);
2446void Yap_InitExecFs(
void)
2450 memset(&catcher_ops, 0,
sizeof(catcher_ops));
2451 catcher_ops.cut_handler = watch_cut;
2452 catcher_ops.fail_handler = watch_retry;
2453 setup_call_catcher_cleanup_tag = YAP_NewOpaqueType(&catcher_ops);
2455 Term cm = CurrentModule;
2457 Yap_InitCPred(
"$execute", 1, execute, 0);
2458 Yap_InitCPred(
"call", 1, execute, 0);
2459 Yap_InitCPred(
"call", 2, execute2, 0);
2460 Yap_InitCPred(
"call", 3, execute3, 0);
2461 Yap_InitCPred(
"call", 4, execute4, 0);
2462 Yap_InitCPred(
"call", 5, execute5, 0);
2463 Yap_InitCPred(
"call", 6, execute6, 0);
2464 Yap_InitCPred(
"call", 7, execute7, 0);
2465 Yap_InitCPred(
"call", 8, execute8, 0);
2466 Yap_InitCPred(
"call", 9, execute9, 0);
2467 Yap_InitCPred(
"call", 10, execute10, 0);
2468 Yap_InitCPred(
"call", 11, execute11, 0);
2469 Yap_InitCPred(
"call", 12, execute12, 0);
2470 Yap_InitCPred(
"call_in_mod", 2, execute_in_mod, 0);
2471 Yap_InitCPred(
"call_wo_mod", 2, execute_in_mod, 0);
2472 Yap_InitCPred(
"call_with_args", 1, execute_0, 0);
2473 Yap_InitCPred(
"call_with_args", 2, execute_1, 0);
2474 Yap_InitCPred(
"call_with_args", 3, execute_2, 0);
2475 Yap_InitCPred(
"call_with_args", 4, execute_3, 0);
2476 Yap_InitCPred(
"call_with_args", 5, execute_4, 0);
2477 Yap_InitCPred(
"call_with_args", 6, execute_5, 0);
2478 Yap_InitCPred(
"call_with_args", 7, execute_6, 0);
2479 Yap_InitCPred(
"call_with_args", 8, execute_7, 0);
2480 Yap_InitCPred(
"call_with_args", 9, execute_8, 0);
2481 Yap_InitCPred(
"call_with_args", 10, execute_9, 0);
2482 Yap_InitCPred(
"call_with_args", 11, execute_10, 0);
2484 Yap_InitCPred(
"$execute_under_depth_limit", 2, execute_depth_limit, 0);
2486 Yap_InitCPred(
"$execute0", 2, execute0, NoTracePredFlag);
2487 Yap_InitCPred(
"$execute_nonstop", 2, execute_nonstop, NoTracePredFlag);
2488 Yap_InitCPred(
"$creep_step", 2, creep_step, NoTracePredFlag);
2489 Yap_InitCPred(
"$execute_clause", 4, execute_clause, NoTracePredFlag);
2490 Yap_InitCPred(
"$current_choice_point", 1, current_choice_point, 0);
2491 Yap_InitCPred(
"$drop_choice_point", 1, drop_choice_point, 0);
2492 Yap_InitCPred(
"$current_choice_point", 1,current_choice_point, 0);
2493 CurrentModule = HACKS_MODULE;
2494 Yap_InitCPred(
"current_choice_point", 1, current_choice_point, 0);
2495 Yap_InitCPred(
"current_choicepoint", 1, current_choice_point, 0);
2496 Yap_InitCPred(
"env_choice_point", 1, save_env_b, 0);
2497 Yap_InitCPred(
"cut_at", 2, clean_ifcp, SafePredFlag);
2499 Yap_InitCPred(
"$restore_regs", 1, restore_regs,
2500 NoTracePredFlag | SafePredFlag);
2501 Yap_InitCPred(
"$restore_regs", 2, restore_regs2,
2502 NoTracePredFlag | SafePredFlag);
2503 Yap_InitCPred(
"$clean_ifcp", 2, clean_ifcp, SafePredFlag);
2504 Yap_InitCPred(
"qpack_clean_up_to_disjunction", 0, cut_up_to_next_disjunction,
2507 Yap_InitCPred(
"_user_expand_goal", 2, _user_expand_goal, 0);
2508 Yap_InitCPred(
"$do_term_expansion", 2, do_term_expansion, 0);
2509 Yap_InitCPred(
"$setup_call_catcher_cleanup", 1, setup_call_catcher_cleanup,
2511 Yap_InitCPred(
"$cleanup_on_exit", 2, cleanup_on_exit, 0);
2512 Yap_InitCPred(
"$tag_cleanup", 2, tag_cleanup, 0);
bool Yap_ResetException(yap_error_descriptor_t *i)
clean up (notice that the code ensures ActiveError exists on exit
bool Yap_RaiseException()
let's go
bool Yap_RestartException(yap_error_descriptor_t *i)
clean up (notice that the code ensures ActiveError exists on exit
opaque variables can interact with the system
all we need to know about an error/throw
yap_error_number errorNo
error identifier