17static char SccsId[] =
"%W% %G%";
36void Yap_suspend_goal(Term tg USES_REGS) {
39 Yap_signal(YAP_WAKEUP_SIGNAL);
41 Term WGs = Yap_ReadTimedVar(LOCAL_WokenGoals);
42 if (IsVarTerm(WGs) || WGs == TermTrue) {
43 Yap_UpdateTimedVar(LOCAL_WokenGoals, tg);
45 if (!IsApplTerm(WGs) || FunctorOfTerm(WGs) != FunctorComma) {
49 WGs = Yap_MkApplTerm(FunctorComma, 2, t);
50 Yap_UpdateTimedVar(LOCAL_WokenGoals, WGs);
55 while (IsApplTerm(WGs) && (nt = ArgOfTerm(2, WGs)) != TermTrue) {
58 Term newTail = AbsAppl(HR);
59 *pt++ = (CELL)FunctorComma;
61 MaBind(RepAppl(WGs) + 2, newTail);
70 t[0] = (CELL) & (attv->Done);
72 ng = Yap_MkApplTerm(FunctorAttGoal, 2, t);
73 Yap_suspend_goal(ng PASS_REGS);
75void AddCompareToQueue(Term Cmp, Term t1, Term t2 USES_REGS) {
80 Term tg = Yap_MkApplTerm(FunctorCompare, 3, ts);
81 Yap_suspend_goal(tg PASS_REGS);
84void AddUnifToQueue(Term t1, Term t2 USES_REGS) {
88 Term tg = Yap_MkApplTerm(FunctorEq, 2, ts);
89 Yap_suspend_goal(tg PASS_REGS);
97 HR = (CELL *)(newv + 1);
98 newv->AttFunc = FunctorAttVar;
99 RESET_VARIABLE(&(newv->Future));
100 RESET_VARIABLE(&(newv->Done));
101 RESET_VARIABLE(&(newv->Atts));
115static int CopyAttVar(CELL *orig,
void *tvp, CELL *res USES_REGS) {
116 struct cp_frame **to_visit_ptr = tvp;
119 struct cp_frame *to_visit = *to_visit_ptr;
122 if (!(newv = BuildNewAttVar(PASS_REGS1)))
125 to_visit->start_cp = vt - 1;
126 to_visit->end_cp = vt;
127 if (IsVarTerm(attv->Atts)) {
128 Bind_Global_NonAtt(&newv->Atts, (CELL)HR);
132 to_visit->to = &(newv->Atts);
134 to_visit->oldv = vt[-1];
135 to_visit->ground = FALSE;
136 *to_visit_ptr = to_visit + 1;
137 *res = (CELL) & (newv->Done);
141static Term AttVarToTerm(CELL *orig) {
147static int IsEmptyWakeUp(Term atts) {
148 Atom name = NameOfFunctor(FunctorOfTerm(atts));
149 Atom *pt = EmptyWakeups;
151 while (i < MaxEmptyWakeups) {
158void Yap_MkEmptyWakeUp(
Atom mod) {
159 if (MaxEmptyWakeups == MAX_EMPTY_WAKEUPS)
160 Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
161 "too many modules that do not wake up");
162 EmptyWakeups[MaxEmptyWakeups++] = mod;
165static int TermToAttVar(Term attvar, Term to USES_REGS) {
169 Bind_Global_NonAtt(&attv->Atts, attvar);
170 *VarOfTerm(to) = AbsAttVar(attv);
174static void WakeAttVar(CELL *pt1, CELL reg2 USES_REGS) {
178 reg2 = MkGlobal(Deref(reg2));
180 Term td = Deref(attv->Done);
181 if (IsEmptyWakeUp(attv->Atts)) {
183 Bind_Global_NonAtt(&(attv->Done), reg2);
188 if (!IsUnboundVar(&attv->Future)) {
190 AddUnifToQueue(td, reg2);
195 if (!IsVarTerm(reg2)) {
196 if (IsVarTerm(attv->Future)) {
197 Bind_Global_NonAtt(&(attv->Future), reg2);
198 AddToQueue(attv PASS_REGS);
200 AddUnifToQueue((Term)pt1, reg2 PASS_REGS);
205 CELL *pt2 = VarOfTerm(reg2);
206 if (pt1 == pt2 || attv->Future == reg2) {
210 if (!IsAttVar(pt2)) {
211 Bind_Global_NonAtt(pt2, attv->Done);
216 Term td2 = Deref(susp2->Done);
217 if (td2 == td || td2 == attv->Future) {
220 if (IsEmptyWakeUp(susp2->Atts)) {
222 Bind_Global_NonAtt(pt2, attv->Done);
226 reg2 = Deref(susp2->Future);
227 if (!IsVarTerm(reg2)) {
228 Bind_Global_NonAtt(pt1, reg2);
229 AddToQueue(attv PASS_REGS);
232 Bind_Global_NonAtt(&attv->Future, susp2->Done);
233 AddToQueue(attv PASS_REGS);
235 Bind_Global_NonAtt(&susp2->Future, attv->Done);
236 AddToQueue(susp2 PASS_REGS);
241void Yap_WakeUp(CELL *pt0) {
243 if (LOCAL_DoNotWakeUp)
245 LOCAL_DoNotWakeUp =
true;
248 WakeAttVar(pt0, d0 PASS_REGS);
249 LOCAL_DoNotWakeUp =
false;
251 CreepFlag = (CELL)LCL0;
254static void mark_attvar(CELL *orig) {
return; }
256static Term BuildAttTerm(
Functor mfun, UInt ar USES_REGS) {
260 if (HR + (1024 + ar) > ASP) {
261 LOCAL_Error_Size = ar *
sizeof(CELL);
265 RESET_VARIABLE(HR + 1);
267 for (i = 1; i < ar; i++) {
275static Term SearchAttsForModule(Term start,
Functor mfun) {
277 if (IsVarTerm(start))
279 if (!IsApplTerm(start))
281 if ( FunctorOfTerm(start) == mfun) {
284 Term a1 = ArgOfTerm(1, start);
285 if (FunctorOfTerm(start) == FunctorAtt1) {
286 if (IsAtomTerm(a1) && NameOfFunctor(mfun) == AtomOfTerm(a1))
288 start = ArgOfTerm(3, start);
295static Term SearchAttsForModuleFunctorName(Term start,
Atom mname) {
298 if (IsVarTerm(start))
300 if (!IsApplTerm(start))
302 if ((at = NameOfFunctor(FunctorOfTerm(start))) == mname) {
305 Term a1 = ArgOfTerm(1, start);
306 if (FunctorOfTerm(start) == FunctorAtt1) {
307 if (IsAtomTerm(a1) && at == AtomOfTerm(a1))
309 start = ArgOfTerm(3, start);
317static Term SearchAttsForModuleName(Term start,
Atom mname) {
319 if (IsVarTerm(start))
321 if (!IsApplTerm(start))
323 if (NameOfFunctor(FunctorOfTerm(start)) == mname) {
326 Term a1 = ArgOfTerm(1, start);
327 if (FunctorOfTerm(start) == FunctorAtt1) {
328 if (IsAtomTerm(a1) && mname == AtomOfTerm(a1))
329 return ArgOfTerm(2, start);
330 start = ArgOfTerm(3, start);
338static void AddNewModule(
attvar_record *attv, Term t,
int new,
339 int do_it USES_REGS) {
340 CELL *newp = RepAppl(t) + 2;
341 UInt i, ar = ArityOfFunctor((
Functor)newp[-2]);
343 for (i = 1; i < ar; i++) {
344 Term n = Deref(*newp);
345 if (n == TermFreeTerm) {
348 if (n != TermVoidAtt)
357 }
else if (IsVarTerm(attv->Atts)) {
358 MaBind(&(attv->Atts), t);
360 Term *wherep = &attv->Atts;
363 if (IsVarTerm(*wherep)) {
364 Bind_Global_NonAtt(wherep, t);
367 wherep = RepAppl(Deref(*wherep)) + 1;
373static void ReplaceAtts(
attvar_record *attv, Term oatt, Term att USES_REGS) {
374 UInt ar = ArityOfFunctor(FunctorOfTerm(oatt)), i;
375 CELL *oldp = RepAppl(oatt) + 1;
380 newp = RepAppl(att) + 2;
383 for (i = 1; i < ar; i++) {
384 Term n = Deref(*newp);
385 if (n != TermFreeTerm) {
393 newp = RepAppl(att) + 1;
395 for (i = 1; i < ar; i++) {
396 Term n = Deref(*newp);
398 if (n == TermFreeTerm) {
399 *newp = Deref(*oldp);
404 if (attv->Atts == oatt) {
405 if (RepAppl(attv->Atts) >= HB)
408 MaBind(&(attv->Atts), att);
410 Term *wherep = &attv->Atts;
413 if (*wherep == oatt) {
417 wherep = RepAppl(Deref(*wherep)) + 1;
424 MaBind(&(attv->Done), attv->Future);
427static void DelAtts(
attvar_record *attv, Term oatt USES_REGS) {
428 Term t = ArgOfTerm(1, oatt);
429 if (attv->Atts == oatt) {
431 DelAllAtts(attv PASS_REGS);
434 if (RepAppl(attv->Atts) >= HB)
437 MaBind(&(attv->Atts), t);
439 Term *wherep = &attv->Atts;
442 if (*wherep == oatt) {
446 wherep = RepAppl(Deref(*wherep)) + 1;
452static void PutAtt(Int pos, Term atts, Term att USES_REGS) {
453 if (IsVarTerm(att) && VarOfTerm(att) > HR && VarOfTerm(att) < LCL0) {
455 Term tnew = MkVarTerm();
456 Bind_NonAtt(VarOfTerm(att), tnew);
459 MaBind(RepAppl(atts) + pos, att);
463 Term done = Deref(attv->Done);
464 Term value = Deref(attv->Future);
466 Bind_Global_NonAtt(&(attv->Done), value);
468 if (IsVarTerm(done) && IsUnboundVar(&attv->Done)) {
470 if (!IsVarTerm(value)) {
471 Bind_Global_NonAtt(&(attv->Done), value);
472 }
else if (IsVarTerm(value)) {
475 if (IsAttachedTerm(t)) {
478 Bind_Global_NonAtt(&(attv2->Done), AbsAttVar(attv));
479 }
else if (attv2 != attv) {
480 Bind_Global_NonAtt(&(attv->Done), AbsAttVar(attv2));
483 Yap_Error(SYSTEM_ERROR_INTERNAL, value,
484 "attvar was bound when unset");
488 Bind_Global_NonAtt(&(attv->Done), t);
493 Yap_Error(SYSTEM_ERROR_INTERNAL, (CELL) & (attv->Done),
494 "attvar was bound when set");
500 RESET_VARIABLE(&(attv->Done));
516static Int put_att(USES_REGS1) {
518 Term inp = Deref(ARG1);
520 if (IsVarTerm(inp)) {
522 Atom modname = AtomOfTerm(Deref(ARG2));
523 UInt ar = IntegerOfTerm(Deref(ARG3));
528 if (IsAttachedTerm(inp)) {
529 attv = RepAttVar(VarOfTerm(inp));
531 while (!(attv = BuildNewAttVar(PASS_REGS1))) {
534 Yap_Error(RESOURCE_ERROR_STACK, TermNil, LOCAL_ErrorMessage);
540 mfun = Yap_MkFunctor(modname, ar);
541 if ((tatts = SearchAttsForModule(attv->Atts, mfun)) == 0) {
542 while (!(tatts = BuildAttTerm(mfun, ar PASS_REGS))) {
544 Yap_Error(RESOURCE_ERROR_STACK, TermNil, LOCAL_ErrorMessage);
549 CELL *ptr = VarOfTerm(Deref(ARG1));
550 CELL d0 = AbsAttVar(attv);
551 Bind_NonAtt(ptr, d0);
553 AddNewModule(attv, tatts,
new, TRUE PASS_REGS);
555 PutAtt(IntegerOfTerm(Deref(ARG4)), tatts, Deref(ARG5) PASS_REGS);
558 Yap_Error(REPRESENTATION_ERROR_VARIABLE, inp,
559 "first argument of put_attributes/2");
564static Int rm_att(USES_REGS1) {
566 Term inp = Deref(ARG1);
568 if (IsVarTerm(inp)) {
570 Atom modname = AtomOfTerm(Deref(ARG2));
571 UInt ar = IntegerOfTerm(Deref(ARG3));
576 if (IsAttachedTerm(inp)) {
577 attv = RepAttVar(VarOfTerm(inp));
579 while (!(attv = BuildNewAttVar(PASS_REGS1))) {
582 Yap_Error(RESOURCE_ERROR_STACK, TermNil, LOCAL_ErrorMessage);
587 Yap_unify(ARG1, AbsAttVar(attv));
589 mfun = Yap_MkFunctor(modname, ar);
590 if (IsVarTerm(tatts = SearchAttsForModule(attv->Atts, mfun))) {
591 while (!(tatts = BuildAttTerm(mfun, ar PASS_REGS))) {
593 Yap_Error(RESOURCE_ERROR_STACK, TermNil, LOCAL_ErrorMessage);
597 AddNewModule(attv, tatts,
new, FALSE PASS_REGS);
599 PutAtt(IntegerOfTerm(Deref(ARG4)), tatts, TermVoidAtt PASS_REGS);
603 Yap_Error(REPRESENTATION_ERROR_VARIABLE, inp,
"first argument of rm_att/2");
608static Int put_atts(USES_REGS1) {
610 Term inp = Deref(ARG1);
613 if (IsVarTerm(inp)) {
616 Term tatts = Deref(ARG2);
617 Functor mfun = FunctorOfTerm(tatts);
620 if (IsAttachedTerm(inp)) {
621 attv = RepAttVar(VarOfTerm(inp));
623 while (!(attv = BuildNewAttVar(PASS_REGS1))) {
625 if (!Yap_dogc(PASS_REGS1)) {
626 Yap_Error(RESOURCE_ERROR_STACK, TermNil, LOCAL_ErrorMessage);
631 Yap_unify(ARG1, AbsAttVar(attv));
635 if (IsVarTerm(tatts)) {
636 Yap_Error(INSTANTIATION_ERROR, tatts,
"second argument of put_att/2");
638 }
else if (!IsApplTerm(tatts)) {
639 Yap_Error(TYPE_ERROR_COMPOUND, tatts,
"second argument of put_att/2");
642 if (IsVarTerm(otatts = SearchAttsForModule(attv->Atts, mfun))) {
643 AddNewModule(attv, tatts,
new, FALSE PASS_REGS);
645 ReplaceAtts(attv, otatts, tatts PASS_REGS);
649 Yap_Error(REPRESENTATION_ERROR_VARIABLE, inp,
650 "first argument of put_att/2");
655static Int del_atts(USES_REGS1) {
657 Term inp = Deref(ARG1);
661 if (IsVarTerm(inp)) {
663 Term tatts = Deref(ARG2);
664 Functor mfun = FunctorOfTerm(tatts);
666 if (IsAttachedTerm(inp)) {
667 attv = RepAttVar(VarOfTerm(inp));
671 if (IsVarTerm(otatts = SearchAttsForModule(attv->Atts, mfun))) {
674 DelAtts(attv, otatts PASS_REGS);
682static Int del_all_atts(USES_REGS1) {
684 Term inp = Deref(ARG1);
687 if (IsVarTerm(inp) && IsAttachedTerm(inp)) {
690 attv = RepAttVar(VarOfTerm(inp));
691 DelAllAtts(attv PASS_REGS);
696static Int get_atts(USES_REGS1) {
698 Term inp = Deref(ARG1);
700 if (IsVarTerm(inp)) {
701 if (IsAttachedTerm(inp)) {
704 Term access = Deref(ARG2);
705 Functor mfun = FunctorOfTerm(access);
709 attv = RepAttVar(VarOfTerm(inp));
710 if (IsVarTerm(tatts = SearchAttsForModule(attv->Atts, mfun)))
713 ar = ArityOfFunctor(mfun);
714 new = RepAppl(access) + 2;
715 old = RepAppl(tatts) + 2;
716 for (i = 1; i < ar; i++,
new ++, old++) {
717 if (*
new != TermFreeTerm) {
718 if (*old == TermVoidAtt && *
new != TermVoidAtt)
720 if (*
new == TermVoidAtt &&*old != TermVoidAtt)
722 if (!Yap_unify(*
new, *old))
736static Int free_att(USES_REGS1) {
738 Term inp = Deref(ARG1);
740 if (IsVarTerm(inp)) {
741 Atom modname = AtomOfTerm(Deref(ARG2));
743 if (IsAttachedTerm(inp)) {
747 attv = RepAttVar(VarOfTerm(inp));
748 if ((tatts = SearchAttsForModuleFunctorName(attv->Atts, modname)) == 0)
750 tout = ArgOfTerm(IntegerOfTerm(Deref(ARG3)), tatts);
751 return (tout == TermVoidAtt);
757 Yap_Error(REPRESENTATION_ERROR_VARIABLE, inp,
758 "first argument of free_att/2");
767static Int get_att(USES_REGS1) {
769 Term inp = Deref(ARG1);
771 if (IsVarTerm(inp)) {
772 if (IsAttachedTerm(inp)) {
775 Term access = Deref(ARG2);
776 Functor mfun = FunctorOfTerm(access);
780 attv = RepAttVar(VarOfTerm(inp));
781 if (IsVarTerm(tatts = SearchAttsForModule(attv->Atts, mfun)))
784 ar = ArityOfFunctor(mfun);
785 new = RepAppl(access) + 2;
786 old = RepAppl(tatts) + 2;
787 for (i = 1; i < ar; i++,
new ++, old++) {
788 if (*
new != TermFreeTerm) {
789 if (*old == TermVoidAtt && *
new != TermVoidAtt)
791 if (*
new == TermVoidAtt &&*old != TermVoidAtt)
793 if (!Yap_unify(*
new, *old))
807static Int has_atts(USES_REGS1) {
809 Term inp = Deref(ARG1);
811 if (IsVarTerm(inp)) {
812 if (IsAttachedTerm(inp)) {
814 Term access = Deref(ARG2);
815 Functor mfun = FunctorOfTerm(access);
817 attv = RepAttVar(VarOfTerm(inp));
818 return SearchAttsForModule(attv->Atts, mfun) != 0;
824 Yap_Error(REPRESENTATION_ERROR_VARIABLE, inp,
825 "first argument of has_atts/2");
830static Int bind_attvar(USES_REGS1) {
832 Term inp = Deref(ARG1);
834 if (IsVarTerm(inp)) {
835 if (IsAttachedTerm(inp)) {
837 return (BindAttVar(attv PASS_REGS));
841 Yap_Error(REPRESENTATION_ERROR_VARIABLE, inp,
842 "first argument of bind_attvar/2");
847static Int wake_up_done(USES_REGS1) {
852static Int wake_up_start(USES_REGS1) {
856static Int unbind_attvar(USES_REGS1) {
858 Term inp = Deref(ARG1);
860 if (IsVarTerm(inp)) {
861 if (IsAttachedTerm(inp)) {
863 return (UnBindAttVar(attv));
867 Yap_Error(REPRESENTATION_ERROR_VARIABLE, inp,
868 "first argument of bind_attvar/2");
873static Int get_all_atts(USES_REGS1) {
875 Term inp = Deref(ARG1);
877 if (IsVarTerm(inp)) {
878 if (IsAttachedTerm(inp)) {
880 return Yap_unify(ARG2, GetAllAtts(attv));
884 Yap_Error(REPRESENTATION_ERROR_VARIABLE, inp,
885 "first argument of get_all_atts/2");
890static int ActiveAtt(Term tatt, UInt ar) {
891 CELL *cp = RepAppl(tatt) + 1;
894 for (i = 1; i < ar; i++) {
895 if (cp[i] != TermVoidAtt)
901static Int modules_with_atts(USES_REGS1) {
903 Term inp = Deref(ARG1);
905 if (IsVarTerm(inp)) {
906 if (IsAttachedTerm(inp)) {
911 if (IsVarTerm(tatt = attv->Atts))
912 return Yap_unify(ARG2, TermNil);
913 while (!IsVarTerm(tatt)) {
914 Functor f = FunctorOfTerm(tatt);
916 HR[-1] = AbsPair(HR);
917 if (ActiveAtt(tatt, ArityOfFunctor(f))) {
918 *HR = MkAtomTerm(NameOfFunctor(f));
921 tatt = ArgOfTerm(1, tatt);
925 return Yap_unify(ARG2, AbsPair(h0));
928 return Yap_unify(ARG2, TermNil);
930 Yap_Error(REPRESENTATION_ERROR_VARIABLE, inp,
931 "first argument of modules_with_attributes/2");
951static Int get_attr(USES_REGS1) {
953 Term inp = Deref(ARG1);
955 Atom modname = AtomOfTerm(must_be_module(ARG2));
959 if (IsAttachedTerm(inp)) {
963 attv = RepAttVar(VarOfTerm(inp));
964 if ((tatts = SearchAttsForModuleName(attv->Atts, modname)) == 0)
966 return Yap_unify(tatts, ARG3);
980static Int get_attrs(USES_REGS1) {
982 Term inp = Deref(ARG1);
984 if (!IsVarTerm(inp) || !IsAttachedTerm(inp)) {
988 attv = RepAttVar(VarOfTerm(inp));
989 return Yap_unify(ARG2, attv->Atts);
1005static Int put_attr(USES_REGS1) {
1008 Term inp = must_be_unbound(ARG1);
1010 ts[0] = must_be_module(ARG2);
1013 if (IsVarTerm(inp)) {
1015 if (IsAttachedTerm(inp)) {
1016 attv = RepAttVar(VarOfTerm(inp));
1018 MaBind(&attv->Atts, Yap_MkApplTerm(FunctorAtt1, 3, ts));
1019 Term start = attv->Atts;
1021 if (IsVarTerm(start))
1023 if (!IsApplTerm(start))
1025 if (FunctorOfTerm(start) != FunctorAtt1) {
1026 start = ArgOfTerm(1, start);
1029 if (ts[0] != ArgOfTerm(1, start)) {
1030 start = ArgOfTerm(3, start);
1034 MaBind(RepAppl(start) + 2, Deref(ARG3));
1037 ts[1] = MkGlobal(ARG3);
1038 if (IsVarTerm(attv->Atts))
1043 MaBind(&attv->Atts, Yap_MkApplTerm(FunctorAtt1, 3, ts))
1046 while (!(attv = BuildNewAttVar(PASS_REGS1))) {
1049 Yap_Error(RESOURCE_ERROR_STACK, TermNil, LOCAL_ErrorMessage);
1055 *S++ = (CELL)FunctorAtt1;
1057 *S++ = MkGlobal(ARG3);
1059 attv->Atts = AbsAppl(S - 4);
1061 MaBind(VarOfTerm(inp), attv->Done);
1075static Int put_attrs(USES_REGS1) {
1077 Term inp = Deref(ARG1);
1079 if (!IsVarTerm(inp) || IsAttachedTerm(inp)) {
1083 attv = RepAttVar(VarOfTerm(inp));
1084 MaBind(&attv->Atts, Deref(ARG2));
1099static Int del_attr(USES_REGS1) {
1101 Term inp = Deref(ARG1);
1102 Term mod = must_be_module(ARG2);
1104 if (!IsVarTerm(inp) || IsAttachedTerm(inp)) {
1108 Term start = attv->Atts, *outside = &attv->Atts;
1110 if (IsVarTerm(start))
1112 if (!IsApplTerm(start))
1114 if (FunctorOfTerm(start) != FunctorAtt1) {
1115 outside = RepAppl(start) + 1;
1116 start = ArgOfTerm(1, start);
1119 if (mod != ArgOfTerm(1, start)) {
1120 outside = RepAppl(start) + 3;
1121 start = ArgOfTerm(3, start);
1125 Term next = ArgOfTerm(3, start);
1126 if (outside == &attv->Atts && next == TermNil) {
1127 DelAllAtts(attv PASS_REGS);
1129 MaBind(outside, next);
1145static Int del_attrs(USES_REGS1) {
1147 Term inp = Deref(ARG1);
1149 if (!IsVarTerm(inp) || !IsAttachedTerm(inp)) {
1153 attv = RepAttVar(VarOfTerm(inp));
1154 DelAllAtts(attv PASS_REGS);
1159static Int swi_all_atts(USES_REGS1) {
1161 Term inp = Deref(ARG1);
1163 if (IsVarTerm(inp)) {
1164 if (IsAttachedTerm(inp)) {
1166 return Yap_unify(ARG2, attv->Atts);
1168 return Yap_unify(ARG2, TermNil);
1170 Yap_Error(REPRESENTATION_ERROR_VARIABLE, inp,
1171 "first argument of get_all_swi_atts/2");
1176static Term AllAttVars(USES_REGS1) {
1183 if (reg == (CELL)FunctorAttVar) {
1184 if (IsUnboundVar(pt + 1)) {
1185 if (ASP - myH < 1024) {
1186 LOCAL_Error_Size = (ASP - HR) *
sizeof(CELL);
1190 myH[-1] = AbsPair(myH);
1195 pt += (1 + ATT_RECORD_ARITY);
1196 }
else if (IsExtensionFunctor(f) && reg > 0 && reg %
sizeof(CELL) == 0) {
1197 ssize_t bigsz = SizeOfOpaqueTerm(pt, reg);
1198 if (bigsz <= 0 || pt + bigsz > HR || !IsAtomTerm(pt[bigsz - 1])) {
1202 CELL end = CloseExtension(pt);
1210 Term out = AbsPair(HR);
1219static Int all_attvars(USES_REGS1) {
1223 if (!(out = AllAttVars(PASS_REGS1))) {
1224 Yap_Error(RESOURCE_ERROR_STACK, TermNil, LOCAL_ErrorMessage);
1227 return Yap_unify(ARG1, out);
1240static Int is_attvar(USES_REGS1) {
1241 Term t = Deref(ARG1);
1242 return (IsVarTerm(t) && IsAttVar(VarOfTerm(t)));
1246static Int attvar_bound(USES_REGS1) {
1247 Term t = Deref(ARG1);
1248 return IsVarTerm(t) && IsAttachedTerm(t) &&
1249 !IsUnboundVar(&(RepAttVar(VarOfTerm(t))->Done));
1252static Int void_term(USES_REGS1) {
return Yap_unify(ARG1, TermVoidAtt); }
1254static Int free_term(USES_REGS1) {
return Yap_unify(ARG1, TermFreeTerm); }
1256static Int fast_unify(USES_REGS1) {
1263 if (!IsVarTerm(t1 = Deref(ARG1)))
1265 if (!IsVarTerm(t2 = Deref(ARG2)))
1270 Bind_Global_NonAtt(a, t2);
1271 }
else if ((a) < (b)) {
1272 Bind_Global_NonAtt(b, t1);
1277void Yap_InitAttVarPreds(
void) {
1279 Yap_InitCPred(
"get_all_swi_atts", 2, swi_all_atts, SafePredFlag);
1280 Yap_InitCPred(
"put_attr", 3, put_attr, 0);
1281 Yap_InitCPred(
"put_attrs", 2, put_attrs, 0);
1282 Yap_InitCPred(
"get_attr", 3, get_attr, SafePredFlag);
1283 Yap_InitCPred(
"get_attrs", 2, get_attrs, SafePredFlag);
1284 Yap_InitCPred(
"del_attr", 2, del_attr, SafePredFlag);
1285 Yap_InitCPred(
"del_attrs", 1, del_attrs, SafePredFlag);
1286 Term OldCurrentModule = CurrentModule;
1287 CurrentModule = ATTRIBUTES_MODULE;
1288 GLOBAL_attas[attvars_ext].bind_op = WakeAttVar;
1289 GLOBAL_attas[attvars_ext].copy_term_op = CopyAttVar;
1290 GLOBAL_attas[attvars_ext].to_term_op = AttVarToTerm;
1291 GLOBAL_attas[attvars_ext].term_to_op = TermToAttVar;
1292 GLOBAL_attas[attvars_ext].mark_op = mark_attvar;
1293 Yap_InitCPred(
"get_att", 4, get_att, SafePredFlag);
1294 Yap_InitCPred(
"free_att", 3, free_att, SafePredFlag);
1295 Yap_InitCPred(
"put_att", 5, put_att, 0);
1296 Yap_InitCPred(
"has_module_atts", 2, has_atts, SafePredFlag);
1297 Yap_InitCPred(
"get_all_atts", 2, get_all_atts, SafePredFlag);
1298 Yap_InitCPred(
"get_module_atts", 2, get_atts, SafePredFlag);
1299 Yap_InitCPred(
"put_module_atts", 2, put_atts, 0);
1300 Yap_InitCPred(
"del_all_module_atts", 2, del_atts, 0);
1301 Yap_InitCPred(
"del_all_atts", 1, del_all_atts, 0);
1302 Yap_InitCPred(
"rm_att", 4, rm_att, 0);
1303 Yap_InitCPred(
"bind_attvar", 1, bind_attvar, SafePredFlag);
1304 Yap_InitCPred(
"unbind_attvar", 1, unbind_attvar, SafePredFlag);
1305 Yap_InitCPred(
"modules_with_attributes", 2, modules_with_atts, SafePredFlag);
1306 Yap_InitCPred(
"void_term", 1, void_term, SafePredFlag);
1307 Yap_InitCPred(
"free_term", 1, free_term, SafePredFlag);
1308 Yap_InitCPred(
"fast_unify_attributed", 2, fast_unify, 0);
1309 Yap_InitCPred(
"all_attvars", 1, all_attvars, 0);
1310 CurrentModule = OldCurrentModule;
1311 Yap_InitCPred(
"attvar", 1, is_attvar, SafePredFlag | TestPredFlag);
1312 Yap_InitCPred(
"$att_bound", 1, attvar_bound, SafePredFlag | TestPredFlag);
1313 Yap_InitCPred(
"$wake_up_start", 0, wake_up_start, 0);
1314 Yap_InitCPred(
"$wake_up_done", 0, wake_up_done, 0);
Attributed variales are controlled by the attvar_record.