19static char SccsId[] =
"@(#)cdmgr.c 1.1 05/02/98";
28static Int get_debugger_state(USES_REGS1) {
29 const char *s = RepAtom(AtomOfTerm(Deref(ARG1)))->StrOfAE;
30 if (!strcmp(s,
"creep")) {
31 return Yap_unify(ARG2, LOCAL_debugger_state[DEBUG_CREEP_LEAP_OR_ZIP]);
33 if (!strcmp(s,
"goal_number")) {
34 return Yap_unify(ARG2, LOCAL_debugger_state[DEBUG_GOAL_NUMBER]);
36 if (!strcmp(s,
"spy")) {
37 return Yap_unify(ARG2, LOCAL_debugger_state[DEBUG_SPY]);
39 if (!strcmp(s,
"trace")) {
40 return Yap_unify(ARG2, LOCAL_debugger_state[DEBUG_TRACE]);
42 if (!strcmp(s,
"debug")) {
43 return Yap_unify(ARG2, LOCAL_debugger_state[DEBUG_DEBUG]);
48static Int set_debugger_state(USES_REGS1) {
49 const char *s = RepAtom(AtomOfTerm(Deref(ARG1)))->StrOfAE;
50 if (!strcmp(s,
"creep")) {
51 LOCAL_debugger_state[DEBUG_CREEP_LEAP_OR_ZIP] = Deref(ARG2);
54 if (!strcmp(s,
"goal_number")) {
55 LOCAL_debugger_state[DEBUG_GOAL_NUMBER] = Deref(ARG2);
58 if (!strcmp(s,
"spy")) {
59 LOCAL_debugger_state[DEBUG_SPY] = Deref(ARG2);
62 if (!strcmp(s,
"trace")) {
63 LOCAL_debugger_state[DEBUG_TRACE] = Deref(ARG2);
66 if (!strcmp(s,
"debug")) {
67 LOCAL_debugger_state[DEBUG_DEBUG] = Deref(ARG2);
73static void init_debugger_state(
void) {
75 LOCAL_debugger_state[DEBUG_CREEP_LEAP_OR_ZIP] = TermCreep;
76 LOCAL_debugger_state[DEBUG_GOAL_NUMBER] = MkIntTerm(0);
77 LOCAL_debugger_state[DEBUG_SPY] = TermOff;
78 LOCAL_debugger_state[DEBUG_TRACE] = TermFalse;
79 LOCAL_debugger_state[DEBUG_DEBUG] = TermFalse;
82static Int set_debugger_state5(USES_REGS1) {
83 Term t1 = Deref(ARG1);
86 LOCAL_debugger_state[DEBUG_CREEP_LEAP_OR_ZIP] = t1;
90 LOCAL_debugger_state[DEBUG_GOAL_NUMBER] = t1;
94 LOCAL_debugger_state[DEBUG_SPY] = t1;
98 LOCAL_debugger_state[DEBUG_TRACE] = t1;
101 if (!IsVarTerm(t1)) {
102 LOCAL_debugger_state[DEBUG_DEBUG] = t1;
107static Int get_debugger_state5(USES_REGS1) {
108 Term t1 = Deref(ARG1);
109 if (!Yap_unify(LOCAL_debugger_state[DEBUG_CREEP_LEAP_OR_ZIP], t1))
112 if (!Yap_unify(LOCAL_debugger_state[DEBUG_GOAL_NUMBER], t1))
115 if (!Yap_unify(LOCAL_debugger_state[DEBUG_SPY], t1))
118 if (!Yap_unify(LOCAL_debugger_state[DEBUG_TRACE], t1))
121 if (!Yap_unify(LOCAL_debugger_state[DEBUG_DEBUG], t1))
132static Int p_is_no_trace(USES_REGS1) {
135 pe = Yap_get_pred(Deref(ARG1), Deref(ARG2),
"undefined/1");
139 if (pe->PredFlags & (NoTracePredFlag | HiddenPredFlag)) {
147static Int p_set_no_trace(USES_REGS1) {
150 pe = Yap_get_pred(Deref(ARG1), Deref(ARG2),
"undefined/1");
154 pe->PredFlags |= NoTracePredFlag;
159int Yap_SetNoTrace(
char *name, arity_t arity, Term tmod) {
163 pe = Yap_get_pred(MkAtomTerm(Yap_LookupAtom(name)), tmod,
"no_trace");
166 PredPropByFunc(Yap_MkFunctor(Yap_LookupAtom(name), arity), tmod));
171 pe->PredFlags |= NoTracePredFlag;
176static Int p_setspy(USES_REGS1) {
183 pred = RepPredProp(PredPropByFunc(Yap_MkFunctor(at, 1), 0));
187 if (IsVarTerm(mod) || !IsAtomTerm(mod))
192 Atom at = AtomOfTerm(t);
193 pred = RepPredProp(Yap_PredPropByAtomNonThreadLocal(at, mod));
194 }
else if (IsApplTerm(t)) {
195 Functor fun = FunctorOfTerm(t);
196 pred = RepPredProp(Yap_PredPropByFunctorNonThreadLocal(fun, mod));
202 if (pred->PredFlags & (CPredFlag | SafePredFlag)) {
206 if (pred->OpcodeOfPred == UNDEF_OPCODE || pred->OpcodeOfPred == FAIL_OPCODE) {
210 if (pred->OpcodeOfPred == INDEX_OPCODE) {
212 for (i = 0; i < pred->ArityOfPE; i++) {
213 XREGS[i + 1] = MkVarTerm();
215 Yap_IPred(pred, 0, CP);
218 fg = pred->PredFlags;
219 if (fg & DynamicPredFlag) {
220 pred->OpcodeOfPred = ((
yamop *)(pred->CodeOfPred))->opc =
221 Yap_opcode(_spy_or_trymark);
223 pred->OpcodeOfPred = Yap_opcode(_spy_pred);
224 pred->CodeOfPred = (
yamop *)(&(pred->OpcodeOfPred));
226 pred->PredFlags |= SpiedPredFlag;
231static Int p_rmspy(USES_REGS1) {
239 if (IsVarTerm(mod) || !IsAtomTerm(mod))
245 pred = RepPredProp(Yap_PredPropByAtomNonThreadLocal(at, mod));
246 }
else if (IsApplTerm(t)) {
247 Functor fun = FunctorOfTerm(t);
248 pred = RepPredProp(Yap_PredPropByFunctorNonThreadLocal(fun, mod));
252 if (!(pred->PredFlags & SpiedPredFlag)) {
257 if (pred->PredFlags & ThreadLocalPredFlag) {
258 pred->OpcodeOfPred = Yap_opcode(_thread_local);
259 pred->PredFlags ^= SpiedPredFlag;
264 if (!(pred->PredFlags & (CountPredFlag | ProfiledPredFlag))) {
265 if (!(pred->PredFlags & DynamicPredFlag)) {
266#if defined(YAPOR) || defined(THREADS)
267 if (pred->PredFlags & LogUpdatePredFlag &&
268 !(pred->PredFlags & ThreadLocalPredFlag) &&
269 pred->ModuleOfPred != IDB_MODULE) {
270 pred->OpcodeOfPred = LOCKPRED_OPCODE;
271 pred->CodeOfPred = (
yamop *)(&(pred->OpcodeOfPred));
274 pred->CodeOfPred = pred->cs.p_code.TrueCodeOfPred;
275 pred->OpcodeOfPred = pred->CodeOfPred->opc;
276#if defined(YAPOR) || defined(THREADS)
279 }
else if (pred->OpcodeOfPred == Yap_opcode(_spy_or_trymark)) {
280 pred->OpcodeOfPred = Yap_opcode(_try_and_mark);
286 pred->PredFlags ^= SpiedPredFlag;
291static Int p_creep(USES_REGS1) {
295 if (LOCAL_debugger_state[DEBUG_CREEP_LEAP_OR_ZIP] == TermZip ||
296 LOCAL_debugger_state[DEBUG_DEBUG] == TermFalse)
299 pred = RepPredProp(PredPropByFunc(Yap_MkFunctor(at, 1), 0));
301 Yap_signal( YAP_CREEP_SIGNAL);
305static Int p_creep_fail(USES_REGS1) {
308 if (LOCAL_debugger_state[DEBUG_CREEP_LEAP_OR_ZIP] == TermZip ||
309 LOCAL_debugger_state[DEBUG_DEBUG] == TermFalse)
312 pred = RepPredProp(PredPropByFunc(Yap_MkFunctor(at, 1), 0));
314 Yap_signal(YAP_CREEP_SIGNAL);
318static Int stop_creeping(USES_REGS1) {
319 LOCAL_debugger_state[DEBUG_DEBUG] = TermFalse;
320 if (Yap_get_signal(YAP_CREEP_SIGNAL)) {
321 return Yap_unify(ARG1, TermTrue);
323 return Yap_unify(ARG1, TermFalse);
326static Int disable_debugging(USES_REGS1) {
327 Yap_get_signal(YAP_CREEP_SIGNAL);
331static Int creep_allowed(USES_REGS1) {
333 Yap_get_signal(YAP_CREEP_SIGNAL);
339void Yap_InitDebugFs(
void) {
342 init_debugger_state();
343 Yap_InitCPred(
"$creep", 0, p_creep, SafePredFlag);
344 Yap_InitCPred(
"$creep_fail", 0, p_creep_fail, SafePredFlag);
345 Yap_InitCPred(
"$stop_creeping", 1, stop_creeping,
346 NoTracePredFlag | HiddenPredFlag | SafePredFlag);
347 Yap_InitCPred(
"$set_spy", 2, p_setspy, SyncPredFlag);
348 Yap_InitCPred(
"$rm_spy", 2, p_rmspy, SafePredFlag | SyncPredFlag);
349 Yap_InitCPred(
"$get_debugger_state", 2, get_debugger_state, NoTracePredFlag);
350 Yap_InitCPred(
"$get_debugger_state", 5, get_debugger_state5, NoTracePredFlag);
351 Yap_InitCPred(
"$set_debugger_state", 2, set_debugger_state, NoTracePredFlag);
352 Yap_InitCPred(
"$set_debugger_state", 5, set_debugger_state5, NoTracePredFlag);
353 Yap_InitCPred(
"$is_no_trace", 2, p_is_no_trace, TestPredFlag | SafePredFlag);
354 Yap_InitCPred(
"$set_no_trace", 2, p_set_no_trace,
355 TestPredFlag | SafePredFlag);
356 Yap_InitCPred(
"creep_allowed", 0, creep_allowed, 0);
357 Yap_InitCPred(
"$disable_debugging", 0, disable_debugging,
358 NoTracePredFlag | HiddenPredFlag | SafePredFlag);