| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | /*************************************************************************
 | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *	 YAP Prolog 							 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *	Yap Prolog was developed at NCCUP - Universidade do Porto	 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997	 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | ************************************************************************** | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | * File:		adtdefs.c						 * | 
					
						
							|  |  |  | * Last rev:								 * | 
					
						
							|  |  |  | * mods:									 * | 
					
						
							|  |  |  | * comments:	abstract machine definitions				 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *************************************************************************/ | 
					
						
							|  |  |  | #ifdef SCCS
 | 
					
						
							|  |  |  | static char SccsId[] = "%W% %G%"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define ADTDEFS_C
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-02-22 06:12:18 +00:00
										 |  |  | #ifdef __SUNPRO_CC
 | 
					
						
							|  |  |  | #define inline
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #include "Yap.h"
 | 
					
						
							| 
									
										
										
										
											2004-01-23 02:23:51 +00:00
										 |  |  | ADDR    STD_PROTO(Yap_PreAllocCodeSpace, (void)); | 
					
						
							| 
									
										
										
										
											2004-02-12 12:37:12 +00:00
										 |  |  | Prop	STD_PROTO(PredPropByFunc,(Functor, Term)); | 
					
						
							|  |  |  | Prop	STD_PROTO(PredPropByAtom,(Atom, Term)); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #include "Yatom.h"
 | 
					
						
							|  |  |  | #include "yapio.h"
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							| 
									
										
										
										
											2006-11-27 17:42:03 +00:00
										 |  |  | #include <wchar.h>
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #if HAVE_STRING_H
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* this routine must be run at least having a read lock on ae */ | 
					
						
							|  |  |  | static Prop | 
					
						
							|  |  |  | GetFunctorProp(AtomEntry *ae, unsigned int arity) | 
					
						
							|  |  |  | {				/* look property list of atom a for kind  */ | 
					
						
							|  |  |  |   FunctorEntry *pp; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |   pp = RepFunctorProp(ae->PropsOfAE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   while (!EndOfPAEntr(pp) && | 
					
						
							|  |  |  | 	 (!IsFunctorProperty(pp->KindOfPE) || | 
					
						
							|  |  |  | 	  pp->ArityOfFE != arity)) | 
					
						
							|  |  |  |     pp = RepFunctorProp(pp->NextOfPE); | 
					
						
							|  |  |  |   return (AbsFunctorProp(pp)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* vsc: We must guarantee that IsVarTerm(functor) returns true! */ | 
					
						
							|  |  |  | static inline Functor | 
					
						
							|  |  |  | InlinedUnlockedMkFunctor(AtomEntry *ae, unsigned int arity) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   FunctorEntry *p; | 
					
						
							|  |  |  |   Prop p0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   p0 = GetFunctorProp(ae, arity); | 
					
						
							|  |  |  |   if (p0 != NIL) { | 
					
						
							|  |  |  |     return ((Functor) RepProp(p0)); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   p = (FunctorEntry *) Yap_AllocAtomSpace(sizeof(*p)); | 
					
						
							| 
									
										
										
										
											2007-04-18 06:30:41 +00:00
										 |  |  |   if (!p) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   p->KindOfPE = FunctorProperty; | 
					
						
							|  |  |  |   p->NameOfFE = AbsAtom(ae); | 
					
						
							|  |  |  |   p->ArityOfFE = arity; | 
					
						
							| 
									
										
										
										
											2001-10-03 13:39:16 +00:00
										 |  |  |   p->PropsOfFE = NIL; | 
					
						
							|  |  |  |   INIT_RWLOCK(p->FRWLock); | 
					
						
							| 
									
										
										
										
											2011-08-17 11:16:21 -07:00
										 |  |  |   /* respect the first property, in case this is a wide atom */ | 
					
						
							|  |  |  |   AddPropToAtom(ae, (PropEntry *)p); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   return ((Functor) p); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Functor | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_UnlockedMkFunctor(AtomEntry *ae, unsigned int arity) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   return(InlinedUnlockedMkFunctor(ae, arity)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* vsc: We must guarantee that IsVarTerm(functor) returns true! */ | 
					
						
							|  |  |  | Functor | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_MkFunctor(Atom ap, unsigned int arity) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   AtomEntry *ae = RepAtom(ap); | 
					
						
							|  |  |  |   Functor f; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   WRITE_LOCK(ae->ARWLock); | 
					
						
							|  |  |  |   f = InlinedUnlockedMkFunctor(ae, arity); | 
					
						
							|  |  |  |   WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |   return (f); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* vsc: We must guarantee that IsVarTerm(functor) returns true! */ | 
					
						
							|  |  |  | void | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_MkFunctorWithAddress(Atom ap, unsigned int arity, FunctorEntry *p) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   AtomEntry *ae = RepAtom(ap); | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   WRITE_LOCK(ae->ARWLock); | 
					
						
							|  |  |  |   p->KindOfPE = FunctorProperty; | 
					
						
							|  |  |  |   p->NameOfFE = ap; | 
					
						
							|  |  |  |   p->ArityOfFE = arity; | 
					
						
							| 
									
										
										
										
											2011-08-17 11:16:21 -07:00
										 |  |  |   AddPropToAtom(ae, (PropEntry *)p); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | inline static Atom | 
					
						
							|  |  |  | SearchInInvisible(char *atom) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   AtomEntry *chain; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   READ_LOCK(INVISIBLECHAIN.AERWLock); | 
					
						
							|  |  |  |   chain = RepAtom(INVISIBLECHAIN.Entry); | 
					
						
							| 
									
										
										
										
											2011-11-02 21:21:28 +09:00
										 |  |  |   while (!EndOfPAEntr(chain) && strcmp(chain->StrOfAE, atom)) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     chain = RepAtom(chain->NextOfAE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   READ_UNLOCK(INVISIBLECHAIN.AERWLock); | 
					
						
							|  |  |  |   if (EndOfPAEntr(chain)) | 
					
						
							|  |  |  |     return (NIL); | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     return(AbsAtom(chain)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline Atom | 
					
						
							|  |  |  | SearchAtom(unsigned char *p, Atom a) { | 
					
						
							|  |  |  |   AtomEntry *ae; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* search atom in chain */ | 
					
						
							|  |  |  |   while (a != NIL) { | 
					
						
							|  |  |  |     ae = RepAtom(a); | 
					
						
							|  |  |  |     if (strcmp(ae->StrOfAE, (const char *)p) == 0) { | 
					
						
							|  |  |  |       return(a); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     a = ae->NextOfAE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return(NIL); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-27 17:42:03 +00:00
										 |  |  | static inline Atom | 
					
						
							|  |  |  | SearchWideAtom(wchar_t *p, Atom a) { | 
					
						
							|  |  |  |   AtomEntry *ae; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* search atom in chain */ | 
					
						
							|  |  |  |   while (a != NIL) { | 
					
						
							|  |  |  |     ae = RepAtom(a); | 
					
						
							|  |  |  |     if (wcscmp((wchar_t *)ae->StrOfAE, p) == 0) { | 
					
						
							|  |  |  |       return a; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     a = ae->NextOfAE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return(NIL); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | static Atom | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | LookupAtom(char *atom) | 
					
						
							|  |  |  | {				/* lookup atom in atom table            */ | 
					
						
							|  |  |  |   register CELL hash; | 
					
						
							|  |  |  |   register unsigned char *p; | 
					
						
							| 
									
										
										
										
											2003-12-01 17:27:42 +00:00
										 |  |  |   Atom a, na; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   AtomEntry *ae; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* compute hash */ | 
					
						
							|  |  |  |   p = (unsigned char *)atom; | 
					
						
							| 
									
										
										
										
											2003-10-28 01:16:03 +00:00
										 |  |  |   hash = HashFunction(p) % AtomHashTableSize; | 
					
						
							| 
									
										
										
										
											2003-12-01 17:27:42 +00:00
										 |  |  |   /* we'll start by holding a read lock in order to avoid contention */ | 
					
						
							|  |  |  |   READ_LOCK(HashChain[hash].AERWLock); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   a = HashChain[hash].Entry; | 
					
						
							|  |  |  |   /* search atom in chain */ | 
					
						
							| 
									
										
										
										
											2003-12-01 17:27:42 +00:00
										 |  |  |   na = SearchAtom((unsigned char *)atom, a); | 
					
						
							|  |  |  |   if (na != NIL) { | 
					
						
							|  |  |  |     READ_UNLOCK(HashChain[hash].AERWLock); | 
					
						
							|  |  |  |     return(na); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2003-12-01 17:27:42 +00:00
										 |  |  |   READ_UNLOCK(HashChain[hash].AERWLock); | 
					
						
							|  |  |  |   /* we need a write lock */ | 
					
						
							|  |  |  |   WRITE_LOCK(HashChain[hash].AERWLock); | 
					
						
							|  |  |  |   /* concurrent version of Yap, need to take care */ | 
					
						
							|  |  |  | #if defined(YAPOR) || defined(THREADS)
 | 
					
						
							|  |  |  |   if (a != HashChain[hash].Entry) { | 
					
						
							|  |  |  |     a = HashChain[hash].Entry; | 
					
						
							|  |  |  |     na = SearchAtom((unsigned char *)atom, a); | 
					
						
							|  |  |  |     if (na != NIL) { | 
					
						
							|  |  |  |       WRITE_UNLOCK(HashChain[hash].AERWLock); | 
					
						
							|  |  |  |       return(na); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | #endif  
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* add new atom to start of chain */ | 
					
						
							| 
									
										
										
										
											2003-10-14 01:32:55 +00:00
										 |  |  |   ae = (AtomEntry *) Yap_AllocAtomSpace((sizeof *ae) + strlen(atom) + 1); | 
					
						
							| 
									
										
										
										
											2005-04-27 20:09:26 +00:00
										 |  |  |   if (ae == NULL) { | 
					
						
							|  |  |  |     WRITE_UNLOCK(HashChain[hash].AERWLock); | 
					
						
							| 
									
										
										
										
											2005-03-01 22:25:09 +00:00
										 |  |  |     return NIL; | 
					
						
							| 
									
										
										
										
											2005-04-27 20:09:26 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   NOfAtoms++; | 
					
						
							| 
									
										
										
										
											2003-12-01 17:27:42 +00:00
										 |  |  |   na = AbsAtom(ae); | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |   ae->PropsOfAE = NIL; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (ae->StrOfAE != atom) | 
					
						
							|  |  |  |     strcpy(ae->StrOfAE, atom); | 
					
						
							| 
									
										
										
										
											2003-12-01 17:27:42 +00:00
										 |  |  |   ae->NextOfAE = a; | 
					
						
							|  |  |  |   HashChain[hash].Entry = na; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   INIT_RWLOCK(ae->ARWLock); | 
					
						
							|  |  |  |   WRITE_UNLOCK(HashChain[hash].AERWLock); | 
					
						
							| 
									
										
										
										
											2003-10-28 01:16:03 +00:00
										 |  |  |   if (NOfAtoms > 2*AtomHashTableSize) { | 
					
						
							| 
									
										
										
										
											2004-01-23 02:23:51 +00:00
										 |  |  |     Yap_signal(YAP_CDOVF_SIGNAL); | 
					
						
							| 
									
										
										
										
											2003-10-28 01:16:03 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2003-12-01 17:27:42 +00:00
										 |  |  |   return na; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-27 17:42:03 +00:00
										 |  |  | static Atom | 
					
						
							|  |  |  | LookupWideAtom(wchar_t *atom) | 
					
						
							|  |  |  | {				/* lookup atom in atom table            */ | 
					
						
							|  |  |  |   CELL hash; | 
					
						
							|  |  |  |   wchar_t *p; | 
					
						
							|  |  |  |   Atom a, na; | 
					
						
							|  |  |  |   AtomEntry *ae; | 
					
						
							|  |  |  |   UInt sz; | 
					
						
							|  |  |  |   WideAtomEntry *wae; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* compute hash */ | 
					
						
							|  |  |  |   p = atom; | 
					
						
							|  |  |  |   hash = WideHashFunction(p) % WideAtomHashTableSize; | 
					
						
							|  |  |  |   /* we'll start by holding a read lock in order to avoid contention */ | 
					
						
							|  |  |  |   READ_LOCK(WideHashChain[hash].AERWLock); | 
					
						
							|  |  |  |   a = WideHashChain[hash].Entry; | 
					
						
							|  |  |  |   /* search atom in chain */ | 
					
						
							|  |  |  |   na = SearchWideAtom(atom, a); | 
					
						
							|  |  |  |   if (na != NIL) { | 
					
						
							|  |  |  |     READ_UNLOCK(WideHashChain[hash].AERWLock); | 
					
						
							|  |  |  |     return(na); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   READ_UNLOCK(WideHashChain[hash].AERWLock); | 
					
						
							|  |  |  |   /* we need a write lock */ | 
					
						
							|  |  |  |   WRITE_LOCK(WideHashChain[hash].AERWLock); | 
					
						
							|  |  |  |   /* concurrent version of Yap, need to take care */ | 
					
						
							|  |  |  | #if defined(YAPOR) || defined(THREADS)
 | 
					
						
							|  |  |  |   if (a != WideHashChain[hash].Entry) { | 
					
						
							|  |  |  |     a = WideHashChain[hash].Entry; | 
					
						
							| 
									
										
										
										
											2006-11-28 00:51:59 +00:00
										 |  |  |     na = SearchWideAtom(atom, a); | 
					
						
							| 
									
										
										
										
											2006-11-27 17:42:03 +00:00
										 |  |  |     if (na != NIL) { | 
					
						
							|  |  |  |       WRITE_UNLOCK(WideHashChain[hash].AERWLock); | 
					
						
							|  |  |  |       return na; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | #endif  
 | 
					
						
							|  |  |  |   /* add new atom to start of chain */ | 
					
						
							|  |  |  |   sz = wcslen(atom); | 
					
						
							|  |  |  |   ae = (AtomEntry *) Yap_AllocAtomSpace(sizeof(AtomEntry) + sizeof(wchar_t)*(sz + 1)+sizeof(WideAtomEntry)); | 
					
						
							|  |  |  |   if (ae == NULL) { | 
					
						
							|  |  |  |     WRITE_UNLOCK(WideHashChain[hash].AERWLock); | 
					
						
							|  |  |  |     return NIL; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   wae = (WideAtomEntry *)(ae->StrOfAE+sizeof(wchar_t)*(sz + 1)); | 
					
						
							|  |  |  |   na = AbsAtom(ae); | 
					
						
							|  |  |  |   ae->PropsOfAE = AbsWideAtomProp(wae); | 
					
						
							|  |  |  |   wae->NextOfPE = NIL; | 
					
						
							|  |  |  |   wae->KindOfPE = WideAtomProperty; | 
					
						
							|  |  |  |   wae->SizeOfAtom = sz; | 
					
						
							|  |  |  |   if (ae->StrOfAE != (char *)atom) | 
					
						
							|  |  |  |     wcscpy((wchar_t *)(ae->StrOfAE), atom); | 
					
						
							|  |  |  |   NOfAtoms++; | 
					
						
							|  |  |  |   ae->NextOfAE = a; | 
					
						
							|  |  |  |   WideHashChain[hash].Entry = na; | 
					
						
							|  |  |  |   INIT_RWLOCK(ae->ARWLock); | 
					
						
							|  |  |  |   WRITE_UNLOCK(WideHashChain[hash].AERWLock); | 
					
						
							|  |  |  |   if (NOfWideAtoms > 2*WideAtomHashTableSize) { | 
					
						
							|  |  |  |     Yap_signal(YAP_CDOVF_SIGNAL); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return na; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-27 00:41:33 +00:00
										 |  |  | Atom | 
					
						
							|  |  |  | Yap_LookupMaybeWideAtom(wchar_t *atom) | 
					
						
							|  |  |  | {				/* lookup atom in atom table            */ | 
					
						
							|  |  |  |   wchar_t *p = atom, c; | 
					
						
							|  |  |  |   size_t len = 0; | 
					
						
							|  |  |  |   char *ptr, *ptr0; | 
					
						
							|  |  |  |   Atom at; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   while ((c = *p++)) {  | 
					
						
							|  |  |  |     if (c > 255) return LookupWideAtom(atom); | 
					
						
							|  |  |  |     len++; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   /* not really a wide atom */ | 
					
						
							| 
									
										
										
										
											2009-03-13 19:00:14 +00:00
										 |  |  |   p = atom; | 
					
						
							| 
									
										
										
										
											2008-03-27 00:41:33 +00:00
										 |  |  |   ptr0 = ptr = Yap_AllocCodeSpace(len+1); | 
					
						
							|  |  |  |   if (!ptr) | 
					
						
							|  |  |  |     return NIL; | 
					
						
							|  |  |  |   while ((*ptr++ = *p++)); | 
					
						
							|  |  |  |   at = LookupAtom(ptr0); | 
					
						
							|  |  |  |   Yap_FreeCodeSpace(ptr0); | 
					
						
							|  |  |  |   return at; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-06 10:58:25 +01:00
										 |  |  | Atom | 
					
						
							|  |  |  | Yap_LookupMaybeWideAtomWithLength(wchar_t *atom, size_t len) | 
					
						
							|  |  |  | {				/* lookup atom in atom table            */ | 
					
						
							|  |  |  |   wchar_t *p = atom, c; | 
					
						
							|  |  |  |   size_t len0 = 0; | 
					
						
							|  |  |  |   Atom at; | 
					
						
							|  |  |  |   int wide = FALSE; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   while ((c = *p++)) {  | 
					
						
							|  |  |  |     if (c > 255) wide = TRUE; | 
					
						
							|  |  |  |     len0++; | 
					
						
							|  |  |  |     if (len0 == len) break; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (p[0] == '\0' && wide) return LookupWideAtom(atom); | 
					
						
							|  |  |  |   else if (wide) { | 
					
						
							|  |  |  |     wchar_t *ptr, *ptr0; | 
					
						
							|  |  |  |     p = atom; | 
					
						
							|  |  |  |     ptr0 = ptr = (wchar_t *)Yap_AllocCodeSpace(sizeof(wchar_t)*(len+1)); | 
					
						
							|  |  |  |     if (!ptr) | 
					
						
							|  |  |  |       return NIL; | 
					
						
							|  |  |  |     while (len--) {*ptr++ = *p++;} | 
					
						
							|  |  |  |     ptr[0] = '\0'; | 
					
						
							|  |  |  |     at = LookupWideAtom(ptr0); | 
					
						
							| 
									
										
										
										
											2010-05-06 12:19:51 +01:00
										 |  |  |     Yap_FreeCodeSpace((char *)ptr0); | 
					
						
							| 
									
										
										
										
											2010-05-06 10:58:25 +01:00
										 |  |  |     return at; | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     char *ptr, *ptr0; | 
					
						
							|  |  |  |     /* not really a wide atom */ | 
					
						
							|  |  |  |     p = atom; | 
					
						
							|  |  |  |     ptr0 = ptr = Yap_AllocCodeSpace(len+1); | 
					
						
							|  |  |  |     if (!ptr) | 
					
						
							|  |  |  |       return NIL; | 
					
						
							|  |  |  |     while (len--) {*ptr++ = *p++;} | 
					
						
							|  |  |  |     ptr[0] = '\0'; | 
					
						
							|  |  |  |     at = LookupAtom(ptr0); | 
					
						
							|  |  |  |     Yap_FreeCodeSpace(ptr0); | 
					
						
							|  |  |  |     return at; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | Atom | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_LookupAtom(char *atom) | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | {				/* lookup atom in atom table            */ | 
					
						
							| 
									
										
										
										
											2005-03-01 22:25:09 +00:00
										 |  |  |   return LookupAtom(atom); | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-27 17:42:03 +00:00
										 |  |  | Atom | 
					
						
							|  |  |  | Yap_LookupWideAtom(wchar_t *atom) | 
					
						
							|  |  |  | {				/* lookup atom in atom table            */ | 
					
						
							|  |  |  |   return LookupWideAtom(atom); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | Atom | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_FullLookupAtom(char *atom) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | {				/* lookup atom in atom table            */ | 
					
						
							|  |  |  |   Atom t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if ((t = SearchInInvisible(atom)) != NIL) { | 
					
						
							|  |  |  |     return (t); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return(LookupAtom(atom)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_LookupAtomWithAddress(char *atom, AtomEntry *ae) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | {				/* lookup atom in atom table            */ | 
					
						
							|  |  |  |   register CELL hash; | 
					
						
							|  |  |  |   register unsigned char *p; | 
					
						
							|  |  |  |   Atom a; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* compute hash */ | 
					
						
							|  |  |  |   p = (unsigned char *)atom; | 
					
						
							| 
									
										
										
										
											2003-10-28 01:16:03 +00:00
										 |  |  |   hash = HashFunction(p) % AtomHashTableSize; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* ask for a WRITE lock because it is highly unlikely we shall find anything */ | 
					
						
							|  |  |  |   WRITE_LOCK(HashChain[hash].AERWLock); | 
					
						
							|  |  |  |   a = HashChain[hash].Entry; | 
					
						
							|  |  |  |   /* search atom in chain */ | 
					
						
							|  |  |  |   if (SearchAtom(p, a) != NIL) { | 
					
						
							| 
									
										
										
										
											2005-03-01 22:25:09 +00:00
										 |  |  |     Yap_Error(INTERNAL_ERROR,TermNil,"repeated initialisation for atom %s", ae); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     WRITE_UNLOCK(HashChain[hash].AERWLock); | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   /* add new atom to start of chain */ | 
					
						
							| 
									
										
										
										
											2005-10-28 17:38:50 +00:00
										 |  |  |   NOfAtoms++; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   ae->NextOfAE = a; | 
					
						
							|  |  |  |   HashChain[hash].Entry = AbsAtom(ae); | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |   ae->PropsOfAE = NIL; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   strcpy(ae->StrOfAE, atom); | 
					
						
							|  |  |  |   INIT_RWLOCK(ae->ARWLock); | 
					
						
							|  |  |  |   WRITE_UNLOCK(HashChain[hash].AERWLock); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_ReleaseAtom(Atom atom) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | {				/* Releases an atom from the hash chain */ | 
					
						
							|  |  |  |   register Int hash; | 
					
						
							|  |  |  |   register unsigned char *p; | 
					
						
							|  |  |  |   AtomEntry *inChain; | 
					
						
							|  |  |  |   AtomEntry *ap = RepAtom(atom); | 
					
						
							|  |  |  |   char *name = ap->StrOfAE; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* compute hash */ | 
					
						
							|  |  |  |   p = (unsigned char *)name; | 
					
						
							| 
									
										
										
										
											2003-10-28 01:16:03 +00:00
										 |  |  |   hash = HashFunction(p) % AtomHashTableSize; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   WRITE_LOCK(HashChain[hash].AERWLock); | 
					
						
							|  |  |  |   if (HashChain[hash].Entry == atom) { | 
					
						
							| 
									
										
										
										
											2003-10-28 01:16:03 +00:00
										 |  |  |     NOfAtoms--; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     HashChain[hash].Entry = ap->NextOfAE; | 
					
						
							|  |  |  |     WRITE_UNLOCK(HashChain[hash].AERWLock); | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   /* else */ | 
					
						
							|  |  |  |   inChain = RepAtom(HashChain[hash].Entry); | 
					
						
							|  |  |  |   while (inChain->NextOfAE != atom) | 
					
						
							|  |  |  |     inChain = RepAtom(inChain->NextOfAE); | 
					
						
							|  |  |  |   WRITE_LOCK(inChain->ARWLock); | 
					
						
							|  |  |  |   inChain->NextOfAE = ap->NextOfAE; | 
					
						
							|  |  |  |   WRITE_UNLOCK(inChain->ARWLock); | 
					
						
							|  |  |  |   WRITE_UNLOCK(HashChain[hash].AERWLock); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Prop | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | GetAPropHavingLock(AtomEntry *ae, PropFlags kind) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | {				/* look property list of atom a for kind  */ | 
					
						
							|  |  |  |   PropEntry *pp; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |   pp = RepProp(ae->PropsOfAE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   while (!EndOfPAEntr(pp) && pp->KindOfPE != kind) | 
					
						
							|  |  |  |     pp = RepProp(pp->NextOfPE); | 
					
						
							|  |  |  |   return (AbsProp(pp)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Prop | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_GetAPropHavingLock(AtomEntry *ae, PropFlags kind) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | {				/* look property list of atom a for kind  */ | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  |   return GetAPropHavingLock(ae,kind); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | static Prop | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | GetAProp(Atom a, PropFlags kind) | 
					
						
							|  |  |  | {				/* look property list of atom a for kind  */ | 
					
						
							|  |  |  |   AtomEntry *ae = RepAtom(a); | 
					
						
							|  |  |  |   Prop out; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   READ_LOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  |   out = GetAPropHavingLock(ae, kind); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   READ_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |   return (out); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | Prop | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_GetAProp(Atom a, PropFlags kind) | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | {				/* look property list of atom a for kind  */ | 
					
						
							|  |  |  |   return GetAProp(a,kind); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  | OpEntry * | 
					
						
							| 
									
										
										
										
											2009-11-20 00:33:14 +00:00
										 |  |  | Yap_GetOpPropForAModuleHavingALock(Atom a, Term mod) | 
					
						
							|  |  |  | {				/* look property list of atom a for kind  */ | 
					
						
							|  |  |  |   AtomEntry *ae = RepAtom(a); | 
					
						
							|  |  |  |   PropEntry *pp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   pp = RepProp(ae->PropsOfAE); | 
					
						
							|  |  |  |   while (!EndOfPAEntr(pp) && | 
					
						
							|  |  |  | 	 (pp->KindOfPE != OpProperty || | 
					
						
							|  |  |  | 	  ((OpEntry *)pp)->OpModule != mod)) | 
					
						
							|  |  |  |     pp = RepProp(pp->NextOfPE); | 
					
						
							|  |  |  |   if (EndOfPAEntr(pp)) { | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return (OpEntry *)pp; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | Yap_HasOp(Atom a) | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  | {				/* look property list of atom a for kind  */ | 
					
						
							|  |  |  |   AtomEntry *ae = RepAtom(a); | 
					
						
							|  |  |  |   PropEntry *pp; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-20 00:33:14 +00:00
										 |  |  |   READ_LOCK(ae->ARWLock); | 
					
						
							|  |  |  |   pp = RepProp(ae->PropsOfAE); | 
					
						
							|  |  |  |   while (!EndOfPAEntr(pp) && | 
					
						
							|  |  |  | 	 ( pp->KindOfPE != OpProperty)) | 
					
						
							|  |  |  |     pp = RepProp(pp->NextOfPE); | 
					
						
							| 
									
										
										
										
											2009-12-17 16:11:02 -02:00
										 |  |  |   READ_UNLOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2009-11-20 00:33:14 +00:00
										 |  |  |   if (EndOfPAEntr(pp)) { | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-27 21:23:14 -03:00
										 |  |  | OpEntry * | 
					
						
							|  |  |  | Yap_OpPropForModule(Atom a, Term mod) | 
					
						
							|  |  |  | {				/* look property list of atom a for kind  */ | 
					
						
							|  |  |  |   AtomEntry *ae = RepAtom(a); | 
					
						
							|  |  |  |   PropEntry *pp; | 
					
						
							| 
									
										
										
										
											2011-08-31 13:54:52 -07:00
										 |  |  |   OpEntry *info = NULL; | 
					
						
							| 
									
										
										
										
											2011-08-27 21:23:14 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (mod == TermProlog) | 
					
						
							|  |  |  |     mod = PROLOG_MODULE; | 
					
						
							|  |  |  |   WRITE_LOCK(ae->ARWLock); | 
					
						
							|  |  |  |   pp = RepProp(ae->PropsOfAE); | 
					
						
							|  |  |  |   while (!EndOfPAEntr(pp)) { | 
					
						
							|  |  |  |     if ( pp->KindOfPE == OpProperty) { | 
					
						
							|  |  |  |       info = (OpEntry *)pp; | 
					
						
							| 
									
										
										
										
											2011-08-31 13:54:52 -07:00
										 |  |  |       if (info->OpModule == mod) { | 
					
						
							|  |  |  | 	WRITE_LOCK(info->OpRWLock); | 
					
						
							|  |  |  | 	WRITE_UNLOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2011-08-27 21:23:14 -03:00
										 |  |  | 	return info; | 
					
						
							| 
									
										
										
										
											2011-08-31 13:54:52 -07:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-08-27 21:23:14 -03:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-08-31 13:54:52 -07:00
										 |  |  |     pp = pp->NextOfPE; | 
					
						
							| 
									
										
										
										
											2011-08-27 21:23:14 -03:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-08-31 13:54:52 -07:00
										 |  |  |   info = (OpEntry *) Yap_AllocAtomSpace(sizeof(OpEntry)); | 
					
						
							|  |  |  |   info->KindOfPE = Ord(OpProperty); | 
					
						
							|  |  |  |   info->OpModule = mod; | 
					
						
							|  |  |  |   info->OpName = a; | 
					
						
							|  |  |  |   LOCK(OpListLock); | 
					
						
							|  |  |  |   info->OpNext = OpList; | 
					
						
							|  |  |  |   OpList = info; | 
					
						
							|  |  |  |   UNLOCK(OpListLock); | 
					
						
							|  |  |  |   AddPropToAtom(ae, (PropEntry *)info); | 
					
						
							|  |  |  |   INIT_RWLOCK(info->OpRWLock); | 
					
						
							|  |  |  |   WRITE_LOCK(info->OpRWLock); | 
					
						
							|  |  |  |   WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |   info->Prefix = info->Infix = info->Posfix = 0; | 
					
						
							|  |  |  |   return info; | 
					
						
							| 
									
										
										
										
											2011-08-27 21:23:14 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-20 00:33:14 +00:00
										 |  |  | OpEntry * | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | Yap_GetOpProp(Atom a, op_type type USES_REGS) | 
					
						
							| 
									
										
										
										
											2009-11-20 00:33:14 +00:00
										 |  |  | {				/* look property list of atom a for kind  */ | 
					
						
							|  |  |  |   AtomEntry *ae = RepAtom(a); | 
					
						
							|  |  |  |   PropEntry *pp; | 
					
						
							| 
									
										
										
										
											2011-08-18 05:01:48 -07:00
										 |  |  |   OpEntry *oinfo = NULL; | 
					
						
							| 
									
										
										
										
											2009-11-20 00:33:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  |   READ_LOCK(ae->ARWLock); | 
					
						
							|  |  |  |   pp = RepProp(ae->PropsOfAE); | 
					
						
							| 
									
										
										
										
											2011-06-14 08:55:44 +01:00
										 |  |  |   while (!EndOfPAEntr(pp)) { | 
					
						
							|  |  |  |     OpEntry *info = NULL; | 
					
						
							|  |  |  |     if ( pp->KindOfPE != OpProperty) { | 
					
						
							| 
									
										
										
										
											2009-11-20 00:33:14 +00:00
										 |  |  |       pp = RepProp(pp->NextOfPE); | 
					
						
							| 
									
										
										
										
											2011-06-14 08:55:44 +01:00
										 |  |  |       continue; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     info = (OpEntry *)pp; | 
					
						
							|  |  |  |     if (info->OpModule != CurrentModule && | 
					
						
							|  |  |  | 	info->OpModule != PROLOG_MODULE) { | 
					
						
							|  |  |  |       pp = RepProp(pp->NextOfPE); | 
					
						
							|  |  |  |       continue; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (type == INFIX_OP) { | 
					
						
							|  |  |  |       if (!info->Infix) { | 
					
						
							|  |  |  | 	pp = RepProp(pp->NextOfPE); | 
					
						
							|  |  |  | 	continue; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } else if (type == POSFIX_OP) { | 
					
						
							|  |  |  |       if (!info->Posfix) { | 
					
						
							|  |  |  | 	pp = RepProp(pp->NextOfPE); | 
					
						
							|  |  |  | 	continue; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       if (!info->Prefix) { | 
					
						
							|  |  |  | 	pp = RepProp(pp->NextOfPE); | 
					
						
							|  |  |  | 	continue; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2009-11-20 00:33:14 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-08-18 05:01:48 -07:00
										 |  |  |     /* if it is not the latest module */ | 
					
						
							|  |  |  |     if (info->OpModule == PROLOG_MODULE) { | 
					
						
							|  |  |  |       /* cannot commit now */ | 
					
						
							|  |  |  |       oinfo = info; | 
					
						
							|  |  |  |       pp = RepProp(pp->NextOfPE); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       READ_LOCK(info->OpRWLock); | 
					
						
							|  |  |  |       READ_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |       return info; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (oinfo) { | 
					
						
							|  |  |  |     READ_LOCK(oinfo->OpRWLock); | 
					
						
							| 
									
										
										
										
											2009-11-20 00:33:14 +00:00
										 |  |  |     READ_UNLOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2011-08-18 05:01:48 -07:00
										 |  |  |     return oinfo; | 
					
						
							| 
									
										
										
										
											2009-11-20 00:33:14 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-06-14 08:55:44 +01:00
										 |  |  |   READ_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |   return NULL; | 
					
						
							| 
									
										
										
										
											2005-10-21 16:09:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  | inline static Prop | 
					
						
							| 
									
										
										
										
											2004-02-12 12:37:12 +00:00
										 |  |  | GetPredPropByAtomHavingLock(AtomEntry* ae, Term cur_mod) | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  | /* get predicate entry for ap/arity; create it if neccessary.              */ | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Prop p0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   p0 = ae->PropsOfAE; | 
					
						
							|  |  |  |   while (p0) { | 
					
						
							|  |  |  |     PredEntry *pe = RepPredProp(p0); | 
					
						
							|  |  |  |     if ( pe->KindOfPE == PEProp &&  | 
					
						
							|  |  |  | 	 (pe->ModuleOfPred == cur_mod || !pe->ModuleOfPred)) { | 
					
						
							|  |  |  |       return(p0); | 
					
						
							| 
									
										
										
										
											2004-02-11 16:09:15 +00:00
										 |  |  | #if THREADS
 | 
					
						
							|  |  |  |       /* Thread Local Predicates */ | 
					
						
							|  |  |  |       if (pe->PredFlags & ThreadLocalPredFlag) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 	return AbsPredProp(Yap_GetThreadPred(pe INIT_REGS)); | 
					
						
							| 
									
										
										
										
											2004-02-11 16:09:15 +00:00
										 |  |  |       } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     p0 = pe->NextOfPE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return(NIL); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Prop | 
					
						
							| 
									
										
										
										
											2004-02-12 12:37:12 +00:00
										 |  |  | Yap_GetPredPropByAtom(Atom at, Term cur_mod) | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  | /* get predicate entry for ap/arity; create it if neccessary.              */ | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Prop p0; | 
					
						
							|  |  |  |   AtomEntry *ae = RepAtom(at); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   READ_LOCK(ae->ARWLock); | 
					
						
							|  |  |  |   p0 = GetPredPropByAtomHavingLock(ae, cur_mod); | 
					
						
							|  |  |  |   READ_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |   return(p0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-25 18:42:35 +00:00
										 |  |  | inline static Prop | 
					
						
							| 
									
										
										
										
											2004-02-12 12:37:12 +00:00
										 |  |  | GetPredPropByAtomHavingLockInThisModule(AtomEntry* ae, Term cur_mod) | 
					
						
							| 
									
										
										
										
											2003-08-25 18:42:35 +00:00
										 |  |  | /* get predicate entry for ap/arity; create it if neccessary.              */ | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Prop p0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   p0 = ae->PropsOfAE; | 
					
						
							|  |  |  |   while (p0) { | 
					
						
							|  |  |  |     PredEntry *pe = RepPredProp(p0); | 
					
						
							|  |  |  |     if ( pe->KindOfPE == PEProp && pe->ModuleOfPred == cur_mod ) { | 
					
						
							| 
									
										
										
										
											2004-02-11 16:09:15 +00:00
										 |  |  | #if THREADS
 | 
					
						
							|  |  |  |       /* Thread Local Predicates */ | 
					
						
							|  |  |  |       if (pe->PredFlags & ThreadLocalPredFlag) { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | 	return AbsPredProp(Yap_GetThreadPred(pe INIT_REGS)); | 
					
						
							| 
									
										
										
										
											2004-02-11 16:09:15 +00:00
										 |  |  |       } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2003-08-25 18:42:35 +00:00
										 |  |  |       return(p0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     p0 = pe->NextOfPE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return(NIL); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Prop | 
					
						
							| 
									
										
										
										
											2004-02-12 12:37:12 +00:00
										 |  |  | Yap_GetPredPropByAtomInThisModule(Atom at, Term cur_mod) | 
					
						
							| 
									
										
										
										
											2003-08-25 18:42:35 +00:00
										 |  |  | /* get predicate entry for ap/arity; create it if neccessary.              */ | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Prop p0; | 
					
						
							|  |  |  |   AtomEntry *ae = RepAtom(at); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   READ_LOCK(ae->ARWLock); | 
					
						
							|  |  |  |   p0 = GetPredPropByAtomHavingLockInThisModule(ae, cur_mod); | 
					
						
							|  |  |  |   READ_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |   return(p0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-03 13:39:16 +00:00
										 |  |  | Prop | 
					
						
							| 
									
										
										
										
											2004-02-12 12:37:12 +00:00
										 |  |  | Yap_GetPredPropByFunc(Functor f, Term cur_mod) | 
					
						
							| 
									
										
										
										
											2001-10-03 13:39:16 +00:00
										 |  |  |      /* get predicate entry for ap/arity;               */ | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Prop p0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-30 22:13:18 +00:00
										 |  |  |   READ_LOCK(f->FRWLock); | 
					
						
							| 
									
										
										
										
											2007-11-01 10:01:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-11-15 00:01:43 +00:00
										 |  |  |   p0 = GetPredPropByFuncHavingLock(f, cur_mod); | 
					
						
							| 
									
										
										
										
											2001-10-03 13:39:16 +00:00
										 |  |  |   READ_UNLOCK(f->FRWLock); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   return (p0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-25 18:42:35 +00:00
										 |  |  | Prop | 
					
						
							| 
									
										
										
										
											2004-02-12 12:37:12 +00:00
										 |  |  | Yap_GetPredPropByFuncInThisModule(Functor f, Term cur_mod) | 
					
						
							| 
									
										
										
										
											2003-08-25 18:42:35 +00:00
										 |  |  |      /* get predicate entry for ap/arity;               */ | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Prop p0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   READ_LOCK(f->FRWLock); | 
					
						
							| 
									
										
										
										
											2007-09-28 23:18:17 +00:00
										 |  |  |   p0 = GetPredPropByFuncHavingLock(f, cur_mod); | 
					
						
							| 
									
										
										
										
											2003-08-25 18:42:35 +00:00
										 |  |  |   READ_UNLOCK(f->FRWLock); | 
					
						
							|  |  |  |   return (p0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | Prop | 
					
						
							| 
									
										
										
										
											2004-02-12 12:37:12 +00:00
										 |  |  | Yap_GetPredPropHavingLock(Atom ap, unsigned int arity, Term mod) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |      /* get predicate entry for ap/arity;               */ | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Prop p0; | 
					
						
							|  |  |  |   AtomEntry *ae = RepAtom(ap); | 
					
						
							| 
									
										
										
										
											2001-10-03 13:39:16 +00:00
										 |  |  |   Functor f; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |   if (arity == 0) { | 
					
						
							| 
									
										
										
										
											2001-11-15 00:01:43 +00:00
										 |  |  |     GetPredPropByAtomHavingLock(ae, mod); | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-10-03 13:39:16 +00:00
										 |  |  |   f = InlinedUnlockedMkFunctor(ae, arity); | 
					
						
							| 
									
										
										
										
											2001-10-30 22:13:18 +00:00
										 |  |  |   READ_LOCK(f->FRWLock); | 
					
						
							| 
									
										
										
										
											2001-11-15 00:01:43 +00:00
										 |  |  |   p0 = GetPredPropByFuncHavingLock(f, mod); | 
					
						
							| 
									
										
										
										
											2001-10-03 13:39:16 +00:00
										 |  |  |   READ_UNLOCK(f->FRWLock); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   return (p0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* get expression entry for at/arity;               */ | 
					
						
							|  |  |  | Prop | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_GetExpProp(Atom at, unsigned int arity) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Prop p0; | 
					
						
							|  |  |  |   AtomEntry *ae = RepAtom(at); | 
					
						
							|  |  |  |   ExpEntry *p; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   READ_LOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |   p = RepExpProp(p0 = ae->PropsOfAE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   while (p0 && (p->KindOfPE != ExpProperty || p->ArityOfEE != arity)) | 
					
						
							|  |  |  |     p = RepExpProp(p0 = p->NextOfPE); | 
					
						
							|  |  |  |   READ_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |   return (p0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* get expression entry for at/arity, at is already locked;         */ | 
					
						
							|  |  |  | Prop | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_GetExpPropHavingLock(AtomEntry *ae, unsigned int arity) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Prop p0; | 
					
						
							|  |  |  |   ExpEntry *p; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |   p = RepExpProp(p0 = ae->PropsOfAE); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   while (p0 && (p->KindOfPE != ExpProperty || p->ArityOfEE != arity)) | 
					
						
							|  |  |  |     p = RepExpProp(p0 = p->NextOfPE); | 
					
						
							| 
									
										
										
										
											2006-11-27 17:42:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   return (p0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-06 17:02:13 +00:00
										 |  |  | static int | 
					
						
							| 
									
										
										
										
											2007-09-28 23:18:17 +00:00
										 |  |  | ExpandPredHash(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   UInt new_size = PredHashTableSize+PredHashIncrement; | 
					
						
							|  |  |  |   PredEntry **oldp = PredHash; | 
					
						
							|  |  |  |   PredEntry **np = (PredEntry **) Yap_AllocAtomSpace(sizeof(PredEntry **)*new_size); | 
					
						
							|  |  |  |   UInt i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!np) { | 
					
						
							| 
									
										
										
										
											2007-11-06 17:02:13 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2007-09-28 23:18:17 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   for (i = 0; i < new_size; i++) { | 
					
						
							|  |  |  |     np[i] = NULL; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   for (i = 0; i < PredHashTableSize; i++) { | 
					
						
							|  |  |  |     PredEntry *p = PredHash[i]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while (p) { | 
					
						
							|  |  |  |       Prop nextp = p->NextOfPE; | 
					
						
							|  |  |  |       UInt hsh = PRED_HASH(p->FunctorOfPred, p->ModuleOfPred, new_size); | 
					
						
							|  |  |  |       p->NextOfPE = AbsPredProp(np[hsh]); | 
					
						
							|  |  |  |       np[hsh] = p; | 
					
						
							|  |  |  |       p = RepPredProp(nextp); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   PredHashTableSize = new_size; | 
					
						
							|  |  |  |   PredHash = np; | 
					
						
							|  |  |  |   Yap_FreeAtomSpace((ADDR)oldp); | 
					
						
							| 
									
										
										
										
											2007-11-06 17:02:13 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2007-09-28 23:18:17 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-12-01 17:27:42 +00:00
										 |  |  | /* fe is supposed to be locked */ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | Prop | 
					
						
							| 
									
										
										
										
											2004-02-12 12:37:12 +00:00
										 |  |  | Yap_NewPredPropByFunctor(FunctorEntry *fe, Term cur_mod) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-04-11 22:08:02 +01:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   PredEntry *p = (PredEntry *) Yap_AllocAtomSpace(sizeof(*p)); | 
					
						
							| 
									
										
										
										
											2001-11-15 00:01:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-06 17:02:13 +00:00
										 |  |  |   if (p == NULL) { | 
					
						
							|  |  |  |     WRITE_UNLOCK(fe->FRWLock); | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2007-11-16 14:58:41 +00:00
										 |  |  |   if (cur_mod == TermProlog) | 
					
						
							|  |  |  |     p->ModuleOfPred = 0L; | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     p->ModuleOfPred = cur_mod; | 
					
						
							| 
									
										
										
										
											2007-11-06 17:02:13 +00:00
										 |  |  |   if (fe->PropsOfFE) { | 
					
						
							|  |  |  |     UInt hsh = PRED_HASH(fe, cur_mod, PredHashTableSize); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     WRITE_LOCK(PredHashRWLock); | 
					
						
							|  |  |  |     if (10*(PredsInHashTable+1) > 6*PredHashTableSize) { | 
					
						
							|  |  |  |       if (!ExpandPredHash()) { | 
					
						
							|  |  |  | 	Yap_FreeCodeSpace((ADDR)p); | 
					
						
							|  |  |  | 	WRITE_UNLOCK(PredHashRWLock); | 
					
						
							|  |  |  | 	WRITE_UNLOCK(fe->FRWLock); | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       /* retry hashing */ | 
					
						
							|  |  |  |       hsh = PRED_HASH(fe, cur_mod, PredHashTableSize); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     PredsInHashTable++; | 
					
						
							|  |  |  |     if (p->ModuleOfPred == 0L) { | 
					
						
							|  |  |  |       PredEntry *pe = RepPredProp(fe->PropsOfFE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       hsh = PRED_HASH(fe, pe->ModuleOfPred, PredHashTableSize); | 
					
						
							|  |  |  |       /* should be the first one */ | 
					
						
							|  |  |  |       pe->NextOfPE = AbsPredProp(PredHash[hsh]); | 
					
						
							|  |  |  |       PredHash[hsh] = pe; | 
					
						
							|  |  |  |       fe->PropsOfFE = AbsPredProp(p); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       p->NextOfPE = AbsPredProp(PredHash[hsh]); | 
					
						
							|  |  |  |       PredHash[hsh] = p; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     WRITE_UNLOCK(PredHashRWLock); | 
					
						
							| 
									
										
										
										
											2010-04-09 11:46:59 +01:00
										 |  |  |     /* make sure that we have something here: note that this is not a valid pointer!! */ | 
					
						
							|  |  |  |     RepPredProp(fe->PropsOfFE)->NextOfPE = fe->PropsOfFE; | 
					
						
							| 
									
										
										
										
											2007-11-06 17:02:13 +00:00
										 |  |  |   } else { | 
					
						
							|  |  |  |     fe->PropsOfFE = AbsPredProp(p); | 
					
						
							|  |  |  |     p->NextOfPE = NIL; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   INIT_LOCK(p->PELock); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   p->KindOfPE = PEProp; | 
					
						
							| 
									
										
										
										
											2001-10-03 13:39:16 +00:00
										 |  |  |   p->ArityOfPE = fe->ArityOfFE; | 
					
						
							| 
									
										
										
										
											2002-12-27 16:53:09 +00:00
										 |  |  |   p->cs.p_code.FirstClause = p->cs.p_code.LastClause = NULL; | 
					
						
							| 
									
										
										
										
											2003-04-30 17:46:05 +00:00
										 |  |  |   p->cs.p_code.NOfClauses = 0; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   p->PredFlags = 0L; | 
					
						
							| 
									
										
										
										
											2003-08-25 18:42:35 +00:00
										 |  |  |   p->src.OwnerFile = AtomNil; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   p->OpcodeOfPred = UNDEF_OPCODE; | 
					
						
							| 
									
										
										
										
											2002-12-27 16:53:09 +00:00
										 |  |  |   p->CodeOfPred = p->cs.p_code.TrueCodeOfPred = (yamop *)(&(p->OpcodeOfPred));  | 
					
						
							| 
									
										
										
										
											2003-08-25 18:42:35 +00:00
										 |  |  |   p->cs.p_code.ExpandCode = EXPAND_OP_CODE;  | 
					
						
							| 
									
										
										
										
											2006-10-10 14:08:17 +00:00
										 |  |  |   p->TimeStampOfPred = 0L;  | 
					
						
							|  |  |  |   p->LastCallOfPred = LUCALL_ASSERT;  | 
					
						
							| 
									
										
										
										
											2004-02-12 12:37:12 +00:00
										 |  |  |   if (cur_mod == TermProlog) | 
					
						
							| 
									
										
										
										
											2004-06-05 03:37:01 +00:00
										 |  |  |     p->ModuleOfPred = 0L; | 
					
						
							| 
									
										
										
										
											2004-02-12 12:37:12 +00:00
										 |  |  |   else | 
					
						
							|  |  |  |     p->ModuleOfPred = cur_mod; | 
					
						
							|  |  |  |   Yap_NewModulePred(cur_mod, p); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   INIT_LOCK(p->StatisticsForPred.lock); | 
					
						
							|  |  |  |   p->StatisticsForPred.NOfEntries = 0; | 
					
						
							|  |  |  |   p->StatisticsForPred.NOfHeadSuccesses = 0; | 
					
						
							|  |  |  |   p->StatisticsForPred.NOfRetries = 0; | 
					
						
							|  |  |  | #ifdef TABLING
 | 
					
						
							|  |  |  |   p->TableOfPred = NULL; | 
					
						
							|  |  |  | #endif /* TABLING */
 | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | #ifdef BEAM
 | 
					
						
							|  |  |  |   p->beamTable = NULL; | 
					
						
							|  |  |  | #endif  /* BEAM */
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   /* careful that they don't cross MkFunctor */ | 
					
						
							| 
									
										
										
										
											2004-12-05 05:01:45 +00:00
										 |  |  |   if (PRED_GOAL_EXPANSION_FUNC) { | 
					
						
							|  |  |  |     if (fe->PropsOfFE && | 
					
						
							|  |  |  | 	(RepPredProp(fe->PropsOfFE)->PredFlags & GoalExPredFlag)) { | 
					
						
							|  |  |  |       p->PredFlags |= GoalExPredFlag; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2007-09-28 23:18:17 +00:00
										 |  |  |   p->FunctorOfPred = fe; | 
					
						
							| 
									
										
										
										
											2001-10-03 13:39:16 +00:00
										 |  |  |   WRITE_UNLOCK(fe->FRWLock); | 
					
						
							| 
									
										
										
										
											2012-03-09 11:46:34 +00:00
										 |  |  |   Yap_inform_profiler_of_clause(&(p->OpcodeOfPred), &(p->OpcodeOfPred)+1, p, GPROF_NEW_PRED_FUNC); | 
					
						
							|  |  |  |   if (!(p->PredFlags & (CPredFlag|AsmPredFlag))) { | 
					
						
							|  |  |  |     Yap_inform_profiler_of_clause(&(p->cs.p_code.ExpandCode), &(p->cs.p_code.ExpandCode)+1, p, GPROF_NEW_PRED_FUNC); | 
					
						
							| 
									
										
										
										
											2007-02-18 00:26:36 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2007-09-28 23:18:17 +00:00
										 |  |  |   return AbsPredProp(p); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  | #if THREADS
 | 
					
						
							|  |  |  | Prop | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | Yap_NewThreadPred(PredEntry *ap USES_REGS) | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   PredEntry *p = (PredEntry *) Yap_AllocAtomSpace(sizeof(*p)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-07 23:52:26 +01:00
										 |  |  |   if (p == NULL) { | 
					
						
							| 
									
										
										
										
											2008-10-08 13:15:09 +01:00
										 |  |  |     return NIL; | 
					
						
							| 
									
										
										
										
											2008-10-07 23:52:26 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   INIT_LOCK(p->PELock); | 
					
						
							|  |  |  |   p->KindOfPE = PEProp; | 
					
						
							|  |  |  |   p->ArityOfPE = ap->ArityOfPE; | 
					
						
							|  |  |  |   p->cs.p_code.FirstClause = p->cs.p_code.LastClause = NULL; | 
					
						
							|  |  |  |   p->cs.p_code.NOfClauses = 0; | 
					
						
							| 
									
										
										
										
											2004-02-11 13:33:19 +00:00
										 |  |  |   p->PredFlags = ap->PredFlags & ~(IndexedPredFlag|SpiedPredFlag); | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   p->src.OwnerFile = ap->src.OwnerFile; | 
					
						
							|  |  |  |   p->OpcodeOfPred = UNDEF_OPCODE; | 
					
						
							|  |  |  |   p->CodeOfPred = p->cs.p_code.TrueCodeOfPred = (yamop *)(&(p->OpcodeOfPred));  | 
					
						
							|  |  |  |   p->cs.p_code.ExpandCode = EXPAND_OP_CODE;  | 
					
						
							|  |  |  |   p->ModuleOfPred = ap->ModuleOfPred; | 
					
						
							|  |  |  |   p->NextPredOfModule = NULL; | 
					
						
							| 
									
										
										
										
											2006-10-10 14:08:17 +00:00
										 |  |  |   p->TimeStampOfPred = 0L;  | 
					
						
							|  |  |  |   p->LastCallOfPred = LUCALL_ASSERT;  | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   INIT_LOCK(p->StatisticsForPred.lock); | 
					
						
							|  |  |  |   p->StatisticsForPred.NOfEntries = 0; | 
					
						
							|  |  |  |   p->StatisticsForPred.NOfHeadSuccesses = 0; | 
					
						
							|  |  |  |   p->StatisticsForPred.NOfRetries = 0; | 
					
						
							|  |  |  | #ifdef TABLING
 | 
					
						
							|  |  |  |   p->TableOfPred = NULL; | 
					
						
							|  |  |  | #endif /* TABLING */
 | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | #ifdef BEAM
 | 
					
						
							|  |  |  |   p->beamTable = NULL; | 
					
						
							|  |  |  | #endif 
 | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   /* careful that they don't cross MkFunctor */ | 
					
						
							| 
									
										
										
										
											2011-05-09 19:55:06 +01:00
										 |  |  |   p->NextOfPE = AbsPredProp(LOCAL_ThreadHandle.local_preds); | 
					
						
							|  |  |  |   LOCAL_ThreadHandle.local_preds = p; | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   p->FunctorOfPred = ap->FunctorOfPred; | 
					
						
							| 
									
										
										
										
											2012-03-09 11:46:34 +00:00
										 |  |  |   Yap_inform_profiler_of_clause(&(p->OpcodeOfPred), &(p->OpcodeOfPred)+1, p, GPROF_NEW_PRED_THREAD); | 
					
						
							|  |  |  |   if (!(p->PredFlags & (CPredFlag|AsmPredFlag))) { | 
					
						
							|  |  |  |     Yap_inform_profiler_of_clause(&(p->cs.p_code.ExpandCode), &(p->cs.p_code.ExpandCode)+1, p, GPROF_NEW_PRED_THREAD); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   return AbsPredProp(p); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  | Prop | 
					
						
							| 
									
										
										
										
											2004-02-12 12:37:12 +00:00
										 |  |  | Yap_NewPredPropByAtom(AtomEntry *ae, Term cur_mod) | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-04-11 22:08:02 +01:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |   Prop p0; | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |   PredEntry *p = (PredEntry *) Yap_AllocAtomSpace(sizeof(*p)); | 
					
						
							| 
									
										
										
										
											2001-11-15 00:01:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-12 12:37:12 +00:00
										 |  |  | /* Printf("entering %s:%s/0\n", RepAtom(AtomOfTerm(cur_mod))->StrOfAE, ae->StrOfAE); */ | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-08 13:15:09 +01:00
										 |  |  |   if (p == NULL) { | 
					
						
							|  |  |  |     WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |     return NIL; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2004-02-05 16:57:02 +00:00
										 |  |  |   INIT_LOCK(p->PELock); | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |   p->KindOfPE = PEProp; | 
					
						
							|  |  |  |   p->ArityOfPE = 0; | 
					
						
							| 
									
										
										
										
											2002-12-27 16:53:09 +00:00
										 |  |  |   p->cs.p_code.FirstClause = p->cs.p_code.LastClause = NULL; | 
					
						
							| 
									
										
										
										
											2003-04-30 17:46:05 +00:00
										 |  |  |   p->cs.p_code.NOfClauses = 0; | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |   p->PredFlags = 0L; | 
					
						
							| 
									
										
										
										
											2003-08-25 18:42:35 +00:00
										 |  |  |   p->src.OwnerFile = AtomNil; | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |   p->OpcodeOfPred = UNDEF_OPCODE; | 
					
						
							| 
									
										
										
										
											2003-08-25 18:42:35 +00:00
										 |  |  |   p->cs.p_code.ExpandCode = EXPAND_OP_CODE;  | 
					
						
							| 
									
										
										
										
											2002-12-27 16:53:09 +00:00
										 |  |  |   p->CodeOfPred = p->cs.p_code.TrueCodeOfPred = (yamop *)(&(p->OpcodeOfPred));  | 
					
						
							| 
									
										
										
										
											2004-02-12 12:37:12 +00:00
										 |  |  |   if (cur_mod == TermProlog) | 
					
						
							|  |  |  |     p->ModuleOfPred = 0; | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     p->ModuleOfPred = cur_mod; | 
					
						
							|  |  |  |   Yap_NewModulePred(cur_mod, p); | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |   INIT_LOCK(p->StatisticsForPred.lock); | 
					
						
							|  |  |  |   p->StatisticsForPred.NOfEntries = 0; | 
					
						
							|  |  |  |   p->StatisticsForPred.NOfHeadSuccesses = 0; | 
					
						
							|  |  |  |   p->StatisticsForPred.NOfRetries = 0; | 
					
						
							| 
									
										
										
										
											2006-10-10 14:08:17 +00:00
										 |  |  |   p->TimeStampOfPred = 0L;  | 
					
						
							|  |  |  |   p->LastCallOfPred = LUCALL_ASSERT;  | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  | #ifdef TABLING
 | 
					
						
							|  |  |  |   p->TableOfPred = NULL; | 
					
						
							|  |  |  | #endif /* TABLING */
 | 
					
						
							| 
									
										
										
										
											2005-09-08 22:06:45 +00:00
										 |  |  | #ifdef BEAM
 | 
					
						
							|  |  |  |   p->beamTable = NULL; | 
					
						
							|  |  |  | #endif 
 | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |   /* careful that they don't cross MkFunctor */ | 
					
						
							| 
									
										
										
										
											2004-12-05 05:01:45 +00:00
										 |  |  |   if (PRED_GOAL_EXPANSION_FUNC) { | 
					
						
							|  |  |  |     Prop p1 = ae->PropsOfAE; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while (p1) { | 
					
						
							|  |  |  |       PredEntry *pe = RepPredProp(p1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (pe->KindOfPE == PEProp) { | 
					
						
							|  |  |  | 	if (pe->PredFlags & GoalExPredFlag) { | 
					
						
							|  |  |  | 	  p->PredFlags |= GoalExPredFlag; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       p1 = pe->NextOfPE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-08-17 11:16:21 -07:00
										 |  |  |   AddPropToAtom(ae, (PropEntry *)p); | 
					
						
							|  |  |  |   p0 = AbsPredProp(p); | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |   p->FunctorOfPred = (Functor)AbsAtom(ae); | 
					
						
							|  |  |  |   WRITE_UNLOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2012-03-14 11:08:04 +00:00
										 |  |  |   Yap_inform_profiler_of_clause(&(p->OpcodeOfPred), &(p->OpcodeOfPred)+1, p, GPROF_NEW_PRED_ATOM); | 
					
						
							| 
									
										
										
										
											2012-03-09 11:46:34 +00:00
										 |  |  |   if (!(p->PredFlags & (CPredFlag|AsmPredFlag))) { | 
					
						
							| 
									
										
										
										
											2012-03-14 11:08:04 +00:00
										 |  |  |     Yap_inform_profiler_of_clause(&(p->cs.p_code.ExpandCode), &(p->cs.p_code.ExpandCode)+1, p, GPROF_NEW_PRED_ATOM); | 
					
						
							| 
									
										
										
										
											2012-03-09 11:46:34 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2004-12-05 05:01:45 +00:00
										 |  |  |   return p0; | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-11 01:20:56 +00:00
										 |  |  | Prop | 
					
						
							| 
									
										
										
										
											2004-02-12 12:37:12 +00:00
										 |  |  | Yap_PredPropByFunctorNonThreadLocal(Functor f, Term cur_mod) | 
					
						
							| 
									
										
										
										
											2004-02-11 01:20:56 +00:00
										 |  |  | /* get predicate entry for ap/arity; create it if neccessary.              */ | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2007-09-28 23:18:17 +00:00
										 |  |  |   PredEntry *p; | 
					
						
							| 
									
										
										
										
											2004-02-11 01:20:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-28 23:18:17 +00:00
										 |  |  |   WRITE_LOCK(f->FRWLock); | 
					
						
							|  |  |  |   if (!(p = RepPredProp(f->PropsOfFE)))  | 
					
						
							|  |  |  |     return Yap_NewPredPropByFunctor(f,cur_mod); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if ((p->ModuleOfPred == cur_mod || !(p->ModuleOfPred))) { | 
					
						
							| 
									
										
										
										
											2011-09-07 22:04:42 +02:00
										 |  |  |     /* don't match multi-files */ | 
					
						
							|  |  |  |     if (!(p->PredFlags & MultiFileFlag) || | 
					
						
							|  |  |  | 	p->ModuleOfPred || | 
					
						
							|  |  |  | 	!cur_mod || | 
					
						
							|  |  |  | 	cur_mod == TermProlog) { | 
					
						
							|  |  |  |       WRITE_UNLOCK(f->FRWLock); | 
					
						
							|  |  |  |       return AbsPredProp(p); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2007-09-28 23:18:17 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   if (p->NextOfPE) { | 
					
						
							|  |  |  |     UInt hash = PRED_HASH(f,cur_mod,PredHashTableSize); | 
					
						
							|  |  |  |     READ_LOCK(PredHashRWLock); | 
					
						
							|  |  |  |     p = PredHash[hash]; | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     while (p) { | 
					
						
							|  |  |  |       if (p->FunctorOfPred == f && | 
					
						
							|  |  |  | 	  p->ModuleOfPred == cur_mod) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  READ_UNLOCK(PredHashRWLock); | 
					
						
							| 
									
										
										
										
											2007-09-29 00:29:00 +00:00
										 |  |  | 	  WRITE_UNLOCK(f->FRWLock); | 
					
						
							| 
									
										
										
										
											2007-09-28 23:18:17 +00:00
										 |  |  | 	  return AbsPredProp(p); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |       p = RepPredProp(p->NextOfPE); | 
					
						
							| 
									
										
										
										
											2004-02-11 01:20:56 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2007-09-28 23:18:17 +00:00
										 |  |  |     READ_UNLOCK(PredHashRWLock); | 
					
						
							| 
									
										
										
										
											2004-02-11 01:20:56 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2007-09-28 23:18:17 +00:00
										 |  |  |   return Yap_NewPredPropByFunctor(f,cur_mod); | 
					
						
							| 
									
										
										
										
											2004-02-11 01:20:56 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Prop | 
					
						
							| 
									
										
										
										
											2004-02-12 12:37:12 +00:00
										 |  |  | Yap_PredPropByAtomNonThreadLocal(Atom at, Term cur_mod) | 
					
						
							| 
									
										
										
										
											2004-02-11 01:20:56 +00:00
										 |  |  | /* get predicate entry for ap/arity; create it if neccessary.              */ | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Prop p0; | 
					
						
							|  |  |  |   AtomEntry *ae = RepAtom(at); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   WRITE_LOCK(ae->ARWLock); | 
					
						
							|  |  |  |   p0 = ae->PropsOfAE; | 
					
						
							|  |  |  |   while (p0) { | 
					
						
							|  |  |  |     PredEntry *pe = RepPredProp(p0); | 
					
						
							|  |  |  |     if ( pe->KindOfPE == PEProp &&  | 
					
						
							|  |  |  | 	 (pe->ModuleOfPred == cur_mod || !pe->ModuleOfPred)) { | 
					
						
							| 
									
										
										
										
											2011-09-07 22:04:42 +02:00
										 |  |  |       /* don't match multi-files */ | 
					
						
							|  |  |  |       if (!(pe->PredFlags & MultiFileFlag) || | 
					
						
							|  |  |  | 	  pe->ModuleOfPred || | 
					
						
							|  |  |  | 	  !cur_mod || | 
					
						
							|  |  |  | 	  cur_mod == TermProlog) { | 
					
						
							|  |  |  | 	WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  | 	return(p0); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2004-02-11 01:20:56 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     p0 = pe->NextOfPE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return Yap_NewPredPropByAtom(ae,cur_mod); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | Term | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_GetValue(Atom a) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Prop p0 = GetAProp(a, ValProperty); | 
					
						
							|  |  |  |   Term out; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (p0 == NIL) | 
					
						
							|  |  |  |     return (TermNil); | 
					
						
							|  |  |  |   READ_LOCK(RepValProp(p0)->VRWLock); | 
					
						
							|  |  |  |   out = RepValProp(p0)->ValueOfVE; | 
					
						
							| 
									
										
										
										
											2002-02-27 01:20:18 +00:00
										 |  |  |   if (IsApplTerm(out)) { | 
					
						
							|  |  |  |     Functor f = FunctorOfTerm(out); | 
					
						
							|  |  |  |     if (f == FunctorDouble) { | 
					
						
							|  |  |  |       out = MkFloatTerm(FloatOfTerm(out)); | 
					
						
							|  |  |  |     } else if (f == FunctorLongInt) { | 
					
						
							|  |  |  |       out = MkLongIntTerm(LongIntOfTerm(out)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #ifdef USE_GMP
 | 
					
						
							|  |  |  |     else { | 
					
						
							| 
									
										
										
										
											2006-01-18 15:34:54 +00:00
										 |  |  |       out = Yap_MkBigIntTerm(Yap_BigIntOfTerm(out)); | 
					
						
							| 
									
										
										
										
											2002-02-27 01:20:18 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   READ_UNLOCK(RepValProp(p0)->VRWLock); | 
					
						
							|  |  |  |   return (out); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_PutValue(Atom a, Term v) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   AtomEntry *ae = RepAtom(a); | 
					
						
							|  |  |  |   Prop p0; | 
					
						
							|  |  |  |   ValEntry *p; | 
					
						
							| 
									
										
										
										
											2002-02-27 01:11:51 +00:00
										 |  |  |   Term t0; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   WRITE_LOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2001-10-30 16:42:05 +00:00
										 |  |  |   p0 = GetAPropHavingLock(ae, ValProperty); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (p0 != NIL) { | 
					
						
							|  |  |  |     p = RepValProp(p0); | 
					
						
							|  |  |  |     WRITE_LOCK(p->VRWLock); | 
					
						
							|  |  |  |     WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     p = (ValEntry *) Yap_AllocAtomSpace(sizeof(ValEntry)); | 
					
						
							| 
									
										
										
										
											2008-10-07 23:52:26 +01:00
										 |  |  |     if (p == NULL) { | 
					
						
							|  |  |  |       WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     p->KindOfPE = ValProperty; | 
					
						
							| 
									
										
										
										
											2002-02-27 01:11:51 +00:00
										 |  |  |     p->ValueOfVE = TermNil; | 
					
						
							| 
									
										
										
										
											2011-08-17 14:35:29 -07:00
										 |  |  |     AddPropToAtom(RepAtom(a), (PropEntry *)p); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     /* take care that the lock for the property will be inited even
 | 
					
						
							|  |  |  |        if someone else searches for the property */ | 
					
						
							|  |  |  |     INIT_RWLOCK(p->VRWLock); | 
					
						
							|  |  |  |     WRITE_LOCK(p->VRWLock); | 
					
						
							|  |  |  |     WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-02-27 01:11:51 +00:00
										 |  |  |   t0 = p->ValueOfVE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   if (IsFloatTerm(v)) { | 
					
						
							|  |  |  |     /* store a float in code space, so that we can access the property */ | 
					
						
							|  |  |  |     union { | 
					
						
							|  |  |  |       Float f; | 
					
						
							|  |  |  |       CELL ar[sizeof(Float) / sizeof(CELL)]; | 
					
						
							|  |  |  |     } un; | 
					
						
							|  |  |  |     CELL *pt, *iptr; | 
					
						
							|  |  |  |     unsigned int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     un.f = FloatOfTerm(v); | 
					
						
							| 
									
										
										
										
											2002-02-27 01:11:51 +00:00
										 |  |  |     if (IsFloatTerm(t0)) { | 
					
						
							|  |  |  |       pt = RepAppl(t0); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       if (IsApplTerm(t0)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | 	Yap_FreeCodeSpace((char *) (RepAppl(t0))); | 
					
						
							| 
									
										
										
										
											2002-02-27 01:11:51 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       pt = (CELL *) Yap_AllocAtomSpace(sizeof(CELL)*(1 + 2*sizeof(Float)/sizeof(CELL))); | 
					
						
							| 
									
										
										
										
											2008-10-07 23:52:26 +01:00
										 |  |  |       if (pt == NULL) { | 
					
						
							|  |  |  | 	WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  | 	return; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2002-02-27 01:11:51 +00:00
										 |  |  |       p->ValueOfVE = AbsAppl(pt); | 
					
						
							|  |  |  |       pt[0] = (CELL)FunctorDouble; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     iptr = pt+1; | 
					
						
							|  |  |  |     for (i = 0; i < sizeof(Float) / sizeof(CELL); i++) { | 
					
						
							| 
									
										
										
										
											2002-02-27 01:11:51 +00:00
										 |  |  |       *iptr++ = (CELL)un.ar[i]; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } else if (IsLongIntTerm(v)) { | 
					
						
							|  |  |  |     CELL *pt; | 
					
						
							|  |  |  |     Int val = LongIntOfTerm(v); | 
					
						
							| 
									
										
										
										
											2002-02-27 01:11:51 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (IsLongIntTerm(t0)) { | 
					
						
							|  |  |  |       pt = RepAppl(t0); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2002-02-27 01:11:51 +00:00
										 |  |  |       if (IsApplTerm(t0)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | 	Yap_FreeCodeSpace((char *) (RepAppl(t0))); | 
					
						
							| 
									
										
										
										
											2002-02-27 01:11:51 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       pt = (CELL *) Yap_AllocAtomSpace(2*sizeof(CELL)); | 
					
						
							| 
									
										
										
										
											2008-10-07 23:52:26 +01:00
										 |  |  |       if (pt == NULL) { | 
					
						
							|  |  |  | 	WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  | 	return; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2002-02-27 01:11:51 +00:00
										 |  |  |       p->ValueOfVE = AbsAppl(pt); | 
					
						
							|  |  |  |       pt[0] = (CELL)FunctorLongInt; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-02-27 01:11:51 +00:00
										 |  |  |     pt[1] = (CELL)val; | 
					
						
							|  |  |  | #ifdef USE_GMP
 | 
					
						
							|  |  |  |   } else if (IsBigIntTerm(v)) { | 
					
						
							|  |  |  |     CELL *ap = RepAppl(v); | 
					
						
							|  |  |  |     Int sz =  | 
					
						
							|  |  |  |       sizeof(MP_INT)+sizeof(CELL)+ | 
					
						
							|  |  |  |       (((MP_INT *)(ap+1))->_mp_alloc*sizeof(mp_limb_t)); | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |     CELL *pt = (CELL *) Yap_AllocAtomSpace(sz); | 
					
						
							| 
									
										
										
										
											2008-10-07 23:52:26 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (pt == NULL) { | 
					
						
							|  |  |  |       WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-02-27 01:11:51 +00:00
										 |  |  |     if (IsApplTerm(t0)) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_FreeCodeSpace((char *) RepAppl(t0)); | 
					
						
							| 
									
										
										
										
											2002-02-27 01:11:51 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     memcpy((void *)pt, (void *)ap, sz); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     p->ValueOfVE = AbsAppl(pt); | 
					
						
							| 
									
										
										
										
											2002-02-27 01:11:51 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2002-02-27 01:11:51 +00:00
										 |  |  |     if (IsApplTerm(t0)) { | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       /* recover space */ | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_FreeCodeSpace((char *) (RepAppl(p->ValueOfVE))); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     p->ValueOfVE = v; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   WRITE_UNLOCK(p->VRWLock); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Term | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_StringToList(char *s) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   register Term t; | 
					
						
							|  |  |  |   register unsigned char *cp = (unsigned char *)s + strlen(s); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   t = MkAtomTerm(AtomNil); | 
					
						
							|  |  |  |   while (cp > (unsigned char *)s) { | 
					
						
							|  |  |  |     t = MkPairTerm(MkIntTerm(*--cp), t); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return (t); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-27 17:42:03 +00:00
										 |  |  | Term | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  | Yap_NStringToList(char *s, size_t len) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  |   Term t; | 
					
						
							| 
									
										
										
										
											2010-06-17 00:29:46 +01:00
										 |  |  |   unsigned char *cp = (unsigned char *)s + len; | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   t = MkAtomTerm(AtomNil); | 
					
						
							| 
									
										
										
										
											2010-06-17 00:29:46 +01:00
										 |  |  |   while (cp > (unsigned char *)s) { | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  |     t = MkPairTerm(MkIntegerTerm(*--cp), t); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return t; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Term | 
					
						
							|  |  |  | Yap_WideStringToList(wchar_t *s) | 
					
						
							| 
									
										
										
										
											2006-11-27 17:42:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2006-11-27 17:42:03 +00:00
										 |  |  |   Term t; | 
					
						
							|  |  |  |   wchar_t *cp = s + wcslen(s); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   t = MkAtomTerm(AtomNil); | 
					
						
							|  |  |  |   while (cp > s) { | 
					
						
							|  |  |  |     t = MkPairTerm(MkIntegerTerm(*--cp), t); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return t; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  | Term | 
					
						
							|  |  |  | Yap_NWideStringToList(wchar_t *s, size_t len) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  |   Term t; | 
					
						
							|  |  |  |   wchar_t *cp = s + len; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   t = MkAtomTerm(AtomNil); | 
					
						
							|  |  |  |   while (cp > s) { | 
					
						
							|  |  |  |     t = MkPairTerm(MkIntegerTerm(*--cp), t); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return t; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-02 18:18:31 +00:00
										 |  |  | Term | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | Yap_StringToDiffList(char *s, Term t USES_REGS) | 
					
						
							| 
									
										
										
										
											2006-08-02 18:18:31 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   register unsigned char *cp = (unsigned char *)s + strlen(s); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-19 14:39:52 +01:00
										 |  |  |  t = Yap_Globalise(t); | 
					
						
							| 
									
										
										
										
											2006-08-02 18:18:31 +00:00
										 |  |  |   while (cp > (unsigned char *)s) { | 
					
						
							| 
									
										
										
										
											2011-02-15 05:54:19 -08:00
										 |  |  |     if (ASP < H+1024) | 
					
						
							|  |  |  |       return (CELL)0; | 
					
						
							| 
									
										
										
										
											2006-08-02 18:18:31 +00:00
										 |  |  |     t = MkPairTerm(MkIntTerm(*--cp), t); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return t; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  | Term | 
					
						
							|  |  |  | Yap_NStringToDiffList(char *s, Term t, size_t len) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  |   register unsigned char *cp = (unsigned char *)s + len; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-19 14:39:52 +01:00
										 |  |  |   t = Yap_Globalise(t); | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  |   while (cp > (unsigned char *)s) { | 
					
						
							|  |  |  |     t = MkPairTerm(MkIntTerm(*--cp), t); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return t; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Term | 
					
						
							|  |  |  | Yap_WideStringToDiffList(wchar_t *s, Term t) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  |  wchar_t *cp = s + wcslen(s); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-19 14:39:52 +01:00
										 |  |  |   t = Yap_Globalise(t); | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  |   while (cp > s) { | 
					
						
							|  |  |  |     t = MkPairTerm(MkIntegerTerm(*--cp), t); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return t; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Term | 
					
						
							|  |  |  | Yap_NWideStringToDiffList(wchar_t *s, Term t, size_t len) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  |  wchar_t *cp = s + len; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-19 14:39:52 +01:00
										 |  |  |  t = Yap_Globalise(t); | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  |   while (cp > s) { | 
					
						
							|  |  |  |     t = MkPairTerm(MkIntegerTerm(*--cp), t); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return t; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | Term | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_StringToListOfAtoms(char *s) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   register Term t; | 
					
						
							|  |  |  |   char so[2]; | 
					
						
							|  |  |  |   register unsigned char *cp = (unsigned char *)s + strlen(s); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   so[1] = '\0'; | 
					
						
							|  |  |  |   t = MkAtomTerm(AtomNil); | 
					
						
							|  |  |  |   while (cp > (unsigned char *)s) { | 
					
						
							|  |  |  |     so[0] = *--cp; | 
					
						
							|  |  |  |     t = MkPairTerm(MkAtomTerm(LookupAtom(so)), t); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  |   return t; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-27 17:42:03 +00:00
										 |  |  | Term | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  | Yap_NStringToListOfAtoms(char *s, size_t len) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  |   register Term t; | 
					
						
							|  |  |  |   char so[2]; | 
					
						
							|  |  |  |   register unsigned char *cp = (unsigned char *)s + len; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   so[1] = '\0'; | 
					
						
							|  |  |  |   t = MkAtomTerm(AtomNil); | 
					
						
							|  |  |  |   while (cp > (unsigned char *)s) { | 
					
						
							|  |  |  |     so[0] = *--cp; | 
					
						
							|  |  |  |     t = MkPairTerm(MkAtomTerm(LookupAtom(so)), t); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return t; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Term | 
					
						
							|  |  |  | Yap_WideStringToListOfAtoms(wchar_t *s) | 
					
						
							| 
									
										
										
										
											2006-11-27 17:42:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2006-11-27 17:42:03 +00:00
										 |  |  |   register Term t; | 
					
						
							|  |  |  |   wchar_t so[2]; | 
					
						
							|  |  |  |   wchar_t *cp = s + wcslen(s); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   so[1] = '\0'; | 
					
						
							|  |  |  |   t = MkAtomTerm(AtomNil); | 
					
						
							|  |  |  |   while (cp > s) { | 
					
						
							|  |  |  |     so[0] = *--cp; | 
					
						
							|  |  |  |     t = MkPairTerm(MkAtomTerm(LookupWideAtom(so)), t); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return t; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  | Term | 
					
						
							|  |  |  | Yap_NWideStringToListOfAtoms(wchar_t *s, size_t len) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2008-07-24 16:02:04 +00:00
										 |  |  |   register Term t; | 
					
						
							|  |  |  |   wchar_t so[2]; | 
					
						
							|  |  |  |   wchar_t *cp = s + len; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   so[1] = '\0'; | 
					
						
							|  |  |  |   t = MkAtomTerm(AtomNil); | 
					
						
							|  |  |  |   while (cp > s) { | 
					
						
							|  |  |  |     so[0] = *--cp; | 
					
						
							|  |  |  |     t = MkPairTerm(MkAtomTerm(LookupWideAtom(so)), t); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return t; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  | Term | 
					
						
							|  |  |  | Yap_NWideStringToDiffListOfAtoms(wchar_t *s, Term t0, size_t len) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   register Term t; | 
					
						
							|  |  |  |   wchar_t so[2]; | 
					
						
							|  |  |  |   wchar_t *cp = s + len; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   so[1] = '\0'; | 
					
						
							| 
									
										
										
										
											2010-07-19 14:39:52 +01:00
										 |  |  |   t = Yap_Globalise(t0); | 
					
						
							| 
									
										
										
										
											2008-12-17 14:47:05 +00:00
										 |  |  |   while (cp > s) { | 
					
						
							|  |  |  |     so[0] = *--cp; | 
					
						
							|  |  |  |     t = MkPairTerm(MkAtomTerm(LookupWideAtom(so)), t); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return t; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | Term | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_ArrayToList(register Term *tp, int nof) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   register Term *pt = tp + nof; | 
					
						
							|  |  |  |   register Term t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   t = MkAtomTerm(AtomNil); | 
					
						
							|  |  |  |   while (pt > tp) { | 
					
						
							|  |  |  |     Term tm = *--pt; | 
					
						
							| 
									
										
										
										
											2011-03-30 15:32:59 +01:00
										 |  |  | #if YAPOR_SBA
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     if (tm == 0) | 
					
						
							|  |  |  |       t = MkPairTerm((CELL)pt, t); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |       t = MkPairTerm(tm, t); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return (t); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_GetName(char *s, UInt max, Term t) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   register Term Head; | 
					
						
							|  |  |  |   register Int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (IsVarTerm(t) || !IsPairTerm(t)) | 
					
						
							| 
									
										
										
										
											2005-03-01 22:25:09 +00:00
										 |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   while (IsPairTerm(t)) { | 
					
						
							|  |  |  |     Head = HeadOfTerm(t); | 
					
						
							|  |  |  |     if (!IsNumTerm(Head)) | 
					
						
							|  |  |  |       return (FALSE); | 
					
						
							|  |  |  |     i = IntOfTerm(Head); | 
					
						
							| 
									
										
										
										
											2006-11-27 17:42:03 +00:00
										 |  |  |     if (i < 0 || i > MAX_ISO_LATIN1) | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     *s++ = i; | 
					
						
							|  |  |  |     t = TailOfTerm(t); | 
					
						
							| 
									
										
										
										
											2002-01-02 20:56:22 +00:00
										 |  |  |     if (--max == 0) { | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  |       Yap_Error(FATAL_ERROR,t,"not enough space for GetName");       | 
					
						
							| 
									
										
										
										
											2002-01-02 20:56:22 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   *s = '\0'; | 
					
						
							| 
									
										
										
										
											2005-03-01 22:25:09 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef SFUNC
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Term | 
					
						
							|  |  |  | MkSFTerm(Functor f, int n, Term *a, empty_value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Term t, p = AbsAppl(H); | 
					
						
							|  |  |  |   int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   *H++ = f; | 
					
						
							|  |  |  |   RESET_VARIABLE(H); | 
					
						
							|  |  |  |   ++H; | 
					
						
							|  |  |  |   for (i = 1; i <= n; ++i) { | 
					
						
							|  |  |  |     t = Derefa(a++); | 
					
						
							|  |  |  |     if (t != empty_value) { | 
					
						
							|  |  |  |       *H++ = i; | 
					
						
							|  |  |  |       *H++ = t; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   *H++ = 0; | 
					
						
							|  |  |  |   return (p); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CELL * | 
					
						
							|  |  |  | ArgsOfSFTerm(Term t) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   CELL *p = RepAppl(t) + 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   while (*p != (CELL) p) | 
					
						
							|  |  |  |     p = CellPtr(*p) + 1; | 
					
						
							|  |  |  |   return (p + 1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-10-17 00:05:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-10 10:21:56 +01:00
										 |  |  | Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | Yap_NewSlots(int n USES_REGS) | 
					
						
							| 
									
										
										
										
											2002-10-17 00:05:29 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Int old_slots = IntOfTerm(ASP[0]), oldn = n; | 
					
						
							|  |  |  |   while (n > 0) { | 
					
						
							|  |  |  |     RESET_VARIABLE(ASP); | 
					
						
							|  |  |  |     ASP--; | 
					
						
							|  |  |  |     n--; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   ASP[0] = MkIntTerm(old_slots+oldn); | 
					
						
							| 
									
										
										
										
											2010-06-01 00:40:58 +01:00
										 |  |  |   CurSlot = LCL0-ASP; | 
					
						
							| 
									
										
										
										
											2002-10-17 00:05:29 +00:00
										 |  |  |   return((ASP+1)-LCL0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-10 10:21:56 +01:00
										 |  |  | Int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | Yap_InitSlot(Term t USES_REGS) | 
					
						
							| 
									
										
										
										
											2002-10-17 00:05:29 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Int old_slots = IntOfTerm(ASP[0]); | 
					
						
							|  |  |  |   *ASP = t; | 
					
						
							|  |  |  |   ASP--; | 
					
						
							| 
									
										
										
										
											2010-06-01 00:40:58 +01:00
										 |  |  |   CurSlot ++; | 
					
						
							| 
									
										
										
										
											2002-10-17 00:05:29 +00:00
										 |  |  |   ASP[0] = MkIntTerm(old_slots+1); | 
					
						
							|  |  |  |   return((ASP+1)-LCL0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-17 13:37:51 +00:00
										 |  |  | int | 
					
						
							| 
									
										
										
										
											2011-03-07 16:02:55 +00:00
										 |  |  | Yap_RecoverSlots(int n USES_REGS) | 
					
						
							| 
									
										
										
										
											2002-10-17 00:05:29 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   Int old_slots = IntOfTerm(ASP[0]); | 
					
						
							| 
									
										
										
										
											2008-06-17 13:37:51 +00:00
										 |  |  |   if (old_slots - n < 0) { | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-10-17 00:05:29 +00:00
										 |  |  |   ASP += n; | 
					
						
							| 
									
										
										
										
											2010-06-01 00:40:58 +01:00
										 |  |  |   CurSlot -= n; | 
					
						
							| 
									
										
										
										
											2002-10-17 00:05:29 +00:00
										 |  |  |   ASP[0] = MkIntTerm(old_slots-n); | 
					
						
							| 
									
										
										
										
											2008-06-17 13:37:51 +00:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2002-10-17 00:05:29 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-21 10:12:47 -02:00
										 |  |  | static HoldEntry * | 
					
						
							|  |  |  | InitAtomHold(void) | 
					
						
							| 
									
										
										
										
											2007-12-05 12:17:25 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   HoldEntry *x = (HoldEntry *)Yap_AllocAtomSpace(sizeof(struct hold_entry)); | 
					
						
							| 
									
										
										
										
											2008-10-07 23:52:26 +01:00
										 |  |  |   if (x == NULL) { | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2007-12-05 12:17:25 +00:00
										 |  |  |   x->KindOfPE = HoldProperty; | 
					
						
							|  |  |  |   x->NextOfPE = NIL; | 
					
						
							| 
									
										
										
										
											2009-12-21 10:12:47 -02:00
										 |  |  |   x->RefsOfPE = 1; | 
					
						
							| 
									
										
										
										
											2007-12-05 12:17:25 +00:00
										 |  |  |   return x; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int | 
					
						
							| 
									
										
										
										
											2009-12-21 10:12:47 -02:00
										 |  |  | Yap_AtomIncreaseHold(Atom at) | 
					
						
							| 
									
										
										
										
											2007-12-05 12:17:25 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   AtomEntry *ae = RepAtom(at); | 
					
						
							| 
									
										
										
										
											2009-12-21 10:12:47 -02:00
										 |  |  |   HoldEntry *pp; | 
					
						
							|  |  |  |   Prop *opp = &(ae->PropsOfAE); | 
					
						
							| 
									
										
										
										
											2002-10-17 00:05:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-05 12:17:25 +00:00
										 |  |  |   WRITE_LOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2009-12-21 10:12:47 -02:00
										 |  |  |   pp = RepHoldProp(ae->PropsOfAE); | 
					
						
							|  |  |  |   while (!EndOfPAEntr(pp) | 
					
						
							|  |  |  | 	 && pp->KindOfPE != HoldProperty) { | 
					
						
							|  |  |  |     opp = &(pp->NextOfPE); | 
					
						
							|  |  |  |     pp = RepHoldProp(pp->NextOfPE); | 
					
						
							| 
									
										
										
										
											2007-12-05 12:17:25 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   if (!pp) { | 
					
						
							| 
									
										
										
										
											2009-12-21 10:12:47 -02:00
										 |  |  |     HoldEntry *new = InitAtomHold(); | 
					
						
							|  |  |  |     if (!new) { | 
					
						
							|  |  |  |       WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |       return FALSE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     *opp = AbsHoldProp(new); | 
					
						
							| 
									
										
										
										
											2007-12-05 12:17:25 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2009-12-21 10:12:47 -02:00
										 |  |  |     pp->RefsOfPE++; | 
					
						
							| 
									
										
										
										
											2007-12-05 12:17:25 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |   return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int | 
					
						
							| 
									
										
										
										
											2009-12-21 10:12:47 -02:00
										 |  |  | Yap_AtomDecreaseHold(Atom at) | 
					
						
							| 
									
										
										
										
											2007-12-05 12:17:25 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   AtomEntry *ae = RepAtom(at); | 
					
						
							| 
									
										
										
										
											2009-12-21 10:12:47 -02:00
										 |  |  |   HoldEntry *pp; | 
					
						
							|  |  |  |   Prop *opp = &(ae->PropsOfAE); | 
					
						
							| 
									
										
										
										
											2007-12-05 12:17:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   WRITE_LOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2009-12-21 10:12:47 -02:00
										 |  |  |   pp = RepHoldProp(ae->PropsOfAE); | 
					
						
							|  |  |  |   while (!EndOfPAEntr(pp) | 
					
						
							|  |  |  | 	 && pp->KindOfPE != HoldProperty) { | 
					
						
							|  |  |  |     opp = &(pp->NextOfPE); | 
					
						
							|  |  |  |     pp = RepHoldProp(pp->NextOfPE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (!pp) { | 
					
						
							|  |  |  |     WRITE_UNLOCK(ae->ARWLock); | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   pp->RefsOfPE--; | 
					
						
							|  |  |  |   if (!pp->RefsOfPE) { | 
					
						
							|  |  |  |     *opp = pp->NextOfPE; | 
					
						
							|  |  |  |     Yap_FreeCodeSpace((ADDR)pp); | 
					
						
							| 
									
										
										
										
											2007-12-05 12:17:25 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   WRITE_UNLOCK(ae->ARWLock); | 
					
						
							| 
									
										
										
										
											2009-12-21 10:12:47 -02:00
										 |  |  |   return TRUE; | 
					
						
							| 
									
										
										
										
											2007-12-05 12:17:25 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-12-21 10:12:47 -02:00
										 |  |  | 
 |