18static char SccsId[] =
"%W% %G%";
38uint64_t HashFunction(
const unsigned char *CHP) {
43 while ((c = *CHP++) !=
'\0') {
45 hash = hash * (uint64_t)33 + c;
62 if (p->KindOfPE == FunctorProperty &&
63 RepFunctorProp(p)->ArityOfFE == arity) {
72static inline Functor InlinedUnlockedMkFunctor(
AtomEntry *ae, arity_t arity) {
76 p0 = GetFunctorProp(ae, arity);
83 p->KindOfPE = FunctorProperty;
84 p->NameOfFE = AbsAtom(ae);
87 INIT_RWLOCK(p->FRWLock);
94 return (InlinedUnlockedMkFunctor(ae, arity));
102 WRITE_LOCK(ae->ARWLock);
103 f = InlinedUnlockedMkFunctor(ae, arity);
104 WRITE_UNLOCK(ae->ARWLock);
109void Yap_MkFunctorWithAddress(
Atom ap,
unsigned int arity,
FunctorEntry *p) {
112 WRITE_LOCK(ae->ARWLock);
113 p->KindOfPE = FunctorProperty;
115 p->ArityOfFE = arity;
117 WRITE_UNLOCK(ae->ARWLock);
120inline static Atom SearchInInvisible(
const unsigned char *atom) {
123 READ_LOCK(INVISIBLECHAIN.AERWLock);
124 chain = RepAtom(INVISIBLECHAIN.Entry);
125 while (!EndOfPAEntr(chain) && strcmp((
char *)chain->StrOfAE, (
char *)atom)) {
126 chain = RepAtom(chain->NextOfAE);
128 READ_UNLOCK(INVISIBLECHAIN.AERWLock);
129 if (EndOfPAEntr(chain))
132 return (AbsAtom(chain));
135static inline Atom SearchAtom(
const unsigned char *p,
Atom a) {
137 const char *ps = (
const char *)p;
142 if (strcmp(ae->StrOfAE, ps) == 0) {
152LookupAtom(
const unsigned char *atom) {
154 const unsigned char *p;
157 size_t sz = AtomHashTableSize;
161 if (atom==NULL)
return NULL;
162 hash = HashFunction(p);
165 READ_LOCK(HashChain[hash].AERWLock);
166 a = HashChain[hash].Entry;
168 na = SearchAtom(atom, a);
170 READ_UNLOCK(HashChain[hash].AERWLock);
173 READ_UNLOCK(HashChain[hash].AERWLock);
175 WRITE_LOCK(HashChain[hash].AERWLock);
177#if defined(YAPOR) || defined(THREADS)
178 if (a != HashChain[hash].Entry) {
179 a = HashChain[hash].Entry;
180 na = SearchAtom(atom, a);
182 WRITE_UNLOCK(HashChain[hash].AERWLock);
188 sz = strlen((
const char *)atom);
189 size_t asz = (
sizeof *ae) + ( sz+1);
192 WRITE_UNLOCK(HashChain[hash].AERWLock);
197 CELL *aec = (CELL*)ae;
198 aec[asz/(YAP_ALIGN+1)-1] = 0;
202 strcpy(ae->StrOfAE, (
const char *)atom);
205 HashChain[hash].Entry = na;
206 INIT_RWLOCK(ae->ARWLock);
207 WRITE_UNLOCK(HashChain[hash].AERWLock);
208 if (NOfAtoms > 2 * AtomHashTableSize) {
209 Yap_signal(YAP_CDOVF_SIGNAL);
215Atom Yap_LookupAtomWithLength(
const char *atom,
222 if (atom==NULL)
return NULL;
223 ptr = Yap_AllocCodeSpace(len0 + 1);
226 memcpy(ptr, atom, len0);
228 at = LookupAtom(ptr);
232 Atom Yap_LookupAtom(
const char *atom) {
233 return LookupAtom((
const unsigned char *)atom);
236 Atom Yap_ULookupAtom(
237 const unsigned char *atom) {
238 return LookupAtom(atom);
242 Atom Yap_FullLookupAtom(
const char *atom) {
245 if ((t = SearchInInvisible((
const unsigned char *)atom)) != NIL) {
248 return LookupAtom((
const unsigned char *)atom);
251 void Yap_LookupAtomWithAddress(
const char *atom,
254 register const unsigned char *p;
257 if (atom == NULL)
return;
259 p = (
const unsigned char *)atom;
260 hash = HashFunction(p) % AtomHashTableSize;
263 WRITE_LOCK(HashChain[hash].AERWLock);
264 a = HashChain[hash].Entry;
266 if (SearchAtom(p, a) != NIL) {
267 Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
268 "repeated initialization for atom %s", ae);
269 WRITE_UNLOCK(HashChain[hash].AERWLock);
275 HashChain[hash].Entry = AbsAtom(ae);
277 strcpy((
char *)ae->StrOfAE, (
char *)atom);
278 INIT_RWLOCK(ae->ARWLock);
279 WRITE_UNLOCK(HashChain[hash].AERWLock);
282 void Yap_ReleaseAtom(
Atom atom) {
284 register const unsigned char *p;
287 char unsigned *name = ap->UStrOfAE;
291 hash = HashFunction(p) % AtomHashTableSize;
292 WRITE_LOCK(HashChain[hash].AERWLock);
293 if (HashChain[hash].Entry == atom) {
295 HashChain[hash].Entry = ap->NextOfAE;
296 WRITE_UNLOCK(HashChain[hash].AERWLock);
300 inChain = RepAtom(HashChain[hash].Entry);
301 while (inChain && inChain->NextOfAE != atom)
302 inChain = RepAtom(inChain->NextOfAE);
305 WRITE_LOCK(inChain->ARWLock);
306 inChain->NextOfAE = ap->NextOfAE;
307 WRITE_UNLOCK(inChain->ARWLock);
308 WRITE_UNLOCK(HashChain[hash].AERWLock);
317 pp = RepProp(ae->PropsOfAE);
318 while (!EndOfPAEntr(pp) && pp->KindOfPE != kind)
319 pp = RepProp(pp->NextOfPE);
320 return (AbsProp(pp));
323 Prop Yap_GetAPropHavingLock(
325 return GetAPropHavingLock(ae, kind);
329 GetAProp(
Atom a, PropFlags kind) {
333 READ_LOCK(ae->ARWLock);
334 out = GetAPropHavingLock(ae, kind);
335 READ_UNLOCK(ae->ARWLock);
341 return GetAProp(a, kind);
344 OpEntry *Yap_GetOpPropForAModuleHavingALock(
349 pp = RepProp(ae->PropsOfAE);
350 while (!EndOfPAEntr(pp) &&
351 (pp->KindOfPE != OpProperty || ((
OpEntry *)pp)->OpModule != mod))
352 pp = RepProp(pp->NextOfPE);
353 if (EndOfPAEntr(pp)) {
359 int Yap_HasOp(
Atom a) {
363 READ_LOCK(ae->ARWLock);
364 pp = RepProp(ae->PropsOfAE);
365 while (!EndOfPAEntr(pp) && (pp->KindOfPE != OpProperty))
366 pp = RepProp(pp->NextOfPE);
367 READ_UNLOCK(ae->ARWLock);
368 if (EndOfPAEntr(pp)) {
376 Yap_OpPropForModule(
Atom a,
382 if (mod == TermProlog)
384 WRITE_LOCK(ae->ARWLock);
385 pp = RepProp(ae->PropsOfAE);
386 while (!EndOfPAEntr(pp)) {
387 if (pp->KindOfPE == OpProperty) {
389 if (info->OpModule == mod) {
390 WRITE_LOCK(info->OpRWLock);
391 WRITE_UNLOCK(ae->ARWLock);
398 info->KindOfPE = Ord(OpProperty);
399 info->NextOfPE = NULL;
400 info->OpModule = mod;
403 info->OpNext = OpList;
407 INIT_RWLOCK(info->OpRWLock);
408 WRITE_LOCK(info->OpRWLock);
409 WRITE_UNLOCK(ae->ARWLock);
410 info->Prefix = info->Infix = info->Posfix = 0;
415 Yap_GetOpProp(
Atom a, op_type type,
416 Term cmod USES_REGS) {
421 READ_LOCK(ae->ARWLock);
422 pp = RepProp(ae->PropsOfAE);
423 while (!EndOfPAEntr(pp)) {
425 if (pp->KindOfPE != OpProperty) {
426 pp = RepProp(pp->NextOfPE);
430 if (info->OpModule != cmod && info->OpModule != PROLOG_MODULE) {
431 pp = RepProp(pp->NextOfPE);
434 if (type == INFIX_OP) {
436 pp = RepProp(pp->NextOfPE);
439 }
else if (type == POSFIX_OP) {
441 pp = RepProp(pp->NextOfPE);
446 pp = RepProp(pp->NextOfPE);
451 if (info->OpModule == PROLOG_MODULE) {
454 pp = RepProp(pp->NextOfPE);
456 READ_LOCK(info->OpRWLock);
457 READ_UNLOCK(ae->ARWLock);
462 READ_LOCK(oinfo->OpRWLock);
463 READ_UNLOCK(ae->ARWLock);
466 READ_UNLOCK(ae->ARWLock);
470 inline static Prop GetPredPropByAtomHavingLock(
AtomEntry *ae, Term cur_mod)
478 if (pe->KindOfPE == PEProp &&
479 (pe->ModuleOfPred == cur_mod || !pe->ModuleOfPred)) {
483 if (pe->PredFlags & ThreadLocalPredFlag) {
484 return AbsPredProp(Yap_GetThreadPred(pe INIT_REGS));
493 Prop Yap_GetPredPropByAtom(
Atom at, Term cur_mod)
499 READ_LOCK(ae->ARWLock);
500 p0 = GetPredPropByAtomHavingLock(ae, cur_mod);
501 READ_UNLOCK(ae->ARWLock);
505 inline static Prop GetPredPropByAtomHavingLockInThisModule(
AtomEntry *ae, Term cur_mod)
513 if (pe->KindOfPE == PEProp && pe->ModuleOfPred == cur_mod) {
516 if (pe->PredFlags & ThreadLocalPredFlag) {
517 return AbsPredProp(Yap_GetThreadPred(pe INIT_REGS));
527 Prop Yap_GetPredPropByAtomInThisModule(
Atom at, Term cur_mod)
533 READ_LOCK(ae->ARWLock);
534 p0 = GetPredPropByAtomHavingLockInThisModule(ae, cur_mod);
535 READ_UNLOCK(ae->ARWLock);
540 Prop Yap_GetPredPropByFunc(
Functor f, Term cur_mod)
546 p0 = GetPredPropByFuncHavingLock(f, cur_mod);
552 Prop Yap_GetPredPropByFuncInThisModule(
Functor f, Term cur_mod)
558 p0 = GetPredPropByFuncHavingLock(f, cur_mod);
563 Prop Yap_GetPredPropHavingLock(
Atom ap,
unsigned int arity, Term mod)
571 GetPredPropByAtomHavingLock(ae, mod);
573 f = InlinedUnlockedMkFunctor(ae, arity);
575 p0 = GetPredPropByFuncHavingLock(f, mod);
581 Prop Yap_GetExpProp(
Atom at,
unsigned int arity) {
586 READ_LOCK(ae->ARWLock);
587 p = RepExpProp(p0 = ae->PropsOfAE);
588 while (p0 && (p->KindOfPE != ExpProperty || p->ArityOfEE != arity))
589 p = RepExpProp(p0 = p->NextOfPE);
590 READ_UNLOCK(ae->ARWLock);
595 Prop Yap_GetExpPropHavingLock(
AtomEntry *ae,
unsigned int arity) {
599 p = RepExpProp(p0 = ae->PropsOfAE);
600 while (p0 && (p->KindOfPE != ExpProperty || p->ArityOfEE != arity))
601 p = RepExpProp(p0 = p->NextOfPE);
606 static int ExpandPredHash(
void) {
607 UInt new_size = PredHashTableSize + PredHashIncrement;
616 for (i = 0; i < new_size; i++) {
619 for (i = 0; i < PredHashTableSize; i++) {
624 UInt hsh = PRED_HASH(p->FunctorOfPred, p->ModuleOfPred, new_size);
625 p->NextPredOfHash = np[hsh];
630 PredHashTableSize = new_size;
632 Yap_FreeAtomSpace((ADDR)oldp);
641 WRITE_UNLOCK(fe->FRWLock);
644 if (cur_mod == TermProlog || cur_mod == 0L) {
645 p->ModuleOfPred = 0L;
647 p->ModuleOfPred = cur_mod;
649 INIT_LOCK(p->PELock);
650 p->KindOfPE = PEProp;
651 p->ArityOfPE = fe->ArityOfFE;
652 p->cs.p_code.FirstClause = p->cs.p_code.LastClause = NULL;
653 p->cs.p_code.NOfClauses = 0;
654 p->PredFlags = UndefPredFlag;
655 p->src.OwnerFile = Yap_source_file_name();
656 p->OpcodeOfPred = UNDEF_OPCODE;
657 p->CodeOfPred = p->cs.p_code.TrueCodeOfPred = (
yamop *)(&(p->OpcodeOfPred));
658 p->cs.p_code.ExpandCode = EXPAND_OP_CODE;
659 p->TimeStampOfPred = 0L;
660 p->LastCallOfPred = LUCALL_ASSERT;
661 p->MetaEntryOfPred = NULL;
662 if (cur_mod == TermProlog)
663 p->ModuleOfPred = 0L;
665 p->ModuleOfPred = cur_mod;
666 p->StatisticsForPred = NULL;
667 Yap_NewModulePred(cur_mod, p);
670 p->TableOfPred = NULL;
676 if (!trueGlobalPrologFlag(DEBUG_INFO_FLAG)) {
677 p->PredFlags |= NoTracePredFlag;
679 p->FunctorOfPred = fe;
681 UInt hsh = PRED_HASH(fe, cur_mod, PredHashTableSize);
683 WRITE_LOCK(PredHashRWLock);
684 if (10 * (PredsInHashTable + 1) > 6 * PredHashTableSize) {
685 if (!ExpandPredHash()) {
686 Yap_FreeCodeSpace((ADDR)p);
687 WRITE_UNLOCK(PredHashRWLock);
688 FUNC_WRITE_UNLOCK(fe);
692 hsh = PRED_HASH(fe, cur_mod, PredHashTableSize);
695 if (p->ModuleOfPred == 0L) {
696 PredEntry *pe = RepPredProp(fe->PropsOfFE);
698 hsh = PRED_HASH(fe, pe->ModuleOfPred, PredHashTableSize);
700 pe->NextPredOfHash = PredHash[hsh];
702 fe->PropsOfFE = AbsPredProp(p);
703 p->NextOfPE = AbsPredProp(pe);
705 p->NextPredOfHash = PredHash[hsh];
707 p->NextOfPE = fe->PropsOfFE->NextOfPE;
708 fe->PropsOfFE->NextOfPE = AbsPredProp(p);
710 WRITE_UNLOCK(PredHashRWLock);
712 fe->PropsOfFE = AbsPredProp(p);
715 FUNC_WRITE_UNLOCK(fe);
717 Yap_inform_profiler_of_clause(&(p->OpcodeOfPred), &(p->OpcodeOfPred) + 1, p,
718 GPROF_NEW_PRED_FUNC);
719 if (!(p->PredFlags & (CPredFlag | AsmPredFlag))) {
720 Yap_inform_profiler_of_clause(&(p->cs.p_code.ExpandCode),
721 &(p->cs.p_code.ExpandCode) + 1, p,
722 GPROF_NEW_PRED_FUNC);
725 return AbsPredProp(p);
735 INIT_LOCK(p->PELock);
736 p->StatisticsForPred = NULL : p->KindOfPE = PEProp;
737 p->ArityOfPE = ap->ArityOfPE;
738 p->cs.p_code.FirstClause = p->cs.p_code.LastClause = NULL;
739 p->cs.p_code.NOfClauses = 0;
740 p->PredFlags = ap->PredFlags & ~(IndexedPredFlag | SpiedPredFlag);
742 p->ExtraPredFlags = 0L;
744 p->MetaEntryOfPred = NULL;
745 p->src.OwnerFile = ap->src.OwnerFile;
746 p->OpcodeOfPred = FAIL_OPCODE;
747 p->CodeOfPred = p->cs.p_code.TrueCodeOfPred = (
yamop *)(&(p->OpcodeOfPred));
748 p->cs.p_code.ExpandCode = EXPAND_OP_CODE;
749 p->ModuleOfPred = ap->ModuleOfPred;
750 p->NextPredOfModule = NULL;
751 p->TimeStampOfPred = 0L;
752 p->LastCallOfPred = LUCALL_ASSERT;
754 p->TableOfPred = NULL;
760 p->NextOfPE = AbsPredProp(LOCAL_ThreadHandle.local_preds);
761 LOCAL_ThreadHandle.local_preds = p;
762 p->FunctorOfPred = ap->FunctorOfPred;
763 Yap_inform_profiler_of_clause(&(p->OpcodeOfPred), &(p->OpcodeOfPred) + 1, p,
764 GPROF_NEW_PRED_THREAD);
765 if (falseGlobalPrologFlag(DEBUG_INFO_FLAG)) {
766 p->PredFlags |= (NoSpyPredFlag | NoTracePredFlag);
768 if (!(p->PredFlags & (CPredFlag | AsmPredFlag))) {
769 Yap_inform_profiler_of_clause(&(p->cs.p_code.ExpandCode),
770 &(p->cs.p_code.ExpandCode) + 1, p,
771 GPROF_NEW_PRED_THREAD);
773 return AbsPredProp(p);
785 WRITE_UNLOCK(ae->ARWLock);
788 INIT_LOCK(p->PELock);
789 p->KindOfPE = PEProp;
791 p->StatisticsForPred = NULL;
792 p->cs.p_code.FirstClause = p->cs.p_code.LastClause = NULL;
793 p->cs.p_code.NOfClauses = 0;
794 p->PredFlags = UndefPredFlag;
795 p->src.OwnerFile = Yap_source_file_name();
796 p->OpcodeOfPred = UNDEF_OPCODE;
797 p->cs.p_code.ExpandCode = EXPAND_OP_CODE;
798 p->CodeOfPred = p->cs.p_code.TrueCodeOfPred = (
yamop *)(&(p->OpcodeOfPred));
799 p->MetaEntryOfPred = NULL;
800 if (cur_mod == TermProlog)
803 p->ModuleOfPred = cur_mod;
804 Yap_NewModulePred(cur_mod, p);
805 p->TimeStampOfPred = 0L;
806 p->LastCallOfPred = LUCALL_ASSERT;
808 p->TableOfPred = NULL;
816 p->FunctorOfPred = (
Functor)AbsAtom(ae);
817 if (!trueGlobalPrologFlag(DEBUG_INFO_FLAG)) {
818 p->PredFlags |= (NoTracePredFlag | NoSpyPredFlag);
820 if (Yap_isSystemModule(CurrentModule))
821 p->PredFlags |= StandardPredFlag;
822 WRITE_UNLOCK(ae->ARWLock);
824 Yap_inform_profiler_of_clause(&(p->OpcodeOfPred), &(p->OpcodeOfPred) + 1, p,
825 GPROF_NEW_PRED_ATOM);
826 if (!(p->PredFlags & (CPredFlag | AsmPredFlag))) {
827 Yap_inform_profiler_of_clause(&(p->cs.p_code.ExpandCode),
828 &(p->cs.p_code.ExpandCode) + 1, p,
829 GPROF_NEW_PRED_ATOM);
835 Prop Yap_PredPropByFunctorNonThreadLocal(
Functor f, Term cur_mod)
841 if (!(p = RepPredProp(f->PropsOfFE)))
842 return Yap_NewPredPropByFunctor(f, cur_mod);
844 if ((p->ModuleOfPred == cur_mod || !(p->ModuleOfPred))) {
846 if (
true || p->ModuleOfPred || !cur_mod ||
847 cur_mod == TermProlog) {
848 FUNC_WRITE_UNLOCK(f);
849 return AbsPredProp(p);
853 UInt hash = PRED_HASH(f, cur_mod, PredHashTableSize);
854 READ_LOCK(PredHashRWLock);
858 if (p->FunctorOfPred == f && p->ModuleOfPred == cur_mod) {
859 READ_UNLOCK(PredHashRWLock);
860 FUNC_WRITE_UNLOCK(f);
861 return AbsPredProp(p);
863 p = p->NextPredOfHash;
865 READ_UNLOCK(PredHashRWLock);
867 return Yap_NewPredPropByFunctor(f, cur_mod);
870 Prop Yap_PredPropByAtomNonThreadLocal(
Atom at, Term cur_mod)
876 WRITE_LOCK(ae->ARWLock);
880 if (pe->KindOfPE == PEProp &&
881 (pe->ModuleOfPred == cur_mod || !pe->ModuleOfPred)) {
883 if (
true || pe->ModuleOfPred || !cur_mod ||
884 cur_mod == TermProlog) {
885 WRITE_UNLOCK(ae->ARWLock);
891 return Yap_NewPredPropByAtom(ae, cur_mod);
894 Term Yap_GetValue(
Atom a) {
895 Prop p0 = GetAProp(a, ValProperty);
900 READ_LOCK(RepValProp(p0)->VRWLock);
901 out = RepValProp(p0)->ValueOfVE;
902 if (IsApplTerm(out)) {
903 Functor f = FunctorOfTerm(out);
904 if (f == FunctorDouble) {
906 out = MkFloatTerm(FloatOfTerm(out));
907 }
else if (f == FunctorLongInt) {
909 out = MkLongIntTerm(LongIntOfTerm(out));
910 }
else if (f == FunctorString) {
912 out = MkStringTerm(StringOfTerm(out));
916 out = Yap_MkBigIntTerm(Yap_BigIntOfTerm(out));
920 READ_UNLOCK(RepValProp(p0)->VRWLock);
924 void Yap_PutValue(
Atom a, Term v) {
930 WRITE_LOCK(ae->ARWLock);
931 p0 = GetAPropHavingLock(ae, ValProperty);
934 WRITE_LOCK(p->VRWLock);
935 WRITE_UNLOCK(ae->ARWLock);
939 WRITE_UNLOCK(ae->ARWLock);
942 p->KindOfPE = ValProperty;
943 p->ValueOfVE = TermNil;
944 AddPropToAtom(RepAtom(a), (
PropEntry *)p);
947 INIT_RWLOCK(p->VRWLock);
948 WRITE_LOCK(p->VRWLock);
949 WRITE_UNLOCK(ae->ARWLock);
952 if (IsFloatTerm(v)) {
956 CELL ar[
sizeof(Float) /
sizeof(CELL)];
961 un.f = FloatOfTerm(v);
962 if (IsFloatTerm(t0)) {
965 if (IsApplTerm(t0)) {
966 Yap_FreeCodeSpace((
char *)(RepAppl(t0)));
968 pt = (CELL *)Yap_AllocAtomSpace(
sizeof(CELL) *
969 (1 + 2 *
sizeof(Float) /
sizeof(CELL)));
971 WRITE_UNLOCK(ae->ARWLock);
974 p->ValueOfVE = AbsAppl(pt);
975 pt[0] = (CELL)FunctorDouble;
979 for (i = 0; i <
sizeof(Float) /
sizeof(CELL); i++) {
980 *iptr++ = (CELL)un.ar[i];
982 }
else if (IsLongIntTerm(v)) {
984 Int val = LongIntOfTerm(v);
986 if (IsLongIntTerm(t0)) {
989 if (IsApplTerm(t0)) {
990 Yap_FreeCodeSpace((
char *)(RepAppl(t0)));
992 pt = (CELL *)Yap_AllocAtomSpace(2 *
sizeof(CELL));
994 WRITE_UNLOCK(ae->ARWLock);
997 p->ValueOfVE = AbsAppl(pt);
998 pt[0] = (CELL)FunctorLongInt;
1002 }
else if (IsBigIntTerm(v)) {
1003 CELL *ap = RepAppl(v);
1004 Int sz =
sizeof(
MP_INT) +
sizeof(CELL) +
1005 (((
MP_INT *)(ap + 1))->_mp_alloc *
sizeof(mp_limb_t));
1006 CELL *pt = (CELL *)Yap_AllocAtomSpace(sz);
1009 WRITE_UNLOCK(ae->ARWLock);
1012 if (IsApplTerm(t0)) {
1013 Yap_FreeCodeSpace((
char *)RepAppl(t0));
1015 memcpy((
void *)pt, (
void *)ap, sz);
1016 p->ValueOfVE = AbsAppl(pt);
1018 }
else if (IsStringTerm(v)) {
1019 CELL *ap = RepAppl(v);
1020 Int sz =
sizeof(CELL) * (3 + ap[1]);
1021 CELL *pt = (CELL *)Yap_AllocAtomSpace(sz);
1024 WRITE_UNLOCK(ae->ARWLock);
1027 if (IsApplTerm(t0)) {
1028 Yap_FreeCodeSpace((
char *)RepAppl(t0));
1030 memcpy((
void *)pt, (
void *)ap, sz);
1031 p->ValueOfVE = AbsAppl(pt);
1033 if (IsApplTerm(t0)) {
1035 Yap_FreeCodeSpace((
char *)(RepAppl(p->ValueOfVE)));
1039 WRITE_UNLOCK(p->VRWLock);
1042 bool Yap_PutAtomTranslation(
Atom a, arity_t arity, Int i) {
1047 WRITE_LOCK(ae->ARWLock);
1048 p0 = GetAPropHavingLock(ae, TranslationProperty);
1052 WRITE_UNLOCK(ae->ARWLock);
1055 p->KindOfPE = TranslationProperty;
1058 AddPropToAtom(RepAtom(a), (
PropEntry *)p);
1062 WRITE_UNLOCK(ae->ARWLock);
1066 bool Yap_PutFunctorTranslation(
Atom a, arity_t arity, Int i) {
1071 WRITE_LOCK(ae->ARWLock);
1072 p0 = GetAPropHavingLock(ae, TranslationProperty);
1076 WRITE_UNLOCK(ae->ARWLock);
1079 p->KindOfPE = TranslationProperty;
1082 AddPropToAtom(RepAtom(a), (
PropEntry *)p);
1086 WRITE_UNLOCK(ae->ARWLock);
1090 bool Yap_PutAtomMutex(
Atom a,
void *i) {
1095 WRITE_LOCK(ae->ARWLock);
1096 p0 = GetAPropHavingLock(ae, MutexProperty);
1100 WRITE_UNLOCK(ae->ARWLock);
1103 p->KindOfPE = MutexProperty;
1105 AddPropToAtom(RepAtom(a), (
PropEntry *)p);
1109 WRITE_UNLOCK(ae->ARWLock);
1113 Term Yap_ArrayToList(
register Term *tp,
size_t nof) {
1115 register Term *pt = tp + nof;
1118 t = MkAtomTerm(AtomNil);
1123 t = MkPairTerm((CELL)pt, t);
1126 t = MkPairTerm(tm, t);
1131 int Yap_GetName(
char *s, UInt max, Term t) {
1135 if (IsVarTerm(t) || !IsPairTerm(t))
1137 while (IsPairTerm(t)) {
1138 Head = HeadOfTerm(t);
1139 if (!IsNumTerm(Head))
1141 i = IntOfTerm(Head);
1142 if (i < 0 || i > MAX_ISO_LATIN1)
1147 Yap_Error(SYSTEM_ERROR_FATAL, t,
"not enough space for GetName");
1156 Term MkSFTerm(
Functor f,
int n, Term *a, empty_value) {
1157 Term t, p = AbsAppl(H);
1163 for (i = 1; i <= n; ++i) {
1165 if (t != empty_value) {
1174 CELL *ArgsOfSFTerm(Term t) {
1175 CELL *p = RepAppl(t) + 1;
1177 while (*p != (CELL)p)
1178 p = CellPtr(*p) + 1;
1189 x->KindOfPE = HoldProperty;
1195 int Yap_AtomIncreaseHold(
Atom at) {
1198 Prop *opp = &(ae->PropsOfAE);
1200 WRITE_LOCK(ae->ARWLock);
1201 pp = RepHoldProp(ae->PropsOfAE);
1202 while (!EndOfPAEntr(pp) && pp->KindOfPE != HoldProperty) {
1203 opp = &(pp->NextOfPE);
1204 pp = RepHoldProp(pp->NextOfPE);
1209 WRITE_UNLOCK(ae->ARWLock);
1212 *opp = AbsHoldProp(
new);
1216 WRITE_UNLOCK(ae->ARWLock);
1220 int Yap_AtomDecreaseHold(
Atom at) {
1223 Prop *opp = &(ae->PropsOfAE);
1225 WRITE_LOCK(ae->ARWLock);
1226 pp = RepHoldProp(ae->PropsOfAE);
1227 while (!EndOfPAEntr(pp) && pp->KindOfPE != HoldProperty) {
1228 opp = &(pp->NextOfPE);
1229 pp = RepHoldProp(pp->NextOfPE);
1232 WRITE_UNLOCK(ae->ARWLock);
1236 if (!pp->RefsOfPE) {
1237 *opp = pp->NextOfPE;
1238 Yap_FreeCodeSpace((ADDR)pp);
1240 WRITE_UNLOCK(ae->ARWLock);
1244 const char *IndicatorOfPred(
PredEntry *pe) {
1248 if (pe->ModuleOfPred == IDB_MODULE) {
1250 if (pe->PredFlags & NumberDBPredFlag) {
1251 char * buf = malloc(MAX_PATH+1);
1252 snprintf(buf, MAX_PATH,
"idb:" UInt_FORMAT,
1253 (Int)(pe->FunctorOfPred));
1255 }
else if (pe->PredFlags & AtomDBPredFlag) {
1256 at = (
Atom)pe->FunctorOfPred;
1259 at = NameOfFunctor(pe->FunctorOfPred);
1260 arity = ArityOfFunctor(pe->FunctorOfPred);
1263 if (pe->ModuleOfPred == 0)
1266 mods = RepAtom(AtomOfTerm(pe->ModuleOfPred))->StrOfAE;
1267 arity = pe->ArityOfPE;
1269 at = (
Atom)pe->FunctorOfPred;
1271 at = NameOfFunctor(pe->FunctorOfPred);
1274 char * buf = malloc(MAX_PATH+1);
1275 snprintf(buf, MAX_PATH,
"%s:%s/" UInt_FORMAT, mods,
1276 RepAtom(at)->StrOfAE, arity);