19static char SccsId[] =
"@(#)cdmgr.c 1.1 05/02/98";
34static bool EnterCreepMode(Term, Term CACHE_TYPE);
37static Int execute(USES_REGS1);
39static Int execute0(USES_REGS1);
41static Term cp_as_integer(
choiceptr cp USES_REGS)
43 return (MkIntegerTerm(LCL0 - (CELL *)cp));
46static choiceptr cp_from_integer(Term cpt USES_REGS)
48 return (
choiceptr)(LCL0 - IntegerOfTerm(cpt));
64PredEntry *Yap_track_cpred(op_numbers op,
yamop *ip,
size_t min,
void *v)
70 CalculateStackGap(PASS_REGS1);
71 i->gc_min = 2 * MinStackGap;
72 yamop *ip0 = PREVOP(ip, Osbpp);
75 op_numbers op1 = Yap_op_from_opcode(ip0->opc);
77 if (op1 == _call_cpred || op1 == _call_usercpred)
81 op = Yap_op_from_opcode(ip->opc);
85 else if (ip->opc == Yap_opcode(op))
94 i->p_env = NEXTOP(ip, Osbpp);
95 i->a = i->p->y_u.Osbpp.p->ArityOfPE;
96 i->env_size = -i->p->y_u.Osbpp.s /
sizeof(CELL);
97 i->callee = i->p->y_u.Osbpp.p;
98 return i->p->y_u.Osbpp.p0;
100 case _call_usercpred:
102 i->p_env = NEXTOP(ip0, Osbpp);
103 i->a = ip0->y_u.Osbpp.p->ArityOfPE;
105 i->env_size = -ip0->y_u.Osbpp.s /
sizeof(CELL);
106 i->callee = i->p->y_u.Osbpp.p;
107 return ip0->y_u.Osbpp.p0;
110 i->p_env = NEXTOP(ip0, Osbpp);
111 i->a = ip0->y_u.Osbpp.p->ArityOfPE;
113 i->env_size = -ip0->y_u.Osbpp.s /
sizeof(CELL);
114 i->callee = i->p->y_u.Osbpp.p;
115 return ip0->y_u.Osbpp.p0;
118 i->a = ip0->y_u.Osbpp.p->ArityOfPE;
122 i->env_size = -PREVOP(CP,Osbpp)->y_u.Osbpp.s /
sizeof(CELL);
123 i->callee = i->p->y_u.Osbpp.p;
124 return ip->y_u.Osbpp.p0;
127 i->a = P->y_u.Osbpp.p->ArityOfPE;
128 i->p_env = NEXTOP(ip, Osbpp);
131 i->env_size = EnvSizeInCells;
132 i->callee = i->p->y_u.Osbpp.p;
133 return ip->y_u.Osbpp.p0;
139 i->a = i->p->y_u.OtapFs.s + i->p->y_u.OtapFs.extra;
142 i->env_size = EnvSizeInCells;
150 i->env_size = EnvSizeInCells;
157 i->a = P->y_u.Osbpa.p->ArityOfPE;
158 i->op = _ensure_space;
159 i->env_size = EnvSizeInCells;
167 i->op = _p_func2s_vv;
168 i->env_size = -NEXTOP(P, xxx)->y_u.Osbpp.s /
sizeof(CELL);
176 i->op = _p_func2s_vc;
177 i->env_size = -NEXTOP(P, xxc)->y_u.Osbpp.s /
sizeof(CELL);
185 i->op = _p_func2s_cv;
186 i->env_size = -NEXTOP(P, xxn)->y_u.Osbpp.s /
sizeof(CELL);
194 i->op = _p_func2s_y_vv;
195 i->env_size = -NEXTOP(P, yxx)->y_u.Osbpp.s /
sizeof(CELL);
202 i->op = _p_func2s_y_vc;
203 i->env_size = -NEXTOP(P, yxc)->y_u.Osbpp.s /
sizeof(CELL);
211 i->op = _p_func2s_y_cv;
212 i->env_size = -NEXTOP(P, yxn)->y_u.Osbpp.s /
sizeof(CELL);
221 i->env_size = -NEXTOP(P, yxx)->y_u.Osbpp.s /
sizeof(CELL);
230 i->env_size = EnvSizeInCells;
244 yamop *code USES_REGS)
246#ifdef LOW_LEVEL_TRACER
247 if (Yap_do_low_level_trace)
248 low_level_trace(enter_pred, pen, XREGS + 1);
251 if (DEPTH <= MkIntTerm(1))
253 if (pen->ModuleOfPred)
255 if (DEPTH == MkIntTerm(0))
261 DEPTH = RESET_DEPTH();
264 else if (pen->ModuleOfPred)
265 DEPTH -= MkIntConstant(2);
267 if (P->opc != EXECUTE_CPRED_OP_CODE)
280 YENV[E_CB] = (CELL)cut_pt;
291inline static bool CallMetaCall(Term t, Term mod USES_REGS)
296 ARG2 = cp_as_integer(B PASS_REGS);
306 if (Yap_GetGlobal(AtomDebugMeta) == TermOn)
308 return CallPredicate(PredTraceMetaCall, B,
309 PredTraceMetaCall->CodeOfPred PASS_REGS);
313 return CallPredicate(PredMetaCall, B, PredMetaCall->CodeOfPred PASS_REGS);
322Term Yap_ExecuteCallMetaCall(Term g, Term mod)
327 ts[1] = cp_as_integer(B PASS_REGS);
330 if (Yap_GetGlobal(AtomDebugMeta) == TermOn)
332 return Yap_MkApplTerm(PredTraceMetaCall->FunctorOfPred, 3, ts);
334 return Yap_MkApplTerm(PredMetaCall->FunctorOfPred, 4, ts);
337Term Yap_PredicateIndicator(Term t, Term mod)
342 t = Yap_YapStripModule(t, &mod);
343 if (IsApplTerm(t) && !IsExtensionFunctor(FunctorOfTerm(t)))
345 ti[0] = MkAtomTerm(NameOfFunctor(FunctorOfTerm(t)));
346 ti[1] = MkIntegerTerm(ArityOfFunctor(FunctorOfTerm(t)));
348 else if (IsPairTerm(t))
350 ti[0] = MkAtomTerm(AtomDot);
351 ti[1] = MkIntTerm(2);
356 ti[1] = MkIntTerm(0);
358 t = Yap_MkApplTerm(FunctorSlash, 2, ti);
359 if (mod != CurrentModule)
363 return Yap_MkApplTerm(FunctorModule, 2, ti);
368static bool CallError(yap_error_number err, Term t, Term mod USES_REGS)
370 if (err == TYPE_ERROR_CALLABLE)
372 t = Yap_YapStripModule(t, &mod);
374 Yap_ThrowError(err, t,
"call/1");
380static Int save_env_b(USES_REGS1)
382 Term t = Deref(ARG1);
385 register CELL *HBREG = HB;
389 td = cp_as_integer((
choiceptr)YENV[E_CB] PASS_REGS);
390 YapBind((CELL *)t, td);
395bool comma_goal(Term t1, Term t0[4],
bool first) {
396 Term ts[2], m1 = t0[3];
399 CallError(INSTANTIATION_ERROR, t0[0], t0[3] PASS_REGS);
403 t1 = Yap_MkApplTerm(FunctorModule,2,ts);
404 t0[1] = Yap_MkApplTerm(FunctorCall,1,&t1);
408 }
else if (IsAtomTerm(t1)) {
410 if (first) t1 = TermTrue;
415 else if (IsPairTerm(t1)) {
418 ts[1] = (CurrentModule == 0 ? TermProlog : CurrentModule);
419 t0[1] = Yap_MkApplTerm(FunctorCsult, 2, ts);
421 }
else if (IsApplTerm(t1)) {
423 if (f==FunctorComma) {
424 Term l = Yap_YapStripModule(ArgOfTerm(1,t1),t0+3);
425 comma_goal(l, t0, first);
427 t0[2] = ArgOfTerm(2,t1);
429 }
else if (IsExtensionFunctor(f)) {
430 return CallError(TYPE_ERROR_CALLABLE, t0[0], t0[3] PASS_REGS);
438inline static bool do_execute(Term t, Term mod USES_REGS)
446 if (Yap_has_a_signal() && !LOCAL_InterruptsDisabled &&
447 !(LOCAL_PrologMode & (AbortMode | InterruptMode | SystemMode)))
449 return EnterCreepMode(t, mod PASS_REGS);
451 Term t0 = t, mod0 = mod;
452 t = Yap_YapStripModule(t, &mod);
453 if (IsVarTerm(t) || IsVarTerm(mod))
455 return CallError(INSTANTIATION_ERROR, t0, mod0 PASS_REGS);
460 ts[1] = (CurrentModule == 0 ? TermProlog : CurrentModule);
461 t = Yap_MkApplTerm(FunctorCsult, 2, ts);
465 register Functor f = FunctorOfTerm(t);
466 if (f == FunctorCall) {
477 while((comma = comma_goal((t1=Yap_YapStripModule(t1, ts+3)), ts, first))) {
481 sreg[0]=(CELL)FunctorComma;
491 f = FunctorOfTerm(t);
492 if (IsExtensionFunctor(f)) {
493 return CallError(TYPE_ERROR_CALLABLE, t0, mod0 PASS_REGS);
495 arity = ArityOfFunctor(f);
496 if (arity > MaxTemps)
498 return CallError(TYPE_ERROR_CALLABLE, t0, mod0 PASS_REGS);
500 pen = RepPredProp(PredPropByFunc(f, mod));
507 if (pen->PredFlags & (MetaPredFlag | UndefPredFlag))
509 return CallMetaCall(t0, mod0 PASS_REGS);
512 for (i = 1; i <= arity; i++)
517 XREGS[i] = (CELL)(pt - 1);
525 return CallPredicate(pen, B, pen->CodeOfPred PASS_REGS);
527 else if (IsAtomTerm(t))
530 Atom a = AtomOfTerm(t);
533 pen = RepPredProp(PredPropByAtom(a, mod));
536 return (CallPredicate(pen, B, pen->CodeOfPred PASS_REGS));
538 return CallMetaCall(t0, mod0 PASS_REGS);
542static bool EnterCreepMode(Term t, Term mod USES_REGS)
546 if (Yap_get_signal(YAP_CDOVF_SIGNAL))
549 if (!Yap_locked_growheap(FALSE, 0, NULL))
551 Yap_Error(RESOURCE_ERROR_HEAP, TermNil,
552 "YAP failed to grow heap at meta-call");
554 if (!Yap_has_a_signal())
556 return do_execute(ARG1, mod PASS_REGS);
559 PredCreep = RepPredProp(PredPropByFunc(FunctorCreep, 1));
561 if (!IsVarTerm(t) && IsApplTerm(t) && FunctorOfTerm(t) == FunctorModule)
577 ARG1 = Yap_MkApplTerm(FunctorModule, 2, ts);
579 CalculateStackGap(PASS_REGS1);
581 return CallPredicate(PredCreep, B, PredCreep->CodeOfPred PASS_REGS);
584static Int execute(USES_REGS1)
586 Term t = Deref(ARG1);
587 return do_execute(t, CurrentModule PASS_REGS);
590bool Yap_Execute(Term t USES_REGS)
592 return do_execute(t, CurrentModule PASS_REGS);
595static Int do_execute_n(arity_t n, Term g, Term mod)
599 g = Yap_YapStripModule(g, &mod);
601 Yap_ThrowError(INSTANTIATION_ERROR, g, NULL);
606 if (IsExtensionFunctor(f)) {
607 Yap_ThrowError(TYPE_ERROR_CALLABLE, g, NULL);
609 arity = f->ArityOfFE;
610 name = NameOfFunctor(f);
611 if (name==AtomDot && n==1 && arity==1) {
614 memmove( &ARG1+arity, &ARG2, n*
sizeof(CELL));
615 memcpy(&ARG1,RepAppl(g)+1, arity*
sizeof(CELL));
616 }
else if (IsAtomTerm(g)) {
618 name = AtomOfTerm(g);
619 if (name==AtomDot && n==2)
621 memmove( &ARG1, &ARG2, n*
sizeof(CELL));
623 Yap_ThrowError(TYPE_ERROR_CALLABLE,g,NULL);
626 Functor f = Yap_MkFunctor(name, arity+n);
627 PredEntry * pen = RepPredProp(PredPropByFunc(f, mod));
634 return CallPredicate(pen, B, pen->CodeOfPred PASS_REGS);
637static Int execute2(USES_REGS1)
639 return do_execute_n(1, ARG1, CurrentModule PASS_REGS);
642static Int execute3(USES_REGS1)
644 return do_execute_n(2, ARG1, CurrentModule PASS_REGS);
647static Int execute4(USES_REGS1)
649 return do_execute_n(3, ARG1, CurrentModule PASS_REGS);
652static Int execute5(USES_REGS1)
654 return do_execute_n(4, ARG1, CurrentModule PASS_REGS);
657static Int execute6(USES_REGS1)
659 return do_execute_n(5, ARG1, CurrentModule PASS_REGS);
662static Int execute7(USES_REGS1)
664 return do_execute_n(6, ARG1, CurrentModule PASS_REGS);
667static Int execute8(USES_REGS1)
669 return do_execute_n(7, ARG1, CurrentModule PASS_REGS);
672static Int execute9(USES_REGS1)
674 return do_execute_n(8, ARG1, CurrentModule PASS_REGS);
677static Int execute10(USES_REGS1)
679 return do_execute_n(9, ARG1, CurrentModule PASS_REGS);
682static Int execute11(USES_REGS1)
684 return do_execute_n(10, ARG1, CurrentModule PASS_REGS);
687static Int execute12(USES_REGS1)
689 return do_execute_n(11, ARG1, CurrentModule PASS_REGS);
692static Int execute_clause(USES_REGS1)
694 Term t = Deref(ARG1);
695 Term mod = Deref(ARG2);
696 choiceptr cut_cp = cp_from_integer(Deref(ARG4) PASS_REGS);
700 Term clt = Deref(ARG3);
705 Yap_Error(INSTANTIATION_ERROR, ARG3,
"call/1");
708 else if (IsAtomTerm(t))
710 Atom a = AtomOfTerm(t);
711 pe = PredPropByAtom(a, mod);
713 else if (IsApplTerm(t))
715 register Functor f = FunctorOfTerm(t);
716 register unsigned int i;
719 if (IsExtensionFunctor(f))
721 if (f == FunctorModule)
723 Term tmod = ArgOfTerm(1, t);
724 if (!IsVarTerm(tmod) && IsAtomTerm(tmod))
731 pe = PredPropByFunc(f, mod);
732 arity = ArityOfFunctor(f);
733 if (arity > MaxTemps)
735 return CallError(TYPE_ERROR_CALLABLE, t, mod PASS_REGS);
741 for (i = 1; i <= arity; ++i)
746 XREGS[i] = (CELL)(pt - 1);
756 return CallError(TYPE_ERROR_CALLABLE, t, mod PASS_REGS);
760 if (RepPredProp(pe)->PredFlags & MegaClausePredFlag)
762 code = Yap_MegaClauseFromTerm(clt);
766 code = Yap_ClauseFromTerm(clt)->ClCode;
768 if (Yap_get_signal(YAP_CREEP_SIGNAL))
770 Yap_signal(YAP_CREEP_SIGNAL);
772 return CallPredicate(RepPredProp(pe), cut_cp, code PASS_REGS);
775static Int execute_in_mod(USES_REGS1)
777 return do_execute(Deref(ARG1), Deref(ARG2) PASS_REGS);
784static void prune_inner_computation(
choiceptr parent)
788 yamop *oP = P, *oCP = CP;
789 Int oENV = LCL0 - ENV;
792 while (cut_pt->cp_b && cut_pt->cp_b < parent)
794 cut_pt = cut_pt->cp_b;
797 CUT_prune_to(cut_pt);
801 LOCAL_AllowRestart = FALSE;
812static void complete_inner_computation(
choiceptr old_B)
819 else if (myB->cp_b == old_B)
823 DEPTH = myB->cp_depth;
826 else if (myB->cp_b && myB->cp_b < old_B)
828 while (myB->cp_b < old_B)
843static Int Yap_ignore(Term t,
bool fail USES_REGS)
845 yamop *oP = P, *oCP = CP;
846 Int oENV = LCL0 - ENV;
847 Int oYENV = LCL0 - YENV;
848 Int oB = LCL0 - (CELL *)B;
850 bool rc = Yap_RunTopGoal(t,
true);
854 complete_inner_computation((
choiceptr)(LCL0 - oB));
858 prune_inner_computation((
choiceptr)(LCL0 - oB));
874extern void *Yap_blob_info(Term t);
876static bool set_watch(Int Bv, Term task)
879 Term t = Yap_AllocExternalDataInStack((CELL)setup_call_catcher_cleanup_tag,
sizeof(Int), &pt);
885 TrailTerm(TR) = AbsPair(HR - 2);
890static bool watch_cut(Term ext USES_REGS)
894 Term task = TailOfTerm(ext);
895 Term cleanup = ArgOfTerm(3, task);
897 bool complete = IsNonVarTerm(Deref(ArgOfTerm(4, task)));
898 bool active = ArgOfTerm(5, task) == TermTrue;
899 bool ex_mode =
false;
905 CELL *port_pt = deref_ptr(RepAppl(task) + 2);
906 CELL *completion_pt = deref_ptr(RepAppl(task) + 4);
907 if ((ex_mode = Yap_HasException()))
910 e = MkAddressTerm(LOCAL_ActiveError);
914 t = Yap_MkApplTerm(FunctorException, 1, &e);
918 t = Yap_MkApplTerm(FunctorExternalException, 1, &e);
921 completion_pt[0] = TermException;
925 completion_pt[0] = port_pt[0] = TermCut;
930 LOCAL_ActiveError->errorNo =YAP_NO_ERROR;
934 Yap_ignore(cleanup,
false);
935 CELL *complete_pt = deref_ptr(RepAppl(task) + 4);
936 complete_pt[0] = TermTrue;
939 LOCAL_PrologMode |= InErrorMode;
955static bool watch_retry(Term d0 USES_REGS)
959 Term task = TailOfTerm(d0);
960 bool box = ArgOfTerm(1, task) == TermTrue;
961 Term cleanup = ArgOfTerm(3, task);
962 bool complete = !IsVarTerm(ArgOfTerm(4, task));
963 bool active = ArgOfTerm(5, task) == TermTrue;
968 CELL *port_pt = deref_ptr(RepAppl(Deref(task)) + 2);
969 CELL *complete_pt = deref_ptr(RepAppl(Deref(task)) + 4);
971 bool ex_mode =
false;
972 while (B->cp_ap->opc == FAIL_OPCODE ||
973 B->cp_ap == TRUSTFAILCODE)
977 if (B >= B0 && !ex_mode && !active)
979 if ((ex_mode = Yap_HasException()))
982 e = MkErrorTerm(&old);
985 t = Yap_MkApplTerm(FunctorException, 1, &e);
989 t = Yap_MkApplTerm(FunctorExternalException, 1, &e);
991 LOCAL_ActiveError->errorNo =YAP_NO_ERROR;
1007 DO_TRAIL(port_pt,t);
1008 Yap_ignore(cleanup,
true);
1009 RESET_VARIABLE(port_pt);
1013 LOCAL_PrologMode |= InErrorMode;
1030static Int setup_call_catcher_cleanup(USES_REGS1)
1032 Term Setup = Deref(ARG1);
1034 yamop *oP = P, *oCP = CP;
1035 Int oENV = LCL0 - ENV;
1036 Int oYENV = LCL0 - YENV;
1039 Yap_DisableInterrupts(worker_id);
1040 rc = Yap_RunTopGoal(Setup,
true);
1041 Yap_EnableInterrupts(worker_id);
1049 complete_inner_computation(B0);
1056 prune_inner_computation(B0);
1061 YENV = LCL0 - oYENV;
1065static Int tag_cleanup(USES_REGS1)
1067 Int iB = LCL0 - (CELL *)B;
1068 set_watch(iB, Deref(ARG2));
1069 return Yap_unify(ARG1, MkIntegerTerm(iB));
1072static Int cleanup_on_exit(USES_REGS1)
1076 Term task = Deref(ARG2);
1077 bool box = ArgOfTerm(1, task) == TermTrue;
1078 Term cleanup = ArgOfTerm(3, task);
1079 Term complete = IsNonVarTerm(ArgOfTerm(4, task));
1081 while (B->cp_ap->opc == FAIL_OPCODE ||
1082 B->cp_ap == TRUSTFAILCODE)
1085 if ((tq = Yap_ReadTimedVar(LOCAL_WokenGoals)) != 0 &&
1087 if (! Yap_ExecuteCallMetaCall(tq, CurrentModule) ) {
1095 CELL *catcher_pt = deref_ptr(RepAppl(Deref(task)) + 2);
1096 CELL *complete_pt = deref_ptr(RepAppl(Deref(task)) + 4);
1100 set_watch(LCL0 - (CELL *)B, task);
1105 catcher_pt[0] = TermAnswer;
1109 catcher_pt[0] = TermExit;
1110 complete_pt[0] = TermExit;
1112 Yap_ignore(cleanup,
false);
1120static bool complete_ge(
bool out, Term omod, yhandle_t sl,
bool creeping)
1125 Yap_signal(YAP_CREEP_SIGNAL);
1127 CurrentModule = omod;
1135static Int _user_expand_goal(USES_REGS1)
1137 yhandle_t sl = Yap_StartSlots();
1138 Int creeping = Yap_get_signal(YAP_CREEP_SIGNAL);
1140 Term cmod = CurrentModule, omod = cmod;
1142 Term g = Yap_YapStripModule(ARG1, &cmod);
1143 yhandle_t h1 = Yap_InitSlot(g), h2 = Yap_InitSlot(ARG2);
1147 if ((pe = RepPredProp(Yap_GetPredPropByFunc(FunctorGoalExpansion2, cmod))) &&
1148 pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
1149 Yap_execute_pred(pe, NULL,
true PASS_REGS))
1151 return complete_ge(
true, omod, sl, creeping);
1155 mg_args[1] = Yap_GetFromSlot(h1);
1156 ARG1 = Yap_MkApplTerm(FunctorModule, 2, mg_args);
1157 ARG2 = Yap_GetFromSlot(h2);
1158 if ((pe = RepPredProp(
1159 Yap_GetPredPropByFunc(FunctorGoalExpansion2, SYSTEM_MODULE))) &&
1160 pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
1161 Yap_execute_pred(pe, NULL,
true PASS_REGS))
1163 return complete_ge(
true, omod, sl, creeping);
1165 ARG1 = Yap_GetFromSlot(h1);
1167 ARG3 = Yap_GetFromSlot(h2);
1169 if ((pe = RepPredProp(
1170 Yap_GetPredPropByFunc(FunctorGoalExpansion, USER_MODULE))) &&
1171 pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
1172 Yap_execute_pred(pe, NULL PASS_REGS,
true))
1174 return complete_ge(
true, omod, sl, creeping);
1177 mg_args[1] = Yap_GetFromSlot(h1);
1178 ARG1 = Yap_MkApplTerm(FunctorModule, 2, mg_args);
1179 ARG2 = Yap_GetFromSlot(h2);
1181 if (cmod != USER_MODULE &&
1183 Yap_GetPredPropByFunc(FunctorGoalExpansion2, USER_MODULE))) &&
1184 pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
1185 Yap_execute_pred(pe, NULL PASS_REGS,
true))
1187 return complete_ge(
true, omod, sl, creeping);
1189 return complete_ge(
false, omod, sl, creeping);
1192static Int do_term_expansion(USES_REGS1)
1194 yhandle_t sl = Yap_StartSlots();
1195 Int creeping = Yap_get_signal(YAP_CREEP_SIGNAL);
1197 Term cmod = CurrentModule, omod = cmod;
1199 Term g = Yap_YapStripModule(ARG1, &cmod);
1200 yhandle_t h1 = Yap_InitSlot(g), h2 = Yap_InitSlot(ARG2);
1204 if ((pe = RepPredProp(
1205 Yap_GetPredPropByFunc(FunctorTermExpansion, USER_MODULE))) &&
1206 pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
1207 Yap_execute_pred(pe, NULL,
true PASS_REGS))
1209 return complete_ge(
true, omod, sl, creeping);
1211 ARG1 = Yap_GetFromSlot(h1);
1213 ARG3 = Yap_GetFromSlot(h2);
1214 if ((pe = RepPredProp(
1215 Yap_GetPredPropByFunc(FunctorTermExpansion3, USER_MODULE))) &&
1216 pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
1217 Yap_execute_pred(pe, NULL,
true PASS_REGS))
1219 return complete_ge(
true, omod, sl, creeping);
1223 if (cmod != USER_MODULE &&
1224 (pe = RepPredProp(Yap_GetPredPropByFunc(FunctorTermExpansion, cmod))) &&
1225 pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
1226 Yap_execute_pred(pe, NULL,
true PASS_REGS))
1228 return complete_ge(
true, omod, sl, creeping);
1232 mg_args[1] = Yap_GetFromSlot(h1);
1233 ARG1 = Yap_MkApplTerm(FunctorModule, 2, mg_args);
1234 ARG2 = Yap_GetFromSlot(h2);
1235 if ((pe = RepPredProp(
1236 Yap_GetPredPropByFunc(FunctorTermExpansion, SYSTEM_MODULE))) &&
1237 pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
1238 Yap_execute_pred(pe, NULL,
true PASS_REGS))
1240 return complete_ge(
true, omod, sl, creeping);
1242 return complete_ge(
false, omod, sl, creeping);
1245static Int execute0(USES_REGS1)
1247 Term t = Deref(ARG1);
1248 Term mod = Deref(ARG2);
1256 pe = Yap_get_pred(t, mod,
"call");
1259 arity = pe->ArityOfPE;
1262 if (arity > MaxTemps)
1264 return CallError(TYPE_ERROR_CALLABLE, t, mod PASS_REGS);
1269 CELL *pt = RepAppl(t) + 1;
1270 for (i = 1; i <= arity; ++i)
1275 XREGS[i] = (CELL)(pt - 1);
1285 return CallPredicate(pe, B,
1286 pe->CodeOfPred PASS_REGS);
1289static Int creep_step(USES_REGS1)
1292 Term t = Deref(ARG1);
1293 Term mod = Deref(ARG2);
1296 PredEntry *pe = Yap_get_pred(t, mod,
"execute0");
1299 arity = pe->ArityOfPE;
1302 CELL *pt = RepAppl(t) + 1;
1303 for (i = 1; i <= arity; ++i)
1308 XREGS[i] = (CELL)(pt - 1);
1318 if (pe->PredFlags & SpiedPredFlag)
1320 if (!LOCAL_InterruptsDisabled && Yap_get_signal(YAP_CREEP_SIGNAL))
1322 Yap_signal(YAP_CREEP_SIGNAL);
1324#if defined(YAPOR) || defined(THREADS)
1325 if (pe->PredFlags & LogUpdatePredFlag)
1331 rc = CallPredicate(pe, B,
1332 pe->cs.p_code.TrueCodeOfPred PASS_REGS);
1336 rc = CallPredicate(pe, B,
1337 pe->CodeOfPred PASS_REGS);
1339 if (!LOCAL_InterruptsDisabled &&
1340 (!(pe->PredFlags & (AsmPredFlag | CPredFlag)) ||
1341 pe->OpcodeOfPred == Yap_opcode(_call_bfunc_xx)))
1343 Yap_signal(YAP_CREEP_SIGNAL);
1348static Int execute_nonstop(USES_REGS1)
1351 Term t = Deref(ARG1);
1352 Term mod = Deref(ARG2);
1356 t = Yap_YapStripModule(t, &mod);
1359 mod = CurrentModule;
1361 else if (!IsAtomTerm(mod))
1363 Yap_Error(TYPE_ERROR_ATOM, ARG2,
"call/1");
1368 Yap_Error(INSTANTIATION_ERROR, ARG1,
"call/1");
1371 else if (IsAtomTerm(t))
1373 Atom a = AtomOfTerm(t);
1374 pe = PredPropByAtom(a, mod);
1376 else if (IsApplTerm(t))
1378 register Functor f = FunctorOfTerm(t);
1379 register unsigned int i;
1382 if (IsExtensionFunctor(f))
1384 pe = PredPropByFunc(f, mod);
1385 arity = ArityOfFunctor(f);
1386 if (arity > MaxTemps)
1388 return CallError(TYPE_ERROR_CALLABLE, t, mod PASS_REGS);
1393 pt = RepAppl(t) + 1;
1394 for (i = 1; i <= arity; ++i)
1399 XREGS[i] = (CELL)(pt - 1);
1409 Yap_Error(TYPE_ERROR_CALLABLE, t,
"call/1");
1414 if (RepPredProp(pe)->PredFlags & SpiedPredFlag)
1416 if (!LOCAL_InterruptsDisabled && Yap_get_signal(YAP_CREEP_SIGNAL))
1418 Yap_signal(YAP_CREEP_SIGNAL);
1420#if defined(YAPOR) || defined(THREADS)
1421 if (RepPredProp(pe)->PredFlags & LogUpdatePredFlag)
1423 PP = RepPredProp(pe);
1427 return CallPredicate(RepPredProp(pe), B,
1428 RepPredProp(pe)->cs.p_code.TrueCodeOfPred PASS_REGS);
1432 if (Yap_get_signal(YAP_CREEP_SIGNAL) && !LOCAL_InterruptsDisabled &&
1433 (!(RepPredProp(pe)->PredFlags & (AsmPredFlag | CPredFlag)) ||
1434 RepPredProp(pe)->OpcodeOfPred == Yap_opcode(_call_bfunc_xx)))
1436 Yap_signal(YAP_CREEP_SIGNAL);
1438 return CallPredicate(RepPredProp(pe), B,
1439 RepPredProp(pe)->CodeOfPred PASS_REGS);
1443static Int execute_0(USES_REGS1)
1445 Term mod = CurrentModule;
1446 Term t = Yap_YapStripModule(Deref(ARG1), &mod);
1449 return do_execute(t, mod PASS_REGS);
1452static bool call_with_args(
int i USES_REGS)
1454 Term mod = CurrentModule, t;
1457 t = Yap_YapStripModule(Deref(ARG1), &mod);
1461 Yap_ThrowError(INSTANTIATION_ERROR,t,
"call/%d",i+1);
1462 if (!IsAtomTerm(t)) {
1463 Yap_ThrowError(TYPE_ERROR_ATOM,t,
"call/%d",i+1);
1465 name = AtomOfTerm(t);
1466 if (name == AtomDot && i==2) {
1469 memmove(XREGS+(1),XREGS+2,i*
sizeof(CELL));
1470 PredEntry * pen = RepPredProp(PredPropByFunc(Yap_MkFunctor(name,i), mod));
1477 return CallPredicate(pen, B, pen->CodeOfPred PASS_REGS);
1481static Int execute_1(USES_REGS1)
1483 return call_with_args(1 PASS_REGS);
1486static Int execute_2(USES_REGS1)
1488 return call_with_args(2 PASS_REGS);
1491static Int execute_3(USES_REGS1)
1493 return call_with_args(3 PASS_REGS);
1496static Int execute_4(USES_REGS1)
1498 return call_with_args(4 PASS_REGS);
1501static Int execute_5(USES_REGS1)
1503 return call_with_args(5 PASS_REGS);
1506static Int execute_6(USES_REGS1)
1508 return call_with_args(6 PASS_REGS);
1511static Int execute_7(USES_REGS1)
1513 return call_with_args(7 PASS_REGS);
1516static Int execute_8(USES_REGS1)
1518 return call_with_args(8 PASS_REGS);
1521static Int execute_9(USES_REGS1)
1523 return call_with_args(9 PASS_REGS);
1526static Int execute_10(USES_REGS1)
1528 return call_with_args(10 PASS_REGS);
1533static Int execute_depth_limit(USES_REGS1)
1535 Term d = Deref(ARG2);
1538 Yap_Error(INSTANTIATION_ERROR, d,
"depth_bound_call/2");
1541 else if (!IsIntegerTerm(d))
1543 if (IsFloatTerm(d) && isinf(FloatOfTerm(d)))
1545 DEPTH = RESET_DEPTH();
1549 Yap_Error(TYPE_ERROR_INTEGER, d,
"depth_bound_call/2");
1555 DEPTH = MkIntTerm(IntegerOfTerm(d) * 2);
1557 return execute(PASS_REGS1);
1562static int exec_absmi(
bool top, yap_reset_t reset_mode USES_REGS)
1565 Int OldBorder = LOCAL_CBorder;
1566 LOCAL_CBorder = LCL0 - (CELL *)B;
1567 sigjmp_buf signew, *sighold = LOCAL_RestartEnv;
1568 LOCAL_RestartEnv = &signew;
1569 int lvl = push_text_stack();
1570 volatile int top_stream = Yap_FirstFreeStreamD();
1572 if (top && (lval = sigsetjmp(signew, 1)) != 0)
1579 LOCAL_PrologMode |= UserMode;
1580 LOCAL_PrologMode &= ~(BootMode | CCallMode | UnifyMode | UserCCallMode);
1589 ASP = (CELL *)PROTECT_FROZEN_B(B);
1592 CalculateStackGap(PASS_REGS1);
1593 LOCAL_PrologMode |= UserMode;
1594 LOCAL_PrologMode &= ~(BootMode | CCallMode | UnifyMode | UserCCallMode);
1595 P = (
yamop *)FAILCODE;
1606 Yap_set_fpu_exceptions(
1607 getAtomicGlobalPrologFlag(ARITHMETIC_EXCEPTIONS_FLAG));
1608 P = (
yamop *)FAILCODE;
1609 LOCAL_PrologMode |= UserMode;
1610 LOCAL_PrologMode &= ~(BootMode | CCallMode | UnifyMode | UserCCallMode);
1615 LOCAL_CBorder = OldBorder;
1616 LOCAL_Error_TYPE = YAP_NO_ERROR;
1617 LOCAL_RestartEnv = sighold;
1624 pop_text_stack(lvl);
1625 Yap_CloseTemporaryStreams(top_stream);
1631 LOCAL_PrologMode &= ~AbortMode;
1632 P = (
yamop *)FAILCODE;
1633 LOCAL_RestartEnv = sighold;
1639 Yap_CloseTemporaryStreams(top_stream);
1640 pop_text_stack(lvl);
1641 LOCAL_PrologMode |= UserMode;
1642 LOCAL_PrologMode &= ~(BootMode | CCallMode | UnifyMode | UserCCallMode);
1644 if (B && B->cp_b && B->cp_b < (
choiceptr)(LCL0 - LOCAL_CBorder))
1648 LOCAL_RestartEnv = sighold;
1649 LOCAL_CBorder = OldBorder;
1653 LOCAL_PrologMode |= UserMode;
1654 LOCAL_PrologMode &= ~(BootMode | CCallMode | UnifyMode | UserCCallMode);
1655 pop_text_stack(lvl);
1660 LOCAL_PrologMode |= UserMode;
1661 LOCAL_PrologMode &= ~(BootMode | CCallMode | UnifyMode | UserCCallMode);
1662 pop_text_stack(lvl);
1666 YENV[E_CB] = Unsigned(B);
1669 Yap_get_signal(YAP_FAIL_SIGNAL);
1670 if (!Yap_has_a_signal())
1671 CalculateStackGap(PASS_REGS1);
1672 LOCAL_CBorder = OldBorder;
1674 LOCAL_RestartEnv = sighold;
1678void Yap_PrepGoal(arity_t arity, CELL *pt,
choiceptr saved_b USES_REGS)
1686 YENV[E_CP] = (CELL)YESCODE;
1687 YENV[E_CB] = (CELL)B;
1688 YENV[E_E] = (CELL)ENV;
1690 YENV[E_B] = (CELL)B;
1693 YENV[E_DEPTH] = DEPTH;
1696 ASP -= EnvSizeInCells;
1703 for (i = 0; i < arity; i++)
1705 XREGS[i + 1] = *pt++;
1717 B->cp_depth = DEPTH;
1719 YENV = ASP = (CELL *)B;
1720 YENV[E_CB] = (CELL)B;
1725static int do_goal(
yamop *CodeAdr,
int arity, CELL *pt,
bool top USES_REGS)
1731 Yap_PrepGoal(arity, pt, saved_b PASS_REGS);
1733 P = (
yamop *)CodeAdr;
1739 out = exec_absmi(top, YAP_EXEC_ABSMI PASS_REGS);
1745 LOCAL_PrologMode &= ~TopGoalMode;
1749bool Yap_exec_absmi(
bool top, yap_reset_t has_reset)
1752 return exec_absmi(top, has_reset PASS_REGS);
1759void Yap_fail_all(
choiceptr bb USES_REGS)
1761 yamop *saved_p, *saved_cp;
1766 while (B->cp_b && B->cp_b != bb && B->cp_ap != NOCODE)
1777 a = exec_absmi(
true, YAP_EXEC_ABSMI PASS_REGS);
1783 DEPTH = B->cp_depth;
1785 YENV = ENV = B->cp_env;
1788 DEPTH = ENV[E_DEPTH];
1791 if (POP_CHOICE_POINT(B->cp_b))
1795 ENV = (CELL *)(ENV[E_E]);
1800 YENV = ENV = (CELL *)((B->cp_env)[E_E]);
1806 HB = PROTECT_FROZEN_H(B);
1811bool Yap_execute_pred(
PredEntry *ppe, CELL *pt,
bool pass_ex USES_REGS)
1813 yamop *saved_p, *saved_cp;
1819 LOCAL_PrologMode |= TopGoalMode;
1822 CodeAdr = ppe->CodeOfPred;
1823 UNLOCK(ppe->PELock);
1824 out = do_goal(CodeAdr, ppe->ArityOfPE, pt,
true PASS_REGS);
1836 while (POP_CHOICE_POINT(ENV[E_CB]))
1842 CUT_prune_to(cut_B);
1847 while (B->cp_b < cut_B)
1852 abolish_incomplete_subgoals(B);
1861 DEPTH = ENV[E_DEPTH];
1863 ENV = (CELL *)(ENV[E_E]);
1872 if (pass_ex && Yap_HasException())
1885 DEPTH = B->cp_depth;
1891 YENV = ENV = (CELL *)((B->cp_env)[E_E]);
1894 HB = PROTECT_FROZEN_H(B);
1903 Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
"emulator crashed");
1908bool Yap_execute_goal(Term t,
int nargs, Term mod,
bool pass_ex)
1920 Atom a = AtomOfTerm(t);
1922 pe = PredPropByAtom(a, mod);
1924 else if (IsApplTerm(t))
1928 if (IsBlobFunctor(f))
1930 Yap_Error(TYPE_ERROR_CALLABLE, t,
"call/1");
1936 pt = RepAppl(t) + 1;
1937 pe = PredPropByFunc(f, mod);
1941 Yap_Error(TYPE_ERROR_CALLABLE, t,
"call/1");
1944 ppe = RepPredProp(pe);
1947 return CallMetaCall(t, mod PASS_REGS);
1949 return Yap_execute_pred(ppe, pt, pass_ex PASS_REGS);
1952void Yap_trust_last(
void)
1959 DEPTH = B->cp_depth;
1961 YENV = ASP = B->cp_env;
1962 ENV = (CELL *)((B->cp_env)[E_E]);
1964 P = (
yamop *)(ENV[E_CP]);
1968 HB = PROTECT_FROZEN_H(B);
1972Term Yap_RunTopGoal(Term t,
bool handle_errors)
1980 Term tmod = CurrentModule;
1982 LOCAL_PrologMode |= TopGoalMode;
1984 t = Yap_YapStripModule(t, &tmod);
1987 Yap_Error(INSTANTIATION_ERROR, t,
"call/1");
1988 LOCAL_PrologMode &= ~TopGoalMode;
1995 ts[1] = (CurrentModule == 0 ? TermProlog : CurrentModule);
1996 t = Yap_MkApplTerm(FunctorCsult, 2, ts);
2000 Atom a = AtomOfTerm(t);
2002 pe = Yap_GetPredPropByAtom(a, tmod);
2005 else if (IsApplTerm(t))
2009 if (IsBlobFunctor(f))
2011 Yap_Error(TYPE_ERROR_CALLABLE, t,
"call/1");
2012 LOCAL_PrologMode &= ~TopGoalMode;
2018 pe = Yap_GetPredPropByFunc(f, tmod);
2019 pt = RepAppl(t) + 1;
2020 arity = ArityOfFunctor(f);
2024 Yap_Error(TYPE_ERROR_CALLABLE, Yap_PredicateIndicator(t, tmod),
"call/1");
2025 LOCAL_PrologMode &= ~TopGoalMode;
2028 ppe = RepPredProp(pe);
2029 if (pe == NIL || ppe->cs.p_code.TrueCodeOfPred->opc == UNDEF_OPCODE ||
2030 (ppe->PredFlags & (MetaPredFlag | UndefPredFlag)))
2037 Functor f = Yap_MkFunctor(Yap_LookupAtom(
"call"), 1);
2040 t = Yap_MkApplTerm(FunctorModule, 2, ts);
2041 pe = Yap_GetPredPropByFunc(f, tmod);
2042 ppe = RepPredProp(pe);
2046 CodeAdr = ppe->CodeOfPred;
2047 UNLOCK(ppe->PELock);
2049#if !USE_SYSTEM_MALLOC
2050 if (LOCAL_TrailTop - HeapTop < 2048)
2052 Yap_Error(RESOURCE_ERROR_TRAIL, TermNil,
2053 "unable to boot because of too little Trail space");
2056 LOCAL_PrologMode &= ~TopGoalMode;
2057 goal_out = do_goal(CodeAdr, arity, pt, handle_errors PASS_REGS);
2061static void do_restore_regs(Term t,
int restore_all USES_REGS)
2066 Int max = ArityOfFunctor(FunctorOfTerm(t)) - 4;
2067 CELL *ptr = RepAppl(t) + 5;
2069 P = (
yamop *)IntegerOfTerm(ptr[-4]);
2070 CP = (
yamop *)IntegerOfTerm(ptr[-3]);
2071 ENV = (CELL *)(LCL0 - IntegerOfTerm(ptr[-2]));
2072 YENV = (CELL *)(LCL0 - IntegerOfTerm(ptr[-1]));
2073 for (i = 0; i < max; i += 2)
2075 Int j = IntOfTerm(ptr[0]);
2083static Int restore_regs(USES_REGS1)
2085 Term t = Deref(ARG1);
2088 Yap_Error(INSTANTIATION_ERROR, t,
"support for coroutining");
2093 do_restore_regs(t, FALSE PASS_REGS);
2097bool Yap_restore_regs(Term t USES_REGS)
2102 Yap_Error(INSTANTIATION_ERROR, t,
"support for coroutining");
2107 do_restore_regs(t, FALSE PASS_REGS);
2120static Int restore_regs2(USES_REGS1)
2123 Term t = Deref(ARG1), d0;
2129 Yap_Error(INSTANTIATION_ERROR, t,
"support for coroutining");
2135 do_restore_regs(t, TRUE PASS_REGS);
2139 Yap_Error(INSTANTIATION_ERROR, d0,
"support for coroutining");
2142 if (!IsIntegerTerm(d0))
2146 d = IntegerOfTerm(d0);
2155 if ((CELL *)pt0 != LCL0 && pt0 > B)
2158 while (B->cp_b < pt0)
2160 while (POP_CHOICE_POINT(B->cp_b))
2169 abolish_incomplete_subgoals(B);
2179static Int clean_ifcp(USES_REGS1)
2181 Term t = Deref(ARG2);
2182 Term t0 = Deref(ARG1);
2185 must_be_integer(t0);
2192 pt0 = cp_from_integer(t PASS_REGS);
2201 prune(pt0 PASS_REGS);
2206 while (b != pt0 && b->cp_b != pt0 && b->cp_b)
2209 pt0->cp_ap = (
yamop *)TRUSTFAILCODE;
2215static int disj_marker(
yamop *apc)
2217 op_numbers opnum = Yap_op_from_opcode(apc->opc);
2219 return opnum == _or_else || opnum == _or_last;
2222static Int cut_up_to_next_disjunction(USES_REGS1)
2225 CELL *qenv = (CELL *)ENV[E_E];
2227 while (pt0 && !(qenv == pt0->cp_env && disj_marker(pt0->cp_ap)))
2237 if (SHOULD_CUT_UP_TO(B, pt0))
2241 abolish_incomplete_subgoals(B);
2258bool Yap_Reset(yap_reset_t mode,
bool hard)
2271 a = exec_absmi(
true, mode PASS_REGS);
2276 Yap_InitYaamRegs(worker_id,
false);
2277 GLOBAL_Initialised =
true;
2284 Yap_RebootSlots(worker_id);
2292 if (cp_b->cp_ap->opc != ORLAST_OPCODE)
2295 pe = cp_b->cp_ap->y_u.Osblp.p0;
2297 pe = cp_b->cp_ap->y_u.p.p;
2303 return pe == PredSafeCallCleanup;
2306void Yap_InitYaamRegs(
int myworker_id,
bool full_reset)
2315 REGSTORE *rs = REMOTE_ThreadHandle(myworker_id).default_yaam_regs;
2316 pthread_setspecific(Yap_yaamregs_key, (
const void *)rs);
2317 REMOTE_ThreadHandle(myworker_id).current_yaam_regs = rs;
2321 Yap_regp = &Yap_standard_regs;
2325 Yap_PutValue(AtomBreak, MkIntTerm(0));
2327 Yap_InitPreAllocCodeSpace(myworker_id);
2328 TR = (tr_fr_ptr)REMOTE_TrailBase(myworker_id);
2329 H0 = ((CELL *)REMOTE_GlobalBase(myworker_id)) ;
2330 LCL0 = ASP = (CELL *)REMOTE_LocalBase(myworker_id);
2331 CurrentTrailTop = (tr_fr_ptr)(REMOTE_TrailTop(myworker_id) - MinTrailGap);
2338 DEPTH = RESET_DEPTH();
2340 STATIC_PREDICATES_MARKED = FALSE;
2347 BBREG = B_FZ = (
choiceptr)REMOTE_LocalBase(myworker_id);
2348 TR = TR_FZ = (tr_fr_ptr)REMOTE_TrailBase(myworker_id);
2351 REMOTE_GcGeneration(myworker_id) = Yap_NewCompactTimedVar(MkIntTerm(0));
2352 REMOTE_WokenGoals(myworker_id) = Yap_NewTimedVar(TermTrue);
2353 REMOTE_AttsMutableList(myworker_id) = Yap_NewTimedVar(TermNil);
2354 REMOTE_GcCurrentPhase(myworker_id) = MkIntTerm(0L);
2355 REMOTE_GcPhase(myworker_id) = Yap_NewCompactTimedVar(MkIntTerm(0L));
2356 REMOTE_GlobalArena(myworker_id) = Yap_MkArena(HR, HR+(128 * 128));
2360 HR = Yap_ArenaLimit(REMOTE_GlobalArena(myworker_id));
2362 tv->value = MkIntTerm(0);
2363 tv->clock = (CELL)H0;
2364 tv = (
timed_var *)(RepAppl(REMOTE_GcPhase(myworker_id))+1);
2365 tv->value = MkIntTerm(0);
2366 tv->clock = (CELL)H0;
2367 REMOTE_GcCurrentPhase(myworker_id) = MkIntTerm(0);
2368 tv = (
timed_var *)(RepAppl(REMOTE_WokenGoals(myworker_id))+1);
2369 tv->value = TermTrue;
2370 tv->clock = (CELL)H0;
2371 tv = (
timed_var *)(RepAppl(REMOTE_AttsMutableList(myworker_id))+1);
2372 tv->value = TermNil;
2373 tv->clock = (CELL)H0;
2376 CalculateStackGap(PASS_REGS1);
2379#if defined(YAPOR) || defined(THREADS)
2380 LOCAL = REMOTE(myworker_id);
2381 worker_id = myworker_id;
2383 Yap_RebootSlots(myworker_id);
2384#if defined(YAPOR) || defined(THREADS)
2394 B = BBREG = B_FZ = (
choiceptr)REMOTE_LocalBase(myworker_id);
2395 TR = TR_FZ = (tr_fr_ptr)REMOTE_TrailBase(myworker_id);
2397 CalculateStackGap(PASS_REGS1);
2400 if (REMOTE_top_dep_fr(myworker_id))
2401 DepFr_cons_cp(REMOTE_top_dep_fr(myworker_id)) = NORM_CP(B);
2403 cut_c_initialize(myworker_id);
2404 Yap_PrepGoal(0, NULL, NULL PASS_REGS);
2407void Yap_InitExecFs(
void)
2411 memset(&catcher_ops, 0,
sizeof(catcher_ops));
2412 catcher_ops.cut_handler = watch_cut;
2413 catcher_ops.fail_handler = watch_retry;
2414 setup_call_catcher_cleanup_tag = YAP_NewOpaqueType(&catcher_ops);
2416 Term cm = CurrentModule;
2418 Yap_InitCPred(
"$execute", 1, execute, 0);
2419 Yap_InitCPred(
"call", 1, execute, 0);
2420 Yap_InitCPred(
"call", 2, execute2, 0);
2421 Yap_InitCPred(
"call", 3, execute3, 0);
2422 Yap_InitCPred(
"call", 4, execute4, 0);
2423 Yap_InitCPred(
"call", 5, execute5, 0);
2424 Yap_InitCPred(
"call", 6, execute6, 0);
2425 Yap_InitCPred(
"call", 7, execute7, 0);
2426 Yap_InitCPred(
"call", 8, execute8, 0);
2427 Yap_InitCPred(
"call", 9, execute9, 0);
2428 Yap_InitCPred(
"call", 10, execute10, 0);
2429 Yap_InitCPred(
"call", 11, execute11, 0);
2430 Yap_InitCPred(
"call", 12, execute12, 0);
2431 Yap_InitCPred(
"call_in_mod", 2, execute_in_mod, 0);
2432 Yap_InitCPred(
"call_wo_mod", 2, execute_in_mod, 0);
2433 Yap_InitCPred(
"call_with_args", 1, execute_0, 0);
2434 Yap_InitCPred(
"call_with_args", 2, execute_1, 0);
2435 Yap_InitCPred(
"call_with_args", 3, execute_2, 0);
2436 Yap_InitCPred(
"call_with_args", 4, execute_3, 0);
2437 Yap_InitCPred(
"call_with_args", 5, execute_4, 0);
2438 Yap_InitCPred(
"call_with_args", 6, execute_5, 0);
2439 Yap_InitCPred(
"call_with_args", 7, execute_6, 0);
2440 Yap_InitCPred(
"call_with_args", 8, execute_7, 0);
2441 Yap_InitCPred(
"call_with_args", 9, execute_8, 0);
2442 Yap_InitCPred(
"call_with_args", 10, execute_9, 0);
2443 Yap_InitCPred(
"call_with_args", 11, execute_10, 0);
2445 Yap_InitCPred(
"$execute_under_depth_limit", 2, execute_depth_limit, 0);
2447 Yap_InitCPred(
"$execute0", 2, execute0, NoTracePredFlag);
2448 Yap_InitCPred(
"$execute_nonstop", 2, execute_nonstop, NoTracePredFlag);
2449 Yap_InitCPred(
"$creep_step", 2, creep_step, NoTracePredFlag);
2450 Yap_InitCPred(
"$execute_clause", 4, execute_clause, NoTracePredFlag);
2451 Yap_InitCPred(
"cut_at", 2, clean_ifcp, SafePredFlag);
2452 CurrentModule = HACKS_MODULE;
2453 Yap_InitCPred(
"env_choice_point", 1, save_env_b, 0);
2455 Yap_InitCPred(
"$restore_regs", 1, restore_regs,
2456 NoTracePredFlag | SafePredFlag);
2457 Yap_InitCPred(
"$restore_regs", 2, restore_regs2,
2458 NoTracePredFlag | SafePredFlag);
2459 Yap_InitCPred(
"$clean_ifcp", 2, clean_ifcp, SafePredFlag);
2460 Yap_InitCPred(
"qpack_clean_up_to_disjunction", 0, cut_up_to_next_disjunction,
2463 Yap_InitCPred(
"_user_expand_goal", 2, _user_expand_goal, 0);
2464 Yap_InitCPred(
"$do_term_expansion", 2, do_term_expansion, 0);
2465 Yap_InitCPred(
"$setup_call_catcher_cleanup", 1, setup_call_catcher_cleanup,
2467 Yap_InitCPred(
"$cleanup_on_exit", 2, cleanup_on_exit, 0);
2468 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
yap_error_descriptor_t * Yap_PeekException(void)
is an error active?
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