Merge branch 'master' of git.dcc.fc.up.pt:yap-6.3
This commit is contained in:
		
							
								
								
									
										4
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							| @@ -36,7 +36,7 @@ | ||||
| 	url = git://git.code.sf.net/p/yap/pldoc | ||||
| [submodule "packages/real"] | ||||
| 	path = packages/real | ||||
| 	url = git://www.swi-prolog.org/home/pl/git/packages/real.git | ||||
| 	url = git://git.code.sf.net/p/yap/real | ||||
| [submodule "packages/archive"] | ||||
| 	path = packages/archive | ||||
| 	url = git://git.code.sf.net/p/yap/archive | ||||
| @@ -51,4 +51,4 @@ | ||||
| 	url = git://git.code.sf.net/p/yap/ltx2htm | ||||
| [submodule "packages/raptor"] | ||||
| 	path = packages/raptor | ||||
| 	url = https://github.com/davidvaz/yap-raptor.git | ||||
| 	url = git://git.code.sf.net/p/yap/raptor | ||||
|   | ||||
							
								
								
									
										302
									
								
								C/adtdefs.c
									
									
									
									
									
								
							
							
						
						
									
										302
									
								
								C/adtdefs.c
									
									
									
									
									
								
							| @@ -30,6 +30,7 @@ static Prop	PredPropByFunc(Functor, Term); | ||||
| static Prop	PredPropByAtom(Atom, Term); | ||||
| #include "Yatom.h" | ||||
| #include "yapio.h" | ||||
| #include "pl-shared.h" | ||||
| #include <stdio.h> | ||||
| #include <wchar.h> | ||||
| #if HAVE_STRING_H | ||||
| @@ -301,45 +302,61 @@ Yap_LookupMaybeWideAtom(wchar_t *atom) | ||||
| } | ||||
|  | ||||
| Atom | ||||
| Yap_LookupMaybeWideAtomWithLength(wchar_t *atom, size_t len) | ||||
| Yap_LookupMaybeWideAtomWithLength(wchar_t *atom, size_t len0) | ||||
| {				/* lookup atom in atom table            */ | ||||
|   wchar_t *p = atom, c; | ||||
|   size_t len0 = 0; | ||||
|   size_t len = 0; | ||||
|   Atom at; | ||||
|   int wide = FALSE; | ||||
|  | ||||
|   while ((c = *p++)) {  | ||||
|     if (c > 255) wide = TRUE; | ||||
|     len0++; | ||||
|     if (len0 == len) break; | ||||
|     len++; | ||||
|     if (len == len0) 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) | ||||
|   if (wide) { | ||||
|     wchar_t *ptr0; | ||||
|     ptr0 = (wchar_t *)Yap_AllocCodeSpace(sizeof(wchar_t)*(len0+1)); | ||||
|     if (!ptr0) | ||||
|       return NIL; | ||||
|     while (len--) {*ptr++ = *p++;} | ||||
|     ptr[0] = '\0'; | ||||
|     memcpy(ptr0, atom, len0*sizeof(wchar_t)); | ||||
|     ptr0[len0] = '\0'; | ||||
|     at = LookupWideAtom(ptr0); | ||||
|     Yap_FreeCodeSpace((char *)ptr0); | ||||
|     return at; | ||||
|   } else { | ||||
|     char *ptr, *ptr0; | ||||
|     /* not really a wide atom */ | ||||
|     p = atom; | ||||
|     ptr0 = ptr = Yap_AllocCodeSpace(len+1); | ||||
|     if (!ptr) | ||||
|     char *ptr0; | ||||
|     Int i; | ||||
|     ptr0 = (char *)Yap_AllocCodeSpace((len0+1)); | ||||
|     if (!ptr0) | ||||
|       return NIL; | ||||
|     while (len--) {*ptr++ = *p++;} | ||||
|     ptr[0] = '\0'; | ||||
|     for (i=0; i < len0; i++) ptr0[i] = atom[i]; | ||||
|     ptr0[len0] = '\0'; | ||||
|     at = LookupAtom(ptr0); | ||||
|     Yap_FreeCodeSpace(ptr0); | ||||
|     return at; | ||||
|   } | ||||
| } | ||||
|  | ||||
| Atom | ||||
| Yap_LookupAtomWithLength(char *atom, size_t len0) | ||||
| {				/* lookup atom in atom table            */ | ||||
|   char *p = atom; | ||||
|   Atom at; | ||||
|  | ||||
|   char *ptr, *ptr0; | ||||
|   size_t len = 0; | ||||
|   /* not really a wide atom */ | ||||
|   p = atom; | ||||
|   ptr0 = ptr = Yap_AllocCodeSpace(len0+1); | ||||
|   if (!ptr) | ||||
|     return NIL; | ||||
|   while (len++ < len0) {int ch = *ptr++ = *p++; if (ch == '\0') break;} | ||||
|   ptr[0] = '\0'; | ||||
|   at = LookupAtom(ptr0); | ||||
|   Yap_FreeCodeSpace(ptr0); | ||||
|   return at; | ||||
| } | ||||
|  | ||||
| Atom | ||||
| Yap_LookupAtom(char *atom) | ||||
| {				/* lookup atom in atom table            */ | ||||
| @@ -770,7 +787,7 @@ ExpandPredHash(void) | ||||
| /* fe is supposed to be locked */ | ||||
| Prop | ||||
| Yap_NewPredPropByFunctor(FunctorEntry *fe, Term cur_mod) | ||||
| { | ||||
| { GET_LD | ||||
|   PredEntry *p = (PredEntry *) Yap_AllocAtomSpace(sizeof(*p)); | ||||
|  | ||||
|   if (p == NULL) { | ||||
| @@ -821,6 +838,9 @@ Yap_NewPredPropByFunctor(FunctorEntry *fe, Term cur_mod) | ||||
|   p->cs.p_code.FirstClause = p->cs.p_code.LastClause = NULL; | ||||
|   p->cs.p_code.NOfClauses = 0; | ||||
|   p->PredFlags = 0L; | ||||
| #if SIZEOF_INT_P==4 | ||||
|   p->ExtraPredFlags = 0L; | ||||
| #endif | ||||
|   p->src.OwnerFile = AtomNil; | ||||
|   p->OpcodeOfPred = UNDEF_OPCODE; | ||||
|   p->CodeOfPred = p->cs.p_code.TrueCodeOfPred = (yamop *)(&(p->OpcodeOfPred));  | ||||
| @@ -849,6 +869,9 @@ Yap_NewPredPropByFunctor(FunctorEntry *fe, Term cur_mod) | ||||
|       p->PredFlags |= GoalExPredFlag; | ||||
|     } | ||||
|   } | ||||
|   if (LOCAL_PL_local_data_p== NULL || !truePrologFlag(PLFLAG_DEBUGINFO)) { | ||||
|     p->ExtraPredFlags |= NoDebugPredFlag; | ||||
|   } | ||||
|   p->FunctorOfPred = fe; | ||||
|   WRITE_UNLOCK(fe->FRWLock); | ||||
|   { | ||||
| @@ -863,7 +886,7 @@ Yap_NewPredPropByFunctor(FunctorEntry *fe, Term cur_mod) | ||||
| #if THREADS | ||||
| Prop | ||||
| Yap_NewThreadPred(PredEntry *ap USES_REGS) | ||||
| { | ||||
| { LD_FROM_REGS | ||||
|   PredEntry *p = (PredEntry *) Yap_AllocAtomSpace(sizeof(*p)); | ||||
|  | ||||
|   if (p == NULL) { | ||||
| @@ -875,6 +898,9 @@ Yap_NewThreadPred(PredEntry *ap USES_REGS) | ||||
|   p->cs.p_code.FirstClause = p->cs.p_code.LastClause = NULL; | ||||
|   p->cs.p_code.NOfClauses = 0; | ||||
|   p->PredFlags = ap->PredFlags & ~(IndexedPredFlag|SpiedPredFlag); | ||||
| #if SIZEOF_INT_P==4 | ||||
|   p->ExtraPredFlags = 0L; | ||||
| #endif | ||||
|   p->src.OwnerFile = ap->src.OwnerFile; | ||||
|   p->OpcodeOfPred = UNDEF_OPCODE; | ||||
|   p->CodeOfPred = p->cs.p_code.TrueCodeOfPred = (yamop *)(&(p->OpcodeOfPred));  | ||||
| @@ -898,6 +924,9 @@ Yap_NewThreadPred(PredEntry *ap USES_REGS) | ||||
|   LOCAL_ThreadHandle.local_preds = p; | ||||
|   p->FunctorOfPred = ap->FunctorOfPred; | ||||
|   Yap_inform_profiler_of_clause(&(p->OpcodeOfPred), &(p->OpcodeOfPred)+1, p, GPROF_NEW_PRED_THREAD); | ||||
|   if (LOCAL_PL_local_data_p== NULL || !truePrologFlag(PLFLAG_DEBUGINFO)) { | ||||
|     p->ExtraPredFlags |= NoDebugPredFlag; | ||||
|   } | ||||
|   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); | ||||
|   } | ||||
| @@ -907,7 +936,7 @@ Yap_NewThreadPred(PredEntry *ap USES_REGS) | ||||
|  | ||||
| Prop | ||||
| Yap_NewPredPropByAtom(AtomEntry *ae, Term cur_mod) | ||||
| { | ||||
| { GET_LD | ||||
|   Prop p0; | ||||
|   PredEntry *p = (PredEntry *) Yap_AllocAtomSpace(sizeof(*p)); | ||||
|  | ||||
| @@ -923,6 +952,9 @@ Yap_NewPredPropByAtom(AtomEntry *ae, Term cur_mod) | ||||
|   p->cs.p_code.FirstClause = p->cs.p_code.LastClause = NULL; | ||||
|   p->cs.p_code.NOfClauses = 0; | ||||
|   p->PredFlags = 0L; | ||||
| #if SIZEOF_INT_P==4 | ||||
|   p->ExtraPredFlags = 0L; | ||||
| #endif | ||||
|   p->src.OwnerFile = AtomNil; | ||||
|   p->OpcodeOfPred = UNDEF_OPCODE; | ||||
|   p->cs.p_code.ExpandCode = EXPAND_OP_CODE;  | ||||
| @@ -963,6 +995,9 @@ Yap_NewPredPropByAtom(AtomEntry *ae, Term cur_mod) | ||||
|   AddPropToAtom(ae, (PropEntry *)p); | ||||
|   p0 = AbsPredProp(p); | ||||
|   p->FunctorOfPred = (Functor)AbsAtom(ae); | ||||
|   if (LOCAL_PL_local_data_p== NULL || !truePrologFlag(PLFLAG_DEBUGINFO)) { | ||||
|     p->ExtraPredFlags |= NoDebugPredFlag; | ||||
|   } | ||||
|   WRITE_UNLOCK(ae->ARWLock); | ||||
|   { | ||||
|     Yap_inform_profiler_of_clause(&(p->OpcodeOfPred), &(p->OpcodeOfPred)+1, p, GPROF_NEW_PRED_ATOM); | ||||
| @@ -1060,6 +1095,9 @@ Yap_GetValue(Atom a) | ||||
|     } else if (f == FunctorLongInt) { | ||||
|       CACHE_REGS | ||||
|       out = MkLongIntTerm(LongIntOfTerm(out)); | ||||
|     } else if (f == FunctorString) { | ||||
|       CACHE_REGS | ||||
|       out = MkStringTerm(StringOfTerm(out)); | ||||
|     } | ||||
| #ifdef USE_GMP | ||||
|     else { | ||||
| @@ -1167,6 +1205,21 @@ Yap_PutValue(Atom a, Term v) | ||||
|     memcpy((void *)pt, (void *)ap, sz); | ||||
|     p->ValueOfVE = AbsAppl(pt); | ||||
| #endif | ||||
|   } else if (IsStringTerm(v)) { | ||||
|     CELL *ap = RepAppl(v); | ||||
|     Int sz =  | ||||
|       sizeof(CELL)*(3+ap[1]); | ||||
|     CELL *pt = (CELL *) Yap_AllocAtomSpace(sz); | ||||
|  | ||||
|     if (pt == NULL) { | ||||
|       WRITE_UNLOCK(ae->ARWLock); | ||||
|       return; | ||||
|     } | ||||
|     if (IsApplTerm(t0)) { | ||||
|       Yap_FreeCodeSpace((char *) RepAppl(t0)); | ||||
|     } | ||||
|     memcpy((void *)pt, (void *)ap, sz); | ||||
|     p->ValueOfVE = AbsAppl(pt); | ||||
|   } else { | ||||
|     if (IsApplTerm(t0)) { | ||||
|       /* recover space */ | ||||
| @@ -1201,209 +1254,6 @@ Yap_PutAtomTranslation(Atom a, Int i) | ||||
|   WRITE_UNLOCK(ae->ARWLock); | ||||
| } | ||||
|  | ||||
| Term | ||||
| Yap_StringToList(char *s) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   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); | ||||
| } | ||||
|  | ||||
| Term | ||||
| Yap_NStringToList(char *s, size_t len) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   Term t; | ||||
|   unsigned char *cp = (unsigned char *)s + len; | ||||
|  | ||||
|   t = MkAtomTerm(AtomNil); | ||||
|   while (cp > (unsigned char *)s) { | ||||
|     t = MkPairTerm(MkIntegerTerm(*--cp), t); | ||||
|   } | ||||
|   return t; | ||||
| } | ||||
|  | ||||
|  | ||||
| Term | ||||
| Yap_WideStringToList(wchar_t *s) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   Term t; | ||||
|   wchar_t *cp = s + wcslen(s); | ||||
|  | ||||
|   t = MkAtomTerm(AtomNil); | ||||
|   while (cp > s) { | ||||
|     if (ASP < H+1024) | ||||
|       return (CELL)0;     | ||||
|     t = MkPairTerm(MkIntegerTerm(*--cp), t); | ||||
|   } | ||||
|   return t; | ||||
| } | ||||
|  | ||||
| Term | ||||
| Yap_NWideStringToList(wchar_t *s, size_t len) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   Term t; | ||||
|   wchar_t *cp = s + len; | ||||
|  | ||||
|   t = MkAtomTerm(AtomNil); | ||||
|   while (cp > s) { | ||||
|     if (ASP < H+1024) | ||||
|       return (CELL)0;     | ||||
|     t = MkPairTerm(MkIntegerTerm(*--cp), t); | ||||
|   } | ||||
|   return t; | ||||
| } | ||||
|  | ||||
| Term | ||||
| Yap_StringToDiffList(char *s, Term t USES_REGS) | ||||
| { | ||||
|   register unsigned char *cp = (unsigned char *)s + strlen(s); | ||||
|  | ||||
|  t = Yap_Globalise(t); | ||||
|   while (cp > (unsigned char *)s) { | ||||
|     if (ASP < H+1024) | ||||
|       return (CELL)0; | ||||
|     t = MkPairTerm(MkIntTerm(*--cp), t); | ||||
|   } | ||||
|   return t; | ||||
| } | ||||
|  | ||||
| Term | ||||
| Yap_NStringToDiffList(char *s, Term t, size_t len) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   register unsigned char *cp = (unsigned char *)s + len; | ||||
|  | ||||
|   t = Yap_Globalise(t); | ||||
|   while (cp > (unsigned char *)s) { | ||||
|     t = MkPairTerm(MkIntTerm(*--cp), t); | ||||
|   } | ||||
|   return t; | ||||
| } | ||||
|  | ||||
| Term | ||||
| Yap_WideStringToDiffList(wchar_t *s, Term t) | ||||
| { | ||||
|   CACHE_REGS | ||||
|  wchar_t *cp = s + wcslen(s); | ||||
|  | ||||
|   t = Yap_Globalise(t); | ||||
|   while (cp > s) { | ||||
|     t = MkPairTerm(MkIntegerTerm(*--cp), t); | ||||
|   } | ||||
|   return t; | ||||
| } | ||||
|  | ||||
| Term | ||||
| Yap_NWideStringToDiffList(wchar_t *s, Term t, size_t len) | ||||
| { | ||||
|   CACHE_REGS | ||||
|  wchar_t *cp = s + len; | ||||
|  | ||||
|  t = Yap_Globalise(t); | ||||
|   while (cp > s) { | ||||
|     t = MkPairTerm(MkIntegerTerm(*--cp), t); | ||||
|   } | ||||
|   return t; | ||||
| } | ||||
|  | ||||
| Term | ||||
| Yap_StringToListOfAtoms(char *s) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   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); | ||||
|   } | ||||
|   return t; | ||||
| } | ||||
|  | ||||
| Term | ||||
| Yap_NStringToListOfAtoms(char *s, size_t len) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   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) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   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; | ||||
|     if (ASP < H+1024) | ||||
|       return (CELL)0;     | ||||
|     t = MkPairTerm(MkAtomTerm(LookupWideAtom(so)), t); | ||||
|   } | ||||
|   return t; | ||||
| } | ||||
|  | ||||
| Term | ||||
| Yap_NWideStringToListOfAtoms(wchar_t *s, size_t len) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   register Term t; | ||||
|   wchar_t so[2]; | ||||
|   wchar_t *cp = s + len; | ||||
|  | ||||
|   so[1] = '\0'; | ||||
|   t = MkAtomTerm(AtomNil); | ||||
|   while (cp > s) { | ||||
|     if (ASP < H+1024) | ||||
|       return (CELL)0;     | ||||
|     so[0] = *--cp; | ||||
|     t = MkPairTerm(MkAtomTerm(LookupWideAtom(so)), t); | ||||
|   } | ||||
|   return t; | ||||
| } | ||||
|  | ||||
| Term | ||||
| Yap_NWideStringToDiffListOfAtoms(wchar_t *s, Term t0, size_t len) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   register Term t; | ||||
|   wchar_t so[2]; | ||||
|   wchar_t *cp = s + len; | ||||
|  | ||||
|   so[1] = '\0'; | ||||
|   t = Yap_Globalise(t0); | ||||
|   while (cp > s) { | ||||
|     so[0] = *--cp; | ||||
|     t = MkPairTerm(MkAtomTerm(LookupWideAtom(so)), t); | ||||
|   } | ||||
|   return t; | ||||
| } | ||||
|  | ||||
| Term | ||||
| Yap_ArrayToList(register Term *tp, int nof) | ||||
| { | ||||
|   | ||||
							
								
								
									
										8
									
								
								C/agc.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								C/agc.c
									
									
									
									
									
								
							| @@ -220,7 +220,7 @@ static void init_reg_copies(USES_REGS1) | ||||
|   LOCAL_OldLCL0 = LCL0; | ||||
|   LOCAL_OldTR = TR; | ||||
|   LOCAL_OldGlobalBase = (CELL *)LOCAL_GlobalBase; | ||||
|   LOCAL_OldH = H; | ||||
|   LOCAL_OldH = HR; | ||||
|   LOCAL_OldH0 = H0; | ||||
|   LOCAL_OldTrailBase = LOCAL_TrailBase; | ||||
|   LOCAL_OldTrailTop = LOCAL_TrailTop; | ||||
| @@ -319,11 +319,13 @@ mark_global_cell(CELL *pt) | ||||
|     /* skip bitmaps */ | ||||
|     switch(reg) { | ||||
|     case (CELL)FunctorDouble: | ||||
| #if SIZEOF_DOUBLE == 2*SIZEOF_LONG_INT | ||||
| #if SIZEOF_DOUBLE == 2*SIZEOF_INT_P | ||||
|       return pt + 4; | ||||
| #else | ||||
|       return pt + 3; | ||||
| #endif | ||||
|     case (CELL)FunctorString: | ||||
|       return pt + 3 + pt[1]; | ||||
|     case (CELL)FunctorBigInt: | ||||
|       { | ||||
| 	Int sz = 3 + | ||||
| @@ -376,7 +378,7 @@ mark_global(USES_REGS1) | ||||
|    * the code  | ||||
|    */ | ||||
|   pt = H0; | ||||
|   while (pt < H) { | ||||
|   while (pt < HR) { | ||||
|     pt = mark_global_cell(pt); | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										82
									
								
								C/amasm.c
									
									
									
									
									
								
							
							
						
						
									
										82
									
								
								C/amasm.c
									
									
									
									
									
								
							| @@ -283,8 +283,6 @@ static void a_fetch_cv(cmp_op_info *, int, struct intermediates *); | ||||
| static void a_fetch_vc(cmp_op_info *, int, struct intermediates *); | ||||
| static yamop *a_f2(cmp_op_info *, yamop *, int, struct intermediates *); | ||||
|  | ||||
| #define CELLSIZE sizeof(CELL) | ||||
|  | ||||
| #define GONEXT(TYPE)      code_p = ((yamop *)(&(code_p->u.TYPE.next))) | ||||
|  | ||||
| inline static yslot | ||||
| @@ -1144,6 +1142,21 @@ a_ublob(CELL rnd1, op_numbers opcode, op_numbers opcode_w, int *clause_has_blobs | ||||
|   return code_p; | ||||
| } | ||||
|  | ||||
| // strings are blobs | ||||
| inline static yamop * | ||||
| a_ustring(CELL rnd1, op_numbers opcode, op_numbers opcode_w, int *clause_has_blobsp, yamop *code_p, int pass_no, struct intermediates *cip) | ||||
| { | ||||
|   if (pass_no) { | ||||
|     code_p->opc = emit_op(opcode); | ||||
|     code_p->u.ou.opcw = emit_op(opcode_w); | ||||
|     code_p->u.ou.u =  | ||||
|       AbsAppl((CELL *)(Unsigned(cip->code_addr) + cip->label_offset[rnd1]));       | ||||
|   } | ||||
|   *clause_has_blobsp = TRUE; | ||||
|   GONEXT(ou); | ||||
|   return code_p; | ||||
| } | ||||
|  | ||||
| inline static yamop * | ||||
| a_udbt(CELL rnd1, op_numbers opcode, op_numbers opcode_w, int *clause_has_dbtermp, yamop *code_p, int pass_no, struct intermediates *cip) | ||||
| { | ||||
| @@ -1384,6 +1397,19 @@ a_rb(op_numbers opcode, int *clause_has_blobsp, yamop *code_p, int pass_no, stru | ||||
|   return code_p; | ||||
| } | ||||
|  | ||||
| inline static yamop * | ||||
| a_rstring(op_numbers opcode, int *clause_has_blobsp, yamop *code_p, int pass_no, struct intermediates *cip) | ||||
| { | ||||
|   if (pass_no) { | ||||
|     code_p->opc = emit_op(opcode); | ||||
|     code_p->u.xu.x = emit_x(cip->cpc->rnd2); | ||||
|     code_p->u.xu.u = AbsAppl((CELL *)(Unsigned(cip->code_addr) + cip->label_offset[cip->cpc->rnd1])); | ||||
|   } | ||||
|   *clause_has_blobsp = TRUE; | ||||
|   GONEXT(xu); | ||||
|   return code_p; | ||||
| } | ||||
|  | ||||
| inline static yamop * | ||||
| a_dbt(op_numbers opcode, int *clause_has_dbtermp, yamop *code_p, int pass_no, struct intermediates *cip) | ||||
| { | ||||
| @@ -2421,6 +2447,16 @@ copy_blob(yamop *code_p, int pass_no, struct PSEUDO *cpc) | ||||
|   return code_p; | ||||
| } | ||||
|  | ||||
| static yamop * | ||||
| copy_string(yamop *code_p, int pass_no, struct PSEUDO *cpc) | ||||
| { | ||||
|   /* copy the blob to code space, making no effort to align if a double */ | ||||
|   int max = cpc->rnd1, i; | ||||
|   for (i = 0; i < max; i++) | ||||
|     code_p = fill_a(cpc->arnds[i], code_p, pass_no); | ||||
|   return code_p; | ||||
| } | ||||
|  | ||||
|  | ||||
| static void | ||||
| a_fetch_vv(cmp_op_info *cmp_info, int pass_no, struct intermediates *cip) | ||||
| @@ -3240,6 +3276,9 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp | ||||
|     case get_bigint_op: | ||||
|       code_p = a_rb(_get_bigint, clause_has_blobsp, code_p, pass_no, cip); | ||||
|       break; | ||||
|     case get_string_op: | ||||
|       code_p = a_rstring(_get_string, clause_has_blobsp, code_p, pass_no, cip); | ||||
|       break; | ||||
|     case get_dbterm_op: | ||||
|       code_p = a_dbt(_get_dbterm, clause_has_dbtermp, code_p, pass_no, cip); | ||||
|       break; | ||||
| @@ -3258,6 +3297,9 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp | ||||
|     case put_bigint_op: | ||||
|       code_p = a_rb(_put_bigint, clause_has_blobsp, code_p, pass_no, cip); | ||||
|       break; | ||||
|     case put_string_op: | ||||
|       code_p = a_rstring(_put_bigint, clause_has_blobsp, code_p, pass_no, cip); | ||||
|       break; | ||||
|     case put_dbterm_op: | ||||
|       code_p = a_dbt(_put_dbterm, clause_has_dbtermp, code_p, pass_no, cip); | ||||
|       break; | ||||
| @@ -3318,6 +3360,9 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp | ||||
|     case unify_bigint_op: | ||||
|       code_p = a_ublob(cip->cpc->rnd1, _unify_bigint, _unify_atom_write, clause_has_blobsp, code_p, pass_no, cip); | ||||
|       break; | ||||
|     case unify_string_op: | ||||
|       code_p = a_ustring(cip->cpc->rnd1, _unify_string, _unify_atom_write, clause_has_blobsp, code_p, pass_no, cip); | ||||
|       break; | ||||
|     case unify_dbterm_op: | ||||
|       code_p = a_udbt(cip->cpc->rnd1, _unify_dbterm, _unify_atom_write, clause_has_dbtermp, code_p, pass_no, cip); | ||||
|       break; | ||||
| @@ -3336,6 +3381,9 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp | ||||
|     case unify_last_bigint_op: | ||||
|       code_p = a_ublob(cip->cpc->rnd1, _unify_l_bigint, _unify_l_atom_write, clause_has_blobsp, code_p, pass_no, cip); | ||||
|       break; | ||||
|     case unify_last_string_op: | ||||
|       code_p = a_ustring(cip->cpc->rnd1, _unify_l_bigint, _unify_l_atom_write, clause_has_blobsp, code_p, pass_no, cip); | ||||
|       break; | ||||
|     case unify_last_dbterm_op: | ||||
|       code_p = a_udbt(cip->cpc->rnd1, _unify_l_dbterm, _unify_l_atom_write, clause_has_dbtermp, code_p, pass_no, cip); | ||||
|       break; | ||||
| @@ -3354,6 +3402,9 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp | ||||
|     case write_bigint_op: | ||||
|       code_p = a_wblob(cip->cpc->rnd1, _write_bigint, clause_has_blobsp, code_p, pass_no, cip); | ||||
|       break; | ||||
|     case write_string_op: | ||||
|       code_p = a_wblob(cip->cpc->rnd1, _write_bigint, clause_has_blobsp, code_p, pass_no, cip); | ||||
|       break; | ||||
|     case write_dbterm_op: | ||||
|       code_p = a_wdbt(cip->cpc->rnd1, _write_dbterm, clause_has_dbtermp, code_p, pass_no, cip); | ||||
|       break; | ||||
| @@ -3540,14 +3591,15 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp | ||||
| 	  cip->cpc->nextInst != NULL && | ||||
| 	  (cip->cpc->nextInst->op == mark_initialised_pvars_op || | ||||
| 	   cip->cpc->nextInst->op == mark_live_regs_op || | ||||
| 	   cip->cpc->nextInst->op == blob_op)) { | ||||
| 	   cip->cpc->nextInst->op == blob_op || | ||||
| 	   cip->cpc->nextInst->op == string_op)) { | ||||
| 	ystop_found = TRUE; | ||||
| 	code_p = a_il((CELL)*entry_codep, _Ystop, code_p, pass_no, cip); | ||||
|       } | ||||
|       if (!pass_no) { | ||||
| #if !USE_SYSTEM_MALLOC | ||||
| 	if (CellPtr(cip->label_offset+cip->cpc->rnd1) > ASP-256) { | ||||
| 	  LOCAL_Error_Size = 256+((char *)(cip->label_offset+cip->cpc->rnd1) - (char *)H); | ||||
| 	  LOCAL_Error_Size = 256+((char *)(cip->label_offset+cip->cpc->rnd1) - (char *)HR); | ||||
| 	  save_machine_regs(); | ||||
| 	  siglongjmp(cip->CompilerBotch, 3);	   | ||||
| 	} | ||||
| @@ -3737,7 +3789,7 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp | ||||
|       break; | ||||
|     case align_float_op: | ||||
|       /* install a blob */ | ||||
| #if SIZEOF_DOUBLE == 2*SIZEOF_LONG_INT | ||||
| #if SIZEOF_DOUBLE == 2*SIZEOF_INT_P | ||||
|       if (!((CELL)code_p & 0x4)) | ||||
| 	GONEXT(e); | ||||
| #endif | ||||
| @@ -3746,6 +3798,10 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp | ||||
|       /* install a blob */ | ||||
|       code_p = copy_blob(code_p, pass_no, cip->cpc); | ||||
|       break; | ||||
|     case string_op: | ||||
|       /* install a blob */ | ||||
|       code_p = copy_string(code_p, pass_no, cip->cpc); | ||||
|       break; | ||||
|     case empty_call_op: | ||||
|       /* create an empty call */ | ||||
|       code_p = a_empty_call(&clinfo, code_p, pass_no, cip); | ||||
| @@ -3784,18 +3840,18 @@ do_pass(int pass_no, yamop **entry_codep, int assembling, int *clause_has_blobsp | ||||
| static DBTerm * | ||||
| fetch_clause_space(Term* tp, UInt size, struct intermediates *cip, UInt *osizep USES_REGS) | ||||
| { | ||||
|   CELL *h0 = H; | ||||
|   CELL *h0 = HR; | ||||
|   DBTerm *x; | ||||
|  | ||||
|   /* This stuff should be just about fetching the space from the data-base, | ||||
|      unfortunately we have to do all sorts of error handling :-( */ | ||||
|   H = (CELL *)cip->freep; | ||||
|   HR = (CELL *)cip->freep; | ||||
|   while ((x = Yap_StoreTermInDBPlusExtraSpace(*tp, size, osizep)) == NULL) { | ||||
|  | ||||
|     H = h0; | ||||
|     HR = h0; | ||||
|     switch (LOCAL_Error_TYPE) { | ||||
|     case OUT_OF_STACK_ERROR: | ||||
|       LOCAL_Error_Size = 256+((char *)cip->freep - (char *)H); | ||||
|       LOCAL_Error_Size = 256+((char *)cip->freep - (char *)HR); | ||||
|       save_machine_regs(); | ||||
|       siglongjmp(cip->CompilerBotch,3); | ||||
|     case OUT_OF_TRAIL_ERROR: | ||||
| @@ -3827,10 +3883,10 @@ fetch_clause_space(Term* tp, UInt size, struct intermediates *cip, UInt *osizep | ||||
|     default: | ||||
|       return NULL; | ||||
|     } | ||||
|     h0 = H; | ||||
|     H = (CELL *)cip->freep; | ||||
|     h0 = HR; | ||||
|     HR = (CELL *)cip->freep; | ||||
|   } | ||||
|   H = h0; | ||||
|   HR = h0; | ||||
|   return x; | ||||
| } | ||||
|  | ||||
| @@ -3915,6 +3971,7 @@ Yap_assemble(int mode, Term t, PredEntry *ap, int is_fact, struct intermediates | ||||
|     } | ||||
|     cl = (LogUpdClause *)((CODEADDR)x-(UInt)size); | ||||
|     cl->lusl.ClSource = x; | ||||
|     cl->ClFlags |= SrcMask; | ||||
|     x->ag.line_number = Yap_source_line_no(); | ||||
|     cl->ClSize = osize; | ||||
|     cip->code_addr = (yamop *)cl; | ||||
| @@ -3933,6 +3990,7 @@ Yap_assemble(int mode, Term t, PredEntry *ap, int is_fact, struct intermediates | ||||
|     code_p = do_pass(1, &entry_code, mode, &clause_has_blobs, &clause_has_dbterm, cip, size PASS_REGS); | ||||
|     /* make sure we copy after second pass */ | ||||
|     cl->usc.ClSource = x; | ||||
|     cl->ClFlags |= SrcMask; | ||||
|     x->ag.line_number = Yap_source_line_no(); | ||||
|     cl->ClSize = osize; | ||||
|     LOCAL_ProfEnd=code_p; | ||||
|   | ||||
| @@ -138,12 +138,12 @@ eval0(Int fi) { | ||||
|     RINT(((CELL *)TR)-LCL0); | ||||
| #endif | ||||
|   case op_stackfree: | ||||
|     RINT(Unsigned(ASP) - Unsigned(H)); | ||||
|     RINT(Unsigned(ASP) - Unsigned(HR)); | ||||
|   case op_globalsp: | ||||
| #if YAPOR_SBA | ||||
|     RINT((Int)H); | ||||
|     RINT((Int)HR); | ||||
| #else | ||||
|     RINT(H - H0); | ||||
|     RINT(HR - H0); | ||||
| #endif | ||||
|   } | ||||
|   RERROR(); | ||||
|   | ||||
| @@ -152,7 +152,7 @@ lsb(Int inp USES_REGS)	/* calculate the least significant bit for an integer */ | ||||
|   } | ||||
|   if (inp==0) | ||||
|     return 0L; | ||||
| #if SIZEOF_LONG_INT == 8 | ||||
| #if SIZEOF_INT_P == 8 | ||||
|   if (!(inp & 0xffffffffLL)) {inp >>= 32; out += 32;} | ||||
| #endif | ||||
|   if (!(inp &     0xffffL)) {inp >>= 16; out += 16;} | ||||
| @@ -373,10 +373,10 @@ eval1(Int fi, Term t USES_REGS) { | ||||
|     } | ||||
|   case op_lgamma: | ||||
|     { | ||||
| #if HAVE_LGAMMA | ||||
|       Float dbl; | ||||
|  | ||||
|       dbl = get_float(t); | ||||
| #if HAVE_LGAMMA | ||||
|       RFLOAT(lgamma(dbl)); | ||||
| #else | ||||
|       RERROR(); | ||||
| @@ -384,8 +384,8 @@ eval1(Int fi, Term t USES_REGS) { | ||||
|     } | ||||
|  case op_erf: | ||||
|    { | ||||
|      Float dbl = get_float(t), out; | ||||
| #if HAVE_ERF | ||||
|      Float dbl = get_float(t), out; | ||||
|      out = erf(dbl); | ||||
|      RFLOAT(out); | ||||
| #else | ||||
| @@ -394,8 +394,8 @@ eval1(Int fi, Term t USES_REGS) { | ||||
|    } | ||||
|  case op_erfc: | ||||
|    { | ||||
|      Float dbl = get_float(t), out; | ||||
| #if HAVE_ERF | ||||
|      Float dbl = get_float(t), out; | ||||
|      out = erfc(dbl); | ||||
|      RFLOAT(out); | ||||
| #else | ||||
|   | ||||
							
								
								
									
										201
									
								
								C/arrays.c
									
									
									
									
									
								
							
							
						
						
									
										201
									
								
								C/arrays.c
									
									
									
									
									
								
							| @@ -330,7 +330,7 @@ AccessNamedArray(Atom a, Int indx USES_REGS) | ||||
|       StaticArrayEntry *ptr = (StaticArrayEntry *)pp; | ||||
|  | ||||
|       READ_LOCK(ptr->ArRWLock); | ||||
|       if (-(pp->ArrayEArity) <= indx || indx < 0) { | ||||
|       if (pp->ArrayEArity <= indx || indx < 0) { | ||||
| 	/*	Yap_Error(DOMAIN_ERROR_ARRAY_OVERFLOW, MkIntegerTerm(indx), "access_array");*/ | ||||
| 	READ_UNLOCK(ptr->ArRWLock); | ||||
| 	P = (yamop *)FAILCODE; | ||||
| @@ -545,14 +545,14 @@ InitNamedArray(ArrayEntry * p, Int dim USES_REGS) | ||||
|   /* Leave a pointer so that we can reclaim array space when | ||||
|    * we backtrack or when we abort */ | ||||
|   /* place terms in reverse order */ | ||||
|   Bind_Global(&(p->ValueOfVE),AbsAppl(H)); | ||||
|   tp = H; | ||||
|   Bind_Global(&(p->ValueOfVE),AbsAppl(HR)); | ||||
|   tp = HR; | ||||
|   tp[0] =  (CELL)Yap_MkFunctor(AtomArray, dim); | ||||
|   tp++; | ||||
|   p->ArrayEArity = dim; | ||||
|   /* Initialise the array as a set of variables */ | ||||
|   H = tp+dim; | ||||
|   for (; tp < H; tp++) { | ||||
|   HR = tp+dim; | ||||
|   for (; tp < HR; tp++) { | ||||
|     RESET_VARIABLE(tp); | ||||
|   } | ||||
|   WRITE_UNLOCK(p->ArRWLock); | ||||
| @@ -566,6 +566,7 @@ CreateNamedArray(PropEntry * pp, Int dim, AtomEntry *ae USES_REGS) | ||||
|  | ||||
|   p = (ArrayEntry *) Yap_AllocAtomSpace(sizeof(*p)); | ||||
|   p->KindOfPE = ArrayProperty; | ||||
|   p->TypeOfAE = DYNAMIC_ARRAY; | ||||
|   AddPropToAtom(ae, (PropEntry *)p); | ||||
|   INIT_RWLOCK(p->ArRWLock); | ||||
| #if THREADS | ||||
| @@ -578,9 +579,9 @@ CreateNamedArray(PropEntry * pp, Int dim, AtomEntry *ae USES_REGS) | ||||
| } | ||||
|  | ||||
| static void | ||||
| AllocateStaticArraySpace(StaticArrayEntry *p, static_array_types atype, Int array_size USES_REGS) | ||||
| AllocateStaticArraySpace(StaticArrayEntry *p, static_array_types atype, void *old, size_t array_size USES_REGS) | ||||
| { | ||||
|   Int asize = 0; | ||||
|   size_t asize = 0; | ||||
|   switch (atype) { | ||||
|   case array_of_doubles: | ||||
|     asize = array_size*sizeof(Float); | ||||
| @@ -606,22 +607,33 @@ AllocateStaticArraySpace(StaticArrayEntry *p, static_array_types atype, Int arra | ||||
|     asize = array_size*sizeof(DBRef); | ||||
|     break; | ||||
|   } | ||||
|   while ((p->ValueOfVE.floats = (Float *) Yap_AllocAtomSpace(asize) ) == NULL) { | ||||
|     YAPLeaveCriticalSection(); | ||||
|     if (!Yap_growheap(FALSE, asize, NULL)) { | ||||
|       Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | ||||
|       return; | ||||
|   if (old == NULL) { | ||||
|     while ((p->ValueOfVE.floats = (Float *) Yap_AllocCodeSpace(asize) ) == NULL) { | ||||
|       YAPLeaveCriticalSection(); | ||||
|       if (!Yap_growheap(FALSE, asize, NULL)) { | ||||
| 	Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | ||||
| 	return; | ||||
|       } | ||||
|       YAPEnterCriticalSection(); | ||||
|     } | ||||
|   } else { | ||||
|     while ((p->ValueOfVE.floats = (Float *) Yap_ReallocCodeSpace(old, asize) ) == NULL) { | ||||
|       YAPLeaveCriticalSection(); | ||||
|       if (!Yap_growheap(FALSE, asize, NULL)) { | ||||
| 	Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | ||||
| 	return; | ||||
|       } | ||||
|       YAPEnterCriticalSection(); | ||||
|     } | ||||
|     YAPEnterCriticalSection(); | ||||
|   } | ||||
| } | ||||
|  | ||||
| /* ae and p are assumed to be locked, if they exist */ | ||||
| static StaticArrayEntry * | ||||
| CreateStaticArray(AtomEntry *ae, Int dim, static_array_types type, CODEADDR start_addr, StaticArrayEntry *p USES_REGS) | ||||
| CreateStaticArray(AtomEntry *ae, size_t dim, static_array_types type, CODEADDR start_addr, StaticArrayEntry *p USES_REGS) | ||||
| { | ||||
|   if (EndOfPAEntr(p)) { | ||||
|     while ((p = (StaticArrayEntry *) Yap_AllocAtomSpace(sizeof(*p))) == NULL) { | ||||
|     while ((p = (StaticArrayEntry *) Yap_AllocCodeSpace(sizeof(*p))) == NULL) { | ||||
|       if (!Yap_growheap(FALSE, sizeof(*p), NULL)) { | ||||
| 	Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | ||||
| 	return NULL; | ||||
| @@ -634,12 +646,13 @@ CreateStaticArray(AtomEntry *ae, Int dim, static_array_types type, CODEADDR star | ||||
|     LOCAL_StaticArrays = p; | ||||
|   } | ||||
|   WRITE_LOCK(p->ArRWLock); | ||||
|   p->ArrayEArity = -dim; | ||||
|   p->ArrayEArity = dim; | ||||
|   p->ArrayType = type; | ||||
|   p->TypeOfAE = STATIC_ARRAY; | ||||
|   if (start_addr == NULL) { | ||||
|     Int i; | ||||
|  | ||||
|     AllocateStaticArraySpace(p, type, dim PASS_REGS); | ||||
|     AllocateStaticArraySpace(p, type, NULL, dim PASS_REGS); | ||||
|     if (p->ValueOfVE.ints == NULL) { | ||||
|       WRITE_UNLOCK(p->ArRWLock); | ||||
|       return p; | ||||
| @@ -683,6 +696,7 @@ CreateStaticArray(AtomEntry *ae, Int dim, static_array_types type, CODEADDR star | ||||
|     } | ||||
|   } else { | ||||
|     /* external array */ | ||||
|     p->TypeOfAE |= MMAP_ARRAY; | ||||
|     p->ValueOfVE.chars = (char *)start_addr; | ||||
|   } | ||||
|   WRITE_UNLOCK(p->ArRWLock); | ||||
| @@ -690,86 +704,64 @@ CreateStaticArray(AtomEntry *ae, Int dim, static_array_types type, CODEADDR star | ||||
| } | ||||
|  | ||||
| static void | ||||
| ResizeStaticArray(StaticArrayEntry *pp, Int dim USES_REGS) | ||||
| ResizeStaticArray(StaticArrayEntry *pp, size_t dim USES_REGS) | ||||
| { | ||||
|   statarray_elements old_v = pp->ValueOfVE; | ||||
|   static_array_types type = pp->ArrayType; | ||||
|   Int old_dim = - pp->ArrayEArity; | ||||
|   Int mindim = (dim < old_dim ? dim : old_dim), i; | ||||
|   size_t old_dim = pp->ArrayEArity; | ||||
|   size_t mindim = (dim < old_dim ? dim : old_dim), i; | ||||
|  | ||||
|   /* change official size */ | ||||
|   if (pp->ArrayEArity >= 0){ | ||||
|   if (pp->ArrayEArity == 0){ | ||||
|     return; | ||||
|   } | ||||
|   WRITE_LOCK(pp->ArRWLock); | ||||
|   pp->ArrayEArity = -dim; | ||||
|   pp->ArrayEArity = dim; | ||||
| #if HAVE_MMAP | ||||
|   if (pp->ValueOfVE.chars < (char *)Yap_HeapBase ||  | ||||
|       pp->ValueOfVE.chars > (char *)HeapTop) { | ||||
|   if (pp->TypeOfAE & MMAP_ARRAY) { | ||||
|     ResizeMmappedArray(pp, dim, (void *)(pp->ValueOfVE.chars) PASS_REGS); | ||||
|     WRITE_UNLOCK(pp->ArRWLock); | ||||
|     return; | ||||
|   } | ||||
| #endif | ||||
|   AllocateStaticArraySpace(pp, type, dim PASS_REGS); | ||||
|   AllocateStaticArraySpace(pp, type, old_v.chars, dim PASS_REGS); | ||||
|   switch(type) { | ||||
|   case array_of_ints: | ||||
|     for (i = 0; i <mindim; i++) | ||||
|       pp->ValueOfVE.ints[i] = old_v.ints[i]; | ||||
|     for (i = mindim; i<dim; i++) | ||||
|       pp->ValueOfVE.ints[i] = 0; | ||||
|     break; | ||||
|   case array_of_chars: | ||||
|     for (i = 0; i <mindim; i++) | ||||
|       pp->ValueOfVE.chars[i] = old_v.chars[i]; | ||||
|     for (i = mindim; i<dim; i++) | ||||
|       pp->ValueOfVE.chars[i] = '\0'; | ||||
|     break; | ||||
|   case array_of_uchars: | ||||
|     for (i = 0; i <mindim; i++) | ||||
|       pp->ValueOfVE.uchars[i] = old_v.uchars[i]; | ||||
|     for (i = mindim; i<dim; i++) | ||||
|       pp->ValueOfVE.uchars[i] = '\0'; | ||||
|     break; | ||||
|   case array_of_doubles: | ||||
|     for (i = 0; i <mindim; i++) | ||||
|       pp->ValueOfVE.floats[i] = old_v.floats[i]; | ||||
|     for (i = mindim; i<dim; i++) | ||||
|       pp->ValueOfVE.floats[i] = 0.0; | ||||
|     break; | ||||
|   case array_of_ptrs: | ||||
|     for (i = 0; i <mindim; i++) | ||||
|       pp->ValueOfVE.ptrs[i] = old_v.ptrs[i]; | ||||
|     for (i = mindim; i<dim; i++) | ||||
|       pp->ValueOfVE.ptrs[i] = NULL; | ||||
|     break; | ||||
|   case array_of_atoms: | ||||
|     for (i = 0; i <mindim; i++) | ||||
|       pp->ValueOfVE.atoms[i] = old_v.atoms[i]; | ||||
|     for (i = mindim; i<dim; i++) | ||||
|       pp->ValueOfVE.atoms[i] = TermNil; | ||||
|     break; | ||||
|   case array_of_dbrefs: | ||||
|     for (i = 0; i <mindim; i++) | ||||
|       pp->ValueOfVE.dbrefs[i] = old_v.dbrefs[i]; | ||||
|     for (i = mindim; i<dim; i++) | ||||
|       pp->ValueOfVE.dbrefs[i] = 0L; | ||||
|     break; | ||||
|   case array_of_terms: | ||||
|     for (i = 0; i <mindim; i++) | ||||
|       pp->ValueOfVE.terms[i] = old_v.terms[i]; | ||||
|     for (i = mindim; i<dim; i++) | ||||
|       pp->ValueOfVE.terms[i] = NULL; | ||||
|     break; | ||||
|   case array_of_nb_terms: | ||||
|     for (i = 0; i <mindim; i++) { | ||||
|       Term tlive = pp->ValueOfVE.lterms[i].tlive; | ||||
|       if (IsVarTerm(tlive) && IsUnboundVar(&(pp->ValueOfVE.lterms[i].tlive))) { | ||||
| 	RESET_VARIABLE(&(pp->ValueOfVE.lterms[i].tlive)); | ||||
|       } else { | ||||
| 	pp->ValueOfVE.lterms[i].tlive = tlive; | ||||
|       } | ||||
|       pp->ValueOfVE.lterms[i].tstore = old_v.lterms[i].tstore; | ||||
|     for (i = mindim; i <dim; i++) { | ||||
|       RESET_VARIABLE(&(pp->ValueOfVE.lterms[i].tlive)); | ||||
|       pp->ValueOfVE.lterms[i].tstore = TermNil; | ||||
|     } | ||||
|     break; | ||||
|   } | ||||
| @@ -781,10 +773,10 @@ ClearStaticArray(StaticArrayEntry *pp) | ||||
| { | ||||
|   statarray_elements old_v = pp->ValueOfVE; | ||||
|   static_array_types type = pp->ArrayType; | ||||
|   Int dim = - pp->ArrayEArity, i; | ||||
|   Int dim = pp->ArrayEArity, i; | ||||
|  | ||||
|   /* change official size */ | ||||
|   if (pp->ArrayEArity >= 0){ | ||||
|   if (pp->ArrayEArity == 0){ | ||||
|     return; | ||||
|   } | ||||
|   WRITE_LOCK(pp->ArRWLock); | ||||
| @@ -895,13 +887,13 @@ p_create_array( USES_REGS1 ) | ||||
|     Functor farray; | ||||
|  | ||||
|     farray = Yap_MkFunctor(AtomArray, size); | ||||
|     if (H+1+size > ASP-1024) { | ||||
|     if (HR+1+size > ASP-1024) { | ||||
|       if (!Yap_gcl((1+size)*sizeof(CELL), 2, ENV, gc_P(P,CP))) { | ||||
| 	Yap_Error(OUT_OF_STACK_ERROR,TermNil,LOCAL_ErrorMessage); | ||||
| 	return(FALSE); | ||||
|       } else { | ||||
| 	if (H+1+size > ASP-1024) { | ||||
| 	  if (!Yap_growstack( sizeof(CELL) * (size+1-(H-ASP-1024)))) { | ||||
| 	if (HR+1+size > ASP-1024) { | ||||
| 	  if (!Yap_growstack( sizeof(CELL) * (size+1-(HR-ASP-1024)))) { | ||||
| 	    Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | ||||
| 	    return FALSE; | ||||
| 	  } | ||||
| @@ -909,11 +901,11 @@ p_create_array( USES_REGS1 ) | ||||
|       } | ||||
|       goto restart; | ||||
|     } | ||||
|     t = AbsAppl(H); | ||||
|     *H++ = (CELL) farray; | ||||
|     t = AbsAppl(HR); | ||||
|     *HR++ = (CELL) farray; | ||||
|     for (; size >= 0; size--) { | ||||
|       RESET_VARIABLE(H); | ||||
|       H++; | ||||
|       RESET_VARIABLE(HR); | ||||
|       HR++; | ||||
|     } | ||||
|     return (Yap_unify(t, ARG1)); | ||||
|   } | ||||
| @@ -932,7 +924,7 @@ p_create_array( USES_REGS1 ) | ||||
| 	   ) | ||||
|       pp = RepProp(pp->NextOfPE); | ||||
|     if (EndOfPAEntr(pp)) { | ||||
|       if (H+1+size > ASP-1024) { | ||||
|       if (HR+1+size > ASP-1024) { | ||||
| 	WRITE_UNLOCK(ae->ARWLock); | ||||
| 	if (!Yap_gcl((1+size)*sizeof(CELL), 2, ENV, gc_P(P,CP))) { | ||||
| 	  Yap_Error(OUT_OF_STACK_ERROR,TermNil,LOCAL_ErrorMessage); | ||||
| @@ -949,13 +941,12 @@ p_create_array( USES_REGS1 ) | ||||
|       WRITE_UNLOCK(ae->ARWLock); | ||||
|       if (!IsVarTerm(app->ValueOfVE) | ||||
| 	  || !IsUnboundVar(&app->ValueOfVE)) { | ||||
| 	if (size == app->ArrayEArity || | ||||
| 	    size == -app->ArrayEArity) | ||||
| 	if (size == app->ArrayEArity) | ||||
| 	  return TRUE; | ||||
| 	Yap_Error(PERMISSION_ERROR_CREATE_ARRAY,t,"create_array", | ||||
| 	      ae->StrOfAE); | ||||
|       } else { | ||||
| 	if (H+1+size > ASP-1024) { | ||||
| 	if (HR+1+size > ASP-1024) { | ||||
| 	  if (!Yap_gcl((1+size)*sizeof(CELL), 2, ENV, gc_P(P,CP))) { | ||||
| 	    Yap_Error(OUT_OF_STACK_ERROR,TermNil,LOCAL_ErrorMessage); | ||||
| 	    return(FALSE); | ||||
| @@ -1064,7 +1055,7 @@ p_create_static_array( USES_REGS1 ) | ||||
| 	return FALSE; | ||||
|       } | ||||
|     } else { | ||||
|       if (pp->ArrayEArity  == -size && | ||||
|       if (pp->ArrayEArity  == size && | ||||
| 	  pp->ArrayType == props) { | ||||
| 	WRITE_UNLOCK(ae->ARWLock); | ||||
| 	return TRUE; | ||||
| @@ -1101,7 +1092,7 @@ p_static_array_properties( USES_REGS1 ) | ||||
|       return (FALSE); | ||||
|     } else { | ||||
|       static_array_types tp = pp->ArrayType; | ||||
|       Int dim = -pp->ArrayEArity; | ||||
|       Int dim = pp->ArrayEArity; | ||||
|  | ||||
|       READ_UNLOCK(ae->ARWLock); | ||||
|       if (dim <= 0 || !Yap_unify(ARG2,MkIntegerTerm(dim))) | ||||
| @@ -1169,7 +1160,7 @@ p_resize_static_array( USES_REGS1 ) | ||||
|       Yap_Error(PERMISSION_ERROR_RESIZE_ARRAY,t,"resize a static array"); | ||||
|       return(FALSE); | ||||
|     } else { | ||||
|       Int osize =  - pp->ArrayEArity; | ||||
|       size_t osize =   pp->ArrayEArity; | ||||
|       ResizeStaticArray(pp, size PASS_REGS); | ||||
|       return(Yap_unify(ARG2,MkIntegerTerm(osize))); | ||||
|     } | ||||
| @@ -1237,14 +1228,14 @@ p_close_static_array( USES_REGS1 ) | ||||
|       StaticArrayEntry *ptr = (StaticArrayEntry *)pp; | ||||
|       if (ptr->ValueOfVE.ints != NULL) { | ||||
| #if HAVE_MMAP | ||||
| 	if (ptr->ValueOfVE.chars < (char *)Yap_HeapBase ||  | ||||
| 	    ptr->ValueOfVE.chars > (char *)HeapTop) { | ||||
| 	  Int val = CloseMmappedArray(ptr, (void *)ptr->ValueOfVE.chars PASS_REGS); | ||||
| 	Int val = CloseMmappedArray(ptr, (void *)ptr->ValueOfVE.chars PASS_REGS); | ||||
| #if USE_SYSTEM_MALLOC | ||||
| 	  if (val) | ||||
| 	if (val) { | ||||
| #endif | ||||
| 	    return(val); | ||||
| #if USE_SYSTEM_MALLOC | ||||
| 	} | ||||
| #endif | ||||
| #endif | ||||
| 	Yap_FreeAtomSpace((char *)(ptr->ValueOfVE.ints)); | ||||
| 	ptr->ValueOfVE.ints = NULL; | ||||
| @@ -1422,7 +1413,7 @@ loop: | ||||
|     } | ||||
|     else if (IsPairTerm(d0)) { | ||||
|       /* store the terms to visit */ | ||||
|       *ptn++ = AbsPair(H); | ||||
|       *ptn++ = AbsPair(HR); | ||||
| #ifdef RATIONAL_TREES | ||||
|       to_visit[0] = pt0; | ||||
|       to_visit[1] = pt0_end; | ||||
| @@ -1441,8 +1432,8 @@ loop: | ||||
|       pt0 = RepPair(d0) - 1; | ||||
|       pt0_end = RepPair(d0) + 1; | ||||
|       /* write the head and tail of the list */ | ||||
|       ptn = H; | ||||
|       H += 2; | ||||
|       ptn = HR; | ||||
|       HR += 2; | ||||
|     } | ||||
|     else if (IsApplTerm(d0)) { | ||||
|       register Functor f; | ||||
| @@ -1455,7 +1446,7 @@ loop: | ||||
| 	  continue; | ||||
| 	} | ||||
|       } | ||||
|       *ptn++ = AbsAppl(H); | ||||
|       *ptn++ = AbsAppl(HR); | ||||
|       /* store the terms to visit */ | ||||
| #ifdef RATIONAL_TREES | ||||
|       to_visit[0] = pt0; | ||||
| @@ -1476,9 +1467,9 @@ loop: | ||||
|       d0 = ArityOfFunctor(f); | ||||
|       pt0_end = pt0 + d0; | ||||
|       /* start writing the compound term */ | ||||
|       ptn = H; | ||||
|       ptn = HR; | ||||
|       *ptn++ = (CELL) f; | ||||
|       H += d0 + 1; | ||||
|       HR += d0 + 1; | ||||
|     } | ||||
|     else {			/* AtomOrInt */ | ||||
|       *ptn++ = d0; | ||||
| @@ -1527,19 +1518,19 @@ replace_array_references(Term t0 USES_REGS) | ||||
|     return (MkPairTerm(t, TermNil)); | ||||
|   } else if (IsPairTerm(t)) { | ||||
|     Term VList = MkVarTerm(); | ||||
|     CELL *h0 = H; | ||||
|     CELL *h0 = HR; | ||||
|  | ||||
|     H += 2; | ||||
|     HR += 2; | ||||
|     replace_array_references_complex(RepPair(t) - 1, RepPair(t) + 1, h0, | ||||
| 				     VList PASS_REGS); | ||||
|     return MkPairTerm(AbsPair(h0), VList); | ||||
|   } else { | ||||
|     Term VList = MkVarTerm(); | ||||
|     CELL *h0 = H; | ||||
|     CELL *h0 = HR; | ||||
|     Functor f = FunctorOfTerm(t); | ||||
|  | ||||
|     *H++ = (CELL) (f); | ||||
|     H += ArityOfFunctor(f); | ||||
|     *HR++ = (CELL) (f); | ||||
|     HR += ArityOfFunctor(f); | ||||
|     replace_array_references_complex(RepAppl(t), | ||||
| 				     RepAppl(t) + ArityOfFunctor(FunctorOfTerm(t)), h0 + 1, | ||||
| 				     VList PASS_REGS); | ||||
| @@ -1651,7 +1642,7 @@ p_assign_static( USES_REGS1 ) | ||||
|     WRITE_LOCK(ptr->ArRWLock); | ||||
|     READ_UNLOCK(ae->ARWLock); | ||||
|     /* a static array */ | ||||
|     if (indx < 0 || indx >= - ptr->ArrayEArity) { | ||||
|     if (indx < 0 || indx >= ptr->ArrayEArity) { | ||||
|       WRITE_UNLOCK(ptr->ArRWLock); | ||||
|       Yap_Error(DOMAIN_ERROR_ARRAY_OVERFLOW,t2,"assign_static"); | ||||
|       return FALSE; | ||||
| @@ -1980,7 +1971,7 @@ p_assign_dynamic( USES_REGS1 ) | ||||
|  | ||||
|   WRITE_LOCK(ptr->ArRWLock); | ||||
|   /* a static array */ | ||||
|   if (indx < 0 || indx >= - ptr->ArrayEArity) { | ||||
|   if (indx < 0 || indx >= ptr->ArrayEArity) { | ||||
|     WRITE_UNLOCK(ptr->ArRWLock); | ||||
|     Yap_Error(DOMAIN_ERROR_ARRAY_OVERFLOW,t2,"assign_static"); | ||||
|     return FALSE; | ||||
| @@ -2179,7 +2170,7 @@ p_add_to_array_element( USES_REGS1 ) | ||||
|  | ||||
|   WRITE_LOCK(ptr->ArRWLock); | ||||
|   /* a static array */ | ||||
|   if (indx < 0 || indx >= - ptr->ArrayEArity) { | ||||
|   if (indx < 0 || indx >= ptr->ArrayEArity) { | ||||
|     WRITE_UNLOCK(ptr->ArRWLock); | ||||
|     Yap_Error(DOMAIN_ERROR_ARRAY_OVERFLOW,t2,"add_to_array_element"); | ||||
|     return FALSE; | ||||
| @@ -2271,16 +2262,16 @@ p_static_array_to_term( USES_REGS1 ) | ||||
|       return (FALSE); | ||||
|     } else { | ||||
|       static_array_types tp = pp->ArrayType; | ||||
|       Int dim = -pp->ArrayEArity, indx; | ||||
|       Int dim = pp->ArrayEArity, indx; | ||||
|       CELL *base; | ||||
|  | ||||
|       while (H+1+dim > ASP-1024) { | ||||
|       while (HR+1+dim > ASP-1024) { | ||||
| 	if (!Yap_gcl((1+dim)*sizeof(CELL), 2, ENV, gc_P(P,CP))) { | ||||
| 	  Yap_Error(OUT_OF_STACK_ERROR,TermNil,LOCAL_ErrorMessage); | ||||
| 	  return(FALSE); | ||||
| 	} else { | ||||
| 	  if (H+1+dim > ASP-1024) { | ||||
| 	    if (!Yap_growstack( sizeof(CELL) * (dim+1-(H-ASP-1024)))) { | ||||
| 	  if (HR+1+dim > ASP-1024) { | ||||
| 	    if (!Yap_growstack( sizeof(CELL) * (dim+1-(HR-ASP-1024)))) { | ||||
| 	      Yap_Error(OUT_OF_STACK_ERROR, TermNil, LOCAL_ErrorMessage); | ||||
| 	      return FALSE; | ||||
| 	    } | ||||
| @@ -2289,13 +2280,13 @@ p_static_array_to_term( USES_REGS1 ) | ||||
|       } | ||||
|       READ_LOCK(pp->ArRWLock); | ||||
|       READ_UNLOCK(ae->ARWLock); | ||||
|       base = H; | ||||
|       *H++ = (CELL)Yap_MkFunctor(AbsAtom(ae),dim); | ||||
|       base = HR; | ||||
|       *HR++ = (CELL)Yap_MkFunctor(AbsAtom(ae),dim); | ||||
|       switch(tp) { | ||||
|       case array_of_ints: | ||||
| 	{ | ||||
| 	  CELL *sptr = H; | ||||
| 	  H += dim; | ||||
| 	  CELL *sptr = HR; | ||||
| 	  HR += dim; | ||||
| 	  for (indx=0; indx < dim; indx++) { | ||||
| 	    *sptr++ = MkIntegerTerm(pp->ValueOfVE.ints[indx]); | ||||
| 	  } | ||||
| @@ -2322,13 +2313,13 @@ p_static_array_to_term( USES_REGS1 ) | ||||
| 	  } else { | ||||
| 	    TRef = TermNil; | ||||
| 	  } | ||||
| 	  *H++ = TRef; | ||||
| 	  *HR++ = TRef; | ||||
| 	} | ||||
| 	break; | ||||
|       case array_of_doubles: | ||||
| 	{ | ||||
| 	  CELL *sptr = H; | ||||
| 	  H += dim; | ||||
| 	  CELL *sptr = HR; | ||||
| 	  HR += dim; | ||||
| 	  for (indx=0; indx < dim; indx++) { | ||||
| 	    *sptr++ = MkEvalFl(pp->ValueOfVE.floats[indx]); | ||||
| 	  } | ||||
| @@ -2336,8 +2327,8 @@ p_static_array_to_term( USES_REGS1 ) | ||||
| 	break; | ||||
|       case array_of_ptrs: | ||||
| 	{ | ||||
| 	  CELL *sptr = H; | ||||
| 	  H += dim; | ||||
| 	  CELL *sptr = HR; | ||||
| 	  HR += dim; | ||||
| 	  for (indx=0; indx < dim; indx++) { | ||||
| 	    *sptr++ = MkIntegerTerm((Int)(pp->ValueOfVE.ptrs[indx])); | ||||
| 	  } | ||||
| @@ -2345,8 +2336,8 @@ p_static_array_to_term( USES_REGS1 ) | ||||
| 	break; | ||||
|       case array_of_chars: | ||||
| 	{ | ||||
| 	  CELL *sptr = H; | ||||
| 	  H += dim; | ||||
| 	  CELL *sptr = HR; | ||||
| 	  HR += dim; | ||||
| 	  for (indx=0; indx < dim; indx++) { | ||||
| 	    *sptr++ = MkIntegerTerm((Int)(pp->ValueOfVE.chars[indx])); | ||||
| 	  } | ||||
| @@ -2354,8 +2345,8 @@ p_static_array_to_term( USES_REGS1 ) | ||||
| 	break; | ||||
|       case array_of_uchars: | ||||
| 	{ | ||||
| 	  CELL *sptr = H; | ||||
| 	  H += dim; | ||||
| 	  CELL *sptr = HR; | ||||
| 	  HR += dim; | ||||
| 	  for (indx=0; indx < dim; indx++) { | ||||
| 	    *sptr++ = MkIntegerTerm((Int)(pp->ValueOfVE.uchars[indx])); | ||||
| 	  } | ||||
| @@ -2363,8 +2354,8 @@ p_static_array_to_term( USES_REGS1 ) | ||||
| 	break; | ||||
|       case array_of_terms: | ||||
| 	{ | ||||
| 	  CELL *sptr = H; | ||||
| 	  H += dim; | ||||
| 	  CELL *sptr = HR; | ||||
| 	  HR += dim; | ||||
| 	  for (indx=0; indx < dim; indx++) { | ||||
| 	    /* The object is now in use */ | ||||
| 	    DBTerm *ref = pp->ValueOfVE.terms[indx]; | ||||
| @@ -2381,8 +2372,8 @@ p_static_array_to_term( USES_REGS1 ) | ||||
| 	break; | ||||
|       case array_of_nb_terms: | ||||
| 	{ | ||||
| 	  CELL *sptr = H; | ||||
| 	  H += dim; | ||||
| 	  CELL *sptr = HR; | ||||
| 	  HR += dim; | ||||
| 	  for (indx=0; indx < dim; indx++) { | ||||
| 	    /* The object is now in use */ | ||||
| 	    Term To = GetNBTerm(pp->ValueOfVE.lterms, indx PASS_REGS); | ||||
| @@ -2401,7 +2392,7 @@ p_static_array_to_term( USES_REGS1 ) | ||||
| 	  out = pp->ValueOfVE.atoms[indx]; | ||||
| 	  if (out == 0L) | ||||
| 	    out = TermNil; | ||||
| 	  *H++ = out; | ||||
| 	  *HR++ = out; | ||||
| 	} | ||||
| 	break; | ||||
|       } | ||||
|   | ||||
							
								
								
									
										1938
									
								
								C/atomic.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1938
									
								
								C/atomic.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										85
									
								
								C/attvar.c
									
									
									
									
									
								
							
							
						
						
									
										85
									
								
								C/attvar.c
									
									
									
									
									
								
							| @@ -73,8 +73,8 @@ BuildNewAttVar( USES_REGS1 ) | ||||
|   attvar_record *newv; | ||||
|  | ||||
|   /* add a new attributed variable */ | ||||
|   newv = (attvar_record *)H; | ||||
|   H = (CELL *)(newv+1); | ||||
|   newv = (attvar_record *)HR; | ||||
|   HR = (CELL *)(newv+1); | ||||
|   newv->AttFunc = FunctorAttVar; | ||||
|   RESET_VARIABLE(&(newv->Value)); | ||||
|   RESET_VARIABLE(&(newv->Done)); | ||||
| @@ -97,9 +97,9 @@ CopyAttVar(CELL *orig, struct cp_frame **to_visit_ptr, CELL *res USES_REGS) | ||||
|   to_visit->start_cp = vt-1; | ||||
|   to_visit->end_cp = vt; | ||||
|   if (IsVarTerm(attv->Atts)) { | ||||
|     Bind_Global_NonAtt(&newv->Atts, (CELL)H); | ||||
|     to_visit->to = H; | ||||
|     H++; | ||||
|     Bind_Global_NonAtt(&newv->Atts, (CELL)HR); | ||||
|     to_visit->to = HR; | ||||
|     HR++; | ||||
|   } else { | ||||
|     to_visit->to = &(newv->Atts); | ||||
|   } | ||||
| @@ -156,7 +156,7 @@ WakeAttVar(CELL* pt1, CELL reg2 USES_REGS) | ||||
|    | ||||
|   /* if bound to someone else, follow until we find the last one */ | ||||
|   attvar_record *attv = RepAttVar(pt1); | ||||
|   CELL *myH = H; | ||||
|   CELL *myH = HR; | ||||
|   CELL *bind_ptr; | ||||
|  | ||||
|   if (IsVarTerm(Deref(attv->Atts))) { | ||||
| @@ -201,9 +201,9 @@ WakeAttVar(CELL* pt1, CELL reg2 USES_REGS) | ||||
|   bind_ptr = AddToQueue(attv PASS_REGS); | ||||
|   if (IsNonVarTerm(reg2)) { | ||||
|     if (IsPairTerm(reg2) && RepPair(reg2) == myH) | ||||
|       reg2 = AbsPair(H); | ||||
|       reg2 = AbsPair(HR); | ||||
|     else if (IsApplTerm(reg2) && RepAppl(reg2) == myH) | ||||
|       reg2 = AbsAppl(H); | ||||
|       reg2 = AbsAppl(HR); | ||||
|   } | ||||
|   *bind_ptr = reg2; | ||||
|   Bind_Global_NonAtt(&(attv->Value), reg2); | ||||
| @@ -227,19 +227,19 @@ mark_attvar(CELL *orig) | ||||
| static Term | ||||
| BuildAttTerm(Functor mfun, UInt ar USES_REGS) | ||||
| { | ||||
|   CELL *h0 = H; | ||||
|   CELL *h0 = HR; | ||||
|   UInt i; | ||||
|  | ||||
|   if (H+(1024+ar) > ASP) { | ||||
|   if (HR+(1024+ar) > ASP) { | ||||
|     LOCAL_Error_Size=ar*sizeof(CELL); | ||||
|     return 0L; | ||||
|   } | ||||
|   H[0] = (CELL)mfun; | ||||
|   RESET_VARIABLE(H+1); | ||||
|   H += 2; | ||||
|   HR[0] = (CELL)mfun; | ||||
|   RESET_VARIABLE(HR+1); | ||||
|   HR += 2; | ||||
|   for (i = 1; i< ar; i++) { | ||||
|     *H = TermVoidAtt; | ||||
|     H++; | ||||
|     *HR = TermVoidAtt; | ||||
|     HR++; | ||||
|   } | ||||
|   return AbsAppl(h0); | ||||
| } | ||||
| @@ -390,7 +390,7 @@ DelAtts(attvar_record *attv, Term oatt USES_REGS) | ||||
| static void  | ||||
| PutAtt(Int pos, Term atts, Term att USES_REGS) | ||||
| { | ||||
|   if (IsVarTerm(att) && VarOfTerm(att) > H && VarOfTerm(att) < LCL0) { | ||||
|   if (IsVarTerm(att) && VarOfTerm(att) > HR && VarOfTerm(att) < LCL0) { | ||||
|     /* globalise locals */ | ||||
|     Term tnew = MkVarTerm(); | ||||
|     Bind_NonAtt(VarOfTerm(att), tnew); | ||||
| @@ -850,23 +850,23 @@ p_modules_with_atts( USES_REGS1 ) { | ||||
|   if (IsVarTerm(inp)) { | ||||
|     if (IsAttachedTerm(inp)) { | ||||
|       attvar_record *attv = RepAttVar(VarOfTerm(inp)); | ||||
|       CELL *h0 = H; | ||||
|       CELL *h0 = HR; | ||||
|       Term tatt; | ||||
|  | ||||
|       if (IsVarTerm(tatt = attv->Atts)) | ||||
| 	  return Yap_unify(ARG2,TermNil); | ||||
|       while (!IsVarTerm(tatt)) { | ||||
| 	Functor f = FunctorOfTerm(tatt); | ||||
| 	if (H != h0) | ||||
| 	  H[-1] = AbsPair(H); | ||||
| 	if (HR != h0) | ||||
| 	  HR[-1] = AbsPair(HR); | ||||
| 	if (ActiveAtt(tatt, ArityOfFunctor(f))) { | ||||
| 	  *H = MkAtomTerm(NameOfFunctor(f)); | ||||
| 	  H+=2; | ||||
| 	  *HR = MkAtomTerm(NameOfFunctor(f)); | ||||
| 	  HR+=2; | ||||
| 	} | ||||
| 	tatt = ArgOfTerm(1,tatt); | ||||
|       } | ||||
|       if (h0 != H) { | ||||
| 	H[-1] = TermNil; | ||||
|       if (h0 != HR) { | ||||
| 	HR[-1] = TermNil; | ||||
| 	return Yap_unify(ARG2,AbsPair(h0)); | ||||
|       } | ||||
|     } | ||||
| @@ -887,7 +887,7 @@ p_swi_all_atts( USES_REGS1 ) { | ||||
|   if (IsVarTerm(inp)) { | ||||
|     if (IsAttachedTerm(inp)) { | ||||
|       attvar_record *attv = RepAttVar(VarOfTerm(inp)); | ||||
|       CELL *h0 = H; | ||||
|       CELL *h0 = HR; | ||||
|       Term tatt; | ||||
|  | ||||
|       if (IsVarTerm(tatt = attv->Atts)) | ||||
| @@ -896,21 +896,21 @@ p_swi_all_atts( USES_REGS1 ) { | ||||
| 	Functor f = FunctorOfTerm(tatt); | ||||
| 	UInt ar = ArityOfFunctor(f); | ||||
|  | ||||
| 	if (H != h0) | ||||
| 	  H[-1] = AbsAppl(H); | ||||
| 	H[0] = (CELL) attf; | ||||
| 	H[1] = MkAtomTerm(NameOfFunctor(f)); | ||||
| 	if (HR != h0) | ||||
| 	  HR[-1] = AbsAppl(HR); | ||||
| 	HR[0] = (CELL) attf; | ||||
| 	HR[1] = MkAtomTerm(NameOfFunctor(f)); | ||||
| 	/* SWI */ | ||||
| 	if (ar == 2)  | ||||
| 	  H[2] =  ArgOfTerm(2,tatt); | ||||
| 	  HR[2] =  ArgOfTerm(2,tatt); | ||||
| 	else | ||||
| 	  H[2] =  tatt; | ||||
| 	H += 4; | ||||
| 	H[-1] = AbsAppl(H); | ||||
| 	  HR[2] =  tatt; | ||||
| 	HR += 4; | ||||
| 	HR[-1] = AbsAppl(HR); | ||||
| 	tatt = ArgOfTerm(1,tatt); | ||||
|       } | ||||
|       if (h0 != H) { | ||||
| 	H[-1] = TermNil; | ||||
|       if (h0 != HR) { | ||||
| 	HR[-1] = TermNil; | ||||
| 	return Yap_unify(ARG2,AbsAppl(h0)); | ||||
|       } | ||||
|     } | ||||
| @@ -925,17 +925,17 @@ p_swi_all_atts( USES_REGS1 ) { | ||||
| static Term | ||||
| AllAttVars( USES_REGS1 ) { | ||||
|   CELL *pt = H0; | ||||
|   CELL *myH = H; | ||||
|   CELL *myH = HR; | ||||
|    | ||||
|   while (pt < myH) { | ||||
|     switch(*pt) { | ||||
|     case (CELL)FunctorAttVar: | ||||
|       if (IsUnboundVar(pt+1)) { | ||||
| 	if (ASP - myH < 1024) { | ||||
| 	  LOCAL_Error_Size = (ASP-H)*sizeof(CELL); | ||||
| 	  LOCAL_Error_Size = (ASP-HR)*sizeof(CELL); | ||||
| 	  return 0L; | ||||
| 	} | ||||
| 	if (myH != H) { | ||||
| 	if (myH != HR) { | ||||
| 	  myH[-1] = AbsPair(myH); | ||||
| 	} | ||||
| 	myH[0] = AbsAttVar((attvar_record *)pt); | ||||
| @@ -944,12 +944,15 @@ AllAttVars( USES_REGS1 ) { | ||||
|       pt += (1+ATT_RECORD_ARITY); | ||||
|       break; | ||||
|     case (CELL)FunctorDouble: | ||||
| #if SIZEOF_DOUBLE == 2*SIZEOF_LONG_INT | ||||
| #if SIZEOF_DOUBLE == 2*SIZEOF_INT_P | ||||
|       pt += 4; | ||||
| #else | ||||
|       pt += 3; | ||||
| #endif | ||||
|       break; | ||||
|     case (CELL)FunctorString: | ||||
|       pt += 3+pt[1]; | ||||
|       break; | ||||
|     case (CELL)FunctorBigInt: | ||||
|       { | ||||
| 	Int sz = 3 + | ||||
| @@ -965,10 +968,10 @@ AllAttVars( USES_REGS1 ) { | ||||
|       pt++; | ||||
|     } | ||||
|   } | ||||
|   if (myH != H) { | ||||
|     Term out = AbsPair(H); | ||||
|   if (myH != HR) { | ||||
|     Term out = AbsPair(HR); | ||||
|     myH[-1] = TermNil; | ||||
|     H = myH; | ||||
|     HR = myH; | ||||
|     return out; | ||||
|   } else { | ||||
|     return TermNil; | ||||
|   | ||||
							
								
								
									
										273
									
								
								C/bignum.c
									
									
									
									
									
								
							
							
						
						
									
										273
									
								
								C/bignum.c
									
									
									
									
									
								
							| @@ -26,6 +26,7 @@ static char     SccsId[] = "%W% %G%"; | ||||
| #endif | ||||
|  | ||||
| #include "YapHeap.h" | ||||
| #include "pl-utf8.h" | ||||
|  | ||||
| #ifdef USE_GMP | ||||
|  | ||||
| @@ -37,8 +38,8 @@ Yap_MkBigIntTerm(MP_INT *big) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   Int nlimbs; | ||||
|   MP_INT *dst = (MP_INT *)(H+2); | ||||
|   CELL *ret = H; | ||||
|   MP_INT *dst = (MP_INT *)(HR+2); | ||||
|   CELL *ret = HR; | ||||
|   Int bytes; | ||||
|  | ||||
|   if (mpz_fits_slong_p(big)) { | ||||
| @@ -53,15 +54,15 @@ Yap_MkBigIntTerm(MP_INT *big) | ||||
|   if (nlimbs > (ASP-ret)-1024) { | ||||
|     return TermNil; | ||||
|   } | ||||
|   H[0] = (CELL)FunctorBigInt; | ||||
|   H[1] = BIG_INT; | ||||
|   HR[0] = (CELL)FunctorBigInt; | ||||
|   HR[1] = BIG_INT; | ||||
|  | ||||
|   dst->_mp_size = big->_mp_size; | ||||
|   dst->_mp_alloc = nlimbs*(CellSize/sizeof(mp_limb_t)); | ||||
|   memmove((void *)(dst+1), (const void *)(big->_mp_d), bytes); | ||||
|   H = (CELL *)(dst+1)+nlimbs; | ||||
|   H[0] = EndSpecials; | ||||
|   H++; | ||||
|   HR = (CELL *)(dst+1)+nlimbs; | ||||
|   HR[0] = EndSpecials; | ||||
|   HR++; | ||||
|   return AbsAppl(ret); | ||||
| } | ||||
|  | ||||
| @@ -80,19 +81,19 @@ Yap_MkBigRatTerm(MP_RAT *big) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   Int nlimbs; | ||||
|   MP_INT *dst = (MP_INT *)(H+2); | ||||
|   MP_INT *dst = (MP_INT *)(HR+2); | ||||
|   MP_INT *num = mpq_numref(big); | ||||
|   MP_INT *den = mpq_denref(big); | ||||
|   MP_RAT *rat; | ||||
|   CELL *ret = H; | ||||
|   CELL *ret = HR; | ||||
|  | ||||
|   if (mpz_cmp_si(den, 1) == 0) | ||||
|     return Yap_MkBigIntTerm(num); | ||||
|   if ((num->_mp_alloc+den->_mp_alloc)*(sizeof(mp_limb_t)/CellSize) > (ASP-ret)-1024) { | ||||
|     return TermNil; | ||||
|   } | ||||
|   H[0] = (CELL)FunctorBigInt; | ||||
|   H[1] = BIG_RATIONAL; | ||||
|   HR[0] = (CELL)FunctorBigInt; | ||||
|   HR[1] = BIG_RATIONAL; | ||||
|   dst->_mp_size = 0; | ||||
|   rat = (MP_RAT *)(dst+1); | ||||
|   rat->_mp_num._mp_size = num->_mp_size; | ||||
| @@ -101,13 +102,13 @@ Yap_MkBigRatTerm(MP_RAT *big) | ||||
|   memmove((void *)(rat+1), (const void *)(num->_mp_d), nlimbs*CellSize); | ||||
|   rat->_mp_den._mp_size = den->_mp_size; | ||||
|   rat->_mp_den._mp_alloc = den->_mp_alloc; | ||||
|   H = (CELL *)(rat+1)+nlimbs; | ||||
|   HR = (CELL *)(rat+1)+nlimbs; | ||||
|   nlimbs = (den->_mp_alloc)*(sizeof(mp_limb_t)/CellSize); | ||||
|   memmove((void *)(H), (const void *)(den->_mp_d), nlimbs*CellSize); | ||||
|   H += nlimbs; | ||||
|   dst->_mp_alloc = (H-(CELL *)(dst+1)); | ||||
|   H[0] = EndSpecials; | ||||
|   H++; | ||||
|   memmove((void *)(HR), (const void *)(den->_mp_d), nlimbs*CellSize); | ||||
|   HR += nlimbs; | ||||
|   dst->_mp_alloc = (HR-(CELL *)(dst+1)); | ||||
|   HR[0] = EndSpecials; | ||||
|   HR++; | ||||
|   return AbsAppl(ret); | ||||
| } | ||||
|  | ||||
| @@ -141,20 +142,20 @@ Yap_AllocExternalDataInStack(CELL tag, size_t bytes) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   Int nlimbs; | ||||
|   MP_INT *dst = (MP_INT *)(H+2); | ||||
|   CELL *ret = H; | ||||
|   MP_INT *dst = (MP_INT *)(HR+2); | ||||
|   CELL *ret = HR; | ||||
|  | ||||
|   nlimbs = ALIGN_YAPTYPE(bytes,CELL)/CellSize; | ||||
|   if (nlimbs > (ASP-ret)-1024) { | ||||
|     return TermNil; | ||||
|   } | ||||
|   H[0] = (CELL)FunctorBigInt; | ||||
|   H[1] = tag; | ||||
|   HR[0] = (CELL)FunctorBigInt; | ||||
|   HR[1] = tag; | ||||
|   dst->_mp_size = 0; | ||||
|   dst->_mp_alloc = nlimbs; | ||||
|   H = (CELL *)(dst+1)+nlimbs; | ||||
|   H[0] = EndSpecials; | ||||
|   H++; | ||||
|   HR = (CELL *)(dst+1)+nlimbs; | ||||
|   HR[0] = EndSpecials; | ||||
|   HR++; | ||||
|   if (tag != EXTERNAL_BLOB) { | ||||
|     TrailTerm(TR) = AbsPair(ret); | ||||
|     TR++; | ||||
| @@ -332,6 +333,82 @@ Yap_MkULLIntTerm(YAP_ULONG_LONG n) | ||||
| #endif | ||||
| } | ||||
|  | ||||
| CELL * | ||||
| Yap_HeapStoreOpaqueTerm(Term t) | ||||
| { | ||||
|   CELL *ptr = RepAppl(t); | ||||
|   size_t sz; | ||||
|   void *new; | ||||
|  | ||||
|   if (ptr[0] == (CELL)FunctorBigInt) { | ||||
|     sz = sizeof(MP_INT)+2*CellSize+ | ||||
|       ((MP_INT *)(ptr+2))->_mp_alloc*sizeof(mp_limb_t); | ||||
|   } else { /* string */ | ||||
|     sz = sizeof(CELL)*(2+ptr[1]); | ||||
|   } | ||||
|   new = Yap_AllocCodeSpace(sz); | ||||
|   if (!new) { | ||||
|     Yap_Error(OUT_OF_HEAP_ERROR, TermNil, "subgoal_search_loop: no space for %s", StringOfTerm(t) ); | ||||
|   } else { | ||||
|     if (ptr[0] == (CELL)FunctorBigInt) { | ||||
|       MP_INT *new = (MP_INT *)(RepAppl(t)+2); | ||||
|  | ||||
|       new->_mp_d = (mp_limb_t *)(new+1); | ||||
|     } | ||||
|     memmove(new, ptr, sz); | ||||
|   } | ||||
|   return new;  | ||||
| } | ||||
|  | ||||
|  | ||||
| size_t | ||||
| Yap_OpaqueTermToString(Term t, char *str, size_t max) | ||||
| { | ||||
|   size_t str_index = 0; | ||||
|   CELL * li = RepAppl(t); | ||||
|   if (li[0] == (CELL)FunctorString) { | ||||
|     str_index += sprintf(& str[str_index], "\""); | ||||
|     do { | ||||
|       int chr; | ||||
|       char *ptr = (char *)StringOfTerm(AbsAppl(li)); | ||||
|       ptr = utf8_get_char(ptr, &chr); | ||||
|       if (chr == '\0') break; | ||||
|       str_index += sprintf(& str[str_index], "%C", chr); | ||||
|     } while (TRUE); | ||||
|     str_index += sprintf(& str[str_index], "\""); | ||||
|   } else { | ||||
|     CELL big_tag = li[1]; | ||||
|  | ||||
|     if (big_tag == ARRAY_INT || big_tag == ARRAY_FLOAT) { | ||||
|       str_index += sprintf(& str[str_index], "{...}"); | ||||
| #ifdef USE_GMP | ||||
|     } else if (big_tag == BIG_INT) { | ||||
|       MP_INT *big = Yap_BigIntOfTerm(AbsAppl(li)); | ||||
|       char *s = mpz_get_str(&str[str_index], 10, big); | ||||
|       str_index += strlen(&s[str_index]); | ||||
|     } else if (big_tag == BIG_RATIONAL) { | ||||
|       MP_RAT *big = Yap_BigRatOfTerm(AbsAppl(li)); | ||||
|       char *s = mpq_get_str(&str[str_index], 10, big); | ||||
|       str_index += strlen(&s[str_index]); | ||||
| #endif | ||||
|     }  | ||||
|     /* | ||||
|       else if (big_tag >= USER_BLOB_START && big_tag < USER_BLOB_END) { | ||||
|       Opaque_CallOnWrite f; | ||||
|       CELL blob_info; | ||||
|        | ||||
|       blob_info = big_tag - USER_BLOB_START; | ||||
|       if (GLOBAL_OpaqueHandlers && | ||||
|       (f= GLOBAL_OpaqueHandlers[blob_info].write_handler)) { | ||||
|       (f)(wglb->stream, big_tag, ExternalBlobFromTerm(t), 0); | ||||
|       return; | ||||
|       } | ||||
|       } */ | ||||
|     str_index += sprintf(& str[str_index], "0"); | ||||
|   } | ||||
|   return str_index; | ||||
| } | ||||
|  | ||||
| static Int  | ||||
| p_is_bignum( USES_REGS1 ) | ||||
| { | ||||
| @@ -348,6 +425,17 @@ p_is_bignum( USES_REGS1 ) | ||||
| #endif | ||||
| } | ||||
|  | ||||
| static Int  | ||||
| p_is_string( USES_REGS1 ) | ||||
| { | ||||
|   Term t = Deref(ARG1); | ||||
|   return( | ||||
| 	 IsNonVarTerm(t) &&  | ||||
| 	 IsApplTerm(t) &&  | ||||
| 	 FunctorOfTerm(t) == FunctorString | ||||
| 	 ); | ||||
| } | ||||
|  | ||||
| static Int  | ||||
| p_nb_set_bit( USES_REGS1 ) | ||||
| { | ||||
| @@ -469,142 +557,6 @@ p_rational( USES_REGS1 ) | ||||
| #endif | ||||
| } | ||||
|  | ||||
| int | ||||
| Yap_IsStringTerm(Term t) | ||||
| { | ||||
|   CELL fl; | ||||
|   if (IsVarTerm(t)) | ||||
|     return FALSE; | ||||
|   if (!IsApplTerm(t)) | ||||
|     return FALSE; | ||||
|   if (FunctorOfTerm(t) != FunctorBigInt) | ||||
|     return FALSE; | ||||
|  | ||||
|   fl = RepAppl(t)[1]; | ||||
|   return fl == BLOB_STRING || fl == BLOB_WIDE_STRING; | ||||
| } | ||||
|  | ||||
| int | ||||
| Yap_IsWideStringTerm(Term t) | ||||
| { | ||||
|   CELL fl; | ||||
|   if (IsVarTerm(t)) | ||||
|     return FALSE; | ||||
|   if (!IsApplTerm(t)) | ||||
|     return FALSE; | ||||
|   if (FunctorOfTerm(t) != FunctorBigInt) | ||||
|     return FALSE; | ||||
|  | ||||
|   fl = RepAppl(t)[1]; | ||||
|   return fl == BLOB_WIDE_STRING; | ||||
| } | ||||
|  | ||||
| Term | ||||
| Yap_MkBlobStringTerm(const char *s, size_t len) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   CELL *ret = H; | ||||
|   size_t sz; | ||||
|   MP_INT *dst = (MP_INT *)(H+2); | ||||
|   blob_string_t *sp; | ||||
|   size_t siz; | ||||
|   char *dest; | ||||
|  | ||||
|   sz = strlen(s); | ||||
|   if (len > 0 && sz > len) sz = len; | ||||
|   if (len/sizeof(CELL) > (ASP-ret)-1024) { | ||||
|     return TermNil; | ||||
|   } | ||||
|   H[0] = (CELL)FunctorBigInt; | ||||
|   H[1] = BLOB_STRING; | ||||
|   siz = ALIGN_YAPTYPE((len+1+sizeof(blob_string_t)),CELL); | ||||
|   dst->_mp_size = 0L; | ||||
|   dst->_mp_alloc = siz/sizeof(mp_limb_t); | ||||
|   sp = (blob_string_t *)(dst+1); | ||||
|   sp->len = sz; | ||||
|   dest = (char *)(sp+1); | ||||
|   strncpy(dest, s, sz); | ||||
|   dest[sz] = '\0'; | ||||
|   H += (siz + 2*sizeof(CELL)+sizeof(MP_INT)+sizeof(Functor))/sizeof(CELL); | ||||
|   H[-1] = EndSpecials; | ||||
|   return AbsAppl(ret); | ||||
| } | ||||
|  | ||||
| Term | ||||
| Yap_MkBlobWideStringTerm(const wchar_t *s, size_t len) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   CELL *ret = H; | ||||
|   size_t sz; | ||||
|   MP_INT *dst = (MP_INT *)(H+2); | ||||
|   blob_string_t *sp = (blob_string_t *)(dst+1); | ||||
|   size_t siz, i = 0; | ||||
|  | ||||
|   H[0] = (CELL)FunctorBigInt; | ||||
|   dst->_mp_size = 0L; | ||||
|   sz = wcslen(s); | ||||
|   if (len > 0 && sz > len) { | ||||
|     sz = len; | ||||
|   } | ||||
|   if ((len/sizeof(CELL)) > (ASP-ret)-1024) { | ||||
|     return TermNil; | ||||
|   } | ||||
|   while (i < sz) { | ||||
|     if (s[i++] >= 255) break; | ||||
|   } | ||||
|   if (i == sz) { | ||||
|     /* we have a standard ascii string */ | ||||
|     char *target; | ||||
|     size_t i = 0; | ||||
|  | ||||
|     H[1] = BLOB_STRING; | ||||
|     siz = ALIGN_YAPTYPE((sz+1+sizeof(blob_string_t)),CELL); | ||||
|     dst->_mp_alloc = siz/sizeof(mp_limb_t); | ||||
|     sp->len = sz; | ||||
|     target = (char *)(sp+1); | ||||
|     for (i = 0 ; i < sz; i++) { | ||||
|       target[i] = s[i]; | ||||
|     } | ||||
|     target[sz] = '\0'; | ||||
|     H += (siz+2*sizeof(CELL)+sizeof(MP_INT)+sizeof(Functor))/sizeof(CELL); | ||||
|   } else { | ||||
|     wchar_t * target; | ||||
|  | ||||
|     H[1] = BLOB_WIDE_STRING; | ||||
|     siz = ALIGN_YAPTYPE((sz+1)*sizeof(wchar_t)+sizeof(blob_string_t),CELL); | ||||
|     dst->_mp_alloc = siz/sizeof(mp_limb_t); | ||||
|     sp->len = sz; | ||||
|     target = (wchar_t *)(sp+1);  | ||||
|     wcsncpy(target, s, sz); | ||||
|     target[sz] = '\0'; | ||||
|     H += (siz + 2*sizeof(CELL)+sizeof(MP_INT)+sizeof(Functor))/sizeof(CELL); | ||||
|   } | ||||
|   H[-1] = EndSpecials; | ||||
|   return AbsAppl(ret); | ||||
| } | ||||
|  | ||||
| char * | ||||
| Yap_BlobStringOfTerm(Term t) | ||||
| { | ||||
|   blob_string_t *new = (blob_string_t *)(RepAppl(t)+2+sizeof(MP_INT)/sizeof(CELL)); | ||||
|   return (char *)(new+1); | ||||
| } | ||||
|  | ||||
| wchar_t * | ||||
| Yap_BlobWideStringOfTerm(Term t) | ||||
| { | ||||
|   blob_string_t *new = (blob_string_t *)(RepAppl(t)+2+sizeof(MP_INT)/sizeof(CELL)); | ||||
|   return (wchar_t *)(new+1); | ||||
| } | ||||
|  | ||||
| char * | ||||
| Yap_BlobStringOfTermAndLength(Term t, size_t *sp) | ||||
| { | ||||
|   blob_string_t *new = (blob_string_t *)(RepAppl(t)+2+sizeof(MP_INT)/sizeof(CELL)); | ||||
|   *sp = new->len; | ||||
|   return (char *)(new+1); | ||||
| } | ||||
|  | ||||
| void | ||||
| Yap_InitBigNums(void) | ||||
| { | ||||
| @@ -612,6 +564,7 @@ Yap_InitBigNums(void) | ||||
|   Yap_InitCPred("$bignum", 1, p_is_bignum, SafePredFlag); | ||||
|   Yap_InitCPred("rational", 3, p_rational, 0); | ||||
|   Yap_InitCPred("rational", 1, p_is_rational, SafePredFlag); | ||||
|   Yap_InitCPred("string", 1, p_is_string, SafePredFlag); | ||||
|   Yap_InitCPred("opaque", 1, p_is_opaque, SafePredFlag); | ||||
|   Yap_InitCPred("nb_set_bit", 2, p_nb_set_bit, SafePredFlag); | ||||
| } | ||||
|   | ||||
							
								
								
									
										321
									
								
								C/c_interface.c
									
									
									
									
									
								
							
							
						
						
									
										321
									
								
								C/c_interface.c
									
									
									
									
									
								
							| @@ -354,6 +354,7 @@ | ||||
| #include "yap_structs.h" | ||||
| #define _yap_c_interface_h 1 | ||||
| #include "pl-shared.h" | ||||
| #include "YapText.h" | ||||
| #include "pl-read.h" | ||||
| #ifdef TABLING | ||||
| #include "tab.macros.h" | ||||
| @@ -362,9 +363,7 @@ | ||||
| #include "or.macros.h" | ||||
| #endif	/* YAPOR */ | ||||
| #include "threads.h" | ||||
| #ifdef CUT_C | ||||
| #include "cut_c.h" | ||||
| #endif /* CUT_C */ | ||||
| #if HAVE_MALLOC_H | ||||
| #include <malloc.h> | ||||
| #endif | ||||
| @@ -378,8 +377,6 @@ | ||||
|  | ||||
| #if defined(_MSC_VER) && defined(YAP_EXPORTS) | ||||
| #define X_API __declspec(dllexport) | ||||
| #else | ||||
| #define X_API | ||||
| #endif | ||||
|  | ||||
| X_API Term    YAP_A(int); | ||||
| @@ -516,10 +513,8 @@ X_API void    YAP_PredicateInfo(void *,Atom *,UInt *,Term *); | ||||
| X_API void    YAP_UserCPredicate(char *,CPredicate,UInt); | ||||
| X_API void    YAP_UserBackCPredicate(char *,CPredicate,CPredicate,UInt,unsigned int); | ||||
| X_API void    YAP_UserCPredicateWithArgs(char *,CPredicate,UInt,Term); | ||||
| #ifdef CUT_C | ||||
| X_API void    YAP_UserBackCutCPredicate(char *,CPredicate,CPredicate,CPredicate,UInt,unsigned int); | ||||
| X_API void   *YAP_ExtraSpaceCut(void); | ||||
| #endif | ||||
| X_API Term     YAP_SetCurrentModule(Term); | ||||
| X_API Term     YAP_CurrentModule(void); | ||||
| X_API Term     YAP_CreateModule(Atom); | ||||
| @@ -566,6 +561,7 @@ X_API void    *YAP_ExternalDataInStackFromTerm(Term); | ||||
| X_API int      YAP_NewOpaqueType(void *); | ||||
| X_API Term     YAP_NewOpaqueObject(int, size_t); | ||||
| X_API void    *YAP_OpaqueObjectFromTerm(Term); | ||||
| X_API CELL    *YAP_HeapStoreOpaqueTerm(Term t); | ||||
| X_API int      YAP_Argv(char *** argvp); | ||||
| X_API YAP_tag_t YAP_TagOfTerm(Term); | ||||
| X_API size_t   YAP_ExportTerm(Term, char *, size_t); | ||||
| @@ -800,21 +796,21 @@ YAP_MkBlobTerm(unsigned int sz) | ||||
|   MP_INT *dst; | ||||
|   BACKUP_H(); | ||||
|  | ||||
|   while (H+(sz+sizeof(MP_INT)/sizeof(CELL)+2) > ASP-1024) { | ||||
|   while (HR+(sz+sizeof(MP_INT)/sizeof(CELL)+2) > ASP-1024) { | ||||
|     if (!doexpand((sz+sizeof(MP_INT)/sizeof(CELL)+2)*sizeof(CELL))) { | ||||
|       Yap_Error(OUT_OF_STACK_ERROR, TermNil, "YAP failed to grow the stack while constructing a blob: %s", LOCAL_ErrorMessage); | ||||
|       return TermNil; | ||||
|     } | ||||
|   } | ||||
|   I = AbsAppl(H); | ||||
|   H[0] = (CELL)FunctorBigInt; | ||||
|   H[1] = ARRAY_INT; | ||||
|   dst = (MP_INT *)(H+2); | ||||
|   I = AbsAppl(HR); | ||||
|   HR[0] = (CELL)FunctorBigInt; | ||||
|   HR[1] = ARRAY_INT; | ||||
|   dst = (MP_INT *)(HR+2); | ||||
|   dst->_mp_size = 0L; | ||||
|   dst->_mp_alloc = sz; | ||||
|   H += (2+sizeof(MP_INT)/sizeof(CELL)); | ||||
|   H[sz] = EndSpecials; | ||||
|   H += sz+1; | ||||
|   HR += (2+sizeof(MP_INT)/sizeof(CELL)); | ||||
|   HR[sz] = EndSpecials; | ||||
|   HR += sz+1; | ||||
|   RECOVER_H(); | ||||
|  | ||||
|   return I; | ||||
| @@ -980,7 +976,7 @@ YAP_MkPairTerm(Term t1, Term t2) | ||||
|   Term t;  | ||||
|   BACKUP_H(); | ||||
|  | ||||
|   while (H > ASP-1024) { | ||||
|   while (HR > ASP-1024) { | ||||
|     Int sl1 = Yap_InitSlot(t1 PASS_REGS); | ||||
|     Int sl2 = Yap_InitSlot(t2 PASS_REGS); | ||||
|     RECOVER_H(); | ||||
| @@ -1006,7 +1002,7 @@ YAP_MkListFromTerms(Term *ta, Int sz) | ||||
|   if (sz == 0) | ||||
|     return TermNil; | ||||
|   BACKUP_H(); | ||||
|   while (H+sz*2 > ASP-1024) { | ||||
|   while (HR+sz*2 > ASP-1024) { | ||||
|     Int sl1 = Yap_InitSlot((CELL)ta PASS_REGS); | ||||
|     RECOVER_H(); | ||||
|     if (!Yap_dogc( 0, NULL PASS_REGS )) { | ||||
| @@ -1016,7 +1012,7 @@ YAP_MkListFromTerms(Term *ta, Int sz) | ||||
|     ta =  (CELL *)Yap_GetFromSlot(sl1 PASS_REGS); | ||||
|     Yap_RecoverSlots(1 PASS_REGS); | ||||
|   } | ||||
|   h = H; | ||||
|   h = HR; | ||||
|   t = AbsPair(h); | ||||
|   while (sz--) { | ||||
|     Term ti = *ta++; | ||||
| @@ -1030,7 +1026,7 @@ YAP_MkListFromTerms(Term *ta, Int sz) | ||||
|     h += 2; | ||||
|   } | ||||
|   h[-1] = TermNil; | ||||
|   H = h; | ||||
|   HR = h; | ||||
|   RECOVER_H(); | ||||
|   return t; | ||||
| } | ||||
| @@ -1042,7 +1038,7 @@ YAP_MkNewPairTerm() | ||||
|   Term t;  | ||||
|   BACKUP_H(); | ||||
|  | ||||
|   if (H > ASP-1024) | ||||
|   if (HR > ASP-1024) | ||||
|     t = TermNil; | ||||
|   else | ||||
|     t = Yap_MkNewPairTerm(); | ||||
| @@ -1100,7 +1096,7 @@ YAP_MkApplTerm(Functor f,UInt arity, Term args[]) | ||||
|   Term t;  | ||||
|   BACKUP_H(); | ||||
|  | ||||
|   if (H+arity > ASP-1024) | ||||
|   if (HR+arity > ASP-1024) | ||||
|     t = TermNil; | ||||
|   else | ||||
|     t = Yap_MkApplTerm(f, arity, args); | ||||
| @@ -1116,7 +1112,7 @@ YAP_MkNewApplTerm(Functor f,UInt arity) | ||||
|   Term t;  | ||||
|   BACKUP_H(); | ||||
|  | ||||
|   if (H+arity > ASP-1024) | ||||
|   if (HR+arity > ASP-1024) | ||||
|     t = TermNil; | ||||
|   else | ||||
|     t = Yap_MkNewApplTerm(f, arity); | ||||
| @@ -1166,7 +1162,6 @@ YAP_ArityOfFunctor(Functor f) | ||||
|   return (ArityOfFunctor(f)); | ||||
| } | ||||
|  | ||||
| #ifdef CUT_C | ||||
| X_API void * | ||||
| YAP_ExtraSpaceCut(void) | ||||
| { | ||||
| @@ -1179,7 +1174,6 @@ YAP_ExtraSpaceCut(void) | ||||
|   RECOVER_B(); | ||||
|   return(ptr); | ||||
| } | ||||
| #endif /*CUT_C*/ | ||||
|  | ||||
| X_API void * | ||||
| YAP_ExtraSpace(void) | ||||
| @@ -1191,7 +1185,7 @@ YAP_ExtraSpace(void) | ||||
|  | ||||
|   /* find a pointer to extra space allocable */ | ||||
|   ptr = (void *)((CELL *)(B+1)+P->u.OtapFs.s); | ||||
|   B->cp_h = H; | ||||
|   B->cp_h = HR; | ||||
|  | ||||
|   RECOVER_H(); | ||||
|   RECOVER_B(); | ||||
| @@ -1203,14 +1197,12 @@ YAP_cut_up(void) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   BACKUP_B(); | ||||
| #ifdef CUT_C | ||||
|       { | ||||
| 	while (POP_CHOICE_POINT(B->cp_b)) | ||||
| 	  {  | ||||
| 	    POP_EXECUTE(); | ||||
| 	  } | ||||
|       } | ||||
| #endif /* CUT_C */ | ||||
|       /* This is complicated: make sure we can restore the ASP | ||||
| 	 pointer back to where cut_up called it. Slots depend on it. */ | ||||
|   if (ENV > B->cp_env) { | ||||
| @@ -1644,7 +1636,7 @@ complete_fail(choiceptr ptr, int has_cp USES_REGS) | ||||
| static int | ||||
| complete_exit(choiceptr ptr, int has_cp, int cut_all USES_REGS) | ||||
| { | ||||
|   // the user often leaves open frames, especially in forward execuryion | ||||
|   // the user often leaves open frames, especially in forward execution | ||||
|   while (B && (!ptr ||  B < ptr)) { | ||||
|     if (cut_all || B->cp_ap == NOCODE) {/* separator */ | ||||
|       do_cut( TRUE ); // pushes B up | ||||
| @@ -1780,6 +1772,7 @@ YAP_ExecuteFirst(PredEntry *pe, CPredicate exec_code) | ||||
|     } | ||||
|   } else { | ||||
|     Int ret = (exec_code)( PASS_REGS1 ); | ||||
|     LOCAL_CurSlot = CurSlot; | ||||
|     if (!ret) { | ||||
|       Term t; | ||||
|  | ||||
| @@ -1907,6 +1900,7 @@ YAP_ExecuteNext(PredEntry *pe, CPredicate exec_code) | ||||
|     return TRUE; | ||||
|   } else { | ||||
|     Int ret = (exec_code)( PASS_REGS1 ); | ||||
|     LOCAL_CurSlot = CurSlot; | ||||
|     if (!ret) { | ||||
|       Term t; | ||||
|  | ||||
| @@ -1984,42 +1978,16 @@ YAP_FreeSpaceFromYap(void *ptr) | ||||
| X_API int | ||||
| YAP_StringToBuffer(Term t, char *buf, unsigned int bufsize) | ||||
| { | ||||
|   unsigned int j = 0; | ||||
|  | ||||
|   while (t != TermNil) { | ||||
|     register Term   Head; | ||||
|     register Int    i; | ||||
|  | ||||
|     Head = HeadOfTerm(t); | ||||
|     if (IsVarTerm(Head)) { | ||||
|       Yap_Error(INSTANTIATION_ERROR,Head,"user defined procedure"); | ||||
|       return(FALSE); | ||||
|     } else if (!IsIntTerm(Head)) { | ||||
|       Yap_Error(REPRESENTATION_ERROR_CHARACTER_CODE,Head,"user defined procedure"); | ||||
|       return FALSE;		 | ||||
|     } | ||||
|     i = IntOfTerm(Head); | ||||
|     if (i < 0 || i > 255) { | ||||
|       Yap_Error(REPRESENTATION_ERROR_CHARACTER_CODE,Head,"user defined procedure"); | ||||
|       return FALSE;		 | ||||
|     } | ||||
|     if (j == bufsize) { | ||||
|       buf[bufsize-1] = '\0'; | ||||
|       return FALSE; | ||||
|     } else { | ||||
|       buf[j++] = i; | ||||
|     } | ||||
|     t = TailOfTerm(t); | ||||
|     if (IsVarTerm(t)) { | ||||
|       Yap_Error(INSTANTIATION_ERROR,t,"user defined procedure"); | ||||
|       return FALSE; | ||||
|     } else if (!IsPairTerm(t) && t != TermNil) { | ||||
|       Yap_Error(TYPE_ERROR_LIST, t, "user defined procedure"); | ||||
|       return FALSE; | ||||
|     } | ||||
|   } | ||||
|   buf[j] = '\0'; | ||||
|   return(TRUE); | ||||
|   CACHE_REGS | ||||
|   seq_tv_t inp, out; | ||||
|   inp.val.t = t; | ||||
|   inp.type = YAP_STRING_CODES|YAP_STRING_TRUNC; | ||||
|   inp.max = bufsize; | ||||
|   out.type = YAP_STRING_CHARS; | ||||
|   out.val.c = buf; | ||||
|   if (!Yap_CVT_Text(&inp, &out PASS_REGS)) | ||||
|     return FALSE; | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -2030,7 +1998,14 @@ YAP_BufferToString(char *s) | ||||
|   Term t;  | ||||
|   BACKUP_H(); | ||||
|  | ||||
|   t = Yap_StringToList(s); | ||||
|   CACHE_REGS | ||||
|   seq_tv_t inp, out; | ||||
|   inp.val.c = s; | ||||
|   inp.type = YAP_STRING_CHARS; | ||||
|   out.type = YAP_STRING_CODES; | ||||
|   if (!Yap_CVT_Text(&inp, &out PASS_REGS)) | ||||
|     return 0L; | ||||
|   t = out.val.t; | ||||
|  | ||||
|   RECOVER_H(); | ||||
|   return t; | ||||
| @@ -2043,7 +2018,16 @@ YAP_NBufferToString(char *s, size_t len) | ||||
|   Term t;  | ||||
|   BACKUP_H(); | ||||
|  | ||||
|   t = Yap_NStringToList(s, len); | ||||
|   CACHE_REGS | ||||
|   seq_tv_t inp, out; | ||||
|   inp.val.c = s; | ||||
|   inp.type = YAP_STRING_CHARS; | ||||
|   out.type = YAP_STRING_CODES|YAP_STRING_NCHARS|YAP_STRING_TRUNC; | ||||
|   out.sz = len; | ||||
|   out.max = len; | ||||
|   if (!Yap_CVT_Text(&inp, &out PASS_REGS)) | ||||
|     return 0L; | ||||
|   t = out.val.t; | ||||
|  | ||||
|   RECOVER_H(); | ||||
|   return t; | ||||
| @@ -2056,7 +2040,14 @@ YAP_WideBufferToString(wchar_t *s) | ||||
|   Term t;  | ||||
|   BACKUP_H(); | ||||
|  | ||||
|   t = Yap_WideStringToList(s); | ||||
|   CACHE_REGS | ||||
|   seq_tv_t inp, out; | ||||
|   inp.val.w = s; | ||||
|   inp.type = YAP_STRING_WCHARS; | ||||
|   out.type = YAP_STRING_CODES; | ||||
|   if (!Yap_CVT_Text(&inp, &out PASS_REGS)) | ||||
|     return 0L; | ||||
|   t = out.val.t; | ||||
|  | ||||
|   RECOVER_H(); | ||||
|   return t; | ||||
| @@ -2069,7 +2060,16 @@ YAP_NWideBufferToString(wchar_t *s, size_t len) | ||||
|   Term t;  | ||||
|   BACKUP_H(); | ||||
|  | ||||
|   t = Yap_NWideStringToList(s, len); | ||||
|   CACHE_REGS | ||||
|   seq_tv_t inp, out; | ||||
|   inp.val.w = s; | ||||
|   inp.type = YAP_STRING_WCHARS; | ||||
|   out.type = YAP_STRING_CODES|YAP_STRING_NCHARS|YAP_STRING_TRUNC; | ||||
|   out.sz = len; | ||||
|   out.max = len; | ||||
|   if (!Yap_CVT_Text(&inp, &out PASS_REGS)) | ||||
|     return 0L; | ||||
|   t = out.val.t; | ||||
|  | ||||
|   RECOVER_H(); | ||||
|   return t; | ||||
| @@ -2131,7 +2131,14 @@ YAP_BufferToAtomList(char *s) | ||||
|   Term t;  | ||||
|   BACKUP_H(); | ||||
|  | ||||
|   t = Yap_StringToListOfAtoms(s); | ||||
|   CACHE_REGS | ||||
|   seq_tv_t inp, out; | ||||
|   inp.val.c = s; | ||||
|   inp.type = YAP_STRING_CHARS; | ||||
|   out.type = YAP_STRING_ATOMS; | ||||
|   if (!Yap_CVT_Text(&inp, &out PASS_REGS)) | ||||
|     return 0L; | ||||
|   t = out.val.t; | ||||
|  | ||||
|   RECOVER_H(); | ||||
|   return t; | ||||
| @@ -2144,7 +2151,16 @@ YAP_NBufferToAtomList(char *s, size_t len) | ||||
|   Term t;  | ||||
|   BACKUP_H(); | ||||
|  | ||||
|   t = Yap_NStringToListOfAtoms(s, len); | ||||
|   CACHE_REGS | ||||
|   seq_tv_t inp, out; | ||||
|   inp.val.c = s; | ||||
|   inp.type = YAP_STRING_CHARS; | ||||
|   out.type = YAP_STRING_ATOMS|YAP_STRING_NCHARS|YAP_STRING_TRUNC; | ||||
|   out.sz = len; | ||||
|   out.max = len; | ||||
|   if (!Yap_CVT_Text(&inp, &out PASS_REGS)) | ||||
|     return 0L; | ||||
|   t = out.val.t; | ||||
|  | ||||
|   RECOVER_H(); | ||||
|   return t; | ||||
| @@ -2157,7 +2173,14 @@ YAP_WideBufferToAtomList(wchar_t *s) | ||||
|   Term t;  | ||||
|   BACKUP_H(); | ||||
|  | ||||
|   t = Yap_WideStringToListOfAtoms(s); | ||||
|   CACHE_REGS | ||||
|   seq_tv_t inp, out; | ||||
|   inp.val.w = s; | ||||
|   inp.type = YAP_STRING_WCHARS; | ||||
|   out.type = YAP_STRING_ATOMS; | ||||
|   if (!Yap_CVT_Text(&inp, &out PASS_REGS)) | ||||
|     return 0L; | ||||
|   t = out.val.t; | ||||
|  | ||||
|   RECOVER_H(); | ||||
|   return t; | ||||
| @@ -2170,7 +2193,16 @@ YAP_NWideBufferToAtomList(wchar_t *s, size_t len) | ||||
|   Term t;  | ||||
|   BACKUP_H(); | ||||
|  | ||||
|   t = Yap_NWideStringToListOfAtoms(s, len); | ||||
|   CACHE_REGS | ||||
|   seq_tv_t inp, out; | ||||
|   inp.val.w = s; | ||||
|   inp.type = YAP_STRING_WCHARS; | ||||
|   out.type = YAP_STRING_ATOMS|YAP_STRING_NCHARS|YAP_STRING_TRUNC; | ||||
|   out.sz = len; | ||||
|   out.max = len; | ||||
|   if (!Yap_CVT_Text(&inp, &out PASS_REGS)) | ||||
|     return 0L; | ||||
|   t = out.val.t; | ||||
|  | ||||
|   RECOVER_H(); | ||||
|   return t; | ||||
| @@ -2183,7 +2215,17 @@ YAP_NWideBufferToAtomDiffList(wchar_t *s, Term t0, size_t len) | ||||
|   Term t;  | ||||
|   BACKUP_H(); | ||||
|  | ||||
|   t = Yap_NWideStringToDiffListOfAtoms(s, t0, len); | ||||
|   CACHE_REGS | ||||
|   seq_tv_t inp, out; | ||||
|   inp.val.w = s; | ||||
|   inp.type = YAP_STRING_WCHARS; | ||||
|   out.type = YAP_STRING_ATOMS|YAP_STRING_NCHARS|YAP_STRING_TRUNC|YAP_STRING_DIFF; | ||||
|   out.sz = len; | ||||
|   out.max = len; | ||||
|   out.dif = t0; | ||||
|   if (!Yap_CVT_Text(&inp, &out PASS_REGS)) | ||||
|     return 0L; | ||||
|   t = out.val.t; | ||||
|  | ||||
|   RECOVER_H(); | ||||
|   return t; | ||||
| @@ -2193,11 +2235,18 @@ YAP_NWideBufferToAtomDiffList(wchar_t *s, Term t0, size_t len) | ||||
| X_API Term | ||||
| YAP_BufferToDiffList(char *s, Term t0) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   Term t;  | ||||
|   BACKUP_H(); | ||||
|  | ||||
|   t = Yap_StringToDiffList(s, t0 PASS_REGS); | ||||
|   CACHE_REGS | ||||
|   seq_tv_t inp, out; | ||||
|   inp.val.c = s; | ||||
|   inp.type = YAP_STRING_CHARS; | ||||
|   out.type = YAP_STRING_CODES|YAP_STRING_DIFF; | ||||
|   out.dif = t0; | ||||
|   if (!Yap_CVT_Text(&inp, &out PASS_REGS)) | ||||
|     return 0L; | ||||
|   t = out.val.t; | ||||
|  | ||||
|   RECOVER_H(); | ||||
|   return t; | ||||
| @@ -2210,7 +2259,17 @@ YAP_NBufferToDiffList(char *s, Term t0, size_t len) | ||||
|   Term t;  | ||||
|   BACKUP_H(); | ||||
|  | ||||
|   t = Yap_NStringToDiffList(s, t0, len); | ||||
|   CACHE_REGS | ||||
|   seq_tv_t inp, out; | ||||
|   inp.val.c = s; | ||||
|   inp.type = YAP_STRING_CHARS; | ||||
|   out.type = YAP_STRING_CODES|YAP_STRING_NCHARS|YAP_STRING_TRUNC|YAP_STRING_DIFF; | ||||
|   out.sz = len; | ||||
|   out.max = len; | ||||
|   out.dif = t0; | ||||
|   if (!Yap_CVT_Text(&inp, &out PASS_REGS)) | ||||
|     return 0L; | ||||
|   t = out.val.t; | ||||
|  | ||||
|   RECOVER_H(); | ||||
|   return t; | ||||
| @@ -2223,7 +2282,15 @@ YAP_WideBufferToDiffList(wchar_t *s, Term t0) | ||||
|   Term t;  | ||||
|   BACKUP_H(); | ||||
|  | ||||
|   t = Yap_WideStringToDiffList(s, t0); | ||||
|   CACHE_REGS | ||||
|   seq_tv_t inp, out; | ||||
|   inp.val.w = s; | ||||
|   inp.type = YAP_STRING_WCHARS; | ||||
|   out.type = YAP_STRING_CODES|YAP_STRING_DIFF; | ||||
|   out.dif = t0; | ||||
|   if (!Yap_CVT_Text(&inp, &out PASS_REGS)) | ||||
|     return 0L; | ||||
|   t = out.val.t; | ||||
|  | ||||
|   RECOVER_H(); | ||||
|   return t; | ||||
| @@ -2236,7 +2303,17 @@ YAP_NWideBufferToDiffList(wchar_t *s, Term t0, size_t len) | ||||
|   Term t;  | ||||
|   BACKUP_H(); | ||||
|  | ||||
|   t = Yap_NWideStringToDiffList(s, t0, len); | ||||
|   CACHE_REGS | ||||
|   seq_tv_t inp, out; | ||||
|   inp.val.w = s; | ||||
|   inp.type = YAP_STRING_WCHARS; | ||||
|   out.type = YAP_STRING_CODES|YAP_STRING_NCHARS|YAP_STRING_TRUNC|YAP_STRING_DIFF; | ||||
|   out.sz = len; | ||||
|   out.max = len; | ||||
|   out.dif = t0; | ||||
|   if (!Yap_CVT_Text(&inp, &out PASS_REGS)) | ||||
|     return 0L; | ||||
|   t = out.val.t; | ||||
|  | ||||
|   RECOVER_H(); | ||||
|   return t; | ||||
| @@ -2300,9 +2377,9 @@ run_emulator(YAP_dogoalinfo *dgi USES_REGS) | ||||
| { | ||||
|   int out; | ||||
|  | ||||
|   LOCAL_PrologMode = UserMode; | ||||
|   LOCAL_PrologMode &= ~(UserCCallMode|CCallMode); | ||||
|   out = Yap_absmi(0); | ||||
|   LOCAL_PrologMode = UserCCallMode; | ||||
|   LOCAL_PrologMode |= UserCCallMode; | ||||
|   return out; | ||||
| } | ||||
|  | ||||
| @@ -2313,6 +2390,7 @@ YAP_EnterGoal(PredEntry *pe, Term *ptr, YAP_dogoalinfo *dgi) | ||||
|   int out; | ||||
|  | ||||
|   BACKUP_MACHINE_REGS(); | ||||
|   LOCAL_PrologMode = UserMode; | ||||
|   dgi->p = P; | ||||
|   dgi->cp = CP; | ||||
|   dgi->CurSlot = LOCAL_CurSlot; | ||||
| @@ -2380,7 +2458,7 @@ YAP_LeaveGoal(int backtrack, YAP_dogoalinfo *dgi) | ||||
|     P = FAILCODE; | ||||
|     Yap_exec_absmi(TRUE); | ||||
|     /* recover stack space */ | ||||
|     H = B->cp_h; | ||||
|     HR = B->cp_h; | ||||
|     TR = B->cp_tr; | ||||
| #ifdef DEPTH_LIMIT | ||||
|     DEPTH = B->cp_depth; | ||||
| @@ -2506,6 +2584,12 @@ YAP_OpaqueObjectFromTerm(Term t) | ||||
|   return ExternalBlobFromTerm (t); | ||||
| } | ||||
|  | ||||
| X_API CELL * | ||||
| YAP_HeapStoreOpaqueTerm(Term t) | ||||
| { | ||||
|   return Yap_HeapStoreOpaqueTerm(t); | ||||
| } | ||||
|  | ||||
| X_API Int | ||||
| YAP_RunGoalOnce(Term t) | ||||
| { | ||||
| @@ -2610,7 +2694,7 @@ YAP_ShutdownGoal(int backtrack) | ||||
|       P = FAILCODE; | ||||
|       Yap_exec_absmi(TRUE); | ||||
|       /* recover stack space */ | ||||
|       H = cut_pt->cp_h; | ||||
|       HR = cut_pt->cp_h; | ||||
|       TR = cut_pt->cp_tr; | ||||
|     } | ||||
|     /* we can always recover the stack */ | ||||
| @@ -2767,7 +2851,7 @@ YAP_Read(IOSTREAM *inp) | ||||
|   BACKUP_MACHINE_REGS(); | ||||
|  | ||||
|  | ||||
|   tokstart = LOCAL_tokptr = LOCAL_toktide = Yap_tokenizer(inp, FALSE, &tpos); | ||||
|   tokstart = LOCAL_tokptr = LOCAL_toktide = Yap_tokenizer(inp, FALSE, &tpos, &rd); | ||||
|   if (LOCAL_ErrorMessage) | ||||
|     { | ||||
|       Yap_clean_tokenizer(tokstart, LOCAL_VarTable, LOCAL_AnonVarTable, LOCAL_Comments); | ||||
| @@ -3087,7 +3171,11 @@ YAP_Init(YAP_init_args *yap_init) | ||||
| #endif /* YAPOR || TABLING */ | ||||
| #ifdef YAPOR | ||||
|     Yap_init_yapor_workers(); | ||||
| #if YAPOR_THREADS | ||||
|     if (Yap_thread_self() != 0) { | ||||
| #else | ||||
|     if (worker_id != 0) { | ||||
| #endif | ||||
| #if defined(YAPOR_COPY) || defined(YAPOR_SBA) | ||||
|       /* | ||||
| 	In the SBA we cannot just happily inherit registers | ||||
| @@ -3131,21 +3219,6 @@ YAP_Init(YAP_init_args *yap_init) | ||||
|     */ | ||||
|     yap_flags[HALT_AFTER_CONSULT_FLAG] = yap_init->HaltAfterConsult; | ||||
|   } | ||||
| #ifdef MYDDAS_MYSQL | ||||
|   if (yap_init->myddas) { | ||||
|     Yap_PutValue(AtomMyddasGoal,MkIntegerTerm(yap_init->myddas)); | ||||
|      | ||||
|     /* Mandatory Fields */ | ||||
|     Yap_PutValue(AtomMyddasUser,MkAtomTerm(Yap_LookupAtom(yap_init->myddas_user))); | ||||
|     Yap_PutValue(AtomMyddasDB,MkAtomTerm(Yap_LookupAtom(yap_init->myddas_db))); | ||||
|      | ||||
|     /* Non-Mandatory Fields */ | ||||
|     if (yap_init->myddas_pass != NULL) | ||||
|       Yap_PutValue(AtomMyddasPass,MkAtomTerm(Yap_LookupAtom(yap_init->myddas_pass))); | ||||
|     if (yap_init->myddas_host != NULL) | ||||
|       Yap_PutValue(AtomMyddasHost,MkAtomTerm(Yap_LookupAtom(yap_init->myddas_host))); | ||||
|   } | ||||
| #endif | ||||
|   if (yap_init->YapPrologTopLevelGoal) { | ||||
|     Yap_PutValue(AtomTopLevelGoal, MkAtomTerm(Yap_LookupAtom(yap_init->YapPrologTopLevelGoal))); | ||||
|   } | ||||
| @@ -3168,12 +3241,13 @@ YAP_Init(YAP_init_args *yap_init) | ||||
|       Yap_AttsSize = Atts*1024; | ||||
|     else | ||||
|       Yap_AttsSize = 2048*sizeof(CELL); | ||||
|       /* reset stacks */ | ||||
|     //    Yap_StartSlots( PASS_REGS1 ); | ||||
|     if (restore_result == DO_ONLY_CODE) { | ||||
|       /* first, initialise the saved state */ | ||||
|       Term t_goal = MkAtomTerm(AtomInitProlog); | ||||
|       YAP_RunGoalOnce(t_goal); | ||||
|       //      Yap_InitYaamRegs( 0 ); | ||||
|       /* reset stacks */ | ||||
|       Yap_InitYaamRegs( 0 ); | ||||
|       return YAP_BOOT_FROM_SAVED_CODE; | ||||
|     } else { | ||||
|       return YAP_BOOT_FROM_SAVED_STACKS; | ||||
| @@ -3284,9 +3358,6 @@ YAP_Reset(void) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   int res = TRUE; | ||||
| #if !defined(YAPOR) && !defined(THREADS) | ||||
|   int worker_id = 0; | ||||
| #endif | ||||
|   BACKUP_MACHINE_REGS(); | ||||
|  | ||||
|   YAP_ClearExceptions(); | ||||
| @@ -3304,6 +3375,9 @@ YAP_Reset(void) | ||||
|   /* the first real choice-point will also have AP=FAIL */  | ||||
|   /* always have an empty slots for people to use */ | ||||
|   P = CP = YESCODE; | ||||
|   // ensure that we have slots where we need them | ||||
|   LOCAL_CurSlot = 0; | ||||
|   Yap_StartSlots( PASS_REGS1 ); | ||||
|   RECOVER_MACHINE_REGS(); | ||||
|   return res; | ||||
| } | ||||
| @@ -3423,23 +3497,16 @@ X_API void | ||||
| YAP_UserBackCPredicate(char *name, CPredicate init, CPredicate cont, | ||||
| 		   UInt arity, unsigned int extra) | ||||
| { | ||||
| #ifdef CUT_C | ||||
|   Yap_InitCPredBackCut(name, arity, extra, init, cont, NULL ,UserCPredFlag); | ||||
| #else | ||||
|   Yap_InitCPredBack(name, arity, extra, init, cont, UserCPredFlag); | ||||
| #endif | ||||
|  | ||||
| } | ||||
|  | ||||
| #ifdef CUT_C | ||||
| X_API void  | ||||
| YAP_UserBackCutCPredicate(char *name, CPredicate init, CPredicate cont, CPredicate cut, | ||||
| 			  UInt arity, unsigned int extra) | ||||
| { | ||||
|   Yap_InitCPredBackCut(name, arity, extra, init, cont, cut, UserCPredFlag); | ||||
| } | ||||
| #endif | ||||
|  | ||||
|  | ||||
| X_API void | ||||
| YAP_UserCPredicateWithArgs(char *a, CPredicate f, UInt arity, Term mod) | ||||
| @@ -3607,8 +3674,8 @@ YAP_FloatsToList(double *dblp, size_t sz) | ||||
|  | ||||
|   if (!sz) | ||||
|     return TermNil; | ||||
|   while (ASP-1024 < H + sz*(2+2+SIZEOF_DOUBLE/SIZEOF_LONG_INT)) { | ||||
|     if ((CELL *)dblp > H0 && (CELL *)dblp < H) { | ||||
|   while (ASP-1024 < HR + sz*(2+2+SIZEOF_DOUBLE/SIZEOF_INT_P)) { | ||||
|     if ((CELL *)dblp > H0 && (CELL *)dblp < HR) { | ||||
|       /* we are in trouble */ | ||||
|       LOCAL_OpenArray =  (CELL *)dblp; | ||||
|     } | ||||
| @@ -3619,12 +3686,12 @@ YAP_FloatsToList(double *dblp, size_t sz) | ||||
|     dblp = (double *)LOCAL_OpenArray; | ||||
|     LOCAL_OpenArray = NULL; | ||||
|   } | ||||
|   t = AbsPair(H); | ||||
|   t = AbsPair(HR); | ||||
|   while (sz) { | ||||
|     oldH = H; | ||||
|     H +=2; | ||||
|     oldH = HR; | ||||
|     HR +=2; | ||||
|     oldH[0] = MkFloatTerm(*dblp++); | ||||
|     oldH[1] = AbsPair(H); | ||||
|     oldH[1] = AbsPair(HR); | ||||
|     sz--; | ||||
|   } | ||||
|   oldH[1] = TermNil; | ||||
| @@ -3679,8 +3746,8 @@ YAP_IntsToList(Int *dblp, size_t sz) | ||||
|  | ||||
|   if (!sz) | ||||
|     return TermNil; | ||||
|   while (ASP-1024 < H + sz*3) { | ||||
|     if ((CELL *)dblp > H0 && (CELL *)dblp < H) { | ||||
|   while (ASP-1024 < HR + sz*3) { | ||||
|     if ((CELL *)dblp > H0 && (CELL *)dblp < HR) { | ||||
|       /* we are in trouble */ | ||||
|       LOCAL_OpenArray =  (CELL *)dblp; | ||||
|     } | ||||
| @@ -3691,12 +3758,12 @@ YAP_IntsToList(Int *dblp, size_t sz) | ||||
|     dblp = (Int *)LOCAL_OpenArray; | ||||
|     LOCAL_OpenArray = NULL; | ||||
|   } | ||||
|   t = AbsPair(H); | ||||
|   t = AbsPair(HR); | ||||
|   while (sz) { | ||||
|     oldH = H; | ||||
|     H +=2; | ||||
|     oldH = HR; | ||||
|     HR +=2; | ||||
|     oldH[0] = MkIntegerTerm(*dblp++); | ||||
|     oldH[1] = AbsPair(H); | ||||
|     oldH[1] = AbsPair(HR); | ||||
|     sz--; | ||||
|   } | ||||
|   oldH[1] = TermNil; | ||||
| @@ -3735,14 +3802,14 @@ YAP_OpenList(int n) | ||||
|   Term t; | ||||
|   BACKUP_H(); | ||||
|  | ||||
|   while (H+2*n > ASP-1024) { | ||||
|   while (HR+2*n > ASP-1024) { | ||||
|     if (!Yap_dogc( 0, NULL PASS_REGS )) { | ||||
|       RECOVER_H(); | ||||
|       return FALSE; | ||||
|     } | ||||
|   } | ||||
|   t = AbsPair(H); | ||||
|   H += 2*n; | ||||
|   t = AbsPair(HR); | ||||
|   HR += 2*n; | ||||
|  | ||||
|   RECOVER_H(); | ||||
|   return t; | ||||
| @@ -3955,7 +4022,7 @@ YAP_SetYAPFlag(yap_flag_t flag, int val) | ||||
| Int YAP_VarSlotToNumber(Int s) { | ||||
|   CACHE_REGS | ||||
|   Term *t = (CELL *)Deref(Yap_GetFromSlot(s PASS_REGS)); | ||||
|   if (t < H) | ||||
|   if (t < HR) | ||||
|     return t-H0; | ||||
|   return t-LCL0; | ||||
| } | ||||
| @@ -4165,11 +4232,11 @@ YAP_RequiresExtraStack(size_t sz) { | ||||
|  | ||||
|   if (sz < 16*1024)  | ||||
|     sz = 16*1024; | ||||
|   if (H <= ASP-sz) { | ||||
|   if (HR <= ASP-sz) { | ||||
|     return FALSE; | ||||
|   } | ||||
|   BACKUP_H(); | ||||
|   while (H > ASP-sz) { | ||||
|   while (HR > ASP-sz) { | ||||
|     CACHE_REGS | ||||
|     RECOVER_H(); | ||||
|     if (!Yap_dogc( 0, NULL PASS_REGS )) { | ||||
|   | ||||
							
								
								
									
										429
									
								
								C/cdmgr.c
									
									
									
									
									
								
							
							
						
						
									
										429
									
								
								C/cdmgr.c
									
									
									
									
									
								
							| @@ -515,7 +515,6 @@ static Int  p_call_count_info( USES_REGS1 ); | ||||
| static Int  p_call_count_set( USES_REGS1 ); | ||||
| static Int  p_call_count_reset( USES_REGS1 ); | ||||
| static Int  p_toggle_static_predicates_in_use( USES_REGS1 ); | ||||
| static Atom  YapConsultingFile( USES_REGS1 ); | ||||
| static Int  PredForCode(yamop *, Atom *, UInt *, Term *); | ||||
| static void  kill_first_log_iblock(LogUpdIndex *, LogUpdIndex *, PredEntry *); | ||||
| static LogUpdIndex *find_owner_log_index(LogUpdIndex *, yamop *); | ||||
| @@ -523,7 +522,6 @@ static StaticIndex *find_owner_static_index(StaticIndex *, yamop *); | ||||
|  | ||||
| #define PredArity(p) (p->ArityOfPE) | ||||
| #define TRYCODE(G,F,N) ( (N)<5 ? (op_numbers)((int)F+(N)*3) : G) | ||||
| #define NEXTOP(V,TYPE)    ((yamop *)(&((V)->u.TYPE.next))) | ||||
|  | ||||
| #define IN_BLOCK(P,B,SZ)     ((CODEADDR)(P) >= (CODEADDR)(B) && \ | ||||
| 			      (CODEADDR)(P) < (CODEADDR)(B)+(SZ)) | ||||
| @@ -2033,7 +2031,7 @@ not_was_reconsulted(PredEntry *p, Term t, int mode) | ||||
| 	!(p->PredFlags & MultiFileFlag)) /* we are in reconsult mode */ { | ||||
|       retract_all(p, static_in_use(p,TRUE)); | ||||
|     } | ||||
|     p->src.OwnerFile = YapConsultingFile( PASS_REGS1 ); | ||||
|     p->src.OwnerFile = Yap_ConsultingFile( PASS_REGS1 ); | ||||
|   } | ||||
|   return TRUE;		/* careful */ | ||||
| } | ||||
| @@ -2363,7 +2361,7 @@ addclause(Term t, yamop *cp, int mode, Term mod, Term *t4ref) | ||||
|   if (pflags & MultiFileFlag) { | ||||
|     /* add Info on new clause for multifile predicates to the DB */ | ||||
|     Term t[5], tn; | ||||
|     t[0] = MkAtomTerm(YapConsultingFile( PASS_REGS1 )); | ||||
|     t[0] = MkAtomTerm(Yap_ConsultingFile( PASS_REGS1 )); | ||||
|     t[1] = MkAtomTerm(at); | ||||
|     t[2] = MkIntegerTerm(Arity); | ||||
|     t[3] = mod; | ||||
| @@ -2571,8 +2569,8 @@ p_compile_dynamic( USES_REGS1 ) | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| static Atom | ||||
| YapConsultingFile ( USES_REGS1 ) | ||||
| Atom | ||||
| Yap_ConsultingFile ( USES_REGS1 ) | ||||
| { | ||||
|   if (LOCAL_consult_level == 0) { | ||||
|     return(AtomUser); | ||||
| @@ -2581,13 +2579,6 @@ YapConsultingFile ( USES_REGS1 ) | ||||
|   } | ||||
| } | ||||
|  | ||||
| Atom | ||||
| Yap_ConsultingFile ( void ) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   return YapConsultingFile( PASS_REGS1 ); | ||||
| } | ||||
|  | ||||
| /* consult file *file*, *mode* may be one of either consult or reconsult */ | ||||
| static void | ||||
| init_consult(int mode, char *file) | ||||
| @@ -2735,6 +2726,57 @@ p_purge_clauses( USES_REGS1 ) | ||||
|    | ||||
| ******************************************************************/ | ||||
|  | ||||
| static Int  | ||||
| p_is_no_trace( USES_REGS1 ) | ||||
| {				/* '$undefined'(P,Mod)	 */ | ||||
|   PredEntry      *pe; | ||||
|  | ||||
|   pe = get_pred(Deref(ARG1), Deref(ARG2), "undefined/1"); | ||||
|   if (EndOfPAEntr(pe)) | ||||
|     return TRUE; | ||||
|   PELOCK(36,pe); | ||||
|   if (pe->ExtraPredFlags & NoTracePredFlag) { | ||||
|     UNLOCKPE(57,pe); | ||||
|     return TRUE; | ||||
|   } | ||||
|   UNLOCKPE(59,pe); | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
|  | ||||
| static Int  | ||||
| p_set_no_trace( USES_REGS1 ) | ||||
| {				/* '$set_no_trace'(+Fun,+M)	 */ | ||||
|   PredEntry      *pe; | ||||
|  | ||||
|   pe = get_pred(Deref(ARG1), Deref(ARG2), "undefined/1"); | ||||
|   if (EndOfPAEntr(pe)) | ||||
|     return FALSE; | ||||
|   PELOCK(36,pe); | ||||
|   pe->ExtraPredFlags |= NoTracePredFlag; | ||||
|   UNLOCKPE(57,pe); | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| int | ||||
| Yap_SetNoTrace(char *name, UInt arity, Term tmod) | ||||
| { | ||||
|   PredEntry      *pe; | ||||
|  | ||||
|   if (arity == 0) { | ||||
|     pe = get_pred(MkAtomTerm(Yap_LookupAtom(name)), tmod, "no_trace"); | ||||
|   } else { | ||||
|     pe = RepPredProp(PredPropByFunc(Yap_MkFunctor(Yap_LookupAtom(name), arity),tmod)); | ||||
|   } | ||||
|   if (EndOfPAEntr(pe)) | ||||
|     return FALSE; | ||||
|   PELOCK(36,pe); | ||||
|   pe->ExtraPredFlags |= NoTracePredFlag; | ||||
|   UNLOCKPE(57,pe); | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
| static Int  | ||||
| p_setspy( USES_REGS1 ) | ||||
| {				/* '$set_spy'(+Fun,+M)	 */ | ||||
| @@ -2941,6 +2983,7 @@ p_new_multifile( USES_REGS1 ) | ||||
|     /* static */ | ||||
|     pe->PredFlags |= (SourcePredFlag|CompiledPredFlag); | ||||
|   } | ||||
|   pe->src.OwnerFile = Yap_ConsultingFile( PASS_REGS1 ); | ||||
|   UNLOCKPE(43,pe); | ||||
|   return (TRUE); | ||||
| } | ||||
| @@ -3049,7 +3092,7 @@ p_mk_d( USES_REGS1 ) | ||||
|   if (pe->OpcodeOfPred == UNDEF_OPCODE) { | ||||
|     pe->OpcodeOfPred = FAIL_OPCODE; | ||||
|   } | ||||
|   pe->src.OwnerFile = YapConsultingFile( PASS_REGS1 ); | ||||
|   pe->src.OwnerFile = Yap_ConsultingFile( PASS_REGS1 ); | ||||
|   UNLOCKPE(50,pe); | ||||
|   return TRUE; | ||||
| } | ||||
| @@ -3468,26 +3511,26 @@ Yap_find_owner_index(yamop *ipc, PredEntry *ap) | ||||
| static Term | ||||
| all_envs(CELL *env_ptr USES_REGS) | ||||
| { | ||||
|   Term tf = AbsPair(H); | ||||
|   CELL *start = H; | ||||
|   Term tf = AbsPair(HR); | ||||
|   CELL *start = HR; | ||||
|   CELL *bp = NULL; | ||||
|    | ||||
|   /* walk the environment chain */ | ||||
|   while (env_ptr) { | ||||
|     bp = H; | ||||
|     H += 2; | ||||
|     bp = HR; | ||||
|     HR += 2; | ||||
|     /* notice that MkIntegerTerm may increase the Heap */ | ||||
|     bp[0] = MkIntegerTerm(LCL0-env_ptr); | ||||
|     if (H >= ASP-1024) { | ||||
|       H = start; | ||||
|       LOCAL_Error_Size = (ASP-1024)-H; | ||||
|     if (HR >= ASP-1024) { | ||||
|       HR = start; | ||||
|       LOCAL_Error_Size = (ASP-1024)-HR; | ||||
|       while (env_ptr) { | ||||
| 	LOCAL_Error_Size += 2; | ||||
| 	env_ptr = (CELL *)(env_ptr[E_E]);       | ||||
|       } | ||||
|       return 0L; | ||||
|     } else { | ||||
|       bp[1] = AbsPair(H); | ||||
|       bp[1] = AbsPair(HR); | ||||
|     } | ||||
|     env_ptr = (CELL *)(env_ptr[E_E]);       | ||||
|   } | ||||
| @@ -3499,24 +3542,24 @@ static Term | ||||
| all_cps(choiceptr b_ptr USES_REGS) | ||||
| { | ||||
|   CELL *bp = NULL; | ||||
|   CELL *start = H; | ||||
|   Term tf = AbsPair(H); | ||||
|   CELL *start = HR; | ||||
|   Term tf = AbsPair(HR); | ||||
|  | ||||
|   while (b_ptr) { | ||||
|     bp = H; | ||||
|     H += 2; | ||||
|     bp = HR; | ||||
|     HR += 2; | ||||
|     /* notice that MkIntegerTerm may increase the Heap */ | ||||
|     bp[0] = MkIntegerTerm((Int)(LCL0-(CELL *)b_ptr)); | ||||
|     if (H >= ASP-1024) { | ||||
|       H = start; | ||||
|       LOCAL_Error_Size = (ASP-1024)-H; | ||||
|     if (HR >= ASP-1024) { | ||||
|       HR = start; | ||||
|       LOCAL_Error_Size = (ASP-1024)-HR; | ||||
|       while (b_ptr) { | ||||
| 	LOCAL_Error_Size += 2; | ||||
| 	b_ptr = b_ptr->cp_b; | ||||
|       } | ||||
|       return 0L; | ||||
|     } else { | ||||
|       bp[1] = AbsPair(H); | ||||
|       bp[1] = AbsPair(HR); | ||||
|     } | ||||
|     b_ptr = b_ptr->cp_b; | ||||
|   } | ||||
| @@ -4940,7 +4983,7 @@ Yap_UpdateTimestamps(PredEntry *ap) | ||||
|       if (bptr->cp_ap->u.OtaLl.d->ClPred == ap) { | ||||
| 	UInt ts = IntegerOfTerm(bptr->cp_args[ar]); | ||||
| 	if (ts != arp[0]) { | ||||
| 	  if (arp-H < 1024) { | ||||
| 	  if (arp-HR < 1024) { | ||||
| 	    goto overflow; | ||||
| 	  } | ||||
| 	  /* be thrifty, have this in case there is a hole */ | ||||
| @@ -4958,7 +5001,7 @@ Yap_UpdateTimestamps(PredEntry *ap) | ||||
| 	  ((PredEntry *)IntegerOfTerm(bptr->cp_args[0]) == ap)) { | ||||
| 	UInt ts = IntegerOfTerm(bptr->cp_args[5]); | ||||
| 	if (ts != arp[0]) { | ||||
| 	  if (arp-H < 1024) { | ||||
| 	  if (arp-HR < 1024) { | ||||
| 	    goto overflow; | ||||
| 	  } | ||||
| 	  if (ts != arp[0]-1) { | ||||
| @@ -5197,79 +5240,6 @@ p_static_clause( USES_REGS1 ) | ||||
|   return fetch_next_static_clause(pe, pe->CodeOfPred, ARG1, ARG3, ARG4, new_cp, TRUE); | ||||
| } | ||||
|  | ||||
| static Int			/* $hidden_predicate(P) */ | ||||
| p_nth_clause( USES_REGS1 ) | ||||
| { | ||||
|   PredEntry      *pe; | ||||
|   Term t1 = Deref(ARG1); | ||||
|   Term tn = Deref(ARG3); | ||||
|   LogUpdClause *cl; | ||||
|   Int ncls; | ||||
|  | ||||
|   Int CurSlot, sl; | ||||
|   if (!IsIntegerTerm(tn)) | ||||
|     return FALSE; | ||||
|   ncls = IntegerOfTerm(tn); | ||||
|   pe = get_pred(t1, Deref(ARG2), "clause/3"); | ||||
|   if (pe == NULL || EndOfPAEntr(pe)) | ||||
|     return FALSE; | ||||
|   PELOCK(47,pe); | ||||
|   if (!(pe->PredFlags & (SourcePredFlag|LogUpdatePredFlag))) { | ||||
|     UNLOCK(pe->PELock); | ||||
|     return FALSE; | ||||
|   } | ||||
|   CurSlot = Yap_StartSlots( PASS_REGS1 ); | ||||
|   sl = Yap_InitSlot( ARG4 PASS_REGS ); | ||||
|   /* in case we have to index or to expand code */ | ||||
|   if (pe->ModuleOfPred != IDB_MODULE) { | ||||
|     UInt i; | ||||
|  | ||||
|     for (i = 1; i <= pe->ArityOfPE; i++) { | ||||
|       XREGS[i] = MkVarTerm(); | ||||
|     } | ||||
|   } else { | ||||
|       XREGS[2] = MkVarTerm(); | ||||
|   } | ||||
|   if(pe->OpcodeOfPred == INDEX_OPCODE) { | ||||
|     IPred(pe, 0, CP); | ||||
|   } | ||||
|   cl = Yap_NthClause(pe, ncls); | ||||
|   ARG4 = Yap_GetFromSlot( sl PASS_REGS ); | ||||
|   LOCAL_CurSlot = CurSlot;   | ||||
|   if (cl == NULL) { | ||||
|     UNLOCK(pe->PELock); | ||||
|     return FALSE; | ||||
|   } | ||||
|   if (pe->PredFlags & LogUpdatePredFlag) { | ||||
| #if MULTIPLE_STACKS | ||||
|     TRAIL_CLREF(cl);		/* So that fail will erase it */ | ||||
|     INC_CLREF_COUNT(cl); | ||||
| #else | ||||
|     if (!(cl->ClFlags & InUseMask)) { | ||||
|       cl->ClFlags |= InUseMask; | ||||
|       TRAIL_CLREF(cl);	/* So that fail will erase it */ | ||||
|     } | ||||
| #endif | ||||
|     UNLOCK(pe->PELock); | ||||
|     return Yap_unify(MkDBRefTerm((DBRef)cl), ARG4); | ||||
|   } else if (pe->PredFlags & MegaClausePredFlag) { | ||||
|     MegaClause *mcl = ClauseCodeToMegaClause(pe->cs.p_code.FirstClause); | ||||
|     if (mcl->ClFlags & ExoMask) { | ||||
|       Term tf[2]; | ||||
|       tf[0] = pe->ModuleOfPred; | ||||
|       tf[1] = Yap_MkApplTerm(pe->FunctorOfPred, pe->ArityOfPE, (CELL *)((char *)mcl->ClCode+(ncls-1)*mcl->ClItemSize)); | ||||
|       UNLOCK(pe->PELock); | ||||
|       return Yap_unify(Yap_MkApplTerm(FunctorExoClause, 2, tf), ARG4); | ||||
|     } | ||||
|     /* fast access to nth element, all have same size */ | ||||
|     UNLOCK(pe->PELock); | ||||
|     return Yap_unify(Yap_MkMegaRefTerm(pe,(yamop *)cl), ARG4); | ||||
|   } else { | ||||
|     UNLOCK(pe->PELock); | ||||
|     return Yap_unify(Yap_MkStaticRefTerm((StaticClause *)cl, pe), ARG4); | ||||
|   } | ||||
| } | ||||
|  | ||||
| static Int			/* $hidden_predicate(P) */ | ||||
| p_continue_static_clause( USES_REGS1 ) | ||||
| { | ||||
| @@ -5583,7 +5553,7 @@ BuildActivePred(PredEntry *ap, CELL *vect) | ||||
|     if (IsVarTerm(t)) { | ||||
|       CELL *pt = VarOfTerm(t); | ||||
|       /* one stack */ | ||||
|       if (pt > H) { | ||||
|       if (pt > HR) { | ||||
| 	Term nt = MkVarTerm(); | ||||
| 	Yap_unify(t, nt); | ||||
|       } | ||||
| @@ -6154,6 +6124,42 @@ p_instance_property( USES_REGS1 ) | ||||
| 	    return Yap_unify(ARG3, MkIntTerm(cl->usc.ClSource->ag.line_number)); | ||||
| 	  } | ||||
| 	} | ||||
|     } else if (FunctorOfTerm(t1) == FunctorMegaClause) { | ||||
|       PredEntry *ap = (PredEntry *)IntegerOfTerm(ArgOfTerm(1, t1)); | ||||
|       MegaClause *mcl = ClauseCodeToMegaClause(ap->cs.p_code.FirstClause); | ||||
|  | ||||
| 	if (op == CL_PROP_ERASED) { | ||||
| 	  return FALSE; | ||||
| 	} | ||||
| 	if (op == CL_PROP_PRED || op == CL_PROP_FILE || op == CL_PROP_STREAM) { | ||||
| 	  if (op == CL_PROP_FILE) { | ||||
| 	    if (ap->src.OwnerFile) | ||||
| 	      return Yap_unify(ARG3,MkAtomTerm(ap->src.OwnerFile)); | ||||
| 	    else | ||||
| 	      return FALSE; | ||||
| 	  } else { | ||||
| 	    Functor nf = ap->FunctorOfPred; | ||||
| 	    UInt arity = ArityOfFunctor(nf); | ||||
| 	    Atom name = NameOfFunctor(nf); | ||||
| 	    Term t[2]; | ||||
| 	     | ||||
| 	    t[0] = MkAtomTerm(name); | ||||
| 	    t[1] = MkIntegerTerm(arity); | ||||
| 	    t[1] = Yap_MkApplTerm(FunctorSlash, 2, t); | ||||
| 	    if (ap->ModuleOfPred == PROLOG_MODULE) { | ||||
| 	      t[0] = MkAtomTerm(AtomProlog); | ||||
| 	    } else { | ||||
| 	      t[0] = ap->ModuleOfPred; | ||||
| 	    } | ||||
| 	    return Yap_unify( ARG3, Yap_MkApplTerm(FunctorModule, 2, t) ); | ||||
| 	  } | ||||
| 	} | ||||
| 	if (op == CL_PROP_FACT) { | ||||
| 	  return Yap_unify(ARG3, MkAtomTerm(AtomTrue)); | ||||
| 	} | ||||
| 	if (op == CL_PROP_LINE) { | ||||
| 	  return Yap_unify(ARG3, MkIntTerm(mcl->ClLine)); | ||||
| 	} | ||||
|       } | ||||
|     } | ||||
|   } else if ((dbr = DBRefOfTerm(t1))->Flags & LogUpdMask) { | ||||
| @@ -6214,6 +6220,213 @@ p_instance_property( USES_REGS1 ) | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
| static Int | ||||
| p_nth_instance( USES_REGS1 ) | ||||
| { | ||||
|   PredEntry      *pe; | ||||
|   UInt pred_arity; | ||||
|   Functor pred_f; | ||||
|   Term pred_module; | ||||
|   Term t4 = Deref(ARG4); | ||||
|  | ||||
|   if (IsVarTerm(t4)) { | ||||
|     // we must know I or count; | ||||
|     Term            TCount; | ||||
|     Int             Count; | ||||
|  | ||||
|     TCount = Deref(ARG3); | ||||
|     if (IsVarTerm(TCount)) { | ||||
|       return FALSE; // backtrack? | ||||
|     } | ||||
|     if (!IsIntegerTerm(TCount)) { | ||||
|       Yap_Error(TYPE_ERROR_INTEGER, TCount, "nth_instance/3"); | ||||
|       return FALSE; | ||||
|     } | ||||
|     Count = IntegerOfTerm(TCount); | ||||
|     if (Count <= 0) { | ||||
|       if (Count)  | ||||
| 	Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, TCount, "nth_clause/3"); | ||||
|       else | ||||
| 	Yap_Error(DOMAIN_ERROR_NOT_ZERO, TCount, "nth_clause/3"); | ||||
|       return FALSE; | ||||
|     } | ||||
|     pe = get_pred(Deref(ARG1), Deref(ARG2), "nth_clause/3"); | ||||
|     if (pe) { | ||||
|       PELOCK(47,pe);  | ||||
|     } | ||||
|     if (Deref(ARG2) == IDB_MODULE) { | ||||
|       return Yap_db_nth_recorded( pe, Count PASS_REGS ); | ||||
|     } else { | ||||
|       Int CurSlot, sl4; | ||||
|       UInt i; | ||||
|       void *cl0; | ||||
|  | ||||
|       if (!pe) | ||||
| 	return FALSE; | ||||
|       if (!(pe->PredFlags & (SourcePredFlag|LogUpdatePredFlag))) { | ||||
| 	UNLOCK(pe->PELock); | ||||
| 	return FALSE; | ||||
|       } | ||||
|       CurSlot = Yap_StartSlots( PASS_REGS1 ); | ||||
|       /* I have pe and n */ | ||||
|       sl4 = Yap_InitSlot( ARG4 PASS_REGS ); | ||||
|       /* in case we have to index or to expand code */ | ||||
|       for (i = 1; i <= pe->ArityOfPE; i++) { | ||||
| 	XREGS[i] = MkVarTerm(); | ||||
|       } | ||||
|       if(pe->OpcodeOfPred == INDEX_OPCODE) { | ||||
| 	IPred(pe, 0, CP); | ||||
|       } | ||||
|       cl0 = Yap_NthClause(pe, Count); | ||||
|       ARG4 = Yap_GetFromSlot( sl4 PASS_REGS ); | ||||
|       LOCAL_CurSlot = CurSlot;   | ||||
|       if (cl0 == NULL) { | ||||
| 	UNLOCK(pe->PELock); | ||||
| 	return FALSE; | ||||
|       } | ||||
|       if (pe->PredFlags & LogUpdatePredFlag) { | ||||
| 	LogUpdClause *cl = cl0; | ||||
| 	 | ||||
| #if MULTIPLE_STACKS | ||||
| 	TRAIL_CLREF(cl);		/* So that fail will erase it */ | ||||
| 	INC_CLREF_COUNT(cl); | ||||
| #else | ||||
| 	if (!(cl->ClFlags & InUseMask)) { | ||||
| 	  cl->ClFlags |= InUseMask; | ||||
| 	  TRAIL_CLREF(cl);	/* So that fail will erase it */ | ||||
| 	} | ||||
| #endif | ||||
| 	UNLOCK(pe->PELock); | ||||
| 	return Yap_unify(MkDBRefTerm((DBRef)cl), ARG4); | ||||
|       } else if (pe->PredFlags & MegaClausePredFlag) { | ||||
| 	MegaClause *mcl = ClauseCodeToMegaClause(pe->cs.p_code.FirstClause); | ||||
| 	if (mcl->ClFlags & ExoMask) { | ||||
| 	  UNLOCK(pe->PELock); | ||||
| 	  return Yap_unify(Yap_MkExoRefTerm(pe,Count-1), ARG4); | ||||
| 	} | ||||
| 	/* fast access to nth element, all have same size */ | ||||
| 	UNLOCK(pe->PELock); | ||||
| 	return Yap_unify(Yap_MkMegaRefTerm(pe,cl0), ARG4); | ||||
|       } else { | ||||
| 	UNLOCK(pe->PELock); | ||||
| 	return Yap_unify(Yap_MkStaticRefTerm(cl0, pe), ARG4); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   /* t4 is bound, we have a reference */ | ||||
|   if (IsDBRefTerm(t4)) { | ||||
|     DBRef ref = DBRefOfTerm(t4); | ||||
|     if (ref->Flags & LogUpdMask) { | ||||
|       LogUpdClause *cl = (LogUpdClause *)ref; | ||||
|       LogUpdClause *ocl; | ||||
|       UInt icl = 0; | ||||
|  | ||||
|       pe = cl->ClPred; | ||||
|       PELOCK(66,pe); | ||||
|       if (cl->ClFlags & ErasedMask) { | ||||
| 	UNLOCK(pe->PELock); | ||||
| 	return FALSE; | ||||
|       } | ||||
|       ocl = ClauseCodeToLogUpdClause(pe->cs.p_code.FirstClause); | ||||
|       do { | ||||
| 	icl++; | ||||
| 	if (cl == ocl) break; | ||||
| 	ocl = ocl->ClNext; | ||||
|       } while (ocl != NULL); | ||||
|       UNLOCK(pe->PELock); | ||||
|       if (ocl == NULL) { | ||||
| 	return FALSE; | ||||
|       } | ||||
|       if (!Yap_unify(ARG3,MkIntegerTerm(icl))) { | ||||
| 	return FALSE; | ||||
|       } | ||||
|     } else { | ||||
|       return Yap_unify_immediate_ref(ref PASS_REGS); | ||||
|     } | ||||
|   } else if (IsApplTerm(t4)) { | ||||
|     Functor f = FunctorOfTerm(t4); | ||||
|      | ||||
|     if (f == FunctorStaticClause) { | ||||
|       StaticClause *cl = Yap_ClauseFromTerm(t4), *cl0; | ||||
|       pe = (PredEntry *)IntegerOfTerm(ArgOfTerm(2, t4)); | ||||
|       Int i; | ||||
|  | ||||
|       if (!pe) { | ||||
| 	return FALSE; | ||||
|       } | ||||
|       if (! pe->cs.p_code.NOfClauses ) | ||||
| 	return FALSE; | ||||
|       cl0 = ClauseCodeToStaticClause(pe->cs.p_code.FirstClause); | ||||
|       //linear scan | ||||
|       for (i = 1; i < pe->cs.p_code.NOfClauses; i++) { | ||||
| 	if (cl0 == cl) { | ||||
| 	  if (!Yap_unify(MkIntTerm(i), ARG3)) | ||||
| 	    return FALSE; | ||||
| 	  break; | ||||
| 	} | ||||
|       } | ||||
|     } else if (f == FunctorMegaClause) { | ||||
|       MegaClause *mcl; | ||||
|       yamop *cl = Yap_MegaClauseFromTerm(t4); | ||||
|       Int i; | ||||
|  | ||||
|       pe = Yap_MegaClausePredicateFromTerm(t4); | ||||
|       mcl = ClauseCodeToMegaClause(pe->cs.p_code.FirstClause); | ||||
|       i = ((char *)cl-(char *)mcl->ClCode)/mcl->ClItemSize; | ||||
|       if (!Yap_unify(MkIntTerm(i), ARG3)) | ||||
| 	return FALSE; | ||||
|     } else if (f == FunctorExoClause) { | ||||
|       Int i; | ||||
|  | ||||
|       pe = Yap_ExoClausePredicateFromTerm(t4); | ||||
|       i = Yap_ExoClauseFromTerm(t4); | ||||
|       if (!Yap_unify(MkIntTerm(i+1), ARG3)) { | ||||
| 	return FALSE; | ||||
|       } | ||||
|     } else { | ||||
|       Yap_Error(TYPE_ERROR_REFERENCE, t4, "nth_clause/3"); | ||||
|       return FALSE; | ||||
|     } | ||||
|   } else { | ||||
|     Yap_Error(TYPE_ERROR_REFERENCE, t4, "nth_clause/3"); | ||||
|     return FALSE; | ||||
|   } | ||||
|   pred_module = pe->ModuleOfPred; | ||||
|   if (pred_module != IDB_MODULE) { | ||||
|     pred_f = pe->FunctorOfPred; | ||||
|     pred_arity = pe->ArityOfPE; | ||||
|   } else { | ||||
|     if (pe->PredFlags & NumberDBPredFlag) { | ||||
|       pred_f = (Functor)MkIntegerTerm(pe->src.IndxId); | ||||
|       pred_arity = 0; | ||||
|     } else { | ||||
|       pred_f = pe->FunctorOfPred; | ||||
|       if (pe->PredFlags & AtomDBPredFlag) { | ||||
| 	pred_arity = 0; | ||||
|       } else { | ||||
| 	pred_arity = ArityOfFunctor(pred_f); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   if (pred_arity) { | ||||
|     if (!Yap_unify(ARG1,Yap_MkNewApplTerm(pred_f, pred_arity))) | ||||
|       return FALSE; | ||||
|   } else { | ||||
|     if (!Yap_unify(ARG1,MkAtomTerm((Atom)pred_f))) | ||||
|       return FALSE; | ||||
|   } | ||||
|   if (pred_module == PROLOG_MODULE) { | ||||
|     if (!Yap_unify(ARG2,TermProlog)) | ||||
|       return FALSE; | ||||
|   } else { | ||||
|     if (!Yap_unify(ARG2,pred_module)) | ||||
|       return FALSE; | ||||
|   }	 | ||||
|   return TRUE;     | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| void  | ||||
| Yap_InitCdMgr(void) | ||||
| { | ||||
| @@ -6249,6 +6462,8 @@ Yap_InitCdMgr(void) | ||||
|   Yap_InitCPred("$kill_dynamic", 2, p_kill_dynamic, SafePredFlag|SyncPredFlag); | ||||
|   Yap_InitCPred("$new_multifile", 3, p_new_multifile, SafePredFlag|SyncPredFlag); | ||||
|   Yap_InitCPred("$is_multifile", 2, p_is_multifile, TestPredFlag | SafePredFlag); | ||||
|   Yap_InitCPred("$is_no_trace", 2, p_is_no_trace, TestPredFlag | SafePredFlag); | ||||
|   Yap_InitCPred("$set_no_trace", 2, p_set_no_trace, TestPredFlag | SafePredFlag); | ||||
|   Yap_InitCPred("$is_profiled", 1, p_is_profiled, SafePredFlag|SyncPredFlag); | ||||
|   Yap_InitCPred("$profile_info", 3, p_profile_info, SafePredFlag|SyncPredFlag); | ||||
|   Yap_InitCPred("$profile_reset", 2, p_profile_reset, SafePredFlag|SyncPredFlag); | ||||
| @@ -6273,9 +6488,9 @@ Yap_InitCdMgr(void) | ||||
|   Yap_InitCPred("$static_clause", 4, p_static_clause, SyncPredFlag); | ||||
|   Yap_InitCPred("$continue_static_clause", 5, p_continue_static_clause, SafePredFlag|SyncPredFlag); | ||||
|   Yap_InitCPred("$static_pred_statistics", 5, p_static_pred_statistics, SyncPredFlag); | ||||
|   Yap_InitCPred("$p_nth_clause", 4, p_nth_clause, SyncPredFlag); | ||||
|   Yap_InitCPred("$program_continuation", 3, p_program_continuation, SafePredFlag|SyncPredFlag); | ||||
|   Yap_InitCPred("$instance_property", 3, p_instance_property, SafePredFlag|SyncPredFlag); | ||||
|   Yap_InitCPred("$fetch_nth_clause", 4, p_nth_instance, SyncPredFlag); | ||||
|   CurrentModule = HACKS_MODULE; | ||||
|   Yap_InitCPred("current_choicepoints", 1, p_all_choicepoints, 0); | ||||
|   Yap_InitCPred("current_continuations", 1, p_all_envs, 0); | ||||
|   | ||||
| @@ -13,14 +13,14 @@ mk_blob(int sz USES_REGS) | ||||
| { | ||||
|   MP_INT *dst; | ||||
|   | ||||
|   H[0] = (CELL)FunctorBigInt; | ||||
|   H[1] = CLAUSE_LIST; | ||||
|   dst = (MP_INT *)(H+2); | ||||
|   HR[0] = (CELL)FunctorBigInt; | ||||
|   HR[1] = CLAUSE_LIST; | ||||
|   dst = (MP_INT *)(HR+2); | ||||
|   dst->_mp_size = 0L; | ||||
|   dst->_mp_alloc = sz; | ||||
|   H += (1+sizeof(MP_INT)/sizeof(CELL)); | ||||
|   H[sz] = EndSpecials; | ||||
|   H += sz+1; | ||||
|   HR += (1+sizeof(MP_INT)/sizeof(CELL)); | ||||
|   HR[sz] = EndSpecials; | ||||
|   HR += sz+1; | ||||
| } | ||||
|  | ||||
| static CELL * | ||||
| @@ -29,14 +29,14 @@ extend_blob(CELL *start, int sz USES_REGS) | ||||
|   UInt osize; | ||||
|   MP_INT *dst; | ||||
|    | ||||
|   if (H + sz > ASP) | ||||
|   if (HR + sz > ASP) | ||||
|     return NULL; | ||||
|   dst = (MP_INT *)(start+2); | ||||
|   osize = dst->_mp_alloc; | ||||
|   start += (1+sizeof(MP_INT)/sizeof(CELL)); | ||||
|   start[sz+osize] = EndSpecials; | ||||
|   dst->_mp_alloc += sz; | ||||
|   H += sz; | ||||
|   HR += sz; | ||||
|   return start+osize; | ||||
| } | ||||
|  | ||||
| @@ -46,9 +46,9 @@ Yap_ClauseListInit(clause_list_t in) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   in->n = 0; | ||||
|   in->start = H; | ||||
|   in->start = HR; | ||||
|   mk_blob(0 PASS_REGS); | ||||
|   in->end = H; | ||||
|   in->end = HR; | ||||
|   return in; | ||||
| } | ||||
|  | ||||
| @@ -61,7 +61,7 @@ Yap_ClauseListExtend(clause_list_t cl, void * clause, void *pred) | ||||
|   PredEntry *ap = (PredEntry *)pred; | ||||
|  | ||||
|   /*  fprintf(stderr,"cl=%p\n",clause); */ | ||||
|   if (cl->end != H) | ||||
|   if (cl->end != HR) | ||||
|     return FALSE; | ||||
|   if (cl->n == 0) { | ||||
|     void **ptr; | ||||
| @@ -112,7 +112,7 @@ Yap_ClauseListExtend(clause_list_t cl, void * clause, void *pred) | ||||
|     code_p = PREVOP(code_p,Otapl); | ||||
|     code_p->opc = Yap_opcode(_retry); | ||||
|   } | ||||
|   cl->end = H; | ||||
|   cl->end = HR; | ||||
|   cl->n++; | ||||
|   return TRUE; | ||||
| } | ||||
| @@ -129,9 +129,9 @@ X_API int | ||||
| Yap_ClauseListDestroy(clause_list_t cl) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   if (cl->end != H) | ||||
|   if (cl->end != HR) | ||||
|     return FALSE; | ||||
|   H = cl->start; | ||||
|   HR = cl->start; | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| @@ -141,7 +141,7 @@ Yap_ClauseListToClause(clause_list_t cl) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   void **ptr; | ||||
|   if (cl->end != H) | ||||
|   if (cl->end != HR) | ||||
|     return NULL; | ||||
|   if (cl->n != 1) | ||||
|     return NULL; | ||||
|   | ||||
							
								
								
									
										76
									
								
								C/cmppreds.c
									
									
									
									
									
								
							
							
						
						
									
										76
									
								
								C/cmppreds.c
									
									
									
									
									
								
							| @@ -82,7 +82,7 @@ static int compare_complex(register CELL *pt0, register CELL *pt0_end, register | ||||
| 		   CELL *pt1) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   register CELL **to_visit = (CELL **)H; | ||||
|   register CELL **to_visit = (CELL **)HR; | ||||
|   register int out = 0; | ||||
|  | ||||
|  loop: | ||||
| @@ -141,6 +141,26 @@ static int compare_complex(register CELL *pt0, register CELL *pt0_end, register | ||||
| 	} | ||||
| 	if (out != 0) | ||||
| 	  goto done; | ||||
|       } else if (IsStringTerm(d0)) { | ||||
| 	if (IsStringTerm(d1)){ | ||||
| 	  out = strcmp(StringOfTerm(d0) , StringOfTerm(d1)); | ||||
| 	} else if (IsIntTerm(d1)) | ||||
| 	  out = 1; | ||||
| 	else if (IsFloatTerm(d1)) { | ||||
| 	  out = 1; | ||||
| 	} else if (IsLongIntTerm(d1)) { | ||||
| 	  out = 1; | ||||
| #ifdef USE_GMP | ||||
| 	} else if (IsBigIntTerm(d1)) { | ||||
| 	  out = 1; | ||||
| #endif | ||||
| 	} else if (IsRefTerm(d1)) { | ||||
| 	  out = 1 ; | ||||
| 	} else { | ||||
| 	  out = -1; | ||||
| 	} | ||||
| 	if (out != 0) | ||||
| 	  goto done; | ||||
|       } else if (IsLongIntTerm(d0)) { | ||||
| 	if (IsIntTerm(d1)) | ||||
| 	  out = LongIntOfTerm(d0) - IntOfTerm(d1); | ||||
| @@ -269,7 +289,7 @@ static int compare_complex(register CELL *pt0, register CELL *pt0_end, register | ||||
|     } | ||||
|   } | ||||
|   /* Do we still have compound terms to visit */ | ||||
|   if (to_visit > (CELL **)H) { | ||||
|   if (to_visit > (CELL **)HR) { | ||||
| #ifdef RATIONAL_TREES | ||||
|     to_visit -= 4; | ||||
|     pt0 = to_visit[0]; | ||||
| @@ -288,7 +308,7 @@ static int compare_complex(register CELL *pt0, register CELL *pt0_end, register | ||||
|  done: | ||||
|   /* failure */ | ||||
| #ifdef RATIONAL_TREES | ||||
|   while (to_visit > (CELL **)H) { | ||||
|   while (to_visit > (CELL **)HR) { | ||||
|     to_visit -= 4; | ||||
|     pt0 = to_visit[0]; | ||||
|     pt0_end = to_visit[1]; | ||||
| @@ -319,24 +339,30 @@ compare(Term t1, Term t2) /* compare terms t1 and t2	 */ | ||||
| 	return cmp_atoms(AtomOfTerm(t1),AtomOfTerm(t2)); | ||||
|       if (IsPrimitiveTerm(t2)) | ||||
| 	return 1; | ||||
|       if (IsStringTerm(t2)) | ||||
| 	return 1; | ||||
|       return -1; | ||||
|     } else { | ||||
|       if (IsIntTerm(t2)) { | ||||
| 	return IntOfTerm(t1) - IntOfTerm(t2); | ||||
|       } | ||||
|       if (IsFloatTerm(t2)) { | ||||
| 	return 1; | ||||
|       } | ||||
|       if (IsLongIntTerm(t2)) { | ||||
| 	return IntOfTerm(t1) - LongIntOfTerm(t2); | ||||
|       } | ||||
|       if (IsApplTerm(t2)) { | ||||
| 	Functor fun2 = FunctorOfTerm(t2); | ||||
| 	switch ((CELL)fun2) { | ||||
| 	case double_e: | ||||
| 	  return 1; | ||||
| 	case long_int_e: | ||||
| 	  return IntOfTerm(t1) - LongIntOfTerm(t2); | ||||
| #ifdef USE_GMP | ||||
|       if (IsBigIntTerm(t2)) { | ||||
| 	return Yap_gmp_tcmp_int_big(IntOfTerm(t1), t2); | ||||
|       } | ||||
| 	case big_int_e: | ||||
| 	  return Yap_gmp_tcmp_int_big(IntOfTerm(t1), t2); | ||||
| #endif | ||||
|       if (IsRefTerm(t2)) | ||||
| 	return 1; | ||||
| 	case db_ref_e: | ||||
| 	  return 1; | ||||
| 	case string_e: | ||||
| 	  return -1; | ||||
| 	} | ||||
|       } | ||||
|       return -1; | ||||
|     } | ||||
|   } else if (IsPairTerm(t1)) { | ||||
| @@ -408,6 +434,28 @@ compare(Term t1, Term t2) /* compare terms t1 and t2	 */ | ||||
| 	  return -1; | ||||
| 	} | ||||
| #endif | ||||
|       case string_e: | ||||
| 	{ | ||||
| 	  if (IsApplTerm(t2)) { | ||||
| 	    Functor fun2 = FunctorOfTerm(t2); | ||||
| 	    switch ((CELL)fun2) { | ||||
| 	    case double_e: | ||||
| 	      return 1; | ||||
| 	    case long_int_e: | ||||
| 	      return 1; | ||||
| #ifdef USE_GMP | ||||
| 	    case big_int_e: | ||||
| 	      return 1; | ||||
| #endif | ||||
| 	    case db_ref_e: | ||||
| 	      return 1; | ||||
| 	    case string_e: | ||||
| 	      return strcmp(StringOfTerm(t1), StringOfTerm(t2)); | ||||
| 	    } | ||||
| 	    return -1; | ||||
| 	  } | ||||
| 	  return -1; | ||||
| 	} | ||||
|       case db_ref_e: | ||||
| 	if (IsRefTerm(t2)) | ||||
| 	  return Unsigned(RefOfTerm(t2)) - | ||||
|   | ||||
							
								
								
									
										119
									
								
								C/compiler.c
									
									
									
									
									
								
							
							
						
						
									
										119
									
								
								C/compiler.c
									
									
									
									
									
								
							| @@ -510,10 +510,10 @@ optimize_ce(Term t, unsigned int arity, unsigned int level, compiler_struct *cgl | ||||
|   if (IsApplTerm(t) && IsExtensionFunctor(FunctorOfTerm(t))) | ||||
|     return (t); | ||||
|   while (p != NULL) { | ||||
|     CELL *oldH = H; | ||||
|     H = (CELL *)cglobs->cint.freep; | ||||
|     CELL *oldH = HR; | ||||
|     HR = (CELL *)cglobs->cint.freep; | ||||
|     cmp = Yap_compare_terms(t, (p->TermOfCE)); | ||||
|     H = oldH; | ||||
|     HR = oldH; | ||||
|  | ||||
|     if (cmp) { | ||||
|       p = p->NextCE; | ||||
| @@ -533,7 +533,7 @@ optimize_ce(Term t, unsigned int arity, unsigned int level, compiler_struct *cgl | ||||
|  | ||||
|   p->TermOfCE = t; | ||||
|   p->VarOfCE = MkVarTerm(); | ||||
|   if (H >= (CELL *)cglobs->cint.freep0) { | ||||
|   if (HR >= (CELL *)cglobs->cint.freep0) { | ||||
|     /* oops, too many new variables */ | ||||
|     save_machine_regs(); | ||||
|     siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH); | ||||
| @@ -614,7 +614,7 @@ try_store_as_dbterm(Term t, Int argno, unsigned int arity, int level, compiler_s | ||||
|   CACHE_REGS | ||||
|   DBTerm *dbt; | ||||
|   int g; | ||||
|   CELL *h0 = H; | ||||
|   CELL *h0 = HR; | ||||
|  | ||||
|   while ((g=Yap_SizeGroundTerm(t,TRUE)) < 0) { | ||||
|     /* oops, too deep a term */ | ||||
| @@ -625,9 +625,9 @@ try_store_as_dbterm(Term t, Int argno, unsigned int arity, int level, compiler_s | ||||
|   if (g < 16) | ||||
|     return FALSE; | ||||
|   /* store ground term away */ | ||||
|   H = CellPtr(cglobs->cint.freep); | ||||
|   HR = CellPtr(cglobs->cint.freep); | ||||
|   if ((dbt = Yap_StoreTermInDB(t, -1)) == NULL) { | ||||
|     H = h0; | ||||
|     HR = h0; | ||||
|     switch(LOCAL_Error_TYPE) { | ||||
|     case OUT_OF_STACK_ERROR: | ||||
|       LOCAL_Error_TYPE = YAP_NO_ERROR; | ||||
| @@ -645,7 +645,7 @@ try_store_as_dbterm(Term t, Int argno, unsigned int arity, int level, compiler_s | ||||
|       siglongjmp(cglobs->cint.CompilerBotch,COMPILER_ERR_BOTCH); | ||||
|     } | ||||
|   } | ||||
|   H = h0; | ||||
|   HR = h0; | ||||
|   if (level == 0) | ||||
|     Yap_emit((cglobs->onhead ? get_dbterm_op : put_dbterm_op), dbt->Entry, argno, &cglobs->cint); | ||||
|   else | ||||
| @@ -668,7 +668,7 @@ c_arg(Int argno, Term t, unsigned int arity, unsigned int level, compiler_struct | ||||
|       Yap_emit((cglobs->onhead ? (argno == (Int)arity ? unify_last_atom_op | ||||
| 		      : unify_atom_op) : | ||||
| 	    write_atom_op), (CELL) t, Zero, &cglobs->cint); | ||||
|   } else  if (IsIntegerTerm(t) || IsFloatTerm(t) || IsBigIntTerm(t)) { | ||||
|   } else  if (IsIntegerTerm(t) || IsFloatTerm(t) || IsBigIntTerm(t) || IsStringTerm(t)) { | ||||
|     if (!IsIntTerm(t)) { | ||||
|       if (IsFloatTerm(t)) { | ||||
| 	if (level == 0) | ||||
| @@ -684,6 +684,41 @@ c_arg(Int argno, Term t, unsigned int arity, unsigned int level, compiler_struct | ||||
| 	  Yap_emit((cglobs->onhead ? (argno == (Int)arity ? unify_last_longint_op | ||||
| 			  : unify_longint_op) : | ||||
| 		write_longint_op), t, Zero, &cglobs->cint); | ||||
|       } else if (IsStringTerm(t)) { | ||||
| 	/* we are taking a string, that is supposed to be | ||||
| 	 guarded in the clause itself. . */ | ||||
| 	CELL l1 = ++cglobs->labelno; | ||||
| 	CELL *src = RepAppl(t); | ||||
| 	PInstr *ocpc = cglobs->cint.cpc, *OCodeStart = cglobs->cint.CodeStart; | ||||
| 	Int sz = (3+src[1])*sizeof(CELL); | ||||
| 	CELL *dest; | ||||
|  | ||||
| 	/* use a special list to store the blobs */ | ||||
| 	cglobs->cint.cpc = cglobs->cint.icpc; | ||||
| 	/*      if (IsFloatTerm(t)) { | ||||
| 		Yap_emit(align_float_op, Zero, Zero, &cglobs->cint); | ||||
| 		}*/ | ||||
| 	Yap_emit(label_op, l1, Zero, &cglobs->cint); | ||||
| 	dest =  | ||||
| 	  Yap_emit_extra_size(blob_op, sz/CellSize, sz, &cglobs->cint); | ||||
|  | ||||
| 	/* copy the bignum */ | ||||
| 	memcpy(dest, src, sz); | ||||
| 	/* note that we don't need to copy size info, unless we wanted | ||||
| 	 to garbage collect clauses ;-) */ | ||||
| 	cglobs->cint.icpc = cglobs->cint.cpc; | ||||
| 	if (cglobs->cint.BlobsStart == NULL) | ||||
| 	  cglobs->cint.BlobsStart = cglobs->cint.CodeStart; | ||||
| 	cglobs->cint.cpc = ocpc; | ||||
| 	cglobs->cint.CodeStart = OCodeStart; | ||||
| 	/* The argument to pass to the structure is now the label for | ||||
| 	   where we are storing the blob */ | ||||
| 	if (level == 0) | ||||
| 	  Yap_emit((cglobs->onhead ? get_string_op : put_string_op), l1, argno, &cglobs->cint); | ||||
| 	else | ||||
| 	  Yap_emit((cglobs->onhead ? (argno == (Int)arity ? unify_last_string_op | ||||
| 			  : unify_string_op) : | ||||
| 		write_string_op), l1, Zero, &cglobs->cint); | ||||
|       } else { | ||||
| 	/* we are taking a blob, that is a binary that is supposed to be | ||||
| 	 guarded in the clause itself. Possible examples include | ||||
| @@ -1088,29 +1123,29 @@ c_bifun(basic_preds Op, Term t1, Term t2, Term t3, Term Goal, Term mod, compiler | ||||
| 	if (i2 == 0) | ||||
| 	  c_eq(t1, t3, cglobs); | ||||
| 	else { | ||||
| 	  CELL *hi = H; | ||||
| 	  CELL *hi = HR; | ||||
| 	  Int i; | ||||
|  | ||||
| 	  if (t1 == TermDot && i2 == 2) { | ||||
| 	    if (H+2 >= (CELL *)cglobs->cint.freep0) { | ||||
| 	    if (HR+2 >= (CELL *)cglobs->cint.freep0) { | ||||
| 	      /* oops, too many new variables */ | ||||
| 	      save_machine_regs(); | ||||
| 	      siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH); | ||||
| 	    } | ||||
| 	    RESET_VARIABLE(H); | ||||
| 	    RESET_VARIABLE(H+1); | ||||
| 	    H += 2; | ||||
| 	    c_eq(AbsPair(H-2),t3, cglobs); | ||||
| 	    RESET_VARIABLE(HR); | ||||
| 	    RESET_VARIABLE(HR+1); | ||||
| 	    HR += 2; | ||||
| 	    c_eq(AbsPair(HR-2),t3, cglobs); | ||||
| 	  } else if (i2 < 256 && IsAtomTerm(t1)) { | ||||
| 	    *H++ = (CELL)Yap_MkFunctor(AtomOfTerm(t1),i2); | ||||
| 	    *HR++ = (CELL)Yap_MkFunctor(AtomOfTerm(t1),i2); | ||||
| 	    for (i=0; i < i2; i++) { | ||||
| 	      if (H >= (CELL *)cglobs->cint.freep0) { | ||||
| 	      if (HR >= (CELL *)cglobs->cint.freep0) { | ||||
| 		/* oops, too many new variables */ | ||||
| 		save_machine_regs(); | ||||
| 		siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH); | ||||
| 	      } | ||||
| 	      RESET_VARIABLE(H); | ||||
| 	      H++;	     | ||||
| 	      RESET_VARIABLE(HR); | ||||
| 	      HR++;	     | ||||
| 	    } | ||||
| 	    c_eq(AbsAppl(hi),t3, cglobs); | ||||
| 	  } else { | ||||
| @@ -1232,16 +1267,16 @@ c_bifun(basic_preds Op, Term t1, Term t2, Term t3, Term Goal, Term mod, compiler | ||||
| 	      save_machine_regs(); | ||||
| 	      siglongjmp(cglobs->cint.CompilerBotch,1); | ||||
| 	    } | ||||
| 	    if (H+1+arity >= (CELL *)cglobs->cint.freep0) { | ||||
| 	    if (HR+1+arity >= (CELL *)cglobs->cint.freep0) { | ||||
| 	      /* oops, too many new variables */ | ||||
| 	      save_machine_regs(); | ||||
| 	      siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH); | ||||
| 	    } | ||||
| 	    tnew = AbsAppl(H); | ||||
| 	    *H++ = (CELL)Yap_MkFunctor(AtomOfTerm(t1),arity); | ||||
| 	    tnew = AbsAppl(HR); | ||||
| 	    *HR++ = (CELL)Yap_MkFunctor(AtomOfTerm(t1),arity); | ||||
| 	    while (arity--) { | ||||
| 	      RESET_VARIABLE(H); | ||||
| 	      H++; | ||||
| 	      RESET_VARIABLE(HR); | ||||
| 	      HR++; | ||||
| 	    } | ||||
| 	    c_eq(tnew, t3, cglobs); | ||||
| 	  } else { | ||||
| @@ -1281,7 +1316,7 @@ c_bifun(basic_preds Op, Term t1, Term t2, Term t3, Term Goal, Term mod, compiler | ||||
|   if (!IsVarTerm(t3)) { | ||||
|     if (Op == _arg) { | ||||
|       Term tmpvar = MkVarTerm(); | ||||
|       if (H == (CELL *)cglobs->cint.freep0) { | ||||
|       if (HR == (CELL *)cglobs->cint.freep0) { | ||||
| 	/* oops, too many new variables */ | ||||
| 	save_machine_regs(); | ||||
| 	siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH); | ||||
| @@ -1681,7 +1716,7 @@ c_goal(Term Goal, Term mod, compiler_struct *cglobs) | ||||
| 	    cglobs->goalno = savegoalno; | ||||
| 	    commitflag = cglobs->labelno; | ||||
| 	    commitvar = MkVarTerm(); | ||||
| 	    if (H == (CELL *)cglobs->cint.freep0) { | ||||
| 	    if (HR == (CELL *)cglobs->cint.freep0) { | ||||
| 	      /* oops, too many new variables */ | ||||
| 	      save_machine_regs(); | ||||
| 	      siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH); | ||||
| @@ -1765,7 +1800,7 @@ c_goal(Term Goal, Term mod, compiler_struct *cglobs) | ||||
|       /* for now */ | ||||
|       cglobs->needs_env = TRUE; | ||||
|       commitvar = MkVarTerm(); | ||||
|       if (H == (CELL *)cglobs->cint.freep0) { | ||||
|       if (HR == (CELL *)cglobs->cint.freep0) { | ||||
| 	/* oops, too many new variables */ | ||||
| 	save_machine_regs(); | ||||
| 	siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH); | ||||
| @@ -1801,7 +1836,7 @@ c_goal(Term Goal, Term mod, compiler_struct *cglobs) | ||||
|       int save = cglobs->onlast; | ||||
|  | ||||
|       commitvar = MkVarTerm(); | ||||
|       if (H == (CELL *)cglobs->cint.freep0) { | ||||
|       if (HR == (CELL *)cglobs->cint.freep0) { | ||||
| 	/* oops, too many new variables */ | ||||
| 	save_machine_regs(); | ||||
| 	siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH); | ||||
| @@ -1928,7 +1963,7 @@ c_goal(Term Goal, Term mod, compiler_struct *cglobs) | ||||
| 	} | ||||
| 	else { | ||||
| 	  Term t2 = MkVarTerm(); | ||||
| 	  if (H == (CELL *)cglobs->cint.freep0) { | ||||
| 	  if (HR == (CELL *)cglobs->cint.freep0) { | ||||
| 	    /* oops, too many new variables */ | ||||
| 	    save_machine_regs(); | ||||
| 	    siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH); | ||||
| @@ -1941,7 +1976,7 @@ c_goal(Term Goal, Term mod, compiler_struct *cglobs) | ||||
|       } else { | ||||
| 	Term a2 = ArgOfTerm(2,Goal); | ||||
| 	Term t1 = MkVarTerm(); | ||||
| 	if (H == (CELL *)cglobs->cint.freep0) { | ||||
| 	if (HR == (CELL *)cglobs->cint.freep0) { | ||||
| 	  /* oops, too many new variables */ | ||||
| 	  save_machine_regs(); | ||||
| 	  siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH); | ||||
| @@ -1955,7 +1990,7 @@ c_goal(Term Goal, Term mod, compiler_struct *cglobs) | ||||
| 	} | ||||
| 	else { | ||||
| 	  Term t2 = MkVarTerm(); | ||||
| 	  if (H == (CELL *)cglobs->cint.freep0) { | ||||
| 	  if (HR == (CELL *)cglobs->cint.freep0) { | ||||
| 	    /* oops, too many new variables */ | ||||
| 	    save_machine_regs(); | ||||
| 	    siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH); | ||||
| @@ -2585,6 +2620,7 @@ CheckVoids(compiler_struct *cglobs) | ||||
|     case get_float_op: | ||||
|     case get_dbterm_op: | ||||
|     case get_longint_op: | ||||
|     case get_string_op: | ||||
|     case get_bigint_op: | ||||
|     case get_list_op: | ||||
|     case get_struct_op: | ||||
| @@ -2935,6 +2971,7 @@ c_layout(compiler_struct *cglobs) | ||||
|     case get_num_op: | ||||
|     case get_float_op: | ||||
|     case get_longint_op: | ||||
|     case get_string_op: | ||||
|     case get_dbterm_op: | ||||
|     case get_bigint_op: | ||||
|       --cglobs->Uses[rn]; | ||||
| @@ -3013,6 +3050,7 @@ c_layout(compiler_struct *cglobs) | ||||
|     case put_num_op: | ||||
|     case put_float_op: | ||||
|     case put_longint_op: | ||||
|     case put_string_op: | ||||
|     case put_dbterm_op: | ||||
|     case put_bigint_op: | ||||
|       rn = checkreg(arg, rn, ic, FALSE, cglobs); | ||||
| @@ -3311,10 +3349,13 @@ c_optimize(PInstr *pc) | ||||
|     case unify_last_float_op: | ||||
|     case write_float_op: | ||||
|     case unify_longint_op: | ||||
|     case unify_string_op: | ||||
|     case unify_bigint_op: | ||||
|     case unify_last_longint_op: | ||||
|     case unify_last_string_op: | ||||
|     case unify_last_bigint_op: | ||||
|     case write_longint_op: | ||||
|     case write_string_op: | ||||
|     case write_bigint_op: | ||||
|     case unify_list_op: | ||||
|     case write_list_op: | ||||
| @@ -3375,7 +3416,7 @@ Yap_cclause(volatile Term inp_clause, Int NOfArgs, Term mod, volatile Term src) | ||||
|     case OUT_OF_STACK_BOTCH: | ||||
|       /* out of local stack, just duplicate the stack */ | ||||
|       { | ||||
| 	Int osize = 2*sizeof(CELL)*(ASP-H); | ||||
| 	Int osize = 2*sizeof(CELL)*(ASP-HR); | ||||
| 	ARG1 = inp_clause; | ||||
| 	ARG3 = src; | ||||
|  | ||||
| @@ -3384,8 +3425,8 @@ Yap_cclause(volatile Term inp_clause, Int NOfArgs, Term mod, volatile Term src) | ||||
| 	  LOCAL_Error_TYPE = OUT_OF_STACK_ERROR; | ||||
| 	  LOCAL_Error_Term = inp_clause; | ||||
| 	} | ||||
| 	if (osize > ASP-H) { | ||||
| 	  if (!Yap_growstack(2*sizeof(CELL)*(ASP-H))) { | ||||
| 	if (osize > ASP-HR) { | ||||
| 	  if (!Yap_growstack(2*sizeof(CELL)*(ASP-HR))) { | ||||
| 	    LOCAL_Error_TYPE = OUT_OF_STACK_ERROR; | ||||
| 	    LOCAL_Error_Term = inp_clause; | ||||
| 	  } | ||||
| @@ -3449,7 +3490,7 @@ Yap_cclause(volatile Term inp_clause, Int NOfArgs, Term mod, volatile Term src) | ||||
|     } | ||||
|   } | ||||
|   my_clause = inp_clause; | ||||
|   HB = H; | ||||
|   HB = HR; | ||||
|   LOCAL_ErrorMessage = NULL; | ||||
|   LOCAL_Error_Size = 0; | ||||
|   LOCAL_Error_TYPE = YAP_NO_ERROR; | ||||
| @@ -3462,7 +3503,7 @@ Yap_cclause(volatile Term inp_clause, Int NOfArgs, Term mod, volatile Term src) | ||||
|   cglobs.cint.label_offset = NULL; | ||||
|   cglobs.cint.freep = | ||||
|     cglobs.cint.freep0 = | ||||
|     (char *) (H + maxvnum+(sizeof(Int)/sizeof(CELL))*MaxTemps+MaxTemps); | ||||
|     (char *) (HR + maxvnum+(sizeof(Int)/sizeof(CELL))*MaxTemps+MaxTemps); | ||||
|   cglobs.cint.success_handler = 0L; | ||||
|   if (ASP <= CellPtr (cglobs.cint.freep) + 256) { | ||||
|     cglobs.vtable = NULL; | ||||
| @@ -3470,8 +3511,8 @@ Yap_cclause(volatile Term inp_clause, Int NOfArgs, Term mod, volatile Term src) | ||||
|     save_machine_regs(); | ||||
|     siglongjmp(cglobs.cint.CompilerBotch,3); | ||||
|   } | ||||
|   cglobs.Uses = (Int *)(H+maxvnum); | ||||
|   cglobs.Contents = (Term *)(H+maxvnum+(sizeof(Int)/sizeof(CELL))*MaxTemps); | ||||
|   cglobs.Uses = (Int *)(HR+maxvnum); | ||||
|   cglobs.Contents = (Term *)(HR+maxvnum+(sizeof(Int)/sizeof(CELL))*MaxTemps); | ||||
|   cglobs.curbranch = cglobs.onbranch = 0; | ||||
|   cglobs.branch_pointer = cglobs.parent_branches; | ||||
|   cglobs.or_found = FALSE; | ||||
| @@ -3586,7 +3627,7 @@ Yap_cclause(volatile Term inp_clause, Int NOfArgs, Term mod, volatile Term src) | ||||
|     } | ||||
|  | ||||
|     reset_vars(cglobs.vtable); | ||||
|     H = HB; | ||||
|     HR = HB; | ||||
|     if (B != NULL) { | ||||
|       HB = B->cp_h; | ||||
|     } | ||||
|   | ||||
| @@ -81,7 +81,7 @@ typedef struct mem_blk { | ||||
|   union { | ||||
|     struct mem_blk *next; | ||||
|     double fill; | ||||
|   } u; | ||||
|   } ublock; | ||||
|   char contents[1]; | ||||
| } MemBlk; | ||||
|  | ||||
| @@ -110,7 +110,7 @@ AllocCMem (UInt size, struct intermediates *cip) | ||||
|       if (LOCAL_CMemFirstBlock) { | ||||
| 	p = LOCAL_CMemFirstBlock; | ||||
| 	blksz = LOCAL_CMemFirstBlockSz; | ||||
| 	p->u.next = NULL; | ||||
| 	p->ublock.next = NULL; | ||||
|       } else { | ||||
| 	if (blksz < FIRST_CMEM_BLK_SIZE) | ||||
| 	  blksz = FIRST_CMEM_BLK_SIZE; | ||||
| @@ -132,7 +132,7 @@ AllocCMem (UInt size, struct intermediates *cip) | ||||
| 	siglongjmp(cip->CompilerBotch, OUT_OF_HEAP_BOTCH); | ||||
|       } | ||||
|     } | ||||
|     p->u.next = cip->blks; | ||||
|     p->ublock.next = cip->blks; | ||||
|     cip->blks = p; | ||||
|     cip->blk_cur = p->contents; | ||||
|     cip->blk_top = (char *)p+blksz; | ||||
| @@ -146,7 +146,7 @@ AllocCMem (UInt size, struct intermediates *cip) | ||||
|   char *p; | ||||
|   if (ASP <= CellPtr (cip->freep) + 256) { | ||||
|     CACHE_REGS | ||||
|     LOCAL_Error_Size = 256+((char *)cip->freep - (char *)H); | ||||
|     LOCAL_Error_Size = 256+((char *)cip->freep - (char *)HR); | ||||
|     save_machine_regs(); | ||||
|     siglongjmp(cip->CompilerBotch, OUT_OF_STACK_BOTCH); | ||||
|   }  | ||||
| @@ -163,7 +163,7 @@ Yap_ReleaseCMem (struct intermediates *cip) | ||||
|   CACHE_REGS | ||||
|   struct mem_blk *p = cip->blks; | ||||
|   while (p) { | ||||
|     struct mem_blk *nextp = p->u.next; | ||||
|     struct mem_blk *nextp = p->ublock.next; | ||||
|     if (p != LOCAL_CMemFirstBlock) | ||||
|       Yap_FreeCodeSpace((ADDR)p); | ||||
|     p = nextp; | ||||
| @@ -435,6 +435,8 @@ write_functor(Functor f) | ||||
|       Yap_DebugPlWrite(MkAtomTerm(AtomLONGINT)); | ||||
|     } else if (f == FunctorDouble) { | ||||
|       Yap_DebugPlWrite(MkAtomTerm(AtomDOUBLE)); | ||||
|     } else if (f == FunctorString) { | ||||
|       Yap_DebugPlWrite(MkAtomTerm(AtomSTRING)); | ||||
|     } | ||||
|   } else { | ||||
|     Yap_DebugPlWrite(MkAtomTerm(NameOfFunctor (f))); | ||||
| @@ -590,6 +592,8 @@ ShowOp (char *f, struct PSEUDO *cpc) | ||||
| 		  Yap_DebugPlWrite(MkAtomTerm(AtomLONGINT)); | ||||
| 		} else if (fun == FunctorDouble) { | ||||
| 		  Yap_DebugPlWrite(MkAtomTerm(AtomDOUBLE)); | ||||
| 		} else if (fun == FunctorString) { | ||||
| 		  Yap_DebugPlWrite(MkAtomTerm(AtomSTRING)); | ||||
| 		} | ||||
| 	      } else { | ||||
| 		Yap_DebugPlWrite (MkAtomTerm(NameOfFunctor(fun))); | ||||
| @@ -852,12 +856,12 @@ void | ||||
| Yap_ShowCode (struct intermediates *cint) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   CELL *oldH = H; | ||||
|   CELL *oldH = HR; | ||||
|   struct PSEUDO *cpc; | ||||
|  | ||||
|   cpc = cint->CodeStart; | ||||
|   /* MkIntTerm and friends may build terms in the global stack */ | ||||
|   H = (CELL *)cint->freep; | ||||
|   HR = (CELL *)cint->freep; | ||||
|   while (cpc) { | ||||
|     compiler_vm_op ic = cpc->op; | ||||
|     if (ic != nop_op) { | ||||
| @@ -866,7 +870,7 @@ Yap_ShowCode (struct intermediates *cint) | ||||
|     cpc = cpc->nextInst; | ||||
|   } | ||||
|   Yap_DebugErrorPutc ('\n'); | ||||
|   H = oldH; | ||||
|   HR = oldH; | ||||
| } | ||||
|  | ||||
| #endif /* DEBUG */ | ||||
|   | ||||
| @@ -60,7 +60,7 @@ static int can_unify_complex(register CELL *pt0, | ||||
|   saved_TR = TR; | ||||
|   saved_B = B; | ||||
|   saved_HB = HB; | ||||
|   HB = H; | ||||
|   HB = HR; | ||||
|  | ||||
|  loop: | ||||
|   while (pt0 < pt0_end) { | ||||
| @@ -152,6 +152,9 @@ static int can_unify_complex(register CELL *pt0, | ||||
| 	    case (CELL)FunctorDouble: | ||||
| 	      if (FloatOfTerm(d0) == FloatOfTerm(d1)) continue; | ||||
| 	      goto comparison_failed; | ||||
| 	    case (CELL)FunctorString: | ||||
| 	      if (strcmp(StringOfTerm(d0), StringOfTerm(d1)) == 0) continue; | ||||
| 	      goto comparison_failed; | ||||
| #ifdef USE_GMP | ||||
| 	    case (CELL)FunctorBigInt: | ||||
| 	      if (Yap_gmp_tcmp_big_big(d0,d1) == 0) continue; | ||||
| @@ -288,6 +291,9 @@ can_unify(Term t1, Term t2, Term *Vars USES_REGS) | ||||
|       case (CELL)FunctorLongInt: | ||||
| 	if (RepAppl(t1)[1] == RepAppl(t2)[1]) return(TRUE); | ||||
| 	return FALSE; | ||||
|       case (CELL)FunctorString: | ||||
| 	if (strcmp(StringOfTerm(t1), StringOfTerm(t2)) == 0) return(TRUE); | ||||
| 	return FALSE; | ||||
|       case (CELL)FunctorDouble: | ||||
| 	if (FloatOfTerm(t1) == FloatOfTerm(t2)) return(TRUE); | ||||
| 	return FALSE; | ||||
|   | ||||
| @@ -1,5 +1,3 @@ | ||||
| #ifdef CUT_C | ||||
|  | ||||
| #include "Yap.h" | ||||
| #include "cut_c.h" | ||||
| #include <stdio.h> | ||||
| @@ -33,5 +31,3 @@ void cut_c_push(cut_c_str_ptr new_top){ | ||||
|   Yap_REGS.CUT_C_TOP=new_top; | ||||
|   return; | ||||
| } | ||||
|  | ||||
| #endif /*CUT_C*/ | ||||
|   | ||||
							
								
								
									
										301
									
								
								C/dbase.c
									
									
									
									
									
								
							
							
						
						
									
										301
									
								
								C/dbase.c
									
									
									
									
									
								
							| @@ -92,8 +92,6 @@ static char     SccsId[] = "%W% %G%"; | ||||
| #define ToSmall(V)	((link_entry)(Unsigned(V)>>3)) | ||||
| #endif | ||||
|  | ||||
| #define DEAD_REF(ref) FALSE | ||||
|  | ||||
| #ifdef SFUNC | ||||
|  | ||||
| #define MaxSFs		256 | ||||
| @@ -586,14 +584,24 @@ copy_double(CELL *st, CELL *pt) | ||||
|   /* first thing, store a link to the list before we move on */ | ||||
|   st[0] = (CELL)FunctorDouble; | ||||
|   st[1] = pt[1]; | ||||
| #if  SIZEOF_DOUBLE == 2*SIZEOF_LONG_INT | ||||
| #if  SIZEOF_DOUBLE == 2*SIZEOF_INT_P | ||||
|   st[2] = pt[2]; | ||||
|   st[3] = EndSpecials; | ||||
| #else | ||||
|   st[2] = EndSpecials; | ||||
| #endif | ||||
|   /* now reserve space */ | ||||
|   return st+(2+SIZEOF_DOUBLE/SIZEOF_LONG_INT); | ||||
|   return st+(2+SIZEOF_DOUBLE/SIZEOF_INT_P); | ||||
| } | ||||
|  | ||||
| static CELL * | ||||
| copy_string(CELL *st, CELL *pt) | ||||
| { | ||||
|   UInt sz = pt[1]+3; | ||||
|   /* first thing, store a link to the list before we move on */ | ||||
|   memcpy(st,pt,sizeof(CELL)*sz); | ||||
|   /* now reserve space */ | ||||
|   return st+sz; | ||||
| } | ||||
|  | ||||
| #ifdef USE_GMP | ||||
| @@ -637,13 +645,13 @@ static CELL *MkDBTerm(register CELL *pt0, register CELL *pt0_end, | ||||
| #endif | ||||
|   register visitel *visited = (visitel *)AuxSp; | ||||
|   /* store this in H */ | ||||
|   register CELL **to_visit = (CELL **)H; | ||||
|   register CELL **to_visit = (CELL **)HR; | ||||
|   CELL **to_visit_base = to_visit; | ||||
|   /* where we are going to add a new pair */ | ||||
|   int vars_found = 0; | ||||
| #ifdef COROUTINING | ||||
|   Term ConstraintsTerm = TermNil; | ||||
|   CELL *origH = H; | ||||
|   CELL *origH = HR; | ||||
| #endif | ||||
|   CELL *CodeMaxBase = CodeMax; | ||||
|  | ||||
| @@ -711,6 +719,17 @@ static CELL *MkDBTerm(register CELL *pt0, register CELL *pt0_end, | ||||
| 	  ++pt0; | ||||
| 	  continue; | ||||
| #endif | ||||
| 	case (CELL)FunctorString: | ||||
| 	  { | ||||
| 	    CELL *st = CodeMax; | ||||
|  | ||||
| 	    CheckDBOverflow(3+ap2[1]); | ||||
| 	    /* first thing, store a link to the list before we move on */ | ||||
| 	    *StoPoint++ = AbsAppl(st); | ||||
| 	    CodeMax = copy_string(CodeMax, ap2); | ||||
| 	    ++pt0; | ||||
| 	    continue; | ||||
| 	  } | ||||
| 	case (CELL)FunctorDouble: | ||||
| 	  { | ||||
| 	    CELL *st = CodeMax; | ||||
| @@ -900,7 +919,7 @@ static CELL *MkDBTerm(register CELL *pt0, register CELL *pt0_end, | ||||
| 	  Term t[4]; | ||||
| 	  int sz = to_visit-to_visit_base; | ||||
|  | ||||
| 	  H = (CELL *)to_visit; | ||||
| 	  HR = (CELL *)to_visit; | ||||
| 	  /* store the constraint away for: we need a back pointer to | ||||
| 	     the variable, the constraint in some cannonical form, what type | ||||
| 	     of constraint, and a list pointer */ | ||||
| @@ -909,11 +928,11 @@ static CELL *MkDBTerm(register CELL *pt0, register CELL *pt0_end, | ||||
| 	  t[2] = MkIntegerTerm(ExtFromCell(ptd0)); | ||||
| 	  t[3] = ConstraintsTerm; | ||||
| 	  ConstraintsTerm = Yap_MkApplTerm(FunctorClist, 4, t); | ||||
| 	  if (H+sz >= ASP) { | ||||
| 	  if (HR+sz >= ASP) { | ||||
| 	    goto error2; | ||||
| 	  } | ||||
| 	  memcpy((void *)H, (void *)(to_visit_base), sz*sizeof(CELL *)); | ||||
| 	  to_visit_base = (CELL **)H; | ||||
| 	  memcpy((void *)HR, (void *)(to_visit_base), sz*sizeof(CELL *)); | ||||
| 	  to_visit_base = (CELL **)HR; | ||||
| 	  to_visit = to_visit_base+sz; | ||||
| 	} | ||||
| #endif | ||||
| @@ -969,7 +988,7 @@ static CELL *MkDBTerm(register CELL *pt0, register CELL *pt0_end, | ||||
|   *vars_foundp = vars_found; | ||||
|   DB_UNWIND_CUNIF(); | ||||
| #ifdef COROUTINING | ||||
|   H = origH; | ||||
|   HR = origH; | ||||
| #endif | ||||
|   return CodeMax; | ||||
|  | ||||
| @@ -988,7 +1007,7 @@ static CELL *MkDBTerm(register CELL *pt0, register CELL *pt0_end, | ||||
| #endif | ||||
|   DB_UNWIND_CUNIF(); | ||||
| #ifdef COROUTINING | ||||
|   H = origH; | ||||
|   HR = origH; | ||||
| #endif | ||||
|   return NULL; | ||||
|  | ||||
| @@ -1006,7 +1025,7 @@ static CELL *MkDBTerm(register CELL *pt0, register CELL *pt0_end, | ||||
| #endif | ||||
|   DB_UNWIND_CUNIF(); | ||||
| #ifdef COROUTINING | ||||
|   H = origH; | ||||
|   HR = origH; | ||||
| #endif | ||||
|   return NULL; | ||||
|  | ||||
| @@ -1024,7 +1043,7 @@ static CELL *MkDBTerm(register CELL *pt0, register CELL *pt0_end, | ||||
| #endif | ||||
|   DB_UNWIND_CUNIF(); | ||||
| #ifdef COROUTINING | ||||
|   H = origH; | ||||
|   HR = origH; | ||||
| #endif | ||||
|   return NULL; | ||||
| #if THREADS | ||||
| @@ -1478,6 +1497,9 @@ CreateDBStruct(Term Tm, DBProp p, int InFlag, int *pstat, UInt extra_size, struc | ||||
| 	case (CELL)FunctorDouble: | ||||
| 	  ntp = copy_double(ntp0, RepAppl(Tm)); | ||||
| 	  break; | ||||
| 	case (CELL)FunctorString: | ||||
| 	  ntp = copy_string(ntp0, RepAppl(Tm)); | ||||
| 	  break; | ||||
| 	case (CELL)FunctorDBRef: | ||||
| 	  Yap_ReleasePreAllocCodeSpace((ADDR)pp0); | ||||
| 	  return CreateDBWithDBRef(Tm, p, dbg); | ||||
| @@ -2449,6 +2471,22 @@ UnifyDBNumber(DBRef DBSP, Term t) | ||||
|   return Yap_unify(MkIntegerTerm(i),t); | ||||
| } | ||||
|  | ||||
| Int | ||||
| Yap_unify_immediate_ref(DBRef ref USES_REGS) | ||||
| { | ||||
|   // old immediate semantics style | ||||
|   LOCK(ref->lock); | ||||
|   if (ref == NULL | ||||
|       || DEAD_REF(ref) | ||||
|       || !UnifyDBKey(ref,0,ARG1) | ||||
|       || !UnifyDBNumber(ref,ARG2)) { | ||||
|     UNLOCK(ref->lock); | ||||
|     return FALSE; | ||||
|   } else { | ||||
|     UNLOCK(ref->lock); | ||||
|     return TRUE; | ||||
|   } | ||||
| } | ||||
|  | ||||
| static Term  | ||||
| GetDBTerm(DBTerm *DBSP, int src USES_REGS) | ||||
| @@ -2464,7 +2502,7 @@ GetDBTerm(DBTerm *DBSP, int src USES_REGS) | ||||
|   } else if (IsAtomOrIntTerm(t)) { | ||||
|     return t; | ||||
|   } else { | ||||
|     CELL           *HOld = H; | ||||
|     CELL           *HOld = HR; | ||||
|     CELL           *HeapPtr; | ||||
|     CELL           *pt; | ||||
|     CELL            NOf; | ||||
| @@ -2473,9 +2511,10 @@ GetDBTerm(DBTerm *DBSP, int src USES_REGS) | ||||
|       return t; | ||||
|     } | ||||
|     pt = CellPtr(DBSP->Contents); | ||||
|     if (H+NOf > ASP-CalculateStackGap()/sizeof(CELL)) { | ||||
|     CalculateStackGap( PASS_REGS1 ); | ||||
|     if (HR+NOf > ASP-EventFlag/sizeof(CELL)) { | ||||
|       if (LOCAL_PrologMode & InErrorMode) { | ||||
| 	if (H+NOf > ASP) | ||||
| 	if (HR+NOf > ASP) | ||||
| 	  fprintf(GLOBAL_stderr, "\n\n [ FATAL ERROR: No Stack for Error Handling ]\n"); | ||||
| 	  Yap_exit( 1); | ||||
|       } else { | ||||
| @@ -2486,7 +2525,7 @@ GetDBTerm(DBTerm *DBSP, int src USES_REGS) | ||||
|     } | ||||
|     HeapPtr = cpcells(HOld, pt, NOf); | ||||
|     pt += HeapPtr - HOld; | ||||
|     H = HeapPtr; | ||||
|     HR = HeapPtr; | ||||
|     { | ||||
|       link_entry *lp = (link_entry *)pt; | ||||
|       linkblk(lp, HOld-1, (CELL)HOld-(CELL)(DBSP->Contents)); | ||||
| @@ -2494,7 +2533,7 @@ GetDBTerm(DBTerm *DBSP, int src USES_REGS) | ||||
| #ifdef COROUTINING | ||||
|     if (DBSP->ag.attachments != 0L && !src)  { | ||||
|       if (!copy_attachments((CELL *)AdjustIDBPtr(DBSP->ag.attachments,(CELL)HOld-(CELL)(DBSP->Contents)) PASS_REGS)) { | ||||
| 	H = HOld; | ||||
| 	HR = HOld; | ||||
| 	LOCAL_Error_TYPE = OUT_OF_ATTVARS_ERROR; | ||||
| 	LOCAL_Error_Size = 0; | ||||
| 	return (Term)0; | ||||
| @@ -2925,17 +2964,16 @@ lu_nth_recorded(PredEntry *pe, Int Count USES_REGS) | ||||
|   if (cl == NULL) | ||||
|     return FALSE; | ||||
| #if MULTIPLE_STACKS | ||||
|   PELOCK(65,pe); | ||||
|   TRAIL_CLREF(cl);		/* So that fail will erase it */ | ||||
|   INC_CLREF_COUNT(cl); | ||||
|   UNLOCK(pe->PELock); | ||||
| #else | ||||
|   if (!(cl->ClFlags & InUseMask)) { | ||||
|     cl->ClFlags |= InUseMask; | ||||
|     TRAIL_CLREF(cl);	/* So that fail will erase it */ | ||||
|   } | ||||
| #endif | ||||
|   return Yap_unify(MkDBRefTerm((DBRef)cl),ARG3); | ||||
|   UNLOCK(pe->PELock); | ||||
|   return Yap_unify(MkDBRefTerm((DBRef)cl),ARG4); | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -2979,175 +3017,22 @@ nth_recorded(DBProp AtProp, Int Count USES_REGS) | ||||
|   } | ||||
|   READ_UNLOCK(AtProp->DBRWLock); | ||||
| #endif | ||||
|   return Yap_unify(MkDBRefTerm(ref),ARG3); | ||||
|   return Yap_unify(MkDBRefTerm(ref),ARG4); | ||||
| } | ||||
|  | ||||
| static Int | ||||
| p_nth_instance( USES_REGS1 ) | ||||
| Int | ||||
| Yap_db_nth_recorded( PredEntry *pe, Int Count USES_REGS ) | ||||
| { | ||||
|   DBProp          AtProp; | ||||
|   Term            TCount; | ||||
|   Int             Count; | ||||
|   PredEntry      *pe; | ||||
|   Term t3 = Deref(ARG3); | ||||
|  | ||||
|   if (!IsVarTerm(t3)) { | ||||
|     if (!IsDBRefTerm(t3)) { | ||||
|       Yap_Error(TYPE_ERROR_DBREF,t3,"nth_instance/3"); | ||||
|       return FALSE; | ||||
|     } else { | ||||
|       DBRef ref = DBRefOfTerm(t3); | ||||
|       if (ref->Flags & LogUpdMask) { | ||||
| 	LogUpdClause *cl = (LogUpdClause *)ref; | ||||
| 	PredEntry *pe; | ||||
| 	LogUpdClause *ocl; | ||||
| 	UInt pred_arity, icl = 0; | ||||
| 	Functor pred_f; | ||||
| 	Term tpred; | ||||
| 	Term pred_module; | ||||
|  | ||||
| 	pe = cl->ClPred; | ||||
| 	PELOCK(66,pe); | ||||
| 	if (cl->ClFlags & ErasedMask) { | ||||
| 	  UNLOCK(pe->PELock); | ||||
| 	  return FALSE; | ||||
| 	} | ||||
| 	ocl = ClauseCodeToLogUpdClause(pe->cs.p_code.FirstClause); | ||||
| 	pred_module = pe->ModuleOfPred; | ||||
| 	if (pred_module != IDB_MODULE) { | ||||
| 	  pred_f = pe->FunctorOfPred; | ||||
| 	  pred_arity = pe->ArityOfPE; | ||||
| 	} else { | ||||
| 	  if (pe->PredFlags & NumberDBPredFlag) { | ||||
| 	    pred_f = (Functor)MkIntegerTerm(pe->src.IndxId); | ||||
| 	    pred_arity = 0; | ||||
| 	  } else { | ||||
| 	    pred_f = pe->FunctorOfPred; | ||||
| 	    if (pe->PredFlags & AtomDBPredFlag) { | ||||
| 	      pred_arity = 0; | ||||
| 	    } else { | ||||
| 	      pred_arity = ArityOfFunctor(pred_f); | ||||
| 	    } | ||||
| 	  } | ||||
| 	} | ||||
| 	do { | ||||
| 	  icl++; | ||||
| 	  if (cl == ocl) break; | ||||
| 	  ocl = ocl->ClNext; | ||||
| 	} while (ocl != NULL); | ||||
| 	UNLOCK(pe->PELock); | ||||
| 	if (ocl == NULL) { | ||||
| 	  return FALSE; | ||||
| 	} | ||||
| 	if (!Yap_unify(ARG2,MkIntegerTerm(icl))) { | ||||
| 	  return FALSE; | ||||
| 	} | ||||
| 	if (pred_arity) { | ||||
| 	  tpred = Yap_MkNewApplTerm(pred_f,pred_arity); | ||||
| 	} else { | ||||
| 	  tpred = MkAtomTerm((Atom)pred_f); | ||||
| 	} | ||||
| 	if (pred_module == IDB_MODULE) { | ||||
| 	  return Yap_unify(ARG1,tpred); | ||||
| 	} else { | ||||
| 	  Term ttpred, ts[2]; | ||||
| 	  ts[0] = pred_module; | ||||
| 	  ts[1] = tpred; | ||||
| 	  ttpred = Yap_MkApplTerm(FunctorModule,pred_arity,ts); | ||||
| 	  return Yap_unify(ARG1,ttpred); | ||||
| 	} | ||||
|       } else { | ||||
| 	LOCK(ref->lock); | ||||
| 	if (ref == NULL | ||||
| 	    || DEAD_REF(ref) | ||||
| 	    || !UnifyDBKey(ref,0,ARG1) | ||||
| 	    || !UnifyDBNumber(ref,ARG2)) { | ||||
| 	  UNLOCK(ref->lock); | ||||
| 	  return FALSE; | ||||
| 	} else { | ||||
| 	  UNLOCK(ref->lock); | ||||
| 	  return TRUE; | ||||
| 	} | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   TCount = Deref(ARG2); | ||||
|   if (IsVarTerm(TCount)) { | ||||
|     Yap_Error(INSTANTIATION_ERROR, TCount, "nth_instance/3"); | ||||
|     return FALSE; | ||||
|   } | ||||
|   if (!IsIntegerTerm(TCount)) { | ||||
|     Yap_Error(TYPE_ERROR_INTEGER, TCount, "nth_instance/3"); | ||||
|     return FALSE; | ||||
|   } | ||||
|   Count = IntegerOfTerm(TCount); | ||||
|   if (Count <= 0) { | ||||
|     if (Count)  | ||||
|       Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, TCount, "nth_instance/3"); | ||||
|     else | ||||
|       Yap_Error(DOMAIN_ERROR_NOT_ZERO, TCount, "nth_instance/3"); | ||||
|     return FALSE; | ||||
|   } | ||||
|   if ((pe = find_lu_entry(Deref(ARG1))) != NULL) { | ||||
|   if (pe == NULL) { | ||||
|     return lu_nth_recorded(pe,Count PASS_REGS); | ||||
|   } | ||||
|   if (EndOfPAEntr(AtProp = FetchDBPropFromKey(Deref(ARG1), 0, FALSE, "nth_instance/3"))) { | ||||
|     UNLOCK(pe->PELock); | ||||
|     return FALSE; | ||||
|   } | ||||
|   return nth_recorded(AtProp,Count PASS_REGS); | ||||
| } | ||||
|  | ||||
| static Int | ||||
| p_nth_instancep( USES_REGS1 ) | ||||
| { | ||||
|   DBProp          AtProp; | ||||
|   Term            TCount; | ||||
|   Int             Count; | ||||
|   Term            t3 = Deref(ARG3); | ||||
|  | ||||
|   if (!IsVarTerm(t3)) { | ||||
|     if (!IsDBRefTerm(t3)) { | ||||
|       Yap_Error(TYPE_ERROR_DBREF,t3,"nth_instance/3"); | ||||
|       return FALSE; | ||||
|     } else { | ||||
|       DBRef ref = DBRefOfTerm(t3); | ||||
|       LOCK(ref->lock); | ||||
|       if (ref == NULL | ||||
| 	  || DEAD_REF(ref) | ||||
| 	  || !UnifyDBKey(ref,CodeDBBit,ARG1) | ||||
| 	  || !UnifyDBNumber(ref,ARG2)) { | ||||
| 	UNLOCK(ref->lock); | ||||
| 	return | ||||
| 	  FALSE; | ||||
|       } else { | ||||
| 	UNLOCK(ref->lock); | ||||
| 	return | ||||
| 	  TRUE; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   if (EndOfPAEntr(AtProp = FetchDBPropFromKey(Deref(ARG1), MkCode, FALSE, "nth_instance/3"))) { | ||||
|     return | ||||
|       FALSE; | ||||
|   } | ||||
|   TCount = Deref(ARG2); | ||||
|   if (IsVarTerm(TCount)) { | ||||
|     Yap_Error(INSTANTIATION_ERROR, TCount, "recorded_at/4"); | ||||
|     return (FALSE); | ||||
|   } | ||||
|   if (!IsIntegerTerm(TCount)) { | ||||
|     Yap_Error(TYPE_ERROR_INTEGER, TCount, "recorded_at/4"); | ||||
|     return (FALSE); | ||||
|   } | ||||
|   Count = IntegerOfTerm(TCount); | ||||
|   if (Count <= 0) { | ||||
|     if (Count)  | ||||
|       Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, TCount, "recorded_at/4"); | ||||
|     else | ||||
|       Yap_Error(DOMAIN_ERROR_NOT_ZERO, TCount, "recorded_at/4"); | ||||
|     return (FALSE); | ||||
|   } | ||||
|   return nth_recorded(AtProp,Count PASS_REGS); | ||||
|   return nth_recorded(AtProp, Count PASS_REGS); | ||||
| } | ||||
|  | ||||
| static Int | ||||
| @@ -3184,7 +3069,7 @@ i_recorded(DBProp AtProp, Term t3 USES_REGS) | ||||
|   if (IsVarTerm(twork)) { | ||||
|     EXTRA_CBACK_ARG(3,2) = MkIntegerTerm(0); | ||||
|     EXTRA_CBACK_ARG(3,3) = MkIntegerTerm(0); | ||||
|     B->cp_h = H; | ||||
|     B->cp_h = HR; | ||||
|     while ((TermDB = GetDBTermFromDBEntry(ref PASS_REGS)) == (CELL)0) { | ||||
|       /* make sure the garbage collector sees what we want it to see! */ | ||||
|       EXTRA_CBACK_ARG(3,1) = (CELL)ref; | ||||
| @@ -3212,7 +3097,7 @@ i_recorded(DBProp AtProp, Term t3 USES_REGS) | ||||
|   } else if (IsAtomOrIntTerm(twork)) { | ||||
|     EXTRA_CBACK_ARG(3,2) = MkIntegerTerm(0); | ||||
|     EXTRA_CBACK_ARG(3,3) = MkIntegerTerm((Int)twork); | ||||
|     B->cp_h = H; | ||||
|     B->cp_h = HR; | ||||
|     READ_LOCK(AtProp->DBRWLock); | ||||
|     do { | ||||
|       if (((twork == ref->DBT.Entry) || IsVarTerm(ref->DBT.Entry)) && | ||||
| @@ -3229,7 +3114,7 @@ i_recorded(DBProp AtProp, Term t3 USES_REGS) | ||||
|     CELL key; | ||||
|     CELL mask = EvalMasks(twork, &key); | ||||
|  | ||||
|     B->cp_h = H; | ||||
|     B->cp_h = HR; | ||||
|     READ_LOCK(AtProp->DBRWLock); | ||||
|     do { | ||||
|       while ((mask & ref->Key) != (key & ref->Mask) && !DEAD_REF(ref)) { | ||||
| @@ -3244,7 +3129,7 @@ i_recorded(DBProp AtProp, Term t3 USES_REGS) | ||||
| 	  /* success */ | ||||
| 	  EXTRA_CBACK_ARG(3,2) = MkIntegerTerm(((Int)mask)); | ||||
| 	  EXTRA_CBACK_ARG(3,3) = MkIntegerTerm(((Int)key)); | ||||
| 	  B->cp_h = H; | ||||
| 	  B->cp_h = HR; | ||||
| 	  break; | ||||
| 	} else { | ||||
| 	  while ((ref = NextDBRef(ref)) != NULL | ||||
| @@ -3302,7 +3187,7 @@ c_recorded(int flags USES_REGS) | ||||
| { | ||||
|   Term            TermDB, TRef; | ||||
|   Register DBRef  ref, ref0; | ||||
|   CELL           *PreviousHeap = H; | ||||
|   CELL           *PreviousHeap = HR; | ||||
|   CELL            mask, key; | ||||
|   Term t1; | ||||
|  | ||||
| @@ -3371,7 +3256,7 @@ c_recorded(int flags USES_REGS) | ||||
| 	} | ||||
|       } | ||||
|       LOCAL_Error_Size = 0; | ||||
|       PreviousHeap = H; | ||||
|       PreviousHeap = HR; | ||||
|     } | ||||
|     Yap_unify(ARG2, TermDB); | ||||
|   } else if (mask == 0) {	/* ARG2 is a constant */ | ||||
| @@ -3387,7 +3272,7 @@ c_recorded(int flags USES_REGS) | ||||
|     } | ||||
|   } else | ||||
|     do {		/* ARG2 is a structure */ | ||||
|       H = PreviousHeap; | ||||
|       HR = PreviousHeap; | ||||
|       while ((mask & ref->Key) != (key & ref->Mask)) { | ||||
| 	while ((ref = NextDBRef(ref)) != NIL | ||||
| 	       && DEAD_REF(ref)); | ||||
| @@ -3414,7 +3299,7 @@ c_recorded(int flags USES_REGS) | ||||
| 	  } | ||||
| 	} | ||||
| 	LOCAL_Error_Size = 0; | ||||
| 	PreviousHeap = H; | ||||
| 	PreviousHeap = HR; | ||||
|       } | ||||
|       if (Yap_unify(ARG2, TermDB)) | ||||
| 	break; | ||||
| @@ -4654,6 +4539,36 @@ static_instance(StaticClause *cl, PredEntry *ap USES_REGS) | ||||
|   } | ||||
| } | ||||
|  | ||||
| static Int | ||||
| exo_instance(Int i, PredEntry *ap USES_REGS) | ||||
| { | ||||
|   if (ap->ArityOfPE == 0) { | ||||
|     return Yap_unify(ARG2,MkAtomTerm((Atom)ap->FunctorOfPred)); | ||||
|   } else { | ||||
|     MegaClause *mcl = ClauseCodeToMegaClause(ap->cs.p_code.FirstClause); | ||||
|     Functor f = ap->FunctorOfPred; | ||||
|     UInt arity = ArityOfFunctor(ap->FunctorOfPred); | ||||
|     Term t2 = Deref(ARG2); | ||||
|     CELL *ptr = (CELL *)((ADDR)mcl->ClCode+2*sizeof(struct index_t *)+i*(mcl->ClItemSize)); | ||||
|     if (IsVarTerm(t2)) { | ||||
|       // fresh slate | ||||
|       t2 = Yap_MkApplTerm(f,arity,ptr); | ||||
|       Yap_unify(ARG2, t2); | ||||
|     } else if (!IsApplTerm(t2) || FunctorOfTerm(t2) != f) { | ||||
|       return FALSE; | ||||
|     } | ||||
|     for (i=0; i<arity; i++) { | ||||
|       XREGS[i+1] = ptr[i]; | ||||
|     } | ||||
|     S = ptr; | ||||
|     CP = P; | ||||
|     YENV = ASP; | ||||
|     YENV[E_CB] = (CELL) B; | ||||
|     P = mcl->ClCode; | ||||
|     return TRUE; | ||||
|   } | ||||
| } | ||||
|  | ||||
| static Int | ||||
| mega_instance(yamop *code, PredEntry *ap USES_REGS) | ||||
| { | ||||
| @@ -4699,7 +4614,7 @@ p_instance( USES_REGS1 ) | ||||
| 	return mega_instance(Yap_MegaClauseFromTerm(t1), Yap_MegaClausePredicateFromTerm(t1) PASS_REGS); | ||||
|       } | ||||
|       if (FunctorOfTerm(t1) == FunctorExoClause) { | ||||
| 	return Yap_unify(ARG2,ArgOfTerm(2,t1)); | ||||
| 	return exo_instance(Yap_ExoClauseFromTerm(t1), Yap_ExoClausePredicateFromTerm(t1) PASS_REGS); | ||||
|       } | ||||
|     } | ||||
|     return FALSE; | ||||
| @@ -4802,6 +4717,8 @@ p_instance( USES_REGS1 ) | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| Term | ||||
| Yap_LUInstance(LogUpdClause *cl, UInt arity) | ||||
| { | ||||
| @@ -5010,7 +4927,7 @@ cont_current_key( USES_REGS1 ) | ||||
|     term = AtT = MkAtomTerm(a); | ||||
|   } else { | ||||
|     unsigned int j; | ||||
|     CELL *p = H; | ||||
|     CELL *p = HR; | ||||
|  | ||||
|     for (j = 0; j < arity; j++) { | ||||
|       p[j] = MkVarTerm(); | ||||
| @@ -5593,8 +5510,6 @@ Yap_InitDBPreds(void) | ||||
|   Yap_InitCPred("total_erased", 4, p_total_erased, SyncPredFlag); | ||||
|   Yap_InitCPred("key_erased_statistics", 5, p_key_erased_statistics, SyncPredFlag); | ||||
|   Yap_InitCPred("heap_space_info", 3, p_heap_space_info, SyncPredFlag); | ||||
|   Yap_InitCPred("$nth_instance", 3, p_nth_instance, SyncPredFlag); | ||||
|   Yap_InitCPred("$nth_instancep", 3, p_nth_instancep, SyncPredFlag); | ||||
|   Yap_InitCPred("$jump_to_next_dynamic_clause", 0, p_jump_to_next_dynamic_clause, SyncPredFlag); | ||||
|   Yap_InitCPred("$install_thread_local", 2, p_install_thread_local, SafePredFlag); | ||||
| } | ||||
|   | ||||
							
								
								
									
										168
									
								
								C/errors.c
									
									
									
									
									
								
							
							
						
						
									
										168
									
								
								C/errors.c
									
									
									
									
									
								
							| @@ -29,6 +29,84 @@ | ||||
| #endif | ||||
| #include "Foreign.h" | ||||
|  | ||||
| int Yap_HandleError( const char *s, ... ) { | ||||
|   CACHE_REGS | ||||
|     yap_error_number err = LOCAL_Error_TYPE; | ||||
|   char *serr; | ||||
|  | ||||
|   LOCAL_Error_TYPE = YAP_NO_ERROR; | ||||
|   if (LOCAL_ErrorMessage) { | ||||
|     serr = LOCAL_ErrorMessage; | ||||
|   } else { | ||||
|     serr = (char *)s; | ||||
|   } | ||||
|   switch (err) { | ||||
|   case OUT_OF_STACK_ERROR: | ||||
|     if (!Yap_gc(2, ENV, gc_P(P,CP))) { | ||||
|       Yap_Error(OUT_OF_STACK_ERROR, TermNil, serr); | ||||
|       return(FALSE); | ||||
|     } | ||||
|     return TRUE; | ||||
|   case OUT_OF_AUXSPACE_ERROR: | ||||
|     if (LOCAL_MAX_SIZE < (char *)AuxSp-AuxBase) { | ||||
|       LOCAL_MAX_SIZE += 1024; | ||||
|     } | ||||
|     if (!Yap_ExpandPreAllocCodeSpace(0,NULL, TRUE)) { | ||||
|       /* crash in flames */ | ||||
|       Yap_Error(OUT_OF_AUXSPACE_ERROR, ARG1, serr); | ||||
|       return FALSE; | ||||
|     } | ||||
|     return TRUE; | ||||
|   case OUT_OF_HEAP_ERROR: | ||||
|     if (!Yap_growheap(FALSE, 0, NULL)) { | ||||
|       Yap_Error(OUT_OF_HEAP_ERROR, ARG2, serr); | ||||
|       return FALSE; | ||||
|     } | ||||
|   default: | ||||
|     Yap_Error(err, LOCAL_Error_Term, serr); | ||||
|     return(FALSE); | ||||
|   } | ||||
| } | ||||
|    | ||||
| int Yap_SWIHandleError( const char *s, ... ) | ||||
| { | ||||
|   CACHE_REGS | ||||
|     yap_error_number err = LOCAL_Error_TYPE; | ||||
|   char *serr; | ||||
|  | ||||
|   LOCAL_Error_TYPE = YAP_NO_ERROR; | ||||
|   if (LOCAL_ErrorMessage) { | ||||
|     serr = LOCAL_ErrorMessage; | ||||
|   } else { | ||||
|     serr = (char *)s; | ||||
|   } | ||||
|   switch (err) { | ||||
|   case OUT_OF_STACK_ERROR: | ||||
|     if (!Yap_gc(2, ENV, gc_P(P,CP))) { | ||||
|       Yap_Error(OUT_OF_STACK_ERROR, TermNil, serr); | ||||
|       return(FALSE); | ||||
|     } | ||||
|     return TRUE; | ||||
|   case OUT_OF_AUXSPACE_ERROR: | ||||
|     if (LOCAL_MAX_SIZE < (char *)AuxSp-AuxBase) { | ||||
|       LOCAL_MAX_SIZE += 1024; | ||||
|     } | ||||
|     if (!Yap_ExpandPreAllocCodeSpace(0,NULL, TRUE)) { | ||||
|       /* crash in flames */ | ||||
|       Yap_Error(OUT_OF_AUXSPACE_ERROR, ARG1, serr); | ||||
|       return FALSE; | ||||
|     } | ||||
|     return TRUE; | ||||
|   case OUT_OF_HEAP_ERROR: | ||||
|     if (!Yap_growheap(FALSE, 0, NULL)) { | ||||
|       Yap_Error(OUT_OF_HEAP_ERROR, ARG2, serr); | ||||
|       return FALSE; | ||||
|     } | ||||
|   default: | ||||
|     Yap_Error(err, LOCAL_Error_Term, serr); | ||||
|     return(FALSE); | ||||
|   } | ||||
| } | ||||
|  | ||||
| void | ||||
| Yap_RestartYap ( int flag ) | ||||
| @@ -47,7 +125,7 @@ static void detect_bug_location(yamop *,find_pred_type,char *, int); | ||||
|  | ||||
| #define ONHEAP(ptr) (CellPtr(ptr) >= CellPtr(Yap_HeapBase)  && CellPtr(ptr) < CellPtr(HeapTop)) | ||||
|  | ||||
| #define ONLOCAL(ptr) (CellPtr(ptr) > CellPtr(H)  && CellPtr(ptr) < CellPtr(LOCAL_LocalBase)) | ||||
| #define ONLOCAL(ptr) (CellPtr(ptr) > CellPtr(HR)  && CellPtr(ptr) < CellPtr(LOCAL_LocalBase)) | ||||
|  | ||||
| static int | ||||
| hidden (Atom at) | ||||
| @@ -285,13 +363,13 @@ dump_stack( USES_REGS1 ) | ||||
|   if (handled_exception( PASS_REGS1 )) | ||||
|     return; | ||||
| #if DEBUG | ||||
|   fprintf(stderr,"%% YAP regs: P=%p, CP=%p, ASP=%p, H=%p, TR=%p, HeapTop=%p\n",P,CP,ASP,H,TR,HeapTop); | ||||
|   fprintf(stderr,"%% YAP regs: P=%p, CP=%p, ASP=%p, H=%p, TR=%p, HeapTop=%p\n",P,CP,ASP,HR,TR,HeapTop); | ||||
|   fprintf(stderr,"%% YAP mode: %ux\n",(unsigned int)LOCAL_PrologMode); | ||||
|   if (LOCAL_ErrorMessage) | ||||
|     fprintf(stderr,"%% LOCAL_ErrorMessage: %s\n",LOCAL_ErrorMessage); | ||||
| #endif | ||||
|   if (H > ASP || H > LCL0) { | ||||
|     fprintf(stderr,"%% YAP ERROR: Global Collided against Local (%p--%p)\n",H,ASP); | ||||
|   if (HR > ASP || HR > LCL0) { | ||||
|     fprintf(stderr,"%% YAP ERROR: Global Collided against Local (%p--%p)\n",HR,ASP); | ||||
|   } else   if (HeapTop > (ADDR)LOCAL_GlobalBase) { | ||||
|     fprintf(stderr,"%% YAP ERROR: Code Space Collided against Global (%p--%p)\n", HeapTop, LOCAL_GlobalBase); | ||||
|   } else { | ||||
| @@ -308,11 +386,11 @@ dump_stack( USES_REGS1 ) | ||||
|     } | ||||
| #endif | ||||
| #endif | ||||
|     detect_bug_location(P, FIND_PRED_FROM_ANYWHERE, (char *)H, 256); | ||||
|     fprintf (stderr,"%%\n%% PC: %s\n",(char *)H);  | ||||
|     detect_bug_location(CP, FIND_PRED_FROM_ANYWHERE, (char *)H, 256); | ||||
|     fprintf (stderr,"%%   Continuation: %s\n",(char *)H);  | ||||
|     fprintf (stderr,"%%    %luKB of Global Stack (%p--%p)\n",(unsigned long int)(sizeof(CELL)*(H-H0))/1024,H0,H);  | ||||
|     detect_bug_location(P, FIND_PRED_FROM_ANYWHERE, (char *)HR, 256); | ||||
|     fprintf (stderr,"%%\n%% PC: %s\n",(char *)HR);  | ||||
|     detect_bug_location(CP, FIND_PRED_FROM_ANYWHERE, (char *)HR, 256); | ||||
|     fprintf (stderr,"%%   Continuation: %s\n",(char *)HR);  | ||||
|     fprintf (stderr,"%%    %luKB of Global Stack (%p--%p)\n",(unsigned long int)(sizeof(CELL)*(HR-H0))/1024,H0,HR);  | ||||
|     fprintf (stderr,"%%    %luKB of Local Stack (%p--%p)\n",(unsigned long int)(sizeof(CELL)*(LCL0-ASP))/1024,ASP,LCL0);  | ||||
|     fprintf (stderr,"%%    %luKB of Trail (%p--%p)\n",(unsigned long int)((ADDR)TR-LOCAL_TrailBase)/1024,LOCAL_TrailBase,TR);  | ||||
|     fprintf (stderr,"%%    Performed %ld garbage collections\n", (unsigned long int)LOCAL_GcCalls); | ||||
| @@ -390,8 +468,8 @@ void | ||||
| Yap_bug_location(yamop *pc) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   detect_bug_location(pc, FIND_PRED_FROM_ANYWHERE, (char *)H, 256); | ||||
|   fprintf(stderr,"%s\n",(char *)H); | ||||
|   detect_bug_location(pc, FIND_PRED_FROM_ANYWHERE, (char *)HR, 256); | ||||
|   fprintf(stderr,"%s\n",(char *)HR); | ||||
|   dump_stack( PASS_REGS1 ); | ||||
| } | ||||
|  | ||||
| @@ -489,10 +567,10 @@ Yap_Error(yap_error_number type, Term where, char *format,...) | ||||
|       fprintf(stderr,"%% YAP OOOPS: %s.\n",tmpbuf); | ||||
|       fprintf(stderr,"%%\n%%\n"); | ||||
|     } | ||||
|     detect_bug_location(P, FIND_PRED_FROM_ANYWHERE, (char *)H, 256); | ||||
|     fprintf (stderr,"%%\n%% PC: %s\n",(char *)H);  | ||||
|     detect_bug_location(CP, FIND_PRED_FROM_ANYWHERE, (char *)H, 256); | ||||
|     fprintf (stderr,"%%   Continuation: %s\n",(char *)H);  | ||||
|     detect_bug_location(P, FIND_PRED_FROM_ANYWHERE, (char *)HR, 256); | ||||
|     fprintf (stderr,"%%\n%% PC: %s\n",(char *)HR);  | ||||
|     detect_bug_location(CP, FIND_PRED_FROM_ANYWHERE, (char *)HR, 256); | ||||
|     fprintf (stderr,"%%   Continuation: %s\n",(char *)HR);  | ||||
|     DumpActiveGoals( PASS_REGS1 ); | ||||
|     error_exit_yap (1); | ||||
|   } | ||||
| @@ -1382,6 +1460,19 @@ Yap_Error(yap_error_number type, Term where, char *format,...) | ||||
|       serious = TRUE; | ||||
|     } | ||||
|     break; | ||||
|   case REPRESENTATION_ERROR_INT: | ||||
|     { | ||||
|       int i; | ||||
|       Term ti[1]; | ||||
|  | ||||
|       i = strlen(tmpbuf); | ||||
|       ti[0] = MkAtomTerm(AtomInt); | ||||
|       nt[0] = Yap_MkApplTerm(FunctorRepresentationError, 1, ti); | ||||
|       psize -= i; | ||||
|       fun = FunctorError; | ||||
|       serious = TRUE; | ||||
|     } | ||||
|     break; | ||||
|   case REPRESENTATION_ERROR_MAX_ARITY: | ||||
|     { | ||||
|       int i; | ||||
| @@ -1450,11 +1541,8 @@ Yap_Error(yap_error_number type, Term where, char *format,...) | ||||
|   case SYNTAX_ERROR: | ||||
|     { | ||||
|       int i; | ||||
|       Term ti[1]; | ||||
|  | ||||
|       i = strlen(tmpbuf); | ||||
|       ti[0] = MkAtomTerm(AtomSyntaxError); | ||||
|       nt[0] = Yap_MkApplTerm(FunctorShortSyntaxError, 1, ti); | ||||
|       psize -= i; | ||||
|       fun = FunctorError; | ||||
|       serious = TRUE; | ||||
| @@ -1535,6 +1623,20 @@ Yap_Error(yap_error_number type, Term where, char *format,...) | ||||
|       serious = TRUE; | ||||
|     } | ||||
|     break; | ||||
|   case TYPE_ERROR_BIGNUM: | ||||
|     { | ||||
|       int i; | ||||
|       Term ti[2]; | ||||
|  | ||||
|       i = strlen(tmpbuf); | ||||
|       ti[0] = MkAtomTerm(AtomBigNum); | ||||
|       ti[1] = where; | ||||
|       nt[0] = Yap_MkApplTerm(FunctorTypeError, 2, ti); | ||||
|       psize -= i; | ||||
|       fun = FunctorError; | ||||
|       serious = TRUE; | ||||
|     } | ||||
|     break; | ||||
|   case TYPE_ERROR_BYTE: | ||||
|     { | ||||
|       int i; | ||||
| @@ -1745,6 +1847,20 @@ Yap_Error(yap_error_number type, Term where, char *format,...) | ||||
|       serious = TRUE; | ||||
|     } | ||||
|     break; | ||||
|   case TYPE_ERROR_REFERENCE: | ||||
|     { | ||||
|       int i; | ||||
|       Term ti[2]; | ||||
|  | ||||
|       i = strlen(tmpbuf); | ||||
|       ti[0] = MkAtomTerm(AtomDBReference); | ||||
|       ti[1] = where; | ||||
|       nt[0] = Yap_MkApplTerm(FunctorTypeError, 2, ti); | ||||
|       psize -= i; | ||||
|       fun = FunctorError; | ||||
|       serious = TRUE; | ||||
|     } | ||||
|     break; | ||||
|   case TYPE_ERROR_STRING: | ||||
|     { | ||||
|       int i; | ||||
| @@ -1759,6 +1875,20 @@ Yap_Error(yap_error_number type, Term where, char *format,...) | ||||
|       serious = TRUE; | ||||
|     } | ||||
|     break; | ||||
|   case TYPE_ERROR_TEXT: | ||||
|     { | ||||
|       int i; | ||||
|       Term ti[2]; | ||||
|  | ||||
|       i = strlen(tmpbuf); | ||||
|       ti[0] = MkAtomTerm(AtomText); | ||||
|       ti[1] = where; | ||||
|       nt[0] = Yap_MkApplTerm(FunctorTypeError, 2, ti); | ||||
|       psize -= i; | ||||
|       fun = FunctorError; | ||||
|       serious = TRUE; | ||||
|     } | ||||
|     break; | ||||
|   case TYPE_ERROR_UBYTE: | ||||
|     { | ||||
|       int i; | ||||
| @@ -1847,7 +1977,7 @@ E); | ||||
|   if (serious) { | ||||
|     /* disable active signals at this point */ | ||||
|     LOCAL_ActiveSignals = 0; | ||||
|     CreepFlag = CalculateStackGap(); | ||||
|     CalculateStackGap( PASS_REGS1 ); | ||||
|     LOCAL_PrologMode &= ~InErrorMode; | ||||
|     LOCK(LOCAL_SignalLock); | ||||
|     /* we might be in the middle of a critical region */ | ||||
|   | ||||
							
								
								
									
										4
									
								
								C/eval.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								C/eval.c
									
									
									
									
									
								
							| @@ -366,7 +366,7 @@ static Int cont_between( USES_REGS1 ) | ||||
|     i1 = IntegerOfTerm(t1); | ||||
|     tn = add_int(i1, 1 PASS_REGS); | ||||
|     EXTRA_CBACK_ARG(3,1) = tn; | ||||
|     HB = B->cp_h = H; | ||||
|     HB = B->cp_h = HR; | ||||
|     return TRUE; | ||||
|   } else { | ||||
|     Term t[2]; | ||||
| @@ -380,7 +380,7 @@ static Int cont_between( USES_REGS1 ) | ||||
|     t[1] = MkIntTerm(1); | ||||
|     tn = Eval(Yap_MkApplTerm(FunctorPlus, 2, t) PASS_REGS); | ||||
|     EXTRA_CBACK_ARG(3,1) = tn; | ||||
|     HB = B->cp_h = H; | ||||
|     HB = B->cp_h = HR; | ||||
|     return TRUE; | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										104
									
								
								C/exec.c
									
									
									
									
									
								
							
							
						
						
									
										104
									
								
								C/exec.c
									
									
									
									
									
								
							| @@ -22,12 +22,7 @@ static char     SccsId[] = "@(#)cdmgr.c	1.1 05/02/98"; | ||||
| #include "pl-shared.h" | ||||
| #include "yapio.h" | ||||
| #include "attvar.h" | ||||
| #ifdef CUT_C | ||||
| #include "cut_c.h" | ||||
| #endif | ||||
| #if defined MYDDAS_ODBC || defined MYDDAS_MYSQL | ||||
| #include "myddas.h" | ||||
| #endif | ||||
|  | ||||
| static Int  CallPredicate(PredEntry *, choiceptr, yamop * CACHE_TYPE); | ||||
| static Int  EnterCreepMode(Term, Term CACHE_TYPE); | ||||
| @@ -166,13 +161,14 @@ do_execute(Term t, Term mod USES_REGS) | ||||
|   if (PRED_GOAL_EXPANSION_ALL) { | ||||
|     LOCK(LOCAL_SignalLock); | ||||
|     /* disable creeping when we do goal expansion */ | ||||
|     if (LOCAL_ActiveSignals & (YAP_CREEP_SIGNAL|YAP_DELAY_CREEP_SIGNAL) && !LOCAL_InterruptsDisabled) { | ||||
|       LOCAL_ActiveSignals &= ~(YAP_CREEP_SIGNAL|YAP_DELAY_CREEP_SIGNAL); | ||||
|       CreepFlag = CalculateStackGap(); | ||||
|     if (LOCAL_ActiveSignals & (YAP_CREEP_SIGNAL) && !LOCAL_InterruptsDisabled) { | ||||
|       LOCAL_ActiveSignals &= ~(YAP_CREEP_SIGNAL); | ||||
|       CalculateStackGap( PASS_REGS1 ); | ||||
|     } | ||||
|     UNLOCK(LOCAL_SignalLock); | ||||
|     return CallMetaCall(ARG1, mod PASS_REGS); | ||||
|   } else if (LOCAL_ActiveSignals  && !LOCAL_InterruptsDisabled) { | ||||
|   } else if (LOCAL_ActiveSignals  && !LOCAL_InterruptsDisabled && | ||||
| 	     !(LOCAL_PrologMode & (AbortMode|InterruptMode|SystemMode))) { | ||||
|     return EnterCreepMode(t, mod PASS_REGS); | ||||
|   } | ||||
|  restart_exec: | ||||
| @@ -254,34 +250,34 @@ do_execute(Term t, Term mod USES_REGS) | ||||
| static Term | ||||
| copy_execn_to_heap(Functor f, CELL *pt, unsigned int n, unsigned int arity, Term mod USES_REGS) | ||||
| { | ||||
|   CELL *h0 = H; | ||||
|   CELL *h0 = HR; | ||||
|   Term tf; | ||||
|   unsigned int i; | ||||
|  | ||||
|   if (arity == 2 && | ||||
|       NameOfFunctor(f) == AtomDot) { | ||||
|     for (i = 0; i<arity-n;i++) { | ||||
|       *H++ = pt[i]; | ||||
|       *HR++ = pt[i]; | ||||
|     } | ||||
|     for (i=0; i< n; i++) { | ||||
|       *H++ = h0[(int)(i-n)]; | ||||
|       *HR++ = h0[(int)(i-n)]; | ||||
|     } | ||||
|     tf = AbsPair(h0); | ||||
|   } else { | ||||
|     *H++ = (CELL)f; | ||||
|     *HR++ = (CELL)f; | ||||
|     for (i = 0; i<arity-n;i++) { | ||||
|       *H++ = pt[i]; | ||||
|       *HR++ = pt[i]; | ||||
|     } | ||||
|     for (i=0; i< n; i++) { | ||||
|       *H++ = h0[(int)(i-n)]; | ||||
|       *HR++ = h0[(int)(i-n)]; | ||||
|     } | ||||
|     tf = AbsAppl(h0); | ||||
|   } | ||||
|   if (mod != CurrentModule) { | ||||
|     CELL *h0 = H; | ||||
|     *H++ = (CELL)FunctorModule; | ||||
|     *H++ = mod; | ||||
|     *H++ = tf; | ||||
|     CELL *h0 = HR; | ||||
|     *HR++ = (CELL)FunctorModule; | ||||
|     *HR++ = mod; | ||||
|     *HR++ = tf; | ||||
|     tf = AbsAppl(h0); | ||||
|   } | ||||
|   return tf; | ||||
| @@ -338,9 +334,9 @@ do_execute_n(Term t, Term mod, unsigned int n USES_REGS) | ||||
|   if (PRED_GOAL_EXPANSION_ALL) { | ||||
|     LOCK(LOCAL_SignalLock); | ||||
|     /* disable creeping when we do goal expansion */ | ||||
|     if (LOCAL_ActiveSignals & (YAP_CREEP_SIGNAL|YAP_DELAY_CREEP_SIGNAL) && !LOCAL_InterruptsDisabled) { | ||||
|       LOCAL_ActiveSignals &= ~(YAP_CREEP_SIGNAL|YAP_DELAY_CREEP_SIGNAL); | ||||
|       CreepFlag = CalculateStackGap(); | ||||
|     if (LOCAL_ActiveSignals & (YAP_CREEP_SIGNAL) && !LOCAL_InterruptsDisabled) { | ||||
|       LOCAL_ActiveSignals &= ~(YAP_CREEP_SIGNAL); | ||||
|       CalculateStackGap( PASS_REGS1 ); | ||||
|     } | ||||
|     UNLOCK(LOCAL_SignalLock); | ||||
|     t = copy_execn_to_heap(f, pt, n, arity, mod PASS_REGS); | ||||
| @@ -374,7 +370,7 @@ do_execute_n(Term t, Term mod, unsigned int n USES_REGS) | ||||
| #endif | ||||
|   } | ||||
|   for (i = arity-n+1; i <= arity; i++,j++) { | ||||
|     XREGS[i] = H[j]; | ||||
|     XREGS[i] = HR[j]; | ||||
|   } | ||||
|   return CallPredicate(pen, B, pen->CodeOfPred PASS_REGS); | ||||
| } | ||||
| @@ -404,7 +400,7 @@ EnterCreepMode(Term t, Term mod USES_REGS) { | ||||
|     } | ||||
|   } | ||||
|   LOCK(LOCAL_SignalLock); | ||||
|   CreepFlag = CalculateStackGap(); | ||||
|   CalculateStackGap( PASS_REGS1 ); | ||||
|   UNLOCK(LOCAL_SignalLock); | ||||
|   P_before_spy = P; | ||||
|   return CallPredicate(PredCreep, B, PredCreep->CodeOfPred PASS_REGS); | ||||
| @@ -421,15 +417,15 @@ static void | ||||
| heap_store(Term t USES_REGS) | ||||
| { | ||||
|   if (IsVarTerm(t)) { | ||||
|     if (VarOfTerm(t) < H) { | ||||
|       *H++ = t; | ||||
|     if (VarOfTerm(t) < HR) { | ||||
|       *HR++ = t; | ||||
|     } else { | ||||
|       RESET_VARIABLE(H); | ||||
|       Bind_Local(VarOfTerm(t), (CELL)H); | ||||
|       H++; | ||||
|       RESET_VARIABLE(HR); | ||||
|       Bind_Local(VarOfTerm(t), (CELL)HR); | ||||
|       HR++; | ||||
|     } | ||||
|   } else { | ||||
|     *H++ = t; | ||||
|     *HR++ = t; | ||||
|   } | ||||
| } | ||||
|  | ||||
| @@ -640,8 +636,8 @@ p_execute_clause( USES_REGS1 ) | ||||
|   } else { | ||||
|     code = Yap_ClauseFromTerm(clt)->ClCode; | ||||
|   } | ||||
|   if (LOCAL_ActiveSignals & (YAP_CREEP_SIGNAL|YAP_DELAY_CREEP_SIGNAL)) { | ||||
|     LOCAL_ActiveSignals &= ~(YAP_CREEP_SIGNAL|YAP_DELAY_CREEP_SIGNAL); | ||||
|   if (LOCAL_ActiveSignals & (YAP_CREEP_SIGNAL)) { | ||||
|     LOCAL_ActiveSignals &= ~(YAP_CREEP_SIGNAL); | ||||
|     Yap_signal(YAP_CREEP_SIGNAL); | ||||
|   } | ||||
|   return CallPredicate(RepPredProp(pe), cut_cp, code PASS_REGS); | ||||
| @@ -656,7 +652,7 @@ p_execute_in_mod( USES_REGS1 ) | ||||
| static Int | ||||
| p_do_goal_expansion( USES_REGS1 ) | ||||
| { | ||||
|   Int creeping = LOCAL_ActiveSignals & (YAP_CREEP_SIGNAL|YAP_DELAY_CREEP_SIGNAL); | ||||
|   Int creeping = LOCAL_ActiveSignals & (YAP_CREEP_SIGNAL); | ||||
|   Int out = FALSE; | ||||
|   PredEntry *pe; | ||||
|   Term cmod = Deref(ARG2); | ||||
| @@ -664,9 +660,9 @@ p_do_goal_expansion( USES_REGS1 ) | ||||
|   ARG2 = ARG3; | ||||
|   /* disable creeping */ | ||||
|   LOCK(LOCAL_SignalLock); | ||||
|   LOCAL_ActiveSignals &= ~(YAP_CREEP_SIGNAL|YAP_DELAY_CREEP_SIGNAL);     | ||||
|   LOCAL_ActiveSignals &= ~(YAP_CREEP_SIGNAL);     | ||||
|   if (!LOCAL_ActiveSignals) | ||||
|     CreepFlag = CalculateStackGap(); | ||||
|     CalculateStackGap( PASS_REGS1 ); | ||||
|   UNLOCK(LOCAL_SignalLock); | ||||
|    | ||||
|   /* CurMod:goal_expansion(A,B) */ | ||||
| @@ -719,16 +715,16 @@ p_do_goal_expansion( USES_REGS1 ) | ||||
| static Int | ||||
| p_do_term_expansion( USES_REGS1 ) | ||||
| { | ||||
|   Int creeping = LOCAL_ActiveSignals & (YAP_CREEP_SIGNAL|YAP_DELAY_CREEP_SIGNAL); | ||||
|   Int creeping = LOCAL_ActiveSignals & (YAP_CREEP_SIGNAL); | ||||
|   Int out = FALSE; | ||||
|   PredEntry *pe; | ||||
|   Term cmod = CurrentModule; | ||||
|  | ||||
|   /* disable creeping */ | ||||
|   LOCK(LOCAL_SignalLock); | ||||
|   LOCAL_ActiveSignals &= ~(YAP_CREEP_SIGNAL|YAP_DELAY_CREEP_SIGNAL); | ||||
|   LOCAL_ActiveSignals &= ~(YAP_CREEP_SIGNAL); | ||||
|   if (!LOCAL_ActiveSignals) | ||||
|     CreepFlag = CalculateStackGap(); | ||||
|     CalculateStackGap( PASS_REGS1 ); | ||||
|   UNLOCK(LOCAL_SignalLock); | ||||
|    | ||||
|   /* CurMod:term_expansion(A,B) */ | ||||
| @@ -902,8 +898,8 @@ p_execute_nonstop( USES_REGS1 ) | ||||
|   /*	N = arity; */ | ||||
|   /* call may not define new system predicates!! */ | ||||
|   if (RepPredProp(pe)->PredFlags & SpiedPredFlag) { | ||||
|     if (LOCAL_ActiveSignals & (YAP_CREEP_SIGNAL|YAP_DELAY_CREEP_SIGNAL)  && !LOCAL_InterruptsDisabled) { | ||||
|       LOCAL_ActiveSignals &= ~(YAP_CREEP_SIGNAL|YAP_DELAY_CREEP_SIGNAL); | ||||
|     if (LOCAL_ActiveSignals & (YAP_CREEP_SIGNAL)  && !LOCAL_InterruptsDisabled) { | ||||
|       LOCAL_ActiveSignals &= ~(YAP_CREEP_SIGNAL); | ||||
|       Yap_signal(YAP_CREEP_SIGNAL); | ||||
|     } | ||||
| #if defined(YAPOR) || defined(THREADS) | ||||
| @@ -1092,7 +1088,7 @@ exec_absmi(int top USES_REGS) | ||||
| 	LOCK(LOCAL_SignalLock); | ||||
| 	/* forget any signals active, we're reborne */ | ||||
| 	LOCAL_ActiveSignals = 0; | ||||
| 	CreepFlag = CalculateStackGap(); | ||||
| 	CalculateStackGap( PASS_REGS1 ); | ||||
| 	LOCAL_PrologMode = UserMode; | ||||
| 	UNLOCK(LOCAL_SignalLock); | ||||
| 	P = (yamop *)FAILCODE; | ||||
| @@ -1126,7 +1122,7 @@ exec_absmi(int top USES_REGS) | ||||
|   /* make sure we don't leave a FAIL signal hanging around */  | ||||
|   LOCAL_ActiveSignals &= ~YAP_FAIL_SIGNAL; | ||||
|   if (!LOCAL_ActiveSignals) | ||||
|     CreepFlag = CalculateStackGap(); | ||||
|     CalculateStackGap( PASS_REGS1 ); | ||||
|   return out; | ||||
| } | ||||
|  | ||||
| @@ -1162,7 +1158,7 @@ Yap_PrepGoal(UInt arity, CELL *pt, choiceptr saved_b USES_REGS) | ||||
|   } | ||||
|   B = (choiceptr)ASP; | ||||
|   B--; | ||||
|   B->cp_h     = H; | ||||
|   B->cp_h     = HR; | ||||
|   B->cp_tr    = TR; | ||||
|   B->cp_cp    = CP; | ||||
|   B->cp_ap    = NOCODE; | ||||
| @@ -1173,7 +1169,7 @@ Yap_PrepGoal(UInt arity, CELL *pt, choiceptr saved_b USES_REGS) | ||||
| #endif /* DEPTH_LIMIT */ | ||||
|   YENV = ASP = (CELL *)B; | ||||
|   YENV[E_CB] = (CELL)B; | ||||
|   HB = H; | ||||
|   HB = HR; | ||||
|   CP = YESCODE; | ||||
| } | ||||
|  | ||||
| @@ -1231,7 +1227,6 @@ execute_pred(PredEntry *ppe, CELL *pt USES_REGS) | ||||
|     /* restore the old environment */ | ||||
|     /* get to previous environment */ | ||||
|     cut_B = (choiceptr)ENV[E_CB]; | ||||
| #ifdef CUT_C | ||||
|     { | ||||
|       /* Note that  | ||||
| 	 cut_B == (choiceptr)ENV[E_CB] */ | ||||
| @@ -1240,7 +1235,6 @@ execute_pred(PredEntry *ppe, CELL *pt USES_REGS) | ||||
| 	  POP_EXECUTE(); | ||||
| 	} | ||||
|     } | ||||
| #endif /* CUT_C */ | ||||
| #ifdef YAPOR | ||||
|     CUT_prune_to(cut_B); | ||||
| #endif /* YAPOR */ | ||||
| @@ -1271,7 +1265,7 @@ execute_pred(PredEntry *ppe, CELL *pt USES_REGS) | ||||
|   } else if (out == 0) { | ||||
|     P    = saved_p; | ||||
|     CP   = saved_cp; | ||||
|     H    = B->cp_h; | ||||
|     HR    = B->cp_h; | ||||
| #ifdef DEPTH_LIMIT | ||||
|     DEPTH= B->cp_depth; | ||||
| #endif | ||||
| @@ -1337,7 +1331,7 @@ Yap_trust_last(void) | ||||
|   CACHE_REGS | ||||
|   ASP  = B->cp_env; | ||||
|   CP   = B->cp_cp; | ||||
|   H    = B->cp_h; | ||||
|   HR    = B->cp_h; | ||||
| #ifdef DEPTH_LIMIT | ||||
|   DEPTH= B->cp_depth; | ||||
| #endif | ||||
| @@ -1756,7 +1750,7 @@ Yap_InitYaamRegs( int myworker_id ) | ||||
|   Yap_ResetExceptionTerm ( myworker_id ); | ||||
|   Yap_PutValue (AtomBreak, MkIntTerm (0)); | ||||
|   TR = (tr_fr_ptr)REMOTE_TrailBase(myworker_id); | ||||
|   H = H0 = ((CELL *) REMOTE_GlobalBase(myworker_id))+1; // +1: hack to ensure the gc does not try to mark mistakenly | ||||
|   HR = H0 = ((CELL *) REMOTE_GlobalBase(myworker_id))+1; // +1: hack to ensure the gc does not try to mark mistakenly | ||||
|   LCL0 = ASP = (CELL *) REMOTE_LocalBase(myworker_id); | ||||
|   CurrentTrailTop = (tr_fr_ptr)(REMOTE_TrailTop(myworker_id)-MinTrailGap); | ||||
|   /* notice that an initial choice-point and environment | ||||
| @@ -1769,7 +1763,7 @@ Yap_InitYaamRegs( int myworker_id ) | ||||
| #endif | ||||
|   STATIC_PREDICATES_MARKED = FALSE; | ||||
| #ifdef FROZEN_STACKS | ||||
|   H_FZ = H; | ||||
|   H_FZ = HR; | ||||
| #ifdef YAPOR_SBA | ||||
|   BSEG = | ||||
| #endif /* YAPOR_SBA */ | ||||
| @@ -1777,7 +1771,7 @@ Yap_InitYaamRegs( int myworker_id ) | ||||
|   TR = TR_FZ = (tr_fr_ptr) REMOTE_TrailBase(myworker_id); | ||||
| #endif /* FROZEN_STACKS */ | ||||
|   LOCK(REMOTE_SignalLock(myworker_id)); | ||||
|   CreepFlag = CalculateStackGap(); | ||||
|   CalculateStackGap( PASS_REGS1 ); | ||||
|   /* the first real choice-point will also have AP=FAIL */  | ||||
|   /* always have an empty slots for people to use */ | ||||
|   REMOTE_GlobalArena(myworker_id) = TermNil; | ||||
| @@ -1801,12 +1795,7 @@ Yap_InitYaamRegs( int myworker_id ) | ||||
| #endif | ||||
|   Yap_AllocateDefaultArena(128*1024, 2, myworker_id); | ||||
|   Yap_InitPreAllocCodeSpace( myworker_id ); | ||||
| #ifdef CUT_C | ||||
|   cut_c_initialize( myworker_id ); | ||||
| #endif | ||||
| #if defined MYDDAS_MYSQL || defined MYDDAS_ODBC | ||||
|   Yap_REGS.MYDDAS_GLOBAL_POINTER = NULL; | ||||
| #endif | ||||
|   Yap_PrepGoal(0, NULL, NULL PASS_REGS); | ||||
| #ifdef TABLING | ||||
|   /* ensure that LOCAL_top_dep_fr is always valid */ | ||||
| @@ -1814,6 +1803,9 @@ Yap_InitYaamRegs( int myworker_id ) | ||||
|     DepFr_cons_cp(REMOTE_top_dep_fr(myworker_id)) = NORM_CP(B); | ||||
| #endif | ||||
|   UNLOCK(REMOTE_SignalLock(myworker_id)); | ||||
|   // make sure we have slots in case we don go through the top-level */ | ||||
|   Yap_StartSlots( PASS_REGS1 ); | ||||
|  | ||||
| } | ||||
|  | ||||
| static Int | ||||
|   | ||||
							
								
								
									
										12
									
								
								C/exo.c
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								C/exo.c
									
									
									
									
									
								
							| @@ -36,8 +36,6 @@ | ||||
|  | ||||
| //void do_write(void) { exo_write=TRUE;} | ||||
|  | ||||
| #define NEXTOP(V,TYPE)    ((yamop *)(&((V)->u.TYPE.next))) | ||||
|  | ||||
| #define MAX_ARITY 256 | ||||
|  | ||||
| #define FNV32_PRIME ((UInt)16777619) | ||||
| @@ -407,7 +405,7 @@ add_index(struct index_t **ip, UInt bmap, PredEntry *ap, UInt count) | ||||
|       Yap_Error(OUT_OF_HEAP_ERROR, TermNil, LOCAL_ErrorMessage); | ||||
|       return NULL; | ||||
|     } | ||||
|     bzero(base, dsz); | ||||
|     memset(base, 0, dsz); | ||||
|   } | ||||
|   i->size = sz+dsz+sizeof(struct index_t); | ||||
|   i->key = (BITS32 *)base; | ||||
| @@ -430,7 +428,7 @@ add_index(struct index_t **ip, UInt bmap, PredEntry *ap, UInt count) | ||||
|       } | ||||
|       if (base != (CELL *)Yap_ReallocCodeSpace((char *)base, sz)) | ||||
| 	return FALSE; | ||||
|       bzero(base, sz); | ||||
|       memset(base, 0, sz); | ||||
|       i->key = (BITS32 *)base; | ||||
|       i->links = (BITS32 *)(base+i->hsize); | ||||
|       i->ncollisions = i->nentries = i->ntrys = 0; | ||||
| @@ -455,7 +453,7 @@ add_index(struct index_t **ip, UInt bmap, PredEntry *ap, UInt count) | ||||
|       } | ||||
|       if (base != (CELL *)Yap_ReallocCodeSpace((char *)base, sz)) | ||||
| 	return FALSE; | ||||
|       bzero(base, sz); | ||||
|       memset(base, 0, sz); | ||||
|       i->key = (BITS32 *)base; | ||||
|       i->links = (BITS32 *)base+i->hsize; | ||||
|       i->ncollisions = i->nentries = i->ntrys = 0; | ||||
| @@ -562,7 +560,7 @@ Yap_NextExo(choiceptr cptr, struct index_t *it) | ||||
|   return next; | ||||
| } | ||||
|  | ||||
| MegaClause * | ||||
| static MegaClause * | ||||
| exodb_get_space( Term t, Term mod, Term tn ) | ||||
| { | ||||
|   UInt            arity; | ||||
| @@ -668,7 +666,7 @@ store_exo(yamop *pc, UInt arity, Term t0) | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| void | ||||
| static void | ||||
| exoassert( void *handle, Int n, Term term ) | ||||
| {                               /* '$number_of_clauses'(Predicate,M,N) */ | ||||
|   PredEntry       *pe; | ||||
|   | ||||
							
								
								
									
										308
									
								
								C/globals.c
									
									
									
									
									
								
							
							
						
						
									
										308
									
								
								C/globals.c
									
									
									
									
									
								
							| @@ -108,15 +108,15 @@ NewArena(UInt size, UInt arity, CELL *where USES_REGS) | ||||
|   Term t; | ||||
|   UInt new_size; | ||||
|  | ||||
|   if (where == NULL || where == H) { | ||||
|     while (H+size > ASP-1024) { | ||||
|   if (where == NULL || where == HR) { | ||||
|     while (HR+size > ASP-1024) { | ||||
|       if (!Yap_gcl(size*sizeof(CELL), arity, ENV, P)) { | ||||
| 	Yap_Error(OUT_OF_STACK_ERROR, TermNil, LOCAL_ErrorMessage); | ||||
| 	return TermNil; | ||||
|       } | ||||
|     } | ||||
|     t = CreateNewArena(H, size); | ||||
|     H += size; | ||||
|     t = CreateNewArena(HR, size); | ||||
|     HR += size; | ||||
|   } else { | ||||
|     if ((new_size=Yap_InsertInGlobal(where, size*sizeof(CELL)))==0) { | ||||
|       Yap_Error(OUT_OF_STACK_ERROR,TermNil,"No Stack Space for Non-Backtrackable terms"); | ||||
| @@ -162,7 +162,7 @@ adjust_cps(UInt size USES_REGS) | ||||
| { | ||||
|   /* adjust possible back pointers in choice-point stack */ | ||||
|   choiceptr b_ptr = B; | ||||
|   while (b_ptr->cp_h == H) { | ||||
|   while (b_ptr->cp_h == HR) { | ||||
|     b_ptr->cp_h += size; | ||||
|     b_ptr = b_ptr->cp_b; | ||||
|   } | ||||
| @@ -183,8 +183,8 @@ GrowArena(Term arena, CELL *pt, UInt old_size, UInt size, UInt arity USES_REGS) | ||||
|   if (size < 4096) { | ||||
|     size = 4096; | ||||
|   } | ||||
|   if (pt == H) { | ||||
|     if (H+size > ASP-1024) { | ||||
|   if (pt == HR) { | ||||
|     if (HR+size > ASP-1024) { | ||||
|  | ||||
|       XREGS[arity+1] = arena; | ||||
|       if (!Yap_gcl(size*sizeof(CELL), arity+1, ENV, gc_P(P,CP))) { | ||||
| @@ -197,11 +197,11 @@ GrowArena(Term arena, CELL *pt, UInt old_size, UInt size, UInt arity USES_REGS) | ||||
|       return GrowArena(arena, pt, old_size, size, arity PASS_REGS); | ||||
|     } | ||||
|     adjust_cps(size PASS_REGS); | ||||
|     H += size; | ||||
|     HR += size; | ||||
|   } else { | ||||
|     XREGS[arity+1] = arena; | ||||
|     /* try to recover some room  */ | ||||
|     if (arena == LOCAL_GlobalArena && 10*(pt-H0) > 8*(H-H0)) { | ||||
|     if (arena == LOCAL_GlobalArena && 10*(pt-H0) > 8*(HR-H0)) { | ||||
|       if (!Yap_gcl(size*sizeof(CELL), arity+1, ENV, gc_P(P,CP))) { | ||||
| 	Yap_Error(OUT_OF_STACK_ERROR,TermNil,LOCAL_ErrorMessage); | ||||
| 	return FALSE; | ||||
| @@ -231,9 +231,9 @@ Yap_GetFromArena(Term *arenap, UInt cells, UInt arity) | ||||
|     CELL *newH; | ||||
|     UInt old_sz = ArenaSz(arena), new_size; | ||||
|  | ||||
|     if (IN_BETWEEN(base, H, max)) { | ||||
|       base = H; | ||||
|       H += cells; | ||||
|     if (IN_BETWEEN(base, HR, max)) { | ||||
|       base = HR; | ||||
|       HR += cells; | ||||
|       return base; | ||||
|     } | ||||
|     if (base+cells > max-1024) { | ||||
| @@ -254,11 +254,11 @@ CloseArena(CELL *oldH, CELL *oldHB, CELL *oldASP, Term *oldArenaP, UInt old_size | ||||
| { | ||||
|   UInt new_size; | ||||
|  | ||||
|   if (H == oldH) | ||||
|   if (HR == oldH) | ||||
|     return; | ||||
|   new_size = old_size - (H-RepAppl(*oldArenaP)); | ||||
|   *oldArenaP = CreateNewArena(H, new_size); | ||||
|   H = oldH; | ||||
|   new_size = old_size - (HR-RepAppl(*oldArenaP)); | ||||
|   *oldArenaP = CreateNewArena(HR, new_size); | ||||
|   HR = oldH; | ||||
|   HB = oldHB; | ||||
|   ASP = oldASP; | ||||
| } | ||||
| @@ -308,12 +308,12 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int cop | ||||
|       if (IsPairTerm(d0)) { | ||||
| 	CELL *ap2 = RepPair(d0); | ||||
| 	if ((share && ap2 < HB) || | ||||
| 	    (ap2 >= HB && ap2 < H)) { | ||||
| 	    (ap2 >= HB && ap2 < HR)) { | ||||
| 	  /* If this is newer than the current term, just reuse */ | ||||
| 	  *ptf++ = d0; | ||||
| 	  continue; | ||||
| 	}  | ||||
| 	*ptf = AbsPair(H); | ||||
| 	*ptf = AbsPair(HR); | ||||
| 	ptf++; | ||||
| #ifdef RATIONAL_TREES | ||||
| 	if (to_visit+1 >= (struct cp_frame *)AuxSp) { | ||||
| @@ -325,7 +325,7 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int cop | ||||
| 	to_visit->oldv = *pt0; | ||||
| 	to_visit->ground = ground; | ||||
| 	/* fool the system into thinking we had a variable there */ | ||||
| 	*pt0 = AbsPair(H); | ||||
| 	*pt0 = AbsPair(HR); | ||||
| 	to_visit ++; | ||||
| #else | ||||
| 	if (pt0 < pt0_end) { | ||||
| @@ -342,9 +342,9 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int cop | ||||
| 	ground = TRUE; | ||||
| 	pt0 = ap2 - 1; | ||||
| 	pt0_end = ap2 + 1; | ||||
| 	ptf = H; | ||||
| 	H += 2; | ||||
| 	if (H > ASP - MIN_ARENA_SIZE) { | ||||
| 	ptf = HR; | ||||
| 	HR += 2; | ||||
| 	if (HR > ASP - MIN_ARENA_SIZE) { | ||||
| 	  goto overflow; | ||||
| 	} | ||||
|       } else if (IsApplTerm(d0)) { | ||||
| @@ -353,7 +353,7 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int cop | ||||
| 	/* store the terms to visit */ | ||||
| 	ap2 = RepAppl(d0); | ||||
| 	if ((share && ap2 < HB) || | ||||
| 	    (ap2 >= HB && ap2 < H)) { | ||||
| 	    (ap2 >= HB && ap2 < HR)) { | ||||
| 	  /* If this is newer than the current term, just reuse */ | ||||
| 	  *ptf++ = d0; | ||||
| 	  continue; | ||||
| @@ -367,54 +367,62 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int cop | ||||
| 	    *ptf++ = d0; | ||||
| 	    break; | ||||
| 	  case (CELL)FunctorLongInt: | ||||
| 	    if (H > ASP - (MIN_ARENA_SIZE+3)) { | ||||
| 	    if (HR > ASP - (MIN_ARENA_SIZE+3)) { | ||||
| 	      goto overflow; | ||||
| 	    } | ||||
| 	    *ptf++ = AbsAppl(H); | ||||
| 	    H[0] = (CELL)f; | ||||
| 	    H[1] = ap2[1]; | ||||
| 	    H[2] = EndSpecials; | ||||
| 	    H += 3; | ||||
| 	    if (H > ASP - MIN_ARENA_SIZE) { | ||||
| 	    *ptf++ = AbsAppl(HR); | ||||
| 	    HR[0] = (CELL)f; | ||||
| 	    HR[1] = ap2[1]; | ||||
| 	    HR[2] = EndSpecials; | ||||
| 	    HR += 3; | ||||
| 	    if (HR > ASP - MIN_ARENA_SIZE) { | ||||
| 	      goto overflow; | ||||
| 	    } | ||||
| 	    break; | ||||
| 	  case (CELL)FunctorDouble: | ||||
| 	    if (H > ASP - (MIN_ARENA_SIZE+(2+SIZEOF_DOUBLE/sizeof(CELL)))) { | ||||
| 	    if (HR > ASP - (MIN_ARENA_SIZE+(2+SIZEOF_DOUBLE/sizeof(CELL)))) { | ||||
| 	      goto overflow; | ||||
| 	    } | ||||
| 	    *ptf++ = AbsAppl(H); | ||||
| 	    H[0] = (CELL)f; | ||||
| 	    H[1] = ap2[1]; | ||||
| #if SIZEOF_DOUBLE == 2*SIZEOF_LONG_INT | ||||
| 	    H[2] = ap2[2]; | ||||
| 	    H[3] = EndSpecials; | ||||
| 	    H += 4; | ||||
| 	    *ptf++ = AbsAppl(HR); | ||||
| 	    HR[0] = (CELL)f; | ||||
| 	    HR[1] = ap2[1]; | ||||
| #if SIZEOF_DOUBLE == 2*SIZEOF_INT_P | ||||
| 	    HR[2] = ap2[2]; | ||||
| 	    HR[3] = EndSpecials; | ||||
| 	    HR += 4; | ||||
| #else | ||||
| 	    H[2] = EndSpecials; | ||||
| 	    H += 3; | ||||
| 	    HR[2] = EndSpecials; | ||||
| 	    HR += 3; | ||||
| #endif | ||||
| 	    break; | ||||
| 	  case (CELL)FunctorString: | ||||
| 	    if (ASP - HR > MIN_ARENA_SIZE+3+ap2[1]) { | ||||
| 	      goto overflow; | ||||
| 	    } | ||||
| 	    *ptf++ = AbsAppl(HR); | ||||
| 	    memcpy(HR, ap2, sizeof(CELL)*(3+ap2[1])); | ||||
| 	    HR+=ap2[1]+3; | ||||
| 	    break; | ||||
| 	  default: | ||||
| 	    { | ||||
| 	      /* big int */ | ||||
| 	      UInt sz = (sizeof(MP_INT)+3*CellSize+ | ||||
| 			 ((MP_INT *)(ap2+2))->_mp_alloc*sizeof(mp_limb_t))/CellSize, i; | ||||
|  | ||||
| 	      if (H > ASP - (MIN_ARENA_SIZE+sz)) { | ||||
| 	      if (HR > ASP - (MIN_ARENA_SIZE+sz)) { | ||||
| 		goto overflow; | ||||
| 	      } | ||||
| 	      *ptf++ = AbsAppl(H); | ||||
| 	      H[0] = (CELL)f; | ||||
| 	      *ptf++ = AbsAppl(HR); | ||||
| 	      HR[0] = (CELL)f; | ||||
| 	      for (i = 1; i < sz; i++) { | ||||
| 		H[i] = ap2[i]; | ||||
| 		HR[i] = ap2[i]; | ||||
| 	      } | ||||
| 	      H += sz; | ||||
| 	      HR += sz; | ||||
| 	    } | ||||
| 	  } | ||||
| 	  continue; | ||||
| 	} | ||||
| 	*ptf = AbsAppl(H); | ||||
| 	*ptf = AbsAppl(HR); | ||||
| 	ptf++; | ||||
| 	/* store the terms to visit */ | ||||
| #ifdef RATIONAL_TREES | ||||
| @@ -427,7 +435,7 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int cop | ||||
| 	to_visit->oldv = *pt0; | ||||
| 	to_visit->ground = ground; | ||||
| 	/* fool the system into thinking we had a variable there */ | ||||
| 	*pt0 = AbsAppl(H); | ||||
| 	*pt0 = AbsAppl(HR); | ||||
| 	to_visit ++; | ||||
| #else | ||||
| 	if (pt0 < pt0_end) { | ||||
| @@ -446,10 +454,10 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int cop | ||||
| 	pt0 = ap2; | ||||
| 	pt0_end = ap2 + d0; | ||||
| 	/* store the functor for the new term */ | ||||
| 	H[0] = (CELL)f; | ||||
| 	ptf = H+1; | ||||
| 	H += 1+d0; | ||||
| 	if (H > ASP - MIN_ARENA_SIZE) { | ||||
| 	HR[0] = (CELL)f; | ||||
| 	ptf = HR+1; | ||||
| 	HR += 1+d0; | ||||
| 	if (HR > ASP - MIN_ARENA_SIZE) { | ||||
| 	  goto overflow; | ||||
| 	} | ||||
|       } else { | ||||
| @@ -463,7 +471,7 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int cop | ||||
|     ground = FALSE; | ||||
|     /* don't need to copy variables if we want to share the global term */ | ||||
|     if ((share && ptd0 < HB && ptd0 > H0) || | ||||
| 	(ptd0 >= HLow && ptd0 < H)) {  | ||||
| 	(ptd0 >= HLow && ptd0 < HR)) {  | ||||
|       /* we have already found this cell */ | ||||
|       *ptf++ = (CELL) ptd0; | ||||
|     } else { | ||||
| @@ -522,7 +530,7 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int cop | ||||
|  | ||||
|  overflow: | ||||
|   /* oops, we're in trouble */ | ||||
|   H = HLow; | ||||
|   HR = HLow; | ||||
|   /* we've done it */ | ||||
|   /* restore our nice, friendly, term to its original state */ | ||||
|   HB = HB0; | ||||
| @@ -540,7 +548,7 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int cop | ||||
|  | ||||
|  heap_overflow: | ||||
|   /* oops, we're in trouble */ | ||||
|   H = HLow; | ||||
|   HR = HLow; | ||||
|   /* we've done it */ | ||||
|   /* restore our nice, friendly, term to its original state */ | ||||
|   HB = HB0; | ||||
| @@ -558,7 +566,7 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int cop | ||||
|  | ||||
|  trail_overflow: | ||||
|   /* oops, we're in trouble */ | ||||
|   H = HLow; | ||||
|   HR = HLow; | ||||
|   /* we've done it */ | ||||
|   /* restore our nice, friendly, term to its original state */ | ||||
|   HB = HB0; | ||||
| @@ -579,7 +587,7 @@ static Term | ||||
| CopyTermToArena(Term t, Term arena, int share, int copy_att_vars, UInt arity, Term *newarena, UInt min_grow USES_REGS) | ||||
| { | ||||
|   UInt old_size = ArenaSz(arena); | ||||
|   CELL *oldH = H; | ||||
|   CELL *oldH = HR; | ||||
|   CELL *oldHB = HB; | ||||
|   CELL *oldASP = ASP; | ||||
|   int res = 0; | ||||
| @@ -589,14 +597,14 @@ CopyTermToArena(Term t, Term arena, int share, int copy_att_vars, UInt arity, Te | ||||
|   t = Deref(t); | ||||
|   if (IsVarTerm(t)) { | ||||
|     ASP = ArenaLimit(arena); | ||||
|     H = HB = ArenaPt(arena); | ||||
|     HR = HB = ArenaPt(arena); | ||||
| #if COROUTINING | ||||
|     if (GlobalIsAttachedTerm(t)) { | ||||
|       CELL *Hi; | ||||
|  | ||||
|       *H = t; | ||||
|       Hi = H+1; | ||||
|       H += 2; | ||||
|       *HR = t; | ||||
|       Hi = HR+1; | ||||
|       HR += 2; | ||||
|       if ((res = copy_complex_term(Hi-2, Hi-1, share, copy_att_vars, Hi, Hi PASS_REGS)) < 0)  | ||||
| 	goto error_handler; | ||||
|       CloseArena(oldH, oldHB, oldASP, newarena, old_size PASS_REGS); | ||||
| @@ -608,7 +616,7 @@ CopyTermToArena(Term t, Term arena, int share, int copy_att_vars, UInt arity, Te | ||||
|       return t; | ||||
|     } | ||||
|     tn = MkVarTerm(); | ||||
|     if (H > ASP - MIN_ARENA_SIZE) { | ||||
|     if (HR > ASP - MIN_ARENA_SIZE) { | ||||
|       res = -1; | ||||
|       goto error_handler; | ||||
|     } | ||||
| @@ -624,12 +632,12 @@ CopyTermToArena(Term t, Term arena, int share, int copy_att_vars, UInt arity, Te | ||||
|     if (share && ArenaPt(arena) > RepPair(t)) { | ||||
|       return t; | ||||
|     } | ||||
|     H = HB = ArenaPt(arena); | ||||
|     HR = HB = ArenaPt(arena); | ||||
|     ASP = ArenaLimit(arena); | ||||
|     ap = RepPair(t); | ||||
|     Hi = H; | ||||
|     tf = AbsPair(H); | ||||
|     H += 2; | ||||
|     Hi = HR; | ||||
|     tf = AbsPair(HR); | ||||
|     HR += 2; | ||||
|     if ((res = copy_complex_term(ap-1, ap+1, share, copy_att_vars, Hi, Hi PASS_REGS)) < 0) { | ||||
| 	goto error_handler; | ||||
|     } | ||||
| @@ -644,59 +652,67 @@ CopyTermToArena(Term t, Term arena, int share, int copy_att_vars, UInt arity, Te | ||||
|     if (share && ArenaPt(arena) > RepAppl(t)) { | ||||
|       return t; | ||||
|     } | ||||
|     H = HB = ArenaPt(arena); | ||||
|     HR = HB = ArenaPt(arena); | ||||
|     ASP = ArenaLimit(arena); | ||||
|     f = FunctorOfTerm(t); | ||||
|     HB0 = H; | ||||
|     HB0 = HR; | ||||
|     ap = RepAppl(t); | ||||
|     tf = AbsAppl(H); | ||||
|     H[0] = (CELL)f; | ||||
|     tf = AbsAppl(HR); | ||||
|     HR[0] = (CELL)f; | ||||
|     if (IsExtensionFunctor(f)) { | ||||
|       switch((CELL)f) { | ||||
|       case (CELL)FunctorDBRef: | ||||
| 	CloseArena(oldH, oldHB, oldASP, newarena, old_size PASS_REGS); | ||||
| 	return t; | ||||
|       case (CELL)FunctorLongInt: | ||||
| 	if (H > ASP - (MIN_ARENA_SIZE+3)) { | ||||
| 	if (HR > ASP - (MIN_ARENA_SIZE+3)) { | ||||
| 	  res = -1; | ||||
| 	  goto error_handler; | ||||
| 	} | ||||
| 	H[1] = ap[1]; | ||||
| 	H[2] = EndSpecials; | ||||
| 	H += 3; | ||||
| 	HR[1] = ap[1]; | ||||
| 	HR[2] = EndSpecials; | ||||
| 	HR += 3; | ||||
| 	break; | ||||
|       case (CELL)FunctorDouble: | ||||
| 	if (H > ASP - (MIN_ARENA_SIZE+(2+SIZEOF_DOUBLE/sizeof(CELL)))) { | ||||
| 	if (HR > ASP - (MIN_ARENA_SIZE+(2+SIZEOF_DOUBLE/sizeof(CELL)))) { | ||||
| 	  res = -1; | ||||
| 	  goto error_handler; | ||||
| 	} | ||||
| 	H[1] = ap[1]; | ||||
| #if SIZEOF_DOUBLE == 2*SIZEOF_LONG_INT | ||||
| 	H[2] = ap[2]; | ||||
| 	H[3] = EndSpecials; | ||||
| 	H += 4; | ||||
| 	HR[1] = ap[1]; | ||||
| #if SIZEOF_DOUBLE == 2*SIZEOF_INT_P | ||||
| 	HR[2] = ap[2]; | ||||
| 	HR[3] = EndSpecials; | ||||
| 	HR += 4; | ||||
| #else | ||||
| 	H[2] = EndSpecials; | ||||
| 	H += 3; | ||||
| 	HR[2] = EndSpecials; | ||||
| 	HR += 3; | ||||
| #endif | ||||
| 	break; | ||||
|       case (CELL)FunctorString: | ||||
| 	if (HR > ASP - MIN_ARENA_SIZE+3+ap[1]) { | ||||
| 	  res = -1; | ||||
| 	  goto error_handler; | ||||
| 	} | ||||
| 	memcpy(HR, ap, sizeof(CELL)*(3+ap[1])); | ||||
| 	HR += ap[1]+3; | ||||
| 	break; | ||||
|       default: | ||||
| 	{ | ||||
| 	  UInt sz = ArenaSz(t), i; | ||||
|  | ||||
| 	  if (H > ASP - (MIN_ARENA_SIZE+sz)) { | ||||
| 	  if (HR > ASP - (MIN_ARENA_SIZE+sz)) { | ||||
| 	    res = -1; | ||||
| 	    goto error_handler; | ||||
| 	  } | ||||
| 	  for (i = 1; i < sz; i++) { | ||||
| 	    H[i] = ap[i]; | ||||
| 	    HR[i] = ap[i]; | ||||
| 	  } | ||||
| 	  H += sz; | ||||
| 	  HR += sz; | ||||
| 	} | ||||
|       } | ||||
|     } else { | ||||
|       H += 1+ArityOfFunctor(f); | ||||
|       if (H > ASP-MIN_ARENA_SIZE) { | ||||
|       HR += 1+ArityOfFunctor(f); | ||||
|       if (HR > ASP-MIN_ARENA_SIZE) { | ||||
| 	res = -1; | ||||
| 	goto error_handler; | ||||
|       }  | ||||
| @@ -708,7 +724,7 @@ CopyTermToArena(Term t, Term arena, int share, int copy_att_vars, UInt arity, Te | ||||
|     return tf; | ||||
|   } | ||||
|  error_handler: | ||||
|   H = HB; | ||||
|   HR = HB; | ||||
|   CloseArena(oldH, oldHB, oldASP, newarena, old_size PASS_REGS); | ||||
|   XREGS[arity+1] = t; | ||||
|   XREGS[arity+2] = arena; | ||||
| @@ -716,7 +732,7 @@ CopyTermToArena(Term t, Term arena, int share, int copy_att_vars, UInt arity, Te | ||||
|   { | ||||
|     CELL *old_top = ArenaLimit(*newarena); | ||||
|     ASP = oldASP; | ||||
|     H = oldH; | ||||
|     HR = oldH; | ||||
|     HB = oldHB; | ||||
|     switch (res) { | ||||
|     case -1: | ||||
| @@ -734,7 +750,7 @@ CopyTermToArena(Term t, Term arena, int share, int copy_att_vars, UInt arity, Te | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   oldH = H; | ||||
|   oldH = HR; | ||||
|   oldHB = HB; | ||||
|   oldASP = ASP; | ||||
|   newarena = (CELL *)XREGS[arity+3]; | ||||
| @@ -748,7 +764,7 @@ static Term | ||||
| CreateTermInArena(Term arena, Atom Na, UInt Nar, UInt arity, Term *newarena, Term init USES_REGS) | ||||
| { | ||||
|   UInt old_size = ArenaSz(arena); | ||||
|   CELL *oldH = H; | ||||
|   CELL *oldH = HR; | ||||
|   CELL *oldHB = HB; | ||||
|   CELL *oldASP = ASP; | ||||
|   Term tf; | ||||
| @@ -757,22 +773,22 @@ CreateTermInArena(Term arena, Atom Na, UInt Nar, UInt arity, Term *newarena, Ter | ||||
|   UInt i; | ||||
|  | ||||
|  restart: | ||||
|   H = HB = ArenaPt(arena); | ||||
|   HR = HB = ArenaPt(arena); | ||||
|   ASP = ArenaLimit(arena); | ||||
|   HB0 = H; | ||||
|   tf = AbsAppl(H); | ||||
|   H[0] = (CELL)f; | ||||
|   H += 1+ArityOfFunctor(f); | ||||
|   if (H > ASP-MIN_ARENA_SIZE) { | ||||
|   HB0 = HR; | ||||
|   tf = AbsAppl(HR); | ||||
|   HR[0] = (CELL)f; | ||||
|   HR += 1+ArityOfFunctor(f); | ||||
|   if (HR > ASP-MIN_ARENA_SIZE) { | ||||
|     /* overflow */ | ||||
|     H = HB; | ||||
|     HR = HB; | ||||
|     CloseArena(oldH, oldHB, oldASP, newarena, old_size PASS_REGS); | ||||
|     XREGS[arity+1] = arena; | ||||
|     XREGS[arity+2] = (CELL)newarena; | ||||
|     { | ||||
|       CELL *old_top = ArenaLimit(*newarena); | ||||
|       ASP = oldASP; | ||||
|       H = oldH; | ||||
|       HR = oldH; | ||||
|       HB = oldHB; | ||||
|       if (arena == LOCAL_GlobalArena) | ||||
| 	LOCAL_GlobalArenaOverflows++; | ||||
| @@ -781,7 +797,7 @@ CreateTermInArena(Term arena, Atom Na, UInt Nar, UInt arity, Term *newarena, Ter | ||||
| 	return 0L; | ||||
|       } | ||||
|     } | ||||
|     oldH = H; | ||||
|     oldH = HR; | ||||
|     oldHB = HB; | ||||
|     oldASP = ASP; | ||||
|     newarena = (CELL *)XREGS[arity+2]; | ||||
| @@ -1108,7 +1124,7 @@ p_nb_add_to_accumulator( USES_REGS1 ) | ||||
|     CELL *target = RepAppl(t0); | ||||
|     CELL *source = RepAppl(new); | ||||
|  | ||||
| #if  SIZEOF_DOUBLE == 2*SIZEOF_LONG_INT | ||||
| #if  SIZEOF_DOUBLE == 2*SIZEOF_INT_P | ||||
|     target[2] = source[2]; | ||||
| #endif | ||||
|     target[1] = source[1]; | ||||
| @@ -1236,7 +1252,7 @@ p_b_setval( USES_REGS1 ) | ||||
|   { | ||||
|     /* but first make sure we are doing on a global object, or a constant! */ | ||||
|     Term t = Deref(ARG2); | ||||
|     if (IsVarTerm(t) && VarOfTerm(t) > H && VarOfTerm(t) < LCL0) { | ||||
|     if (IsVarTerm(t) && VarOfTerm(t) > HR && VarOfTerm(t) < LCL0) { | ||||
|       Term tn = MkVarTerm(); | ||||
|       Bind_Local(VarOfTerm(t), tn); | ||||
|       t = tn; | ||||
| @@ -1476,7 +1492,7 @@ nb_queue(UInt arena_sz USES_REGS) | ||||
| static Int | ||||
| p_nb_queue( USES_REGS1 ) | ||||
| { | ||||
|   UInt arena_sz = (ASP-H)/16; | ||||
|   UInt arena_sz = (ASP-HR)/16; | ||||
|   if (LOCAL_DepthArenas > 1) | ||||
|     arena_sz /= LOCAL_DepthArenas; | ||||
|   if (arena_sz < MIN_ARENA_SIZE) | ||||
| @@ -1547,8 +1563,8 @@ RecoverArena(Term arena USES_REGS) | ||||
|   CELL *pt = ArenaPt(arena), | ||||
|     *max = ArenaLimit(arena); | ||||
|    | ||||
|   if (max == H) { | ||||
|     H = pt; | ||||
|   if (max == HR) { | ||||
|     HR = pt; | ||||
|   } | ||||
| } | ||||
|  | ||||
| @@ -1610,14 +1626,14 @@ p_nb_queue_enqueue( USES_REGS1 ) | ||||
|   qd = GetQueue(ARG1,"enqueue"); | ||||
|   arena = GetQueueArena(qd,"enqueue"); | ||||
|   /* garbage collection ? */ | ||||
|   oldH = H; | ||||
|   oldH = HR; | ||||
|   oldHB = HB; | ||||
|   H = HB = ArenaPt(arena); | ||||
|   HR = HB = ArenaPt(arena); | ||||
|   old_sz = ArenaSz(arena); | ||||
|   qsize = IntegerOfTerm(qd[QUEUE_SIZE]); | ||||
|   while (old_sz < MIN_ARENA_SIZE) { | ||||
|     UInt gsiz = H-RepPair(qd[QUEUE_HEAD]); | ||||
|     H = oldH; | ||||
|     UInt gsiz = HR-RepPair(qd[QUEUE_HEAD]); | ||||
|     HR = oldH; | ||||
|     HB = oldHB; | ||||
|     if (gsiz > 1024*1024) { | ||||
|       gsiz = 1024*1024; | ||||
| @@ -1633,21 +1649,21 @@ p_nb_queue_enqueue( USES_REGS1 ) | ||||
|     to = ARG3; | ||||
|     qd = RepAppl(Deref(ARG1))+1; | ||||
|     arena = GetQueueArena(qd,"enqueue"); | ||||
|     oldH = H; | ||||
|     oldH = HR; | ||||
|     oldHB = HB; | ||||
|     H = HB = ArenaPt(arena); | ||||
|     HR = HB = ArenaPt(arena); | ||||
|     old_sz = ArenaSz(arena);     | ||||
|   } | ||||
|   qd[QUEUE_SIZE] = Global_MkIntegerTerm(qsize+1); | ||||
|   if (qsize == 0) { | ||||
|     qd[QUEUE_HEAD] = AbsPair(H); | ||||
|     qd[QUEUE_HEAD] = AbsPair(HR); | ||||
|   } else { | ||||
|     *VarOfTerm(qd[QUEUE_TAIL]) = AbsPair(H); | ||||
|     *VarOfTerm(qd[QUEUE_TAIL]) = AbsPair(HR); | ||||
|   } | ||||
|   *H++ = to; | ||||
|   RESET_VARIABLE(H); | ||||
|   qd[QUEUE_TAIL] = (CELL)H; | ||||
|   H++; | ||||
|   *HR++ = to; | ||||
|   RESET_VARIABLE(HR); | ||||
|   qd[QUEUE_TAIL] = (CELL)HR; | ||||
|   HR++; | ||||
|   CloseArena(oldH, oldHB, ASP, qd+QUEUE_ARENA, old_sz PASS_REGS); | ||||
|   return TRUE; | ||||
| } | ||||
| @@ -1672,7 +1688,7 @@ p_nb_queue_dequeue( USES_REGS1 ) | ||||
|   out = HeadOfTerm(qd[QUEUE_HEAD]); | ||||
|   qd[QUEUE_HEAD] = TailOfTerm(qd[QUEUE_HEAD]); | ||||
|   /* garbage collection ? */ | ||||
|   oldH = H; | ||||
|   oldH = HR; | ||||
|   oldHB = HB; | ||||
|   qd[QUEUE_SIZE] = Global_MkIntegerTerm(qsz-1); | ||||
|   CloseArena(oldH, oldHB, ASP, &arena, old_sz PASS_REGS); | ||||
| @@ -1771,16 +1787,16 @@ MkZeroApplTerm(Functor f, UInt sz USES_REGS) | ||||
|   Term t0, tf; | ||||
|   CELL *pt; | ||||
|  | ||||
|   if (H+(sz+1) > ASP-1024) | ||||
|   if (HR+(sz+1) > ASP-1024) | ||||
|     return TermNil; | ||||
|   tf = AbsAppl(H); | ||||
|   *H = (CELL)f; | ||||
|   tf = AbsAppl(HR); | ||||
|   *HR = (CELL)f; | ||||
|   t0 = MkIntTerm(0); | ||||
|   pt = H+1; | ||||
|   pt = HR+1; | ||||
|   while (sz--) { | ||||
|     *pt++ = t0; | ||||
|   } | ||||
|   H = pt; | ||||
|   HR = pt; | ||||
|   return tf; | ||||
| } | ||||
|  | ||||
| @@ -1790,7 +1806,7 @@ p_nb_heap( USES_REGS1 ) | ||||
|   Term heap_arena, heap, *ar, *nar; | ||||
|   UInt hsize; | ||||
|   Term tsize = Deref(ARG1); | ||||
|   UInt arena_sz = (H-H0)/16; | ||||
|   UInt arena_sz = (HR-H0)/16; | ||||
|  | ||||
|   if (IsVarTerm(tsize)) { | ||||
|     Yap_Error(INSTANTIATION_ERROR,tsize,"nb_heap"); | ||||
| @@ -1941,9 +1957,9 @@ p_nb_heap_add_to_heap( USES_REGS1 ) | ||||
|     } | ||||
|     arena = qd[HEAP_ARENA]; | ||||
|     old_sz = ArenaSz(arena); | ||||
|     oldH = H; | ||||
|     oldH = HR; | ||||
|     oldHB = HB; | ||||
|     H = HB = ArenaPt(arena); | ||||
|     HR = HB = ArenaPt(arena); | ||||
|     qd[HEAP_MAX] = Global_MkIntegerTerm(hmsize); | ||||
|     CloseArena(oldH, oldHB, ASP, qd+HEAP_ARENA, old_sz PASS_REGS); | ||||
|     goto restart; | ||||
| @@ -1963,14 +1979,14 @@ p_nb_heap_add_to_heap( USES_REGS1 ) | ||||
|   qd = GetHeap(ARG1,"add_to_heap"); | ||||
|   arena = qd[HEAP_ARENA]; | ||||
|   /* garbage collection ? */ | ||||
|   oldH = H; | ||||
|   oldH = HR; | ||||
|   oldHB = HB; | ||||
|   H = HB = ArenaPt(arena); | ||||
|   HR = HB = ArenaPt(arena); | ||||
|   old_sz = ArenaSz(arena); | ||||
|   while (old_sz < MIN_ARENA_SIZE) { | ||||
|     UInt gsiz = hsize*2; | ||||
|  | ||||
|     H = oldH; | ||||
|     HR = oldH; | ||||
|     HB = oldHB; | ||||
|     if (gsiz > 1024*1024) { | ||||
|       gsiz = 1024*1024; | ||||
| @@ -1985,9 +2001,9 @@ p_nb_heap_add_to_heap( USES_REGS1 ) | ||||
|     to = ARG3; | ||||
|     qd = RepAppl(Deref(ARG1))+1; | ||||
|     arena = qd[HEAP_ARENA]; | ||||
|     oldH = H; | ||||
|     oldH = HR; | ||||
|     oldHB = HB; | ||||
|     H = HB = ArenaPt(arena); | ||||
|     HR = HB = ArenaPt(arena); | ||||
|     old_sz = ArenaSz(arena);     | ||||
|   } | ||||
|   pt = qd+HEAP_START; | ||||
| @@ -2018,7 +2034,7 @@ p_nb_heap_del( USES_REGS1 ) | ||||
|     return FALSE; | ||||
|   old_sz = ArenaSz(arena); | ||||
|   /* garbage collection ? */ | ||||
|   oldH = H; | ||||
|   oldH = HR; | ||||
|   oldHB = HB; | ||||
|   qd[HEAP_SIZE] = Global_MkIntegerTerm(qsz-1); | ||||
|   CloseArena(oldH, oldHB, ASP, &arena, old_sz PASS_REGS); | ||||
| @@ -2073,7 +2089,7 @@ p_nb_beam( USES_REGS1 ) | ||||
|   Term beam_arena, beam, *ar, *nar; | ||||
|   UInt hsize; | ||||
|   Term tsize = Deref(ARG1); | ||||
|   UInt arena_sz = (H-H0)/16; | ||||
|   UInt arena_sz = (HR-H0)/16; | ||||
|  | ||||
|   if (IsVarTerm(tsize)) { | ||||
|     Yap_Error(INSTANTIATION_ERROR,tsize,"nb_beam"); | ||||
| @@ -2352,14 +2368,14 @@ p_nb_beam_add_to_beam( USES_REGS1 ) | ||||
|   qd = GetHeap(ARG1,"add_to_beam"); | ||||
|   arena = qd[HEAP_ARENA]; | ||||
|   /* garbage collection ? */ | ||||
|   oldH = H; | ||||
|   oldH = HR; | ||||
|   oldHB = HB; | ||||
|   H = HB = ArenaPt(arena); | ||||
|   HR = HB = ArenaPt(arena); | ||||
|   old_sz = ArenaSz(arena); | ||||
|   while (old_sz < MIN_ARENA_SIZE) { | ||||
|     UInt gsiz = hsize*2; | ||||
|  | ||||
|     H = oldH; | ||||
|     HR = oldH; | ||||
|     HB = oldHB; | ||||
|     if (gsiz > 1024*1024) { | ||||
|       gsiz = 1024*1024; | ||||
| @@ -2374,9 +2390,9 @@ p_nb_beam_add_to_beam( USES_REGS1 ) | ||||
|     to = ARG3; | ||||
|     qd = RepAppl(Deref(ARG1))+1; | ||||
|     arena = qd[HEAP_ARENA]; | ||||
|     oldH = H; | ||||
|     oldH = HR; | ||||
|     oldHB = HB; | ||||
|     H = HB = ArenaPt(arena); | ||||
|     HR = HB = ArenaPt(arena); | ||||
|     old_sz = ArenaSz(arena);     | ||||
|   } | ||||
|   pt = qd+HEAP_START; | ||||
| @@ -2405,7 +2421,7 @@ p_nb_beam_del( USES_REGS1 ) | ||||
|     return FALSE; | ||||
|   old_sz = ArenaSz(arena); | ||||
|   /* garbage collection ? */ | ||||
|   oldH = H; | ||||
|   oldH = HR; | ||||
|   oldHB = HB; | ||||
|   qd[HEAP_SIZE] = Global_MkIntegerTerm(qsz-1); | ||||
|   CloseArena(oldH, oldHB, ASP, &arena, old_sz PASS_REGS); | ||||
| @@ -2472,25 +2488,25 @@ p_nb_beam_keys( USES_REGS1 ) | ||||
|   if (!qd) | ||||
|     return FALSE; | ||||
|   qsz = IntegerOfTerm(qd[HEAP_SIZE]); | ||||
|   ho = H; | ||||
|   ho = HR; | ||||
|   pt = qd+HEAP_START; | ||||
|   if (qsz == 0) | ||||
|     return Yap_unify(ARG2, TermNil); | ||||
|   for (i=0; i < qsz; i++) { | ||||
|     if (H > ASP-1024) { | ||||
|       H = ho; | ||||
|       if (!Yap_gcl(((ASP-H)-1024)*sizeof(CELL), 2, ENV, P)) { | ||||
|     if (HR > ASP-1024) { | ||||
|       HR = ho; | ||||
|       if (!Yap_gcl(((ASP-HR)-1024)*sizeof(CELL), 2, ENV, P)) { | ||||
| 	Yap_Error(OUT_OF_STACK_ERROR, TermNil, LOCAL_ErrorMessage); | ||||
| 	return TermNil; | ||||
|       } | ||||
|       goto restart; | ||||
|     } | ||||
|     *H++ = pt[0]; | ||||
|     *H = AbsPair(H+1); | ||||
|     H++; | ||||
|     *HR++ = pt[0]; | ||||
|     *HR = AbsPair(HR+1); | ||||
|     HR++; | ||||
|     pt += 2; | ||||
|   } | ||||
|   H[-1] = TermNil; | ||||
|   HR[-1] = TermNil; | ||||
|   return Yap_unify(ARG2, AbsPair(ho)); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -1327,51 +1327,6 @@ Yap_gmp_tcmp_big_big(Term t1, Term t2) | ||||
|       return 1; | ||||
|     } else if (pt1[1] == BIG_RATIONAL) { | ||||
|       b1 = Yap_BigRatOfTerm(t1); | ||||
|     } else if (pt1[1] == BLOB_STRING) { | ||||
|       char *s1 = Yap_BlobStringOfTerm(t1); | ||||
|       if (pt2[1] == BLOB_STRING) { | ||||
| 	char *s2 = Yap_BlobStringOfTerm(t2); | ||||
| 	return strcmp(s1,s2); | ||||
|       } else if (pt2[1] == BLOB_WIDE_STRING) { | ||||
| 	wchar_t *wcs2 = Yap_BlobWideStringOfTerm(t2), *wcs1, *tmp1; | ||||
| 	int out; | ||||
| 	size_t n = strlen(s1); | ||||
| 	if (!(wcs1 = (wchar_t *)malloc((n+1)*sizeof(wchar_t)))) { | ||||
| 	  Yap_Error(OUT_OF_HEAP_ERROR, t1, "compare/3");	   | ||||
| 	  return 0; | ||||
| 	} | ||||
| 	tmp1 = wcs1; | ||||
| 	while (*s1) { | ||||
| 	  *tmp1++ = *s1++; | ||||
| 	} | ||||
| 	out = wcscmp(wcs1, wcs2); | ||||
| 	free(wcs1); | ||||
| 	return out; | ||||
|       } | ||||
|       b1 = Yap_BigRatOfTerm(t1); | ||||
|     } else if (pt1[1] == BLOB_WIDE_STRING) { | ||||
|       wchar_t *wcs1 = Yap_BlobWideStringOfTerm(t1); | ||||
|       if (pt2[1] == BLOB_STRING) { | ||||
| 	char *s2 = Yap_BlobStringOfTerm(t2); | ||||
| 	wchar_t *wcs2, *tmp2; | ||||
| 	int out; | ||||
| 	size_t n = strlen(s2); | ||||
| 	if (!(wcs2 = (wchar_t *)malloc((n+1)*sizeof(wchar_t)))) { | ||||
| 	  Yap_Error(OUT_OF_HEAP_ERROR, t2, "compare/3");	   | ||||
| 	  return 0; | ||||
| 	} | ||||
| 	tmp2 = wcs2; | ||||
| 	while (*s2) { | ||||
| 	  *tmp2++ = *s2++; | ||||
| 	} | ||||
| 	out = wcscmp(wcs1, wcs2); | ||||
| 	free(wcs2); | ||||
| 	return out; | ||||
|       } else if (pt2[1] == BLOB_WIDE_STRING) { | ||||
| 	wchar_t *wcs2 = Yap_BlobWideStringOfTerm(t2); | ||||
| 	return wcscmp(wcs1,wcs2); | ||||
|       } | ||||
|       b1 = Yap_BigRatOfTerm(t1); | ||||
|     } else { | ||||
|       return pt1-pt2; | ||||
|     } | ||||
| @@ -1686,6 +1641,19 @@ Yap_gmp_popcount(Term t) | ||||
|   } | ||||
| } | ||||
|  | ||||
| char *  | ||||
| Yap_mpz_to_string(MP_INT *b, char *s, size_t sz, int base) | ||||
| { | ||||
|   if (s) { | ||||
|     size_t size = mpz_sizeinbase(b, base); | ||||
|     if (size+2 > sz) { | ||||
|       return NULL; | ||||
|     } | ||||
|     return mpz_get_str (s, base, b); | ||||
|   } | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| char *  | ||||
| Yap_gmp_to_string(Term t, char *s, size_t sz, int base) | ||||
| { | ||||
|   | ||||
							
								
								
									
										131
									
								
								C/grow.c
									
									
									
									
									
								
							
							
						
						
									
										131
									
								
								C/grow.c
									
									
									
									
									
								
							| @@ -22,9 +22,7 @@ | ||||
| #include "sshift.h" | ||||
| #include "compile.h" | ||||
| #include "attvar.h" | ||||
| #ifdef CUT_C | ||||
| #include "cut_c.h" | ||||
| #endif /* CUT_C */ | ||||
| #if HAVE_STRING_H | ||||
| #include <string.h> | ||||
| #endif | ||||
| @@ -100,7 +98,7 @@ SetHeapRegs(int copying_threads USES_REGS) | ||||
|   LOCAL_OldLCL0 = LCL0; | ||||
|   LOCAL_OldASP = ASP; | ||||
|   LOCAL_OldGlobalBase = (CELL *)LOCAL_GlobalBase; | ||||
|   LOCAL_OldH = H; | ||||
|   LOCAL_OldH = HR; | ||||
|   LOCAL_OldH0 = H0; | ||||
|   LOCAL_OldTrailBase = LOCAL_TrailBase; | ||||
|   LOCAL_OldTrailTop = LOCAL_TrailTop; | ||||
| @@ -135,18 +133,26 @@ SetHeapRegs(int copying_threads USES_REGS) | ||||
|   if (LCL0) | ||||
|     LCL0 = PtoLocAdjust(LCL0); | ||||
|   UNLOCK(LOCAL_SignalLock); | ||||
|   if (H) | ||||
|     H = PtoGloAdjust(H); | ||||
| #ifdef CUT_C | ||||
|   if (HR) | ||||
|     HR = PtoGloAdjust(HR); | ||||
|   if (Yap_REGS.CUT_C_TOP) | ||||
|     Yap_REGS.CUT_C_TOP = CutCAdjust(Yap_REGS.CUT_C_TOP); | ||||
| #endif | ||||
|   if (HB) | ||||
|     HB = PtoGloAdjust(HB); | ||||
|   if (LOCAL_OpenArray) | ||||
|     LOCAL_OpenArray = PtoGloAdjust(LOCAL_OpenArray); | ||||
|   if (B) | ||||
|     B = ChoicePtrAdjust(B); | ||||
| #ifdef YAPOR_THREADS | ||||
|   { | ||||
|     choiceptr cpt; | ||||
|     cpt = Get_LOCAL_top_cp(); | ||||
|     if (cpt) { | ||||
|       //      cpt = ChoicePtrAdjust( cpt ); | ||||
|       Set_LOCAL_top_cp( cpt ); | ||||
|     } | ||||
|   } | ||||
| #endif | ||||
| #ifdef TABLING | ||||
|   if (B_FZ) | ||||
|     B_FZ = ChoicePtrAdjust(B_FZ); | ||||
| @@ -220,7 +226,7 @@ static CELL | ||||
| worker_p_binding(int worker_p, CELL *aux_ptr) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   if (aux_ptr > H) { | ||||
|   if (aux_ptr > HR) { | ||||
|     CELL reg = REMOTE_ThreadHandle(worker_p).current_yaam_regs->LCL0_[aux_ptr-LCL0]; | ||||
|     reg = AdjustGlobTerm(reg PASS_REGS); | ||||
|     return reg; | ||||
| @@ -245,7 +251,7 @@ RestoreTrail(int worker_p USES_REGS) | ||||
|   if (aux_tr < TR){ | ||||
|     Yap_Error(SYSTEM_ERROR, TermNil, "oops"); | ||||
|   } | ||||
|   Yap_NEW_MAHASH((ma_h_inner_struct *)H PASS_REGS); | ||||
|   Yap_NEW_MAHASH((ma_h_inner_struct *)HR PASS_REGS); | ||||
|   while (TR != aux_tr) { | ||||
|     CELL aux_cell = TrailTerm(--aux_tr); | ||||
|     if (IsVarTerm(aux_cell)) { | ||||
| @@ -532,7 +538,7 @@ AdjustGlobal(long sz, int thread_copying USES_REGS) | ||||
|   } else { | ||||
| #endif | ||||
|     pt = H0; | ||||
|     pt_max = (H-sz/CellSize); | ||||
|     pt_max = (HR-sz/CellSize); | ||||
| #if defined(YAPOR_THREADS) | ||||
|   } | ||||
| #endif | ||||
| @@ -553,12 +559,15 @@ AdjustGlobal(long sz, int thread_copying USES_REGS) | ||||
| 	/* skip bitmaps */ | ||||
| 	switch((CELL)f) { | ||||
| 	case (CELL)FunctorDouble: | ||||
| #if SIZEOF_DOUBLE == 2*SIZEOF_LONG_INT | ||||
| #if SIZEOF_DOUBLE == 2*SIZEOF_INT_P | ||||
| 	  pt += 3; | ||||
| #else | ||||
| 	  pt += 2; | ||||
| #endif | ||||
| 	  break; | ||||
| 	case (CELL)FunctorString: | ||||
| 	  pt += 3+pt[1]; | ||||
| 	  break; | ||||
| 	case (CELL)FunctorBigInt: | ||||
| 	  { | ||||
| 	    Int sz = 2+ | ||||
| @@ -811,7 +820,7 @@ static_growheap(long size, int fix_code, struct intermediates *cip, tr_fr_ptr *o | ||||
|   /* CreepFlag is set to force heap expansion */ | ||||
|   if (LOCAL_ActiveSignals == YAP_CDOVF_SIGNAL) { | ||||
|     LOCK(LOCAL_SignalLock); | ||||
|     CreepFlag = CalculateStackGap(); | ||||
|     CalculateStackGap( PASS_REGS1 ); | ||||
|     UNLOCK(LOCAL_SignalLock); | ||||
|   } | ||||
|   ASP -= 256; | ||||
| @@ -888,19 +897,19 @@ static_growglobal(long request, CELL **ptr, CELL *hsplit USES_REGS) | ||||
| 	do_grow = FALSE; | ||||
|       } | ||||
|     } else if (hsplit < (CELL*)omax || | ||||
| 	hsplit > H) | ||||
| 	hsplit > HR) | ||||
|       return FALSE; | ||||
|     else if (hsplit == (CELL *)omax) | ||||
|       hsplit = NULL; | ||||
|     if (size < 0 || | ||||
| 	(Unsigned(H)+size < Unsigned(ASP)-CreepFlag && | ||||
| 	(Unsigned(HR)+size < Unsigned(ASP)-StackGap( PASS_REGS1 ) && | ||||
| 	 hsplit > H0)) { | ||||
|       /* don't need to expand stacks */ | ||||
|       insert_in_delays = FALSE; | ||||
|       do_grow = FALSE; | ||||
|     } | ||||
|   } else { | ||||
|     if (Unsigned(H)+size < Unsigned(ASP)-CreepFlag) { | ||||
|     if (Unsigned(HR)+size < Unsigned(ASP)-CreepFlag) { | ||||
|       /* we can just ask for more room */ | ||||
|       do_grow = FALSE; | ||||
|     }     | ||||
| @@ -1082,7 +1091,9 @@ fix_compiler_instructions(PInstr *pcpc USES_REGS) | ||||
|     case get_float_op: | ||||
|     case put_float_op: | ||||
|     case get_longint_op: | ||||
|     case get_string_op: | ||||
|     case put_longint_op: | ||||
|     case put_string_op: | ||||
|     case unify_float_op: | ||||
|     case unify_last_float_op: | ||||
|     case write_float_op: | ||||
| @@ -1112,8 +1123,11 @@ fix_compiler_instructions(PInstr *pcpc USES_REGS) | ||||
|     case unify_last_num_op: | ||||
|     case write_num_op: | ||||
|     case unify_longint_op: | ||||
|     case unify_string_op: | ||||
|     case unify_last_longint_op: | ||||
|     case unify_last_string_op: | ||||
|     case write_longint_op: | ||||
|     case write_string_op: | ||||
|     case unify_bigint_op: | ||||
|     case unify_last_bigint_op: | ||||
|     case unify_dbterm_op: | ||||
| @@ -1166,6 +1180,7 @@ fix_compiler_instructions(PInstr *pcpc USES_REGS) | ||||
|     case index_dbref_op: | ||||
|     case index_blob_op: | ||||
|     case index_long_op: | ||||
|     case index_string_op: | ||||
|     case if_nonvar_op: | ||||
|     case unify_last_list_op: | ||||
|     case write_last_list_op: | ||||
| @@ -1182,6 +1197,7 @@ fix_compiler_instructions(PInstr *pcpc USES_REGS) | ||||
|     case enter_lu_op: | ||||
|     case empty_call_op: | ||||
|     case blob_op: | ||||
|     case string_op: | ||||
|     case fetch_args_vi_op: | ||||
|     case fetch_args_iv_op: | ||||
|     case label_ctl_op: | ||||
| @@ -1305,7 +1321,7 @@ do_growheap(int fix_code, UInt in_size, struct intermediates *cip, tr_fr_ptr *ol | ||||
|     LOCK(LOCAL_SignalLock); | ||||
|     LOCAL_ActiveSignals &= ~YAP_CDOVF_SIGNAL; | ||||
|     if (!LOCAL_ActiveSignals) | ||||
| 	CreepFlag = CalculateStackGap(); | ||||
| 	CalculateStackGap( PASS_REGS1 ); | ||||
|     UNLOCK(LOCAL_SignalLock); | ||||
|     return TRUE; | ||||
|   } | ||||
| @@ -1361,7 +1377,7 @@ growatomtable( USES_REGS1 ) | ||||
|  | ||||
|   LOCK(LOCAL_SignalLock); | ||||
|   if (LOCAL_ActiveSignals == YAP_CDOVF_SIGNAL) { | ||||
|     CreepFlag = CalculateStackGap(); | ||||
|     CalculateStackGap( PASS_REGS1 ); | ||||
|   } | ||||
|   LOCAL_ActiveSignals &= ~YAP_CDOVF_SIGNAL; | ||||
|   UNLOCK(LOCAL_SignalLock); | ||||
| @@ -1416,6 +1432,18 @@ Yap_growheap(int fix_code, size_t in_size, void *cip) | ||||
|   int res; | ||||
|   int blob_overflow = (NOfBlobs > NOfBlobsMax); | ||||
|  | ||||
| #if (THREADS) || YAPOR | ||||
|   res = FALSE; | ||||
|   if (NOfAtoms > 2*AtomHashTableSize || blob_overflow) { | ||||
|       LOCK(LOCAL_SignalLock); | ||||
|       if (LOCAL_ActiveSignals == YAP_CDOVF_SIGNAL) { | ||||
| 	CalculateStackGap( PASS_REGS1 ); | ||||
|       } | ||||
|       LOCAL_ActiveSignals &= ~YAP_CDOVF_SIGNAL; | ||||
|       UNLOCK(LOCAL_SignalLock); | ||||
|       return TRUE; | ||||
|     } | ||||
| #else | ||||
|   if (NOfAtoms > 2*AtomHashTableSize || blob_overflow) { | ||||
|     UInt n = NOfAtoms; | ||||
|     if (GLOBAL_AGcThreshold) | ||||
| @@ -1429,7 +1457,7 @@ Yap_growheap(int fix_code, size_t in_size, void *cip) | ||||
|     } else { | ||||
|       LOCK(LOCAL_SignalLock); | ||||
|       if (LOCAL_ActiveSignals == YAP_CDOVF_SIGNAL) { | ||||
| 	CreepFlag = CalculateStackGap(); | ||||
| 	CalculateStackGap( PASS_REGS1 ); | ||||
|       } | ||||
|       LOCAL_ActiveSignals &= ~YAP_CDOVF_SIGNAL; | ||||
|       UNLOCK(LOCAL_SignalLock); | ||||
| @@ -1446,6 +1474,7 @@ Yap_growheap(int fix_code, size_t in_size, void *cip) | ||||
|   res=do_growheap(fix_code, in_size, (struct intermediates *)cip, NULL, NULL, NULL PASS_REGS); | ||||
| #endif | ||||
|   LeaveGrowMode(GrowHeapMode); | ||||
| #endif | ||||
|   return res; | ||||
| } | ||||
|  | ||||
| @@ -1634,7 +1663,7 @@ growstack(size_t size USES_REGS) | ||||
|     fprintf(GLOBAL_stderr, "%% Worker Id %d:\n", worker_id); | ||||
| #endif | ||||
|     fprintf(GLOBAL_stderr, "%% Stack Overflow %d\n", LOCAL_stack_overflows); | ||||
|     fprintf(GLOBAL_stderr, "%%   Global: %8ld cells (%p-%p)\n", (unsigned long int)(H-(CELL *)LOCAL_GlobalBase),LOCAL_GlobalBase,H); | ||||
|     fprintf(GLOBAL_stderr, "%%   Global: %8ld cells (%p-%p)\n", (unsigned long int)(HR-(CELL *)LOCAL_GlobalBase),LOCAL_GlobalBase,HR); | ||||
|     fprintf(GLOBAL_stderr, "%%   Local:%8ld cells (%p-%p)\n", (unsigned long int)(LCL0-ASP),LCL0,ASP); | ||||
|     fprintf(GLOBAL_stderr, "%%   Trail:%8ld cells (%p-%p)\n", | ||||
| 	       (unsigned long int)(TR-(tr_fr_ptr)LOCAL_TrailBase),LOCAL_TrailBase,TR); | ||||
| @@ -1672,7 +1701,7 @@ Yap_growstack_in_parser(tr_fr_ptr *old_trp, TokEntry **tksp, VarEntry **vep) | ||||
|     fprintf(GLOBAL_stderr, "%% Worker Id %d:\n", worker_id); | ||||
| #endif | ||||
|     fprintf(GLOBAL_stderr, "%% Stack Overflow %d\n", LOCAL_stack_overflows); | ||||
|     fprintf(GLOBAL_stderr, "%%   Global: %8ld cells (%p-%p)\n", (unsigned long int)(H-(CELL *)LOCAL_GlobalBase),LOCAL_GlobalBase,H); | ||||
|     fprintf(GLOBAL_stderr, "%%   Global: %8ld cells (%p-%p)\n", (unsigned long int)(HR-(CELL *)LOCAL_GlobalBase),LOCAL_GlobalBase,HR); | ||||
|     fprintf(GLOBAL_stderr, "%%   Local:%8ld cells (%p-%p)\n", (unsigned long int)(LCL0-ASP),LCL0,ASP); | ||||
|     fprintf(GLOBAL_stderr, "%%   Trail:%8ld cells (%p-%p)\n", | ||||
| 	       (unsigned long int)(TR-(tr_fr_ptr)LOCAL_TrailBase),LOCAL_TrailBase,TR); | ||||
| @@ -1721,7 +1750,7 @@ static int do_growtrail(long size, int contiguous_only, int in_parser, tr_fr_ptr | ||||
| #endif | ||||
|     fprintf(GLOBAL_stderr, "%% Trail Overflow %d\n", LOCAL_trail_overflows); | ||||
| #if USE_SYSTEM_MALLOC | ||||
|     fprintf(GLOBAL_stderr, "%%  Heap: %8ld cells (%p-%p)\n", (unsigned long int)(H-(CELL *)LOCAL_GlobalBase),(CELL *)LOCAL_GlobalBase,H); | ||||
|     fprintf(GLOBAL_stderr, "%%  Heap: %8ld cells (%p-%p)\n", (unsigned long int)(HR-(CELL *)LOCAL_GlobalBase),(CELL *)LOCAL_GlobalBase,HR); | ||||
|     fprintf(GLOBAL_stderr, "%%  Local:%8ld cells (%p-%p)\n", (unsigned long int)(LCL0-ASP),LCL0,ASP); | ||||
|     fprintf(GLOBAL_stderr, "%%  Trail:%8ld cells (%p-%p)\n", | ||||
| 	       (unsigned long int)(TR-(tr_fr_ptr)LOCAL_TrailBase),LOCAL_TrailBase,TR); | ||||
| @@ -1764,7 +1793,7 @@ static int do_growtrail(long size, int contiguous_only, int in_parser, tr_fr_ptr | ||||
|   } | ||||
|   LOCK(LOCAL_SignalLock); | ||||
|   if (LOCAL_ActiveSignals == YAP_TROVF_SIGNAL) { | ||||
|     CreepFlag = CalculateStackGap(); | ||||
|     CalculateStackGap( PASS_REGS1 ); | ||||
|   } | ||||
|   LOCAL_ActiveSignals &= ~YAP_TROVF_SIGNAL; | ||||
|   UNLOCK(LOCAL_SignalLock); | ||||
| @@ -1878,11 +1907,59 @@ Yap_CopyThreadStacks(int worker_q, int worker_p, int incremental) | ||||
|   /* make sure both stacks have same size */ | ||||
|   Int p_size = REMOTE_ThreadHandle(worker_p).ssize+REMOTE_ThreadHandle(worker_p).tsize; | ||||
|   Int q_size = REMOTE_ThreadHandle(worker_q).ssize+REMOTE_ThreadHandle(worker_q).tsize; | ||||
|   if (p_size != q_size) { | ||||
|     if (!(REMOTE_ThreadHandle(worker_q).stack_address = realloc(REMOTE_ThreadHandle(worker_q).stack_address,p_size*K1))) { | ||||
|       exit(1); | ||||
|    if (p_size != q_size) { | ||||
|     UInt start_growth_time, growth_time; | ||||
|     int gc_verbose; | ||||
|     size_t ssiz = REMOTE_ThreadHandle(worker_q).ssize*K1; | ||||
|     size_t tsiz = REMOTE_ThreadHandle(worker_q).tsize*K1; | ||||
|     size_t diff = (REMOTE_ThreadHandle(worker_p).ssize-REMOTE_ThreadHandle(worker_q).ssize)*K1; | ||||
|     char *oldq = (char *)REMOTE_ThreadHandle(worker_q).stack_address, *newq; | ||||
|  | ||||
|     if (!(newq = REMOTE_ThreadHandle(worker_q).stack_address = realloc(REMOTE_ThreadHandle(worker_q).stack_address,p_size*K1))) { | ||||
|       Yap_Error(OUT_OF_STACK_ERROR,TermNil,"cannot expand slave thread to match master thread"); | ||||
|     } | ||||
|     start_growth_time = Yap_cputime(); | ||||
|     gc_verbose = Yap_is_gc_verbose(); | ||||
|     LOCAL_stack_overflows++; | ||||
|     if (gc_verbose) { | ||||
| #if  defined(YAPOR) || defined(THREADS) | ||||
|       fprintf(GLOBAL_stderr, "%% Worker Id %d:\n", worker_id); | ||||
| #endif | ||||
|       fprintf(GLOBAL_stderr, "%% Stack Overflow %d\n", LOCAL_stack_overflows); | ||||
|       fprintf(GLOBAL_stderr, "%%   Stack: %8ld cells (%p-%p)\n", (unsigned long int)(LCL0-(CELL *)LOCAL_GlobalBase),LOCAL_GlobalBase,LCL0); | ||||
|       fprintf(GLOBAL_stderr, "%%   Trail:%8ld cells (%p-%p)\n", | ||||
| 	      (unsigned long int)(TR-(tr_fr_ptr)LOCAL_TrailBase),LOCAL_TrailBase,TR); | ||||
|       fprintf(GLOBAL_stderr, "%% Growing the stacks %ld bytes\n", diff); | ||||
|     } | ||||
|     LOCAL_GDiff = LOCAL_GDiff0 = LOCAL_DelayDiff = LOCAL_BaseDiff = (newq-oldq); | ||||
|     LOCAL_TrDiff = LOCAL_LDiff = diff + LOCAL_GDiff; | ||||
|     LOCAL_XDiff = LOCAL_HDiff = 0; | ||||
|     LOCAL_GSplit = NULL; | ||||
|     YAPEnterCriticalSection(); | ||||
|     SetHeapRegs(FALSE PASS_REGS); | ||||
|     { | ||||
|         choiceptr imageB;  | ||||
|  | ||||
| 	LOCAL_OldLCL0 = LCL0; | ||||
| 	LCL0 = REMOTE_ThreadHandle(0).current_yaam_regs->LCL0_; | ||||
| 	imageB = Get_GLOBAL_root_cp(); | ||||
| 	/* we know B */ | ||||
| 	B->cp_tr = TR =  | ||||
| 	  (tr_fr_ptr)((CELL)(imageB->cp_tr)+((CELL)LOCAL_OldLCL0-(CELL)LCL0)); | ||||
| 	LCL0 = LOCAL_OldLCL0; | ||||
| 	B->cp_h = H0; | ||||
| 	B->cp_ap = GETWORK; | ||||
| 	B->cp_or_fr = GLOBAL_root_or_fr; | ||||
|     } | ||||
|     YAPLeaveCriticalSection(); | ||||
|     growth_time = Yap_cputime()-start_growth_time; | ||||
|     LOCAL_total_stack_overflow_time += growth_time; | ||||
|     if (gc_verbose) { | ||||
|       fprintf(GLOBAL_stderr, "%%   took %g sec\n", (double)growth_time/1000); | ||||
|       fprintf(GLOBAL_stderr, "%% Total of %g sec expanding stacks \n", (double)LOCAL_total_stack_overflow_time/1000); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   REMOTE_ThreadHandle(worker_q).ssize = REMOTE_ThreadHandle(worker_p).ssize; | ||||
|   REMOTE_ThreadHandle(worker_q).tsize = REMOTE_ThreadHandle(worker_p).tsize; | ||||
|   /* compute offset indicators */ | ||||
| @@ -1895,7 +1972,7 @@ Yap_CopyThreadStacks(int worker_q, int worker_p, int incremental) | ||||
|   LOCAL_TrDiff = LOCAL_LDiff = LOCAL_GDiff = LOCAL_GDiff0 = LOCAL_DelayDiff = LOCAL_BaseDiff = size; | ||||
|   LOCAL_XDiff = LOCAL_HDiff = 0; | ||||
|   LOCAL_GSplit = NULL; | ||||
|   H = REMOTE_ThreadHandle(worker_p).current_yaam_regs->H_; | ||||
|   HR = REMOTE_ThreadHandle(worker_p).current_yaam_regs->H_; | ||||
|   H0 = REMOTE_ThreadHandle(worker_p).current_yaam_regs->H0_; | ||||
|   B = REMOTE_ThreadHandle(worker_p).current_yaam_regs->B_; | ||||
|   ENV = REMOTE_ThreadHandle(worker_p).current_yaam_regs->ENV_; | ||||
| @@ -1905,9 +1982,7 @@ Yap_CopyThreadStacks(int worker_q, int worker_p, int incremental) | ||||
|   if (ASP > CellPtr(B)) | ||||
|     ASP = CellPtr(B); | ||||
|   LCL0 = REMOTE_ThreadHandle(worker_p).current_yaam_regs->LCL0_; | ||||
| #ifdef CUT_C | ||||
|   Yap_REGS.CUT_C_TOP = REMOTE_ThreadHandle(worker_p).current_yaam_regs->CUT_C_TOP; | ||||
| #endif | ||||
|   LOCAL_DynamicArrays = NULL; | ||||
|   LOCAL_StaticArrays = NULL; | ||||
|   LOCAL_GlobalVariables = NULL; | ||||
|   | ||||
							
								
								
									
										84
									
								
								C/heapgc.c
									
									
									
									
									
								
							
							
						
						
									
										84
									
								
								C/heapgc.c
									
									
									
									
									
								
							| @@ -1010,7 +1010,7 @@ static void | ||||
| inc_vars_of_type(CELL *curr,gc_types val) { | ||||
|   if (curr >= H0 && curr < TrueHB) { | ||||
|     old_vars++; | ||||
|   } else if (curr >= TrueHB && curr < H) { | ||||
|   } else if (curr >= TrueHB && curr < HR) { | ||||
|     new_vars++; | ||||
|   } else { | ||||
|     return; | ||||
| @@ -1163,7 +1163,7 @@ mark_variable(CELL_PTR current USES_REGS) | ||||
|   if (UNMARKED_MARK(current,local_bp)) { | ||||
|     POP_CONTINUATION(); | ||||
|   } | ||||
|   if (current >= H0 && current < H) { | ||||
|   if (current >= H0 && current < HR) { | ||||
|     //fprintf(stderr,"%p M\n", current); | ||||
|     LOCAL_total_marked++; | ||||
|     if (current < LOCAL_HGEN) { | ||||
| @@ -1177,7 +1177,7 @@ mark_variable(CELL_PTR current USES_REGS) | ||||
|   next = GET_NEXT(ccur); | ||||
|  | ||||
|   if (IsVarTerm(ccur)) { | ||||
|     if (IN_BETWEEN(LOCAL_GlobalBase,current,H) && GlobalIsAttVar(current) && current==next) { | ||||
|     if (IN_BETWEEN(LOCAL_GlobalBase,current,HR) && GlobalIsAttVar(current) && current==next) { | ||||
|       if (next < H0) POP_CONTINUATION(); | ||||
|       if (!UNMARKED_MARK(next-1,local_bp)) { | ||||
| 	//fprintf(stderr,"%p M\n", next-1); | ||||
| @@ -1222,7 +1222,7 @@ mark_variable(CELL_PTR current USES_REGS) | ||||
| 	  if (next >= HB && current < LCL0 && cnext != TermFoundVar) { | ||||
| 	    UNMARK(current); | ||||
| 	    *current = cnext; | ||||
| 	    if (current >= H0 && current < H) { | ||||
| 	    if (current >= H0 && current < HR) { | ||||
| 	      //fprintf(stderr,"%p M\n", current-1); | ||||
| 	      LOCAL_total_marked--; | ||||
| 	      if (current < LOCAL_HGEN) { | ||||
| @@ -1247,7 +1247,7 @@ mark_variable(CELL_PTR current USES_REGS) | ||||
| 	/* This step is possible because we clean up the trail */ | ||||
| 	*current = UNMARK_CELL(cnext); | ||||
| 	UNMARK(current); | ||||
| 	if (current >= H0 && current < H ) { | ||||
| 	if (current >= H0 && current < HR ) { | ||||
| 	  //fprintf(stderr,"%p M\n", current); | ||||
| 	  LOCAL_total_marked--; | ||||
| 	  if (current < LOCAL_HGEN) { | ||||
| @@ -1365,7 +1365,24 @@ mark_variable(CELL_PTR current USES_REGS) | ||||
| 	MARK(next); | ||||
| 	PUSH_POINTER(next PASS_REGS); | ||||
| 	{ | ||||
| 	  UInt sz = 1+SIZEOF_DOUBLE/SIZEOF_LONG_INT; | ||||
| 	  UInt sz = 1+SIZEOF_DOUBLE/SIZEOF_INT_P; | ||||
| 	  if (next < LOCAL_HGEN) { | ||||
| 	    LOCAL_total_oldies+= 1+sz; | ||||
| 	  } else { | ||||
| 	    DEBUG_printf0("%p 1\n", next); | ||||
| 	    DEBUG_printf1("%p %ld\n", next, (long int)(sz+1)); | ||||
| 	  } | ||||
| 	  //fprintf(stderr,"%p M %d\n", next,1+sz); | ||||
| 	  LOCAL_total_marked += 1+sz; | ||||
| 	  PUSH_POINTER(next+sz PASS_REGS); | ||||
| 	  MARK(next+sz); | ||||
| 	} | ||||
| 	POP_CONTINUATION(); | ||||
|       case (CELL)FunctorString: | ||||
| 	MARK(next); | ||||
| 	PUSH_POINTER(next PASS_REGS); | ||||
| 	{ | ||||
| 	  UInt sz = 2+next[1]; | ||||
| 	  if (next < LOCAL_HGEN) { | ||||
| 	    LOCAL_total_oldies+= 1+sz; | ||||
| 	  } else { | ||||
| @@ -1719,7 +1736,7 @@ mark_trail(tr_fr_ptr trail_ptr, tr_fr_ptr trail_base, CELL *gc_H, choiceptr gc_B | ||||
| 	     nondeterministically, I know that after backtracking it will be back to be an unbound variable. | ||||
| 	     The ideal solution would be to unbind all variables. The current solution is to | ||||
| 	     remark it as an attributed variable */ | ||||
| 	  if (IN_BETWEEN(LOCAL_GlobalBase,hp,H) && GlobalIsAttVar(hp) && !UNMARKED_MARK(hp-1,LOCAL_bp)) { | ||||
| 	  if (IN_BETWEEN(LOCAL_GlobalBase,hp,HR) && GlobalIsAttVar(hp) && !UNMARKED_MARK(hp-1,LOCAL_bp)) { | ||||
| 	    //fprintf(stderr,"%p M\n", hp); | ||||
| 	    LOCAL_total_marked++; | ||||
| 	    PUSH_POINTER(hp-1 PASS_REGS); | ||||
| @@ -1762,7 +1779,7 @@ mark_trail(tr_fr_ptr trail_ptr, tr_fr_ptr trail_base, CELL *gc_H, choiceptr gc_B | ||||
|     } else if (IsPairTerm(trail_cell)) { | ||||
|       /* cannot safely ignore this */ | ||||
|       CELL *cptr = RepPair(trail_cell); | ||||
|       if (IN_BETWEEN(LOCAL_GlobalBase,cptr,H)) { | ||||
|       if (IN_BETWEEN(LOCAL_GlobalBase,cptr,HR)) { | ||||
| 	if (GlobalIsAttVar(cptr)) { | ||||
| 	  TrailTerm(trail_base) = (CELL)cptr; | ||||
| 	  mark_external_reference(&TrailTerm(trail_base) PASS_REGS); | ||||
| @@ -2354,7 +2371,7 @@ mark_choicepoints(register choiceptr gc_B, tr_fr_ptr saved_TR, int very_verbose | ||||
|       case _count_trust_me: | ||||
|       case _retry: | ||||
|       case _trust: | ||||
| 	if (IN_BETWEEN(H0,(CELL *)(gc_B->cp_ap),H)) { | ||||
| 	if (IN_BETWEEN(H0,(CELL *)(gc_B->cp_ap),HR)) { | ||||
| 	  fprintf(stderr,"OOPS in GC: gc not supported in this case!!!\n"); | ||||
| 	  exit(1); | ||||
| 	} | ||||
| @@ -2600,7 +2617,7 @@ sweep_trail(choiceptr gc_B, tr_fr_ptr old_TR USES_REGS) | ||||
|       if (IsVarTerm(trail_cell)) { | ||||
| 	/* we need to check whether this is a honest to god trail entry */ | ||||
| 	/* make sure it is a heap cell before we test whether it has been marked */ | ||||
| 	if ((CELL *)trail_cell < H && (CELL *)trail_cell >= H0 && MARKED_PTR((CELL *)trail_cell)) { | ||||
| 	if ((CELL *)trail_cell < HR && (CELL *)trail_cell >= H0 && MARKED_PTR((CELL *)trail_cell)) { | ||||
| 	  if (HEAP_PTR(trail_cell)) { | ||||
| 	    into_relocation_chain(&TrailTerm(dest), GET_NEXT(trail_cell) PASS_REGS); | ||||
| 	  } | ||||
| @@ -2618,7 +2635,7 @@ sweep_trail(choiceptr gc_B, tr_fr_ptr old_TR USES_REGS) | ||||
| 	CELL *pt0 = RepPair(trail_cell); | ||||
| 	CELL flags; | ||||
|  | ||||
| 	if (IN_BETWEEN(LOCAL_GlobalBase, pt0, H)) { | ||||
| 	if (IN_BETWEEN(LOCAL_GlobalBase, pt0, HR)) { | ||||
| 	  if (GlobalIsAttVar(pt0)) { | ||||
| 	    TrailTerm(dest) = trail_cell; | ||||
| 	    /* be careful with partial gc */ | ||||
| @@ -3428,12 +3445,12 @@ compact_heap( USES_REGS1 ) | ||||
|   next_hb = set_next_hb(gc_B PASS_REGS); | ||||
|   dest = H0 + LOCAL_total_marked - 1; | ||||
|  | ||||
|   gc_B = update_B_H(gc_B, H, dest+1, dest+2 | ||||
|   gc_B = update_B_H(gc_B, HR, dest+1, dest+2 | ||||
| #ifdef TABLING | ||||
| 		    , &depfr | ||||
| #endif /* TABLING */ | ||||
| 		    ); | ||||
|   for (current = H - 1; current >= start_from; current--) { | ||||
|   for (current = HR - 1; current >= start_from; current--) { | ||||
|  | ||||
|     if (MARKED_PTR(current)) { | ||||
|       CELL ccell = UNMARK_CELL(*current); | ||||
| @@ -3524,7 +3541,7 @@ compact_heap( USES_REGS1 ) | ||||
|    */ | ||||
|  | ||||
|   dest = (CELL_PTR) start_from; | ||||
|   for (current = start_from; current < H; current++) { | ||||
|   for (current = start_from; current < HR; current++) { | ||||
|     CELL ccur = *current; | ||||
|     if (MARKED_PTR(current)) { | ||||
|       CELL uccur = UNMARK_CELL(ccur); | ||||
| @@ -3560,7 +3577,7 @@ compact_heap( USES_REGS1 ) | ||||
|       ccur = *current; | ||||
|       next = GET_NEXT(ccur); | ||||
|       if (HEAP_PTR(ccur) && | ||||
| 	  (next = GET_NEXT(ccur)) < H && /* move current cell & | ||||
| 	  (next = GET_NEXT(ccur)) < HR && /* move current cell & | ||||
| 				 * push */ | ||||
| 	  next > current) {	/* into relocation chain  */ | ||||
| 	*dest = ccur; | ||||
| @@ -3584,7 +3601,7 @@ compact_heap( USES_REGS1 ) | ||||
| 	    (unsigned long int)found_marked); | ||||
| #endif | ||||
|  | ||||
|   H = dest;		/* reset H */ | ||||
|   HR = dest;		/* reset H */ | ||||
|   HB = B->cp_h; | ||||
| #ifdef TABLING | ||||
|   if (B_FZ == (choiceptr)LCL0) | ||||
| @@ -3603,7 +3620,7 @@ compact_heap( USES_REGS1 ) | ||||
| static void  | ||||
| icompact_heap( USES_REGS1 ) | ||||
| { | ||||
|   CELL_PTR *iptr, *ibase = (CELL_PTR *)H; | ||||
|   CELL_PTR *iptr, *ibase = (CELL_PTR *)HR; | ||||
|   CELL_PTR dest; | ||||
|   CELL *next_hb; | ||||
| #ifdef DEBUG | ||||
| @@ -3628,7 +3645,7 @@ icompact_heap( USES_REGS1 ) | ||||
| #endif /* TABLING */ | ||||
|   next_hb = set_next_hb(gc_B PASS_REGS); | ||||
|   dest = (CELL_PTR) H0 + LOCAL_total_marked - 1; | ||||
|   gc_B = update_B_H(gc_B, H, dest+1, dest+2 | ||||
|   gc_B = update_B_H(gc_B, HR, dest+1, dest+2 | ||||
| #ifdef TABLING | ||||
| 		    , &depfr | ||||
| #endif /* TABLING */ | ||||
| @@ -3761,7 +3778,7 @@ icompact_heap( USES_REGS1 ) | ||||
| 	    (unsigned long int)found_marked); | ||||
| #endif | ||||
|  | ||||
|   H = dest;		/* reset H */ | ||||
|   HR = dest;		/* reset H */ | ||||
|   HB = B->cp_h; | ||||
| #ifdef TABLING | ||||
|   if (B_FZ == (choiceptr)LCL0) | ||||
| @@ -3850,7 +3867,7 @@ compaction_phase(tr_fr_ptr old_TR, CELL *current_env, yamop *curp USES_REGS) | ||||
| { | ||||
|   CELL *CurrentH0 = NULL; | ||||
|  | ||||
|   int icompact = (LOCAL_iptop < (CELL_PTR *)ASP && 10*LOCAL_total_marked < H-H0); | ||||
|   int icompact = (LOCAL_iptop < (CELL_PTR *)ASP && 10*LOCAL_total_marked < HR-H0); | ||||
|  | ||||
|   if (icompact) { | ||||
|     /* we are going to reuse the total space */ | ||||
| @@ -3878,7 +3895,7 @@ compaction_phase(tr_fr_ptr old_TR, CELL *current_env, yamop *curp USES_REGS) | ||||
| 	-LOCAL_total_smarked | ||||
| #endif | ||||
| 	!= LOCAL_iptop-(CELL_PTR *)H && LOCAL_iptop < (CELL_PTR *)ASP -1024) | ||||
|       fprintf(GLOBAL_stderr,"%% Oops on LOCAL_iptop-H (%ld) vs %ld\n", (unsigned long int)(LOCAL_iptop-(CELL_PTR *)H), LOCAL_total_marked); | ||||
|       fprintf(GLOBAL_stderr,"%% Oops on LOCAL_iptop-H (%ld) vs %ld\n", (unsigned long int)(LOCAL_iptop-(CELL_PTR *)HR), LOCAL_total_marked); | ||||
|     */ | ||||
| #endif | ||||
| #if DEBUGX | ||||
| @@ -3891,7 +3908,7 @@ compaction_phase(tr_fr_ptr old_TR, CELL *current_env, yamop *curp USES_REGS) | ||||
|       LOCAL_total_marked += LOCAL_total_oldies; | ||||
|       CurrentH0 = NULL;  | ||||
|     } | ||||
|     quicksort((CELL_PTR *)H, 0, (LOCAL_iptop-(CELL_PTR *)H)-1); | ||||
|     quicksort((CELL_PTR *)HR, 0, (LOCAL_iptop-(CELL_PTR *)HR)-1); | ||||
|     icompact_heap( PASS_REGS1 ); | ||||
|   } else | ||||
| #endif /* HYBRID_SCHEME */ | ||||
| @@ -3930,7 +3947,7 @@ do_gc(Int predarity, CELL *current_env, yamop *nextop USES_REGS) | ||||
|   UInt		alloc_sz; | ||||
|   int jmp_res; | ||||
|  | ||||
|   heap_cells = H-H0; | ||||
|   heap_cells = HR-H0; | ||||
|   gc_verbose = is_gc_verbose(); | ||||
|   effectiveness = 0; | ||||
|   gc_trace = FALSE; | ||||
| @@ -3967,7 +3984,7 @@ do_gc(Int predarity, CELL *current_env, yamop *nextop USES_REGS) | ||||
|     fprintf(GLOBAL_stderr, "%% Worker Id %d:\n", worker_id); | ||||
| #endif | ||||
|     fprintf(GLOBAL_stderr, "%% Start of garbage collection %lu:\n", (unsigned long int)LOCAL_GcCalls); | ||||
|     fprintf(GLOBAL_stderr, "%%       Global: %8ld cells (%p-%p)\n", (long int)heap_cells,H0,H); | ||||
|     fprintf(GLOBAL_stderr, "%%       Global: %8ld cells (%p-%p)\n", (long int)heap_cells,H0,HR); | ||||
|     fprintf(GLOBAL_stderr, "%%       Local:%8ld cells (%p-%p)\n", (unsigned long int)(LCL0-ASP),LCL0,ASP); | ||||
|     fprintf(GLOBAL_stderr, "%%       Trail:%8ld cells (%p-%p)\n", | ||||
| 	       (unsigned long int)(TR-(tr_fr_ptr)LOCAL_TrailBase),LOCAL_TrailBase,TR); | ||||
| @@ -4053,7 +4070,7 @@ do_gc(Int predarity, CELL *current_env, yamop *nextop USES_REGS) | ||||
|   } | ||||
|   memset((void *)LOCAL_bp, 0, alloc_sz); | ||||
| #ifdef HYBRID_SCHEME | ||||
|   LOCAL_iptop = (CELL_PTR *)H; | ||||
|   LOCAL_iptop = (CELL_PTR *)HR; | ||||
| #endif | ||||
|   /* get the number of active registers */ | ||||
|   LOCAL_HGEN = VarOfTerm(Yap_ReadTimedVar(LOCAL_GcGeneration)); | ||||
| @@ -4127,7 +4144,7 @@ do_gc(Int predarity, CELL *current_env, yamop *nextop USES_REGS) | ||||
|   if (gc_verbose) { | ||||
|     fprintf(GLOBAL_stderr, "%% GC %lu took %g sec, total of %g sec doing GC so far.\n", (unsigned long int)LOCAL_GcCalls, (double)gc_time/1000, (double)LOCAL_TotGcTime/1000); | ||||
|     fprintf(GLOBAL_stderr, "%%  Left %ld cells free in stacks.\n", | ||||
| 	       (unsigned long int)(ASP-H)); | ||||
| 	       (unsigned long int)(ASP-HR)); | ||||
|   } | ||||
|   check_global(); | ||||
|   return effectiveness; | ||||
| @@ -4214,24 +4231,25 @@ call_gc(UInt gc_lim, Int predarity, CELL *current_env, yamop *nextop USES_REGS) | ||||
|   if (gc_on && !(LOCAL_PrologMode & InErrorMode) && | ||||
|       /* make sure there is a point in collecting the heap */ | ||||
|       (ASP-H0)*sizeof(CELL) > gc_lim &&  | ||||
|       H-LOCAL_HGEN > (LCL0-ASP)/2) { | ||||
|       HR-LOCAL_HGEN > (LCL0-ASP)/2) { | ||||
|     effectiveness = do_gc(predarity, current_env, nextop PASS_REGS); | ||||
|     if (effectiveness < 0) | ||||
|       return FALSE; | ||||
|     if (effectiveness > 90 && !gc_t) { | ||||
|       while (gc_margin < (H-H0)/sizeof(CELL))  | ||||
|       while (gc_margin < (HR-H0)/sizeof(CELL))  | ||||
| 	gc_margin <<= 1; | ||||
|     } | ||||
|   } else { | ||||
|     effectiveness = 0; | ||||
|   } | ||||
|   /* expand the stack if effectiveness is less than 20 % */ | ||||
|   if (ASP - H < gc_margin/sizeof(CELL) || | ||||
|   if (ASP - HR < gc_margin/sizeof(CELL) || | ||||
|       effectiveness < 20) { | ||||
|     LeaveGCMode( PASS_REGS1 ); | ||||
| #ifndef YAPOR | ||||
|     if (gc_margin < 2*CalculateStackGap()) | ||||
|       gc_margin = 2*CalculateStackGap(); | ||||
|     CalculateStackGap( PASS_REGS1 ); | ||||
|     if (gc_margin < 2*EventFlag) | ||||
|       gc_margin = 2*EventFlag; | ||||
|     return Yap_growstack(gc_margin); | ||||
| #endif | ||||
|   } | ||||
| @@ -4277,8 +4295,10 @@ Yap_gcl(UInt gc_lim, Int predarity, CELL *current_env, yamop *nextop) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   int res; | ||||
|   UInt min = CalculateStackGap()*sizeof(CELL); | ||||
|   UInt min; | ||||
|  | ||||
|   CalculateStackGap( PASS_REGS1 ); | ||||
|   min = EventFlag*sizeof(CELL); | ||||
|   LOCAL_PrologMode |= GCMode; | ||||
|   if (gc_lim < min) | ||||
|     gc_lim = min; | ||||
|   | ||||
							
								
								
									
										314
									
								
								C/index.c
									
									
									
									
									
								
							
							
						
						
									
										314
									
								
								C/index.c
									
									
									
									
									
								
							| @@ -492,9 +492,7 @@ static char     SccsId[] = "%W% %G%"; | ||||
| #if HAVE_STRING_H | ||||
| #include <string.h> | ||||
| #endif | ||||
| #ifdef CUT_C | ||||
| #include "cut_c.h" | ||||
| #endif | ||||
|  | ||||
| #if defined(YAPOR) || defined(THREADS) | ||||
| #define SET_JLBL(X) jlbl = &(ipc->u.X) | ||||
| @@ -598,7 +596,7 @@ recover_from_failed_susp_on_cls(struct intermediates *cint, UInt sz) | ||||
| 	int cases = cpc->rnd1, i; | ||||
|  | ||||
| 	for (i = 0; i < cases; i++) { | ||||
| 	  sz = cleanup_sw_on_clauses(target[i].u.Label, sz, ecls); | ||||
| 	  sz = cleanup_sw_on_clauses(target[i].u_a.Label, sz, ecls); | ||||
| 	} | ||||
| 	if (log_upd_pred) { | ||||
| 	  LogUpdIndex *lcl = ClauseCodeToLogUpdIndex(cpc->rnd2); | ||||
| @@ -620,7 +618,7 @@ recover_from_failed_susp_on_cls(struct intermediates *cint, UInt sz) | ||||
| 	int cases = cpc->rnd1, i; | ||||
| 	 | ||||
| 	for (i = 0; i < cases; i++) { | ||||
| 	  sz = cleanup_sw_on_clauses(target[i].u.Label, sz, ecls); | ||||
| 	  sz = cleanup_sw_on_clauses(target[i].u_f.Label, sz, ecls); | ||||
| 	} | ||||
| 	if (log_upd_pred) { | ||||
| 	  LogUpdIndex *lcl = ClauseCodeToLogUpdIndex(cpc->rnd2); | ||||
| @@ -1033,7 +1031,7 @@ add_arg_info(ClauseDef *clause, PredEntry *ap, UInt argno) | ||||
|   if (ap->ModuleOfPred == IDB_MODULE) { | ||||
|     cl = clause->Code; | ||||
|   } else { | ||||
|     cl = clause->u.WorkPC; | ||||
|     cl = clause->ucd.WorkPC; | ||||
|   } | ||||
|   while (TRUE) { | ||||
|     op_numbers op = Yap_op_from_opcode(cl->opc); | ||||
| @@ -1139,7 +1137,7 @@ add_arg_info(ClauseDef *clause, PredEntry *ap, UInt argno) | ||||
|     case _unify_l_list: | ||||
|       if (argno == 1) { | ||||
| 	clause->Tag = AbsPair(NULL); | ||||
| 	clause->u.WorkPC = NEXTOP(cl,o); | ||||
| 	clause->ucd.WorkPC = NEXTOP(cl,o); | ||||
| 	return; | ||||
|       } | ||||
|       argno += 1; /* 2-1: have two extra arguments to skip */ | ||||
| @@ -1177,7 +1175,7 @@ add_arg_info(ClauseDef *clause, PredEntry *ap, UInt argno) | ||||
|     case _unify_l_float: | ||||
|       if (argno == 1) { | ||||
| 	clause->Tag = AbsAppl((CELL *)FunctorDouble); | ||||
| 	clause->u.t_ptr = AbsAppl(cl->u.od.d); | ||||
| 	clause->ucd.t_ptr = AbsAppl(cl->u.od.d); | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,od); | ||||
| @@ -1187,7 +1185,7 @@ add_arg_info(ClauseDef *clause, PredEntry *ap, UInt argno) | ||||
|     case _unify_l_longint: | ||||
|       if (argno == 1) { | ||||
| 	clause->Tag = AbsAppl((CELL *)FunctorLongInt); | ||||
| 	clause->u.t_ptr = AbsAppl(cl->u.oi.i); | ||||
| 	clause->ucd.t_ptr = AbsAppl(cl->u.oi.i); | ||||
| 	return; | ||||
|       } | ||||
|       argno--; | ||||
| @@ -1197,12 +1195,22 @@ add_arg_info(ClauseDef *clause, PredEntry *ap, UInt argno) | ||||
|     case _unify_l_bigint: | ||||
|       if (argno == 1) { | ||||
| 	clause->Tag = AbsAppl((CELL *)FunctorBigInt); | ||||
| 	clause->u.t_ptr = cl->u.oc.c; | ||||
| 	clause->ucd.t_ptr = cl->u.oc.c; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,oc); | ||||
|       argno--; | ||||
|       break; | ||||
|     case _unify_string: | ||||
|     case _unify_l_string: | ||||
|       if (argno == 1) { | ||||
| 	clause->Tag = AbsAppl((CELL *)FunctorString); | ||||
| 	clause->ucd.t_ptr = cl->u.ou.u; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,ou); | ||||
|       argno--; | ||||
|       break; | ||||
|     case _unify_n_atoms: | ||||
|       if (argno <= cl->u.osc.s) { | ||||
| 	clause->Tag = cl->u.osc.c; | ||||
| @@ -1216,7 +1224,7 @@ add_arg_info(ClauseDef *clause, PredEntry *ap, UInt argno) | ||||
|     case _unify_l_struc: | ||||
|       if (argno == 1) { | ||||
| 	clause->Tag = AbsAppl((CELL *)cl->u.ofa.f); | ||||
| 	clause->u.WorkPC = NEXTOP(cl,ofa); | ||||
| 	clause->ucd.WorkPC = NEXTOP(cl,ofa); | ||||
| 	return; | ||||
|       } | ||||
|       /* must skip next n arguments */ | ||||
| @@ -1246,7 +1254,7 @@ add_arg_info(ClauseDef *clause, PredEntry *ap, UInt argno) | ||||
|     case _unify_idb_term: | ||||
|     case _copy_idb_term: | ||||
|       { | ||||
| 	Term t = clause->u.c_sreg[argno]; | ||||
| 	Term t = clause->ucd.c_sreg[argno]; | ||||
|  | ||||
| 	if (IsVarTerm(t)) { | ||||
| 	  clause->Tag = (CELL)NULL; | ||||
| @@ -1255,15 +1263,15 @@ add_arg_info(ClauseDef *clause, PredEntry *ap, UInt argno) | ||||
|  | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  if (IsExtensionFunctor(FunctorOfTerm(t))) { | ||||
| 	    clause->u.t_ptr = t; | ||||
| 	    clause->ucd.t_ptr = t; | ||||
| 	  } else { | ||||
| 	    clause->u.c_sreg = pt; | ||||
| 	    clause->ucd.c_sreg = pt; | ||||
| 	  } | ||||
| 	} else if (IsPairTerm(t)) { | ||||
| 	  CELL *pt = RepPair(t); | ||||
|  | ||||
| 	  clause->Tag = AbsPair(NULL); | ||||
| 	  clause->u.c_sreg = pt-1; | ||||
| 	  clause->ucd.c_sreg = pt-1; | ||||
| 	} else { | ||||
| 	  clause->Tag = t; | ||||
| 	} | ||||
| @@ -1323,7 +1331,7 @@ skip_to_arg(ClauseDef *clause, PredEntry *ap, UInt argno, int at_point) | ||||
|       */ | ||||
|     case _unify_struct: | ||||
|     case _unify_l_struc: | ||||
|       if (cl == clause->u.WorkPC) { | ||||
|       if (cl == clause->ucd.WorkPC) { | ||||
| 	clause->CurrentCode = cl; | ||||
|       } else { | ||||
| 	clause->CurrentCode = clause->Code; | ||||
| @@ -1628,7 +1636,7 @@ emit_cswitch(COUNT n, yamop *fail_l, struct intermediates *cint) | ||||
|     target = (AtomSwiEntry *)emit_switch_space(n, sizeof(AtomSwiEntry), cint, 0); | ||||
|     for (i=0; i<n; i++) { | ||||
|       target[i].Tag = Zero; | ||||
|       target[i].u.labp = fail_l; | ||||
|       target[i].u_a.labp = fail_l; | ||||
|     } | ||||
|     Yap_emit(op, Unsigned(n), (CELL)target, cint); | ||||
|   } else { | ||||
| @@ -1638,10 +1646,10 @@ emit_cswitch(COUNT n, yamop *fail_l, struct intermediates *cint) | ||||
|     target = (AtomSwiEntry *)emit_switch_space(n+1, sizeof(AtomSwiEntry), cint, 0); | ||||
|  | ||||
|     for (i=0; i<n; i++) { | ||||
|       target[i].u.labp = fail_l; | ||||
|       target[i].u_a.labp = fail_l; | ||||
|     } | ||||
|     target[n].Tag = Zero; | ||||
|     target[n].u.labp = fail_l; | ||||
|     target[n].u_a.labp = fail_l; | ||||
|     Yap_emit(op, Unsigned(n), (CELL)target, cint); | ||||
|   } | ||||
|   return target; | ||||
| @@ -1695,7 +1703,7 @@ emit_fswitch(COUNT n, yamop *fail_l, struct intermediates *cint) | ||||
|     target = (FuncSwiEntry *)emit_switch_space(n, sizeof(FuncSwiEntry), cint, FuncSwitchMask); | ||||
|     for (i=0; i<n; i++) { | ||||
|       target[i].Tag = NULL; | ||||
|       target[i].u.labp = fail_l; | ||||
|       target[i].u_f.labp = fail_l; | ||||
|     } | ||||
|     Yap_emit(op, Unsigned(n), (CELL)target, cint); | ||||
|   } else { | ||||
| @@ -1704,10 +1712,10 @@ emit_fswitch(COUNT n, yamop *fail_l, struct intermediates *cint) | ||||
|     op = if_f_op; | ||||
|     target = (FuncSwiEntry *)emit_switch_space(n+1, sizeof(FuncSwiEntry), cint, FuncSwitchMask); | ||||
|     for (i=0; i<n; i++) { | ||||
|       target[i].u.labp = fail_l; | ||||
|       target[i].u_f.labp = fail_l; | ||||
|     } | ||||
|     target[n].Tag = NULL; | ||||
|     target[n].u.labp = fail_l; | ||||
|     target[n].u_f.labp = fail_l; | ||||
|     Yap_emit(op, Unsigned(n), (CELL)target, cint); | ||||
|   } | ||||
|   return target; | ||||
| @@ -2025,17 +2033,17 @@ do_consts(GroupDef *grp, Term t, struct intermediates *cint, int compound_term, | ||||
|     if (min != max) { | ||||
|       if (sreg != NULL) { | ||||
| 	if (ap->PredFlags & LogUpdatePredFlag && max > min) { | ||||
| 	  ics->u.Label = suspend_indexing(min, max, ap, cint); | ||||
| 	  ics->u_a.Label = suspend_indexing(min, max, ap, cint); | ||||
| 	} else { | ||||
| 	    ics->u.Label = do_compound_index(min, max, sreg, cint, compound_term, arity, argno, nxtlbl, first, last_arg, clleft, top, TRUE); | ||||
| 	    ics->u_a.Label = do_compound_index(min, max, sreg, cint, compound_term, arity, argno, nxtlbl, first, last_arg, clleft, top, TRUE); | ||||
| 	} | ||||
|       } else if (ap->PredFlags & LogUpdatePredFlag) { | ||||
| 	ics->u.Label = suspend_indexing(min, max, cint->CurrentPred, cint); | ||||
| 	ics->u_a.Label = suspend_indexing(min, max, cint->CurrentPred, cint); | ||||
|       } else { | ||||
| 	ics->u.Label = do_index(min, max, cint, argno+1, nxtlbl, first, clleft, top); | ||||
| 	ics->u_a.Label = do_index(min, max, cint, argno+1, nxtlbl, first, clleft, top); | ||||
|       } | ||||
|     } else { | ||||
|       ics->u.Label = do_index(min, max, cint, argno+1, nxtlbl, first, clleft, top); | ||||
|       ics->u_a.Label = do_index(min, max, cint, argno+1, nxtlbl, first, clleft, top); | ||||
|     } | ||||
|     grp->FirstClause = min = max+1; | ||||
|   } | ||||
| @@ -2064,9 +2072,9 @@ do_blobs(GroupDef *grp, Term t, struct intermediates *cint, UInt argno, int firs | ||||
| 	   (max+1)->Tag == min->Tag) max++; | ||||
|     if (min != max && | ||||
| 	(ap->PredFlags & LogUpdatePredFlag)) { | ||||
|       ics->u.Label = suspend_indexing(min, max, ap, cint); | ||||
|       ics->u_a.Label = suspend_indexing(min, max, ap, cint); | ||||
|     } else { | ||||
|       ics->u.Label = do_index(min, max, cint, argno+1, nxtlbl, first, clleft, top); | ||||
|       ics->u_a.Label = do_index(min, max, cint, argno+1, nxtlbl, first, clleft, top); | ||||
|     } | ||||
|     grp->FirstClause = min = max+1; | ||||
|   } | ||||
| @@ -2107,11 +2115,11 @@ do_funcs(GroupDef *grp, Term t, struct intermediates *cint, UInt argno, int firs | ||||
|  | ||||
|     if (IsExtensionFunctor(f)) { | ||||
|       if (f == FunctorDBRef)  | ||||
| 	ifs->u.Label = do_dbref_index(min, max, t, cint, argno, nxtlbl, first, clleft, top); | ||||
| 	ifs->u_f.Label = do_dbref_index(min, max, t, cint, argno, nxtlbl, first, clleft, top); | ||||
|       else if (f == FunctorLongInt || f == FunctorBigInt)  | ||||
| 	ifs->u.Label = do_blob_index(min, max, t, cint, argno, nxtlbl, first, clleft, top, FALSE); | ||||
| 	ifs->u_f.Label = do_blob_index(min, max, t, cint, argno, nxtlbl, first, clleft, top, FALSE); | ||||
|       else | ||||
| 	ifs->u.Label = do_blob_index(min, max, t, cint, argno, nxtlbl, first, clleft, top, TRUE); | ||||
| 	ifs->u_f.Label = do_blob_index(min, max, t, cint, argno, nxtlbl, first, clleft, top, TRUE); | ||||
| 	 | ||||
|     } else { | ||||
|       CELL *sreg; | ||||
| @@ -2121,7 +2129,7 @@ do_funcs(GroupDef *grp, Term t, struct intermediates *cint, UInt argno, int firs | ||||
|       } else { | ||||
| 	sreg = NULL; | ||||
|       } | ||||
|       ifs->u.Label = do_compound_index(min, max, sreg, cint, 0, ArityOfFunctor(f), argno, nxtlbl, first, last_arg, clleft, top, TRUE); | ||||
|       ifs->u_f.Label = do_compound_index(min, max, sreg, cint, 0, ArityOfFunctor(f), argno, nxtlbl, first, last_arg, clleft, top, TRUE); | ||||
|     } | ||||
|     grp->FirstClause = min = max+1; | ||||
|   } | ||||
| @@ -2349,15 +2357,15 @@ cls_head_info(ClauseDef *min, ClauseDef *max, UInt argno, int in_idb) | ||||
| 	 | ||||
| 	  cl->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  if (IsExtensionFunctor(FunctorOfTerm(t))) { | ||||
| 	    cl->u.t_ptr = t; | ||||
| 	    cl->ucd.t_ptr = t; | ||||
| 	  } else { | ||||
| 	    cl->u.c_sreg = pt; | ||||
| 	    cl->ucd.c_sreg = pt; | ||||
| 	  } | ||||
| 	} else if (IsPairTerm(t)) { | ||||
| 	  CELL *pt = RepPair(t); | ||||
|  | ||||
| 	  cl->Tag = AbsPair(NULL); | ||||
| 	  cl->u.c_sreg = pt-1; | ||||
| 	  cl->ucd.c_sreg = pt-1; | ||||
| 	} else { | ||||
| 	  cl->Tag = t; | ||||
| 	} | ||||
| @@ -2629,7 +2637,7 @@ do_dbref_index(ClauseDef *min, ClauseDef* max, Term t, struct intermediates *cin | ||||
|   cl = min; | ||||
|    | ||||
|   while (cl <= max) { | ||||
|     cl->Tag = cl->u.t_ptr; | ||||
|     cl->Tag = cl->ucd.t_ptr; | ||||
|     cl++; | ||||
|   } | ||||
|   ngroups = groups_in(min, max, group, cint); | ||||
| @@ -2657,12 +2665,12 @@ do_blob_index(ClauseDef *min, ClauseDef* max, Term t, struct intermediates *cint | ||||
|   cl = min; | ||||
|    | ||||
|   while (cl <= max) { | ||||
|     if (cl->u.t_ptr == (CELL)NULL) { /* check whether it is a builtin */ | ||||
|     if (cl->ucd.t_ptr == (CELL)NULL) { /* check whether it is a builtin */ | ||||
|       cl->Tag = Zero; | ||||
|     } else if (blob) { | ||||
|       cl->Tag = Yap_Double_key(cl->u.t_ptr); | ||||
|       cl->Tag = Yap_Double_key(cl->ucd.t_ptr); | ||||
|     } else { | ||||
|       cl->Tag = Yap_Int_key(cl->u.t_ptr); | ||||
|       cl->Tag = Yap_Int_key(cl->ucd.t_ptr); | ||||
|     } | ||||
|     cl++; | ||||
|   } | ||||
| @@ -2746,10 +2754,10 @@ compile_index(struct intermediates *cint) | ||||
|       siglongjmp(cint->CompilerBotch,2); | ||||
|     } | ||||
|   } | ||||
|   cint->freep = (char *)H; | ||||
|   cint->freep = (char *)HR; | ||||
| #else | ||||
|   /* reserve double the space for compiler */ | ||||
|   cint->cls = (ClauseDef *)H; | ||||
|   cint->cls = (ClauseDef *)HR; | ||||
|   if (cint->cls+2*NClauses > (ClauseDef *)(ASP-4096)) { | ||||
|     /* tell how much space we need */ | ||||
|     LOCAL_Error_Size += NClauses*sizeof(ClauseDef); | ||||
| @@ -2915,14 +2923,18 @@ install_clause(ClauseDef *cls, PredEntry *ap, istack_entry *stack) | ||||
| 	Functor f = (Functor)RepAppl(cls->Tag); | ||||
| 	if (IsExtensionFunctor(f)) { | ||||
| 	  if (f == FunctorDBRef) { | ||||
| 	    if (cls->u.t_ptr != sp->extra) break; | ||||
| 	    if (cls->ucd.t_ptr != sp->extra) break; | ||||
| 	  } else if (f == FunctorDouble) { | ||||
| 	    if (cls->u.t_ptr && | ||||
| 		Yap_Double_key(sp->extra) != Yap_Double_key(cls->u.t_ptr)) | ||||
| 	    if (cls->ucd.t_ptr && | ||||
| 		Yap_Double_key(sp->extra) != Yap_Double_key(cls->ucd.t_ptr)) | ||||
| 		break; | ||||
| 	  } else if (f == FunctorString) { | ||||
| 	    if (cls->ucd.t_ptr && | ||||
| 		Yap_String_key(sp->extra) != Yap_String_key(cls->ucd.t_ptr)) | ||||
| 		break; | ||||
| 	  } else { | ||||
| 	    if (cls->u.t_ptr &&  | ||||
| 		Yap_Int_key(sp->extra) != Yap_Int_key(cls->u.t_ptr)) | ||||
| 	    if (cls->ucd.t_ptr && | ||||
| 		Yap_Int_key(sp->extra) != Yap_Int_key(cls->ucd.t_ptr)) | ||||
| 		break; | ||||
| 	  } | ||||
| 	} | ||||
| @@ -3066,14 +3078,14 @@ install_log_upd_clause(ClauseDef *cls, PredEntry *ap, istack_entry *stack) | ||||
| 	Functor f = (Functor)RepAppl(cls->Tag); | ||||
| 	if (IsExtensionFunctor(f)) { | ||||
| 	  if (f == FunctorDBRef) { | ||||
| 	    if (cls->u.t_ptr != sp->extra) break; | ||||
| 	    if (cls->ucd.t_ptr != sp->extra) break; | ||||
| 	  } else if (f == FunctorDouble) { | ||||
| 	    if (cls->u.t_ptr &&   | ||||
| 		Yap_Double_key(sp->extra) != Yap_Double_key(cls->u.t_ptr)) | ||||
| 	    if (cls->ucd.t_ptr && | ||||
| 		Yap_Double_key(sp->extra) != Yap_Double_key(cls->ucd.t_ptr)) | ||||
| 		break; | ||||
| 	  } else { | ||||
| 	    if (cls->u.t_ptr &&  | ||||
| 		Yap_Int_key(sp->extra) != Yap_Int_key(cls->u.t_ptr)) | ||||
| 	    if (cls->ucd.t_ptr && | ||||
| 		Yap_Int_key(sp->extra) != Yap_Int_key(cls->ucd.t_ptr)) | ||||
| 		break; | ||||
| 	  } | ||||
| 	} | ||||
| @@ -3665,9 +3677,9 @@ expand_index(struct intermediates *cint) { | ||||
| 	} else { | ||||
| 	  fe = lookup_f(f,ipc->u.sssl.l,ipc->u.sssl.s); | ||||
| 	} | ||||
| 	newpc = fe->u.labp; | ||||
| 	newpc = fe->u_f.labp; | ||||
|  | ||||
| 	labp = &(fe->u.labp); | ||||
| 	labp = &(fe->u_f.labp); | ||||
| 	if (newpc == e_code) { | ||||
| 	  /* we found it */ | ||||
| 	  parentcl = code_to_indexcl(ipc->u.sssl.l,is_lu); | ||||
| @@ -3691,14 +3703,14 @@ expand_index(struct intermediates *cint) { | ||||
| 	  ae = lookup_c(t,ipc->u.sssl.l,ipc->u.sssl.s); | ||||
| 	} | ||||
|  | ||||
| 	labp = &(ae->u.labp); | ||||
| 	if (ae->u.labp == e_code) { | ||||
| 	labp = &(ae->u_a.labp); | ||||
| 	if (ae->u_a.labp == e_code) { | ||||
| 	  /* we found it */ | ||||
| 	  parentcl = code_to_indexcl(ipc->u.sssl.l,is_lu); | ||||
| 	  ipc = NULL; | ||||
| 	} else { | ||||
| 	  ClausePointer npar = code_to_indexcl(ipc->u.sssl.l,is_lu); | ||||
| 	  ipc = ae->u.labp; | ||||
| 	  ipc = ae->u_a.labp; | ||||
| 	  parentcl = index_jmp(npar, parentcl, ipc, is_lu, e_code); | ||||
| 	} | ||||
|       } | ||||
| @@ -3795,7 +3807,7 @@ expand_index(struct intermediates *cint) { | ||||
|       } | ||||
|     } | ||||
| #else | ||||
|     cint->cls = (ClauseDef *)H; | ||||
|     cint->cls = (ClauseDef *)HR; | ||||
|     if (cint->cls+2*nclauses > (ClauseDef *)(ASP-4096)) { | ||||
|       /* tell how much space we need (worst case) */ | ||||
|       LOCAL_Error_Size += 2*NClauses*sizeof(ClauseDef); | ||||
| @@ -3823,7 +3835,7 @@ expand_index(struct intermediates *cint) { | ||||
|       } | ||||
|     } | ||||
| #else | ||||
|     cint->cls = (ClauseDef *)H; | ||||
|     cint->cls = (ClauseDef *)HR; | ||||
|     if (cint->cls+2*NClauses > (ClauseDef *)(ASP-4096)) { | ||||
|       /* tell how much space we need (worst case) */ | ||||
|       LOCAL_Error_Size += 2*NClauses*sizeof(ClauseDef); | ||||
| @@ -3852,7 +3864,7 @@ expand_index(struct intermediates *cint) { | ||||
|     return labp; | ||||
|   } | ||||
| #if USE_SYSTEM_MALLOC | ||||
|   cint->freep = (char *)H; | ||||
|   cint->freep = (char *)HR; | ||||
| #else | ||||
|   cint->freep = (char *)(max+1); | ||||
| #endif | ||||
| @@ -4139,11 +4151,11 @@ push_path(path_stack_entry *sp, yamop **pipc, ClauseDef *clp, struct intermediat | ||||
|     siglongjmp(cint->CompilerBotch,4);     | ||||
|   } | ||||
|   sp->flag = pc_entry; | ||||
|   sp->u.pce.pi_pc = pipc; | ||||
|   sp->u.pce.code = clp->Code; | ||||
|   sp->u.pce.current_code = clp->CurrentCode; | ||||
|   sp->u.pce.work_pc = clp->u.WorkPC; | ||||
|   sp->u.pce.tag = clp->Tag; | ||||
|   sp->uip.pce.pi_pc = pipc; | ||||
|   sp->uip.pce.code = clp->Code; | ||||
|   sp->uip.pce.current_code = clp->CurrentCode; | ||||
|   sp->uip.pce.work_pc = clp->ucd.WorkPC; | ||||
|   sp->uip.pce.tag = clp->Tag; | ||||
|   return sp+1; | ||||
| } | ||||
| 		  | ||||
| @@ -4157,11 +4169,11 @@ fetch_new_block(path_stack_entry *sp, yamop **pipc, PredEntry *ap, struct interm | ||||
|   } | ||||
|   /* add current position */ | ||||
|   sp->flag = block_entry; | ||||
|   sp->u.cle.entry_code = pipc; | ||||
|   sp->uip.cle.entry_code = pipc; | ||||
|   if (ap->PredFlags & LogUpdatePredFlag) { | ||||
|     sp->u.cle.block = (ClauseUnion *)ClauseCodeToLogUpdIndex(*pipc); | ||||
|     sp->uip.cle.block = (ClauseUnion *)ClauseCodeToLogUpdIndex(*pipc); | ||||
|   } else { | ||||
|     sp->u.cle.block = (ClauseUnion *)ClauseCodeToStaticIndex(*pipc); | ||||
|     sp->uip.cle.block = (ClauseUnion *)ClauseCodeToStaticIndex(*pipc); | ||||
|   } | ||||
|   return sp+1; | ||||
| } | ||||
| @@ -4172,11 +4184,11 @@ init_block_stack(path_stack_entry *sp, yamop *ipc, PredEntry *ap) | ||||
|   /* add current position */ | ||||
|    | ||||
|   sp->flag = block_entry; | ||||
|   sp->u.cle.entry_code = NULL; | ||||
|   sp->uip.cle.entry_code = NULL; | ||||
|   if (ap->PredFlags & LogUpdatePredFlag) { | ||||
|     sp->u.cle.block = (ClauseUnion *)ClauseCodeToLogUpdIndex(ipc); | ||||
|     sp->uip.cle.block = (ClauseUnion *)ClauseCodeToLogUpdIndex(ipc); | ||||
|   } else { | ||||
|     sp->u.cle.block = (ClauseUnion *)ClauseCodeToStaticIndex(ipc); | ||||
|     sp->uip.cle.block = (ClauseUnion *)ClauseCodeToStaticIndex(ipc); | ||||
|   } | ||||
|   return sp+1; | ||||
| } | ||||
| @@ -4191,7 +4203,7 @@ cross_block(path_stack_entry *sp, yamop **pipc, PredEntry *ap, struct intermedia | ||||
|   do { | ||||
|     UInt bsize; | ||||
|     while ((--tsp)->flag != block_entry); | ||||
|     block = tsp->u.cle.block; | ||||
|     block = tsp->uip.cle.block; | ||||
|     if (block->lui.ClFlags & LogUpdMask) | ||||
|       bsize = block->lui.ClSize; | ||||
|     else | ||||
| @@ -4203,18 +4215,18 @@ cross_block(path_stack_entry *sp, yamop **pipc, PredEntry *ap, struct intermedia | ||||
| 	if (tsp->flag == pc_entry) { | ||||
| 	  if (nsp != tsp) { | ||||
| 	    nsp->flag = pc_entry; | ||||
| 	    nsp->u.pce.pi_pc = tsp->u.pce.pi_pc; | ||||
| 	    nsp->u.pce.code = tsp->u.pce.code; | ||||
| 	    nsp->u.pce.current_code = tsp->u.pce.current_code; | ||||
| 	    nsp->u.pce.work_pc = tsp->u.pce.work_pc; | ||||
| 	    nsp->u.pce.tag = tsp->u.pce.tag; | ||||
| 	    nsp->uip.pce.pi_pc = tsp->uip.pce.pi_pc; | ||||
| 	    nsp->uip.pce.code = tsp->uip.pce.code; | ||||
| 	    nsp->uip.pce.current_code = tsp->uip.pce.current_code; | ||||
| 	    nsp->uip.pce.work_pc = tsp->uip.pce.work_pc; | ||||
| 	    nsp->uip.pce.tag = tsp->uip.pce.tag; | ||||
| 	  } | ||||
| 	  nsp++; | ||||
| 	} | ||||
|       } | ||||
|       return nsp; | ||||
|     } | ||||
|   } while (tsp->u.cle.entry_code != NULL); | ||||
|   } while (tsp->uip.cle.entry_code != NULL); | ||||
|   /* moved to a new block */ | ||||
|   return fetch_new_block(sp, pipc, ap, cint); | ||||
| } | ||||
| @@ -4228,16 +4240,16 @@ pop_path(path_stack_entry **spp, ClauseDef *clp, PredEntry *ap, struct intermedi | ||||
|  | ||||
|   while ((--sp)->flag != pc_entry); | ||||
|   *spp = sp; | ||||
|   clp->Code = sp->u.pce.code; | ||||
|   clp->CurrentCode = sp->u.pce.current_code; | ||||
|   clp->u.WorkPC = sp->u.pce.work_pc; | ||||
|   clp->Tag = sp->u.pce.tag; | ||||
|   if (sp->u.pce.pi_pc == NULL) { | ||||
|   clp->Code = sp->uip.pce.code; | ||||
|   clp->CurrentCode = sp->uip.pce.current_code; | ||||
|   clp->ucd.WorkPC = sp->uip.pce.work_pc; | ||||
|   clp->Tag = sp->uip.pce.tag; | ||||
|   if (sp->uip.pce.pi_pc == NULL) { | ||||
|     *spp = sp; | ||||
|     return NULL; | ||||
|   } | ||||
|   nipc = *(sp->u.pce.pi_pc); | ||||
|   *spp = cross_block(sp, sp->u.pce.pi_pc, ap, cint); | ||||
|   nipc = *(sp->uip.pce.pi_pc); | ||||
|   *spp = cross_block(sp, sp->uip.pce.pi_pc, ap, cint); | ||||
|   return nipc; | ||||
| } | ||||
|  | ||||
| @@ -4345,10 +4357,10 @@ expand_ctable(yamop *pc, ClauseUnion *blk, struct intermediates *cint, Term at) | ||||
|     n = 1; | ||||
|     for (i = 0; i < pc->u.sssl.s; i++,tmp++) { | ||||
|       if (tmp->Tag != Zero) n++; | ||||
|       else fail_l = tmp->u.Label; | ||||
|       else fail_l = tmp->u_a.Label; | ||||
|     } | ||||
|   } else { | ||||
|     fail_l = old_ae[n].u.Label; | ||||
|     fail_l = old_ae[n].u_a.Label; | ||||
|     n++; | ||||
|   } | ||||
|   if (n > MIN_HASH_ENTRIES) { | ||||
| @@ -4364,14 +4376,14 @@ expand_ctable(yamop *pc, ClauseUnion *blk, struct intermediates *cint, Term at) | ||||
|     pc->u.sssl.s = cases; | ||||
|     for (i=0; i<cases; i++) { | ||||
|       target[i].Tag = Zero; | ||||
|       target[i].u.Label = fail_l; | ||||
|       target[i].u_a.Label = fail_l; | ||||
|     } | ||||
|   } else { | ||||
|     pc->opc = Yap_opcode(_if_cons); | ||||
|     pc->u.sssl.s = n; | ||||
|     target = (AtomSwiEntry *)emit_switch_space(n+1, sizeof(AtomSwiEntry), cint, 0); | ||||
|     target[n].Tag = Zero; | ||||
|     target[n].u.Label = fail_l; | ||||
|     target[n].u_a.Label = fail_l; | ||||
|   } | ||||
|   for (i = 0; i < i0; i++,old_ae++) { | ||||
|     Term tag = old_ae->Tag; | ||||
| @@ -4379,7 +4391,7 @@ expand_ctable(yamop *pc, ClauseUnion *blk, struct intermediates *cint, Term at) | ||||
|     if (tag != Zero) { | ||||
|       AtomSwiEntry *ics = fetch_centry(target, tag, i, n); | ||||
|       ics->Tag = tag; | ||||
|       ics->u.Label = old_ae->u.Label;     | ||||
|       ics->u_a.Label = old_ae->u_a.Label; | ||||
|     } | ||||
|   } | ||||
|   /* support for threads */ | ||||
| @@ -4404,10 +4416,10 @@ expand_ftable(yamop *pc, ClauseUnion *blk, struct intermediates *cint, Functor f | ||||
|     n = 1; | ||||
|     for (i = 0; i < pc->u.sssl.s; i++,tmp++) { | ||||
|       if (tmp->Tag != Zero) n++; | ||||
|       else fail_l = tmp->u.Label; | ||||
|       else fail_l = tmp->u_f.Label; | ||||
|     } | ||||
|   } else { | ||||
|     fail_l = old_fe[n].u.Label; | ||||
|     fail_l = old_fe[n].u_f.Label; | ||||
|     n++; | ||||
|   } | ||||
|   if (n > MIN_HASH_ENTRIES) { | ||||
| @@ -4426,7 +4438,7 @@ expand_ftable(yamop *pc, ClauseUnion *blk, struct intermediates *cint, Functor f | ||||
|     target = (FuncSwiEntry *)emit_switch_space(cases, sizeof(FuncSwiEntry), cint, FuncSwitchMask); | ||||
|     for (i=0; i<cases; i++) { | ||||
|       target[i].Tag = NULL; | ||||
|       target[i].u.Label = fail_l; | ||||
|       target[i].u_f.Label = fail_l; | ||||
|     } | ||||
|   } else { | ||||
|     pc->opc = Yap_opcode(_if_func); | ||||
| @@ -4435,7 +4447,7 @@ expand_ftable(yamop *pc, ClauseUnion *blk, struct intermediates *cint, Functor f | ||||
|     pc->u.sssl.w = 0; | ||||
|     target = (FuncSwiEntry *)emit_switch_space(n+1, sizeof(FuncSwiEntry), cint, FuncSwitchMask); | ||||
|     target[n].Tag = Zero; | ||||
|     target[n].u.Label = fail_l; | ||||
|     target[n].u_f.Label = fail_l; | ||||
|   } | ||||
|   for (i = 0; i < i0; i++,old_fe++) { | ||||
|     Functor f = old_fe->Tag; | ||||
| @@ -4443,7 +4455,7 @@ expand_ftable(yamop *pc, ClauseUnion *blk, struct intermediates *cint, Functor f | ||||
|     if (f != NULL) { | ||||
|       FuncSwiEntry *ifs = fetch_fentry(target, f, i, n); | ||||
|       ifs->Tag = old_fe->Tag; | ||||
|       ifs->u.Label = old_fe->u.Label;     | ||||
|       ifs->u_f.Label = old_fe->u_f.Label; | ||||
|     } | ||||
|   } | ||||
|   replace_index_block(blk, pc->u.sssl.l, (yamop *)target, ap); | ||||
| @@ -4468,21 +4480,21 @@ static ClauseUnion * | ||||
| current_block(path_stack_entry *sp) | ||||
| { | ||||
|   while ((--sp)->flag != block_entry); | ||||
|   return sp->u.cle.block; | ||||
|   return sp->uip.cle.block; | ||||
| } | ||||
|  | ||||
| static path_stack_entry * | ||||
| kill_block(path_stack_entry *sp, PredEntry *ap) | ||||
| { | ||||
|   while ((--sp)->flag != block_entry); | ||||
|   if (sp->u.cle.entry_code == NULL) { | ||||
|     Yap_kill_iblock(sp->u.cle.block, NULL, ap); | ||||
|   if (sp->uip.cle.entry_code == NULL) { | ||||
|     Yap_kill_iblock(sp->uip.cle.block, NULL, ap); | ||||
|   } else { | ||||
|     path_stack_entry *nsp = sp; | ||||
|      | ||||
|     while ((--nsp)->flag != block_entry); | ||||
|     Yap_kill_iblock(sp->u.cle.block, nsp->u.cle.block, ap); | ||||
|     *sp->u.cle.entry_code = (yamop *)&(ap->cs.p_code.ExpandCode); | ||||
|     Yap_kill_iblock(sp->uip.cle.block, nsp->uip.cle.block, ap); | ||||
|     *sp->uip.cle.entry_code = (yamop *)&(ap->cs.p_code.ExpandCode); | ||||
|   } | ||||
|   return sp; | ||||
| } | ||||
| @@ -4626,7 +4638,7 @@ kill_clause(yamop *ipc, yamop *bg, yamop *lt, path_stack_entry *sp0, PredEntry * | ||||
|   path_stack_entry *sp = sp0; | ||||
|  | ||||
|   while ((--sp)->flag != block_entry); | ||||
|   blk = (LogUpdIndex *)(sp->u.cle.block); | ||||
|   blk = (LogUpdIndex *)(sp->uip.cle.block); | ||||
|   start = blk->ClCode; | ||||
|   op0 = Yap_op_from_opcode(start->opc); | ||||
|   while (op0 == _lock_lu) { | ||||
| @@ -4655,8 +4667,8 @@ kill_clause(yamop *ipc, yamop *bg, yamop *lt, path_stack_entry *sp0, PredEntry * | ||||
|     nsp = sp; | ||||
|     while ((--nsp)->flag != block_entry); | ||||
|     /* make us point straight at clause */ | ||||
|     *sp->u.cle.entry_code = tgl->ClCode; | ||||
|     Yap_kill_iblock(sp->u.cle.block, nsp->u.cle.block, ap); | ||||
|     *sp->uip.cle.entry_code = tgl->ClCode; | ||||
|     Yap_kill_iblock(sp->uip.cle.block, nsp->uip.cle.block, ap); | ||||
|     return sp; | ||||
|   } else { | ||||
|     if ( | ||||
| @@ -4679,7 +4691,7 @@ static path_stack_entry * | ||||
| expanda_block(path_stack_entry *sp, PredEntry *ap, ClauseDef *cls, int group1, yamop *alt, struct intermediates *cint) | ||||
| { | ||||
|   while ((--sp)->flag != block_entry); | ||||
|   Yap_kill_iblock(sp->u.cle.block, NULL, ap); | ||||
|   Yap_kill_iblock(sp->uip.cle.block, NULL, ap); | ||||
|   return sp; | ||||
| } | ||||
|  | ||||
| @@ -4687,7 +4699,7 @@ static path_stack_entry * | ||||
| expandz_block(path_stack_entry *sp, PredEntry *ap, ClauseDef *cls, int group1, yamop *alt, struct intermediates *cint) | ||||
| { | ||||
|   while ((--sp)->flag != block_entry); | ||||
|   Yap_kill_iblock(sp->u.cle.block, NULL, ap); | ||||
|   Yap_kill_iblock(sp->uip.cle.block, NULL, ap); | ||||
|   return sp; | ||||
| } | ||||
|  | ||||
| @@ -4784,18 +4796,18 @@ kill_unsafe_block(path_stack_entry *sp, op_numbers op, PredEntry *ap, int first, | ||||
| { | ||||
|   yamop *ipc; | ||||
|   while ((--sp)->flag != block_entry); | ||||
|   if (sp->u.cle.entry_code == NULL) { | ||||
|   if (sp->uip.cle.entry_code == NULL) { | ||||
|     /* we have reached the top */ | ||||
|     Yap_RemoveIndexation(ap); | ||||
|     return sp; | ||||
|   } | ||||
|   ipc = *sp->u.cle.entry_code; | ||||
|   ipc = *sp->uip.cle.entry_code; | ||||
|   if (Yap_op_from_opcode(ipc->opc) == op) { | ||||
|     /* the new block was the current clause */ | ||||
|     ClauseDef cld[2]; | ||||
|  | ||||
|     if (remove) { | ||||
|       *sp->u.cle.entry_code = FAILCODE; | ||||
|       *sp->uip.cle.entry_code = FAILCODE; | ||||
|       return sp; | ||||
|     } | ||||
|     if (ap->PredFlags & LogUpdatePredFlag) { | ||||
| @@ -4810,10 +4822,10 @@ kill_unsafe_block(path_stack_entry *sp, op_numbers op, PredEntry *ap, int first, | ||||
| 	cld[1].Code = cls[0].Code; | ||||
|       } | ||||
|       intrs.expand_block = NULL; | ||||
|       *sp->u.cle.entry_code = (yamop *)suspend_indexing(cld, cld+1, ap, &intrs); | ||||
|       *sp->uip.cle.entry_code = (yamop *)suspend_indexing(cld, cld+1, ap, &intrs); | ||||
|     } else { | ||||
|       /* static predicate, shouldn't do much, just suspend the code here */ | ||||
|       *sp->u.cle.entry_code = (yamop *)&(ap->cs.p_code.ExpandCode); | ||||
|       *sp->uip.cle.entry_code = (yamop *)&(ap->cs.p_code.ExpandCode); | ||||
|       return sp; | ||||
|     } | ||||
|     return sp; | ||||
| @@ -4905,8 +4917,8 @@ add_to_expand_clauses(path_stack_entry **spp, yamop *ipc, ClauseDef *cls, PredEn | ||||
|     } while (compactz_expand_clauses(ipc)); | ||||
|   } | ||||
|   while ((--sp)->flag != block_entry); | ||||
|   if (sp->u.cle.entry_code) { | ||||
|     *sp->u.cle.entry_code = (yamop *)&(ap->cs.p_code.ExpandCode); | ||||
|   if (sp->uip.cle.entry_code) { | ||||
|     *sp->uip.cle.entry_code = (yamop *)&(ap->cs.p_code.ExpandCode); | ||||
|   } | ||||
|   recover_ecls_block(ipc); | ||||
|   return pop_path(spp, cls, ap, cint); | ||||
| @@ -4934,7 +4946,7 @@ nullify_expand_clause(yamop *ipc, path_stack_entry *sp, ClauseDef *cls) | ||||
|     while ((--sp)->flag != block_entry); | ||||
|     while (TRUE) { | ||||
|       if (*st && *st != cls->Code) { | ||||
| 	*sp->u.cle.entry_code = *st; | ||||
| 	*sp->uip.cle.entry_code = *st; | ||||
| 	recover_ecls_block(ipc); | ||||
| 	return; | ||||
|       } | ||||
| @@ -5329,7 +5341,7 @@ add_to_index(struct intermediates *cint, int first, path_stack_entry *sp, Clause | ||||
| 	if (!IsExtensionFunctor(f)) { | ||||
| 	  current_arity = ArityOfFunctor(f); | ||||
| 	} | ||||
| 	newpc = fe->u.labp; | ||||
| 	newpc = fe->u_f.labp; | ||||
| 	if (newpc == (yamop *)&(ap->cs.p_code.ExpandCode)) { | ||||
| 	  /* we found it */ | ||||
| 	  ipc = pop_path(&sp, cls, ap, cint); | ||||
| @@ -5348,29 +5360,29 @@ add_to_index(struct intermediates *cint, int first, path_stack_entry *sp, Clause | ||||
| 	    ipc->u.sssl.e++; | ||||
| 	  } | ||||
| 	  if (ap->PredFlags & LogUpdatePredFlag) { | ||||
| 	     fe->u.labp = cls->Code; | ||||
| 	     fe->u_f.labp = cls->Code; | ||||
| 	  } else { | ||||
| 	    fe->u.labp = cls->CurrentCode; | ||||
| 	    fe->u_f.labp = cls->CurrentCode; | ||||
| 	  } | ||||
| 	  ipc = pop_path(&sp, cls, ap, cint); | ||||
| 	} else { | ||||
| 	  yamop *newpc = fe->u.labp; | ||||
| 	  yamop *newpc = fe->u_f.labp; | ||||
| 	  sp = fetch_new_block(sp, &(ipc->u.sssl.l), ap, cint); | ||||
| 	  sp = cross_block(sp, &(fe->u.labp), ap, cint); | ||||
| 	  sp = cross_block(sp, &(fe->u_f.labp), ap, cint); | ||||
| 	  ipc = newpc; | ||||
| 	} | ||||
|       } | ||||
|       break; | ||||
|     case _index_dbref: | ||||
|       cls->Tag = cls->u.t_ptr; | ||||
|       cls->Tag = cls->ucd.t_ptr; | ||||
|       ipc = NEXTOP(ipc,e); | ||||
|       break; | ||||
|     case _index_blob: | ||||
|       cls->Tag = Yap_Double_key(cls->u.t_ptr); | ||||
|       cls->Tag = Yap_Double_key(cls->ucd.t_ptr); | ||||
|       ipc = NEXTOP(ipc,e); | ||||
|       break; | ||||
|     case _index_long: | ||||
|       cls->Tag = Yap_Int_key(cls->u.t_ptr); | ||||
|       cls->Tag = Yap_Int_key(cls->ucd.t_ptr); | ||||
|       ipc = NEXTOP(ipc,e); | ||||
|       break; | ||||
|     case _switch_on_cons: | ||||
| @@ -5386,7 +5398,7 @@ add_to_index(struct intermediates *cint, int first, path_stack_entry *sp, Clause | ||||
| 	} else { | ||||
| 	  ae = lookup_c(at, ipc->u.sssl.l, ipc->u.sssl.s); | ||||
| 	} | ||||
| 	newpc = ae->u.labp; | ||||
| 	newpc = ae->u_a.labp; | ||||
|  | ||||
| 	if (newpc == (yamop *)&(ap->cs.p_code.ExpandCode)) { | ||||
| 	  /* nothing more to do */ | ||||
| @@ -5401,16 +5413,16 @@ add_to_index(struct intermediates *cint, int first, path_stack_entry *sp, Clause | ||||
| 	    ipc->u.sssl.e++; | ||||
| 	  } | ||||
| 	  if (ap->PredFlags & LogUpdatePredFlag) { | ||||
| 	    ae->u.labp = cls->Code; | ||||
| 	    ae->u_a.labp = cls->Code; | ||||
| 	  } else { | ||||
| 	    ae->u.labp = cls->CurrentCode; | ||||
| 	    ae->u_a.labp = cls->CurrentCode; | ||||
| 	  } | ||||
| 	  ipc = pop_path(&sp, cls, ap, cint); | ||||
| 	} else { | ||||
| 	  yamop *newpc = ae->u.labp; | ||||
| 	  yamop *newpc = ae->u_a.labp; | ||||
|  | ||||
| 	  sp = fetch_new_block(sp, &(ipc->u.sssl.l), ap, cint); | ||||
| 	  sp = cross_block(sp, &(ae->u.labp), ap, cint); | ||||
| 	  sp = cross_block(sp, &(ae->u_a.labp), ap, cint); | ||||
| 	  ipc = newpc; | ||||
| 	} | ||||
|       } | ||||
| @@ -5429,7 +5441,7 @@ add_to_index(struct intermediates *cint, int first, path_stack_entry *sp, Clause | ||||
|       break; | ||||
|     case _op_fail: | ||||
|       while ((--sp)->flag != block_entry); | ||||
|       *sp->u.cle.entry_code = cls->Code; | ||||
|       *sp->uip.cle.entry_code = cls->Code; | ||||
|       ipc = pop_path(&sp, cls, ap, cint); | ||||
|       break; | ||||
|     default: | ||||
| @@ -5531,7 +5543,7 @@ contract_ftable(yamop *ipc, ClauseUnion *blk, PredEntry *ap, Functor f) { | ||||
|     fep = (FuncSwiEntry *)(ipc->u.sssl.l); | ||||
|     while (fep->Tag != f) fep++; | ||||
|   } | ||||
|   fep->u.labp = FAILCODE; | ||||
|   fep->u_f.labp = FAILCODE; | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -5545,7 +5557,7 @@ contract_ctable(yamop *ipc, ClauseUnion *blk, PredEntry *ap, Term at) { | ||||
|     cep = (AtomSwiEntry *)(ipc->u.sssl.l); | ||||
|     while (cep->Tag != at) cep++; | ||||
|   } | ||||
|   cep->u.labp = FAILCODE; | ||||
|   cep->u_a.labp = FAILCODE; | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -5828,35 +5840,35 @@ remove_from_index(PredEntry *ap, path_stack_entry *sp, ClauseDef *cls, yamop *bg | ||||
| 	} else { | ||||
| 	  fe = lookup_f(f, ipc->u.sssl.l, ipc->u.sssl.s); | ||||
| 	} | ||||
| 	newpc = fe->u.labp; | ||||
| 	newpc = fe->u_f.labp; | ||||
|  | ||||
| 	if (newpc == (yamop *)&(ap->cs.p_code.ExpandCode)) { | ||||
| 	  /* we found it */ | ||||
| 	  ipc = pop_path(&sp, cls, ap, cint); | ||||
| 	} else if (newpc == FAILCODE) { | ||||
| 	  ipc = pop_path(&sp, cls, ap, cint); | ||||
| 	} else if (IN_BETWEEN(bg,fe->u.Label,lt)) { | ||||
| 	} else if (IN_BETWEEN(bg,fe->u_f.Label,lt)) { | ||||
| 	  /* oops, nothing there */ | ||||
| 	  contract_ftable(ipc, current_block(sp), ap, f); | ||||
| 	  ipc = pop_path(&sp, cls, ap, cint); | ||||
| 	} else { | ||||
| 	  yamop *newpc = fe->u.labp; | ||||
| 	  yamop *newpc = fe->u_f.labp; | ||||
| 	  sp = fetch_new_block(sp, &(ipc->u.sssl.l), ap, cint); | ||||
| 	  sp = cross_block(sp, &(fe->u.labp), ap, cint); | ||||
| 	  sp = cross_block(sp, &(fe->u_f.labp), ap, cint); | ||||
| 	  ipc = newpc; | ||||
| 	} | ||||
|       } | ||||
|       break; | ||||
|     case _index_dbref: | ||||
|       cls->Tag = cls->u.t_ptr; | ||||
|       cls->Tag = cls->ucd.t_ptr; | ||||
|       ipc = NEXTOP(ipc,e); | ||||
|       break; | ||||
|     case _index_blob: | ||||
|       cls->Tag = Yap_Double_key(cls->u.t_ptr); | ||||
|       cls->Tag = Yap_Double_key(cls->ucd.t_ptr); | ||||
|       ipc = NEXTOP(ipc,e); | ||||
|       break; | ||||
|     case _index_long: | ||||
|       cls->Tag = Yap_Int_key(cls->u.t_ptr); | ||||
|       cls->Tag = Yap_Int_key(cls->ucd.t_ptr); | ||||
|       ipc = NEXTOP(ipc,e); | ||||
|       break; | ||||
|     case _switch_on_cons: | ||||
| @@ -5872,22 +5884,22 @@ remove_from_index(PredEntry *ap, path_stack_entry *sp, ClauseDef *cls, yamop *bg | ||||
| 	} else { | ||||
| 	  ae = lookup_c(at, ipc->u.sssl.l, ipc->u.sssl.s); | ||||
| 	} | ||||
| 	newpc = ae->u.labp; | ||||
| 	newpc = ae->u_a.labp; | ||||
|  | ||||
| 	if (newpc == (yamop *)&(ap->cs.p_code.ExpandCode)) { | ||||
| 	  /* we found it */ | ||||
| 	  ipc = pop_path(&sp, cls, ap, cint); | ||||
| 	} else if (newpc == FAILCODE) { | ||||
| 	  ipc = pop_path(&sp, cls, ap, cint); | ||||
| 	} else if (IN_BETWEEN(bg,ae->u.Label,lt)) { | ||||
| 	} else if (IN_BETWEEN(bg,ae->u_a.Label,lt)) { | ||||
| 	  /* oops, nothing there */ | ||||
| 	  contract_ctable(ipc, current_block(sp), ap, at); | ||||
| 	  ipc = pop_path(&sp, cls, ap, cint); | ||||
| 	} else { | ||||
| 	  yamop *newpc = ae->u.labp; | ||||
| 	  yamop *newpc = ae->u_a.labp; | ||||
|  | ||||
| 	  sp = fetch_new_block(sp, &(ipc->u.sssl.l), ap, cint); | ||||
| 	  sp = cross_block(sp, &(ae->u.labp), ap, cint); | ||||
| 	  sp = cross_block(sp, &(ae->u_a.labp), ap, cint); | ||||
| 	  ipc = newpc; | ||||
| 	} | ||||
|       } | ||||
| @@ -6042,7 +6054,7 @@ store_clause_choice_point(Term t1, Term tb, Term tr, yamop *ipc, PredEntry *pe, | ||||
|   tsp[3] = tb; | ||||
|   tsp[4] = tr; | ||||
|   bptr->cp_tr = TR; | ||||
|   HB = bptr->cp_h = H; | ||||
|   HB = bptr->cp_h = HR; | ||||
| #ifdef DEPTH_LIMIT | ||||
|   bptr->cp_depth = DEPTH; | ||||
| #endif | ||||
| @@ -6065,7 +6077,7 @@ update_clause_choice_point(yamop *ipc, yamop *ap_pc USES_REGS) | ||||
| { | ||||
|   Term tpc = MkIntegerTerm((Int)ipc); | ||||
|   B->cp_args[1] = tpc; | ||||
|   B->cp_h = H; | ||||
|   B->cp_h = HR; | ||||
|   B->cp_ap = ap_pc; | ||||
| } | ||||
|  | ||||
| @@ -6186,14 +6198,12 @@ Yap_FollowIndexingCode(PredEntry *ap, yamop *ipc, Term Terms[3], yamop *ap_pc, y | ||||
| #if TABLING | ||||
|     case _table_trust: | ||||
| #endif | ||||
| #ifdef CUT_C | ||||
|       { | ||||
| 	while (POP_CHOICE_POINT(B->cp_b)) | ||||
| 	  { | ||||
| 	    POP_EXECUTE(); | ||||
| 	  } | ||||
|       } | ||||
| #endif /* CUT_C */ | ||||
| #ifdef YAPOR | ||||
|       { | ||||
| 	choiceptr cut_pt; | ||||
| @@ -6216,14 +6226,12 @@ Yap_FollowIndexingCode(PredEntry *ap, yamop *ipc, Term Terms[3], yamop *ap_pc, y | ||||
|     case _table_trust_me: | ||||
| #endif | ||||
|       b0 = B; | ||||
| #ifdef CUT_C | ||||
|       { | ||||
| 	while (POP_CHOICE_POINT(B->cp_b)) | ||||
| 	  { | ||||
| 	    POP_EXECUTE(); | ||||
| 	  } | ||||
|       } | ||||
| #endif /* CUT_C */ | ||||
| #ifdef YAPOR | ||||
|       { | ||||
| 	choiceptr cut_pt; | ||||
| @@ -6355,7 +6363,7 @@ Yap_FollowIndexingCode(PredEntry *ap, yamop *ipc, Term Terms[3], yamop *ap_pc, y | ||||
| 	    LogUpdClause *lcl = ipc->u.OtILl.d; | ||||
| 	    /* make sure we don't erase the clause we are jumping to, notice that | ||||
| 	       ErLogUpdIndex may remove several references in one go. | ||||
| 	       Notice we only need to do this if we<EFBFBD> re jumping to the clause. | ||||
| 	       Notice we only need to do this if we´ re jumping to the clause. | ||||
| 	     */ | ||||
| 	    if (newpc && !(lcl->ClFlags & (DirtyMask|InUseMask))) { | ||||
| 	      lcl->ClFlags |= InUseMask; | ||||
| @@ -6369,14 +6377,12 @@ Yap_FollowIndexingCode(PredEntry *ap, yamop *ipc, Term Terms[3], yamop *ap_pc, y | ||||
| 	  } | ||||
| 	} | ||||
| #endif | ||||
| #ifdef CUT_C | ||||
| 	{ | ||||
| 	  while (POP_CHOICE_POINT(B->cp_b)) | ||||
| 	    { | ||||
| 	      POP_EXECUTE(); | ||||
| 	    } | ||||
| 	} | ||||
| #endif /* CUT_C */ | ||||
| #ifdef YAPOR | ||||
| 	{ | ||||
| 	  choiceptr cut_pt; | ||||
| @@ -6533,9 +6539,9 @@ Yap_FollowIndexingCode(PredEntry *ap, yamop *ipc, Term Terms[3], yamop *ap_pc, y | ||||
| 	  fe = lookup_f(f, ipc->u.sssl.l, ipc->u.sssl.s); | ||||
| 	} | ||||
| #if defined(YAPOR) || defined(THREADS) | ||||
| 	jlbl = &(fe->u.labp); | ||||
| 	jlbl = &(fe->u_f.labp); | ||||
| #endif | ||||
| 	ipc = fe->u.labp; | ||||
| 	ipc = fe->u_f.labp; | ||||
|       } | ||||
|       break; | ||||
|     case _index_dbref: | ||||
| @@ -6566,9 +6572,9 @@ Yap_FollowIndexingCode(PredEntry *ap, yamop *ipc, Term Terms[3], yamop *ap_pc, y | ||||
| 	  ae = lookup_c(t, ipc->u.sssl.l, ipc->u.sssl.s); | ||||
| 	} | ||||
| #if defined(YAPOR) || defined(THREADS) | ||||
| 	jlbl = &(ae->u.labp); | ||||
| 	jlbl = &(ae->u_a.labp); | ||||
| #endif | ||||
| 	ipc = ae->u.labp; | ||||
| 	ipc = ae->u_a.labp; | ||||
|       } | ||||
|       break; | ||||
|     case _expand_index: | ||||
| @@ -6643,14 +6649,12 @@ Yap_FollowIndexingCode(PredEntry *ap, yamop *ipc, Term Terms[3], yamop *ap_pc, y | ||||
| 	return NULL; | ||||
|     default: | ||||
|       if (b0) { | ||||
| #ifdef CUT_C | ||||
|       { | ||||
| 	while (POP_CHOICE_POINT(B->cp_b)) | ||||
| 	  { | ||||
| 	    POP_EXECUTE(); | ||||
| 	  } | ||||
|       } | ||||
| #endif /* CUT_C */ | ||||
| #ifdef YAPOR | ||||
| 	{ | ||||
| 	  choiceptr cut_pt; | ||||
| @@ -6673,14 +6677,12 @@ Yap_FollowIndexingCode(PredEntry *ap, yamop *ipc, Term Terms[3], yamop *ap_pc, y | ||||
|   } | ||||
|   if (b0) { | ||||
|     /* I did a trust */ | ||||
| #ifdef CUT_C | ||||
|       { | ||||
| 	while (POP_CHOICE_POINT(B->cp_b)) | ||||
| 	  { | ||||
| 	    POP_EXECUTE(); | ||||
| 	  } | ||||
|       } | ||||
| #endif /* CUT_C */ | ||||
| #ifdef YAPOR | ||||
|     { | ||||
|       choiceptr cut_pt; | ||||
|   | ||||
							
								
								
									
										51
									
								
								C/init.c
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								C/init.c
									
									
									
									
									
								
							| @@ -69,11 +69,7 @@ static void  InTTYLine(char *); | ||||
| static void  SetOp(int, int, char *, Term); | ||||
| static void  InitOps(void); | ||||
| static void  InitDebug(void); | ||||
| #ifdef CUT_C | ||||
| static void  CleanBack(PredEntry *, CPredicate, CPredicate, CPredicate); | ||||
| #else | ||||
| static void  CleanBack(PredEntry *, CPredicate, CPredicate); | ||||
| #endif | ||||
| static void  InitStdPreds(void); | ||||
| static void  InitFlags(void); | ||||
| static void  InitCodes(void); | ||||
| @@ -477,6 +473,7 @@ Yap_InitCPred(char *Name, unsigned long int Arity, CPredicate code, UInt flags) | ||||
|   } | ||||
|   pe->CodeOfPred = p_code; | ||||
|   pe->PredFlags = flags | StandardPredFlag | CPredFlag; | ||||
|   pe->src.OwnerFile = Yap_ConsultingFile( PASS_REGS1 ); | ||||
|   pe->cs.f_code = code; | ||||
|   if (!(flags & SafePredFlag)) { | ||||
|     p_code->opc = Yap_opcode(_allocate); | ||||
| @@ -681,11 +678,7 @@ Yap_InitAsmPred(char *Name,  unsigned long int Arity, int code, CPredicate def, | ||||
|  | ||||
|  | ||||
| static void  | ||||
| #ifdef CUT_C | ||||
| CleanBack(PredEntry *pe, CPredicate Start, CPredicate Cont, CPredicate Cut) | ||||
| #else | ||||
| CleanBack(PredEntry *pe, CPredicate Start, CPredicate Cont) | ||||
| #endif | ||||
| { | ||||
|   yamop   *code; | ||||
|   if (pe->cs.p_code.FirstClause != pe->cs.p_code.LastClause || | ||||
| @@ -716,7 +709,6 @@ CleanBack(PredEntry *pe, CPredicate Start, CPredicate Cont) | ||||
|   PUT_YAMOP_SEQ(code); | ||||
| #endif /* YAPOR */ | ||||
|   code->u.OtapFs.f = Cont; | ||||
| #ifdef CUT_C | ||||
|   code = NEXTOP(code,OtapFs); | ||||
|   if (pe->PredFlags & UserCPredFlag) | ||||
|     code->opc = Yap_opcode(_cut_c); | ||||
| @@ -724,11 +716,8 @@ CleanBack(PredEntry *pe, CPredicate Start, CPredicate Cont) | ||||
|     code->opc = Yap_opcode(_cut_userc); | ||||
|   code->u.OtapFs.p = pe; | ||||
|   code->u.OtapFs.f = Cut; | ||||
| #endif | ||||
| } | ||||
|  | ||||
|  | ||||
| #ifdef CUT_C | ||||
| void  | ||||
| Yap_InitCPredBack(char *Name, unsigned long int Arity, | ||||
| 		  unsigned int Extra, CPredicate Start, | ||||
| @@ -742,24 +731,11 @@ Yap_InitCPredBackCut(char *Name, unsigned long int Arity, | ||||
| 		     CPredicate Cont,CPredicate Cut, UInt flags){ | ||||
|   Yap_InitCPredBack_(Name,Arity,Extra,Start,Cont,Cut,flags); | ||||
| } | ||||
| #else | ||||
| Yap_InitCPredBackCut(char *Name, unsigned long int Arity, | ||||
| 		     unsigned int Extra, CPredicate Start, | ||||
| 		     CPredicate Cont,CPredicate Cut, UInt flags){ | ||||
|   Yap_InitCPredBack(Name,Arity,Extra,Start,Cont,flags); | ||||
| } | ||||
| #endif /* CUT_C */ | ||||
|  | ||||
| void | ||||
| #ifdef CUT_C  | ||||
| Yap_InitCPredBack_(char *Name, unsigned long int Arity, | ||||
| 		  unsigned int Extra, CPredicate Start, | ||||
| 		  CPredicate Cont, CPredicate Cut, UInt flags) | ||||
| #else | ||||
| Yap_InitCPredBack(char *Name, unsigned long int Arity, | ||||
| 		  unsigned int Extra, CPredicate Start, | ||||
| 		  CPredicate Cont, UInt flags) | ||||
| #endif  | ||||
| { | ||||
|   CACHE_REGS | ||||
|   PredEntry      *pe = NULL; | ||||
| @@ -795,11 +771,7 @@ Yap_InitCPredBack(char *Name, unsigned long int Arity, | ||||
|   if (pe->cs.p_code.FirstClause != NIL) | ||||
|     { | ||||
|       flags = update_flags_from_prolog(flags, pe);       | ||||
| #ifdef CUT_C | ||||
|       CleanBack(pe, Start, Cont, Cut); | ||||
| #else | ||||
|       CleanBack(pe, Start, Cont); | ||||
| #endif /*CUT_C*/ | ||||
|     } | ||||
|   else { | ||||
|     StaticClause *cl; | ||||
| @@ -813,11 +785,7 @@ Yap_InitCPredBack(char *Name, unsigned long int Arity, | ||||
|     pe->PredFlags |= SequentialPredFlag; | ||||
| #endif /* YAPOR */ | ||||
|      | ||||
| #ifdef CUT_C | ||||
|     cl = (StaticClause *)Yap_AllocCodeSpace((CELL)NEXTOP(NEXTOP(NEXTOP(NEXTOP(code,OtapFs),OtapFs),OtapFs),l)); | ||||
| #else | ||||
|     cl = (StaticClause *)Yap_AllocCodeSpace((CELL)NEXTOP(NEXTOP(NEXTOP(code,OtapFs),OtapFs),l)); | ||||
| #endif | ||||
|      | ||||
|     if (cl == NULL) { | ||||
|       Yap_Error(OUT_OF_HEAP_ERROR,TermNil,"No Heap Space in InitCPredBack"); | ||||
| @@ -825,15 +793,9 @@ Yap_InitCPredBack(char *Name, unsigned long int Arity, | ||||
|     } | ||||
|     cl->ClFlags = StaticMask; | ||||
|     cl->ClNext = NULL; | ||||
| #ifdef CUT_C | ||||
|     Yap_ClauseSpace += (CELL)NEXTOP(NEXTOP(NEXTOP(NEXTOP(code,OtapFs),OtapFs),OtapFs),l); | ||||
|     cl->ClSize =  | ||||
|       (CELL)NEXTOP(NEXTOP(NEXTOP(NEXTOP(code,OtapFs),OtapFs),OtapFs),e); | ||||
| #else | ||||
|     Yap_ClauseSpace += (CELL)NEXTOP(NEXTOP(NEXTOP(code,OtapFs),OtapFs),l); | ||||
|     cl->ClSize =  | ||||
|       (CELL)NEXTOP(NEXTOP(NEXTOP(code,OtapFs),OtapFs),e); | ||||
| #endif | ||||
|     cl->usc.ClLine = Yap_source_line_no(); | ||||
|  | ||||
|     code = cl->ClCode; | ||||
| @@ -865,7 +827,6 @@ Yap_InitCPredBack(char *Name, unsigned long int Arity, | ||||
|     PUT_YAMOP_SEQ(code); | ||||
| #endif /* YAPOR */ | ||||
|     code = NEXTOP(code,OtapFs); | ||||
| #ifdef CUT_C | ||||
|     if (flags & UserCPredFlag) | ||||
|       code->opc = Yap_opcode(_cut_userc); | ||||
|     else | ||||
| @@ -875,7 +836,6 @@ Yap_InitCPredBack(char *Name, unsigned long int Arity, | ||||
|     code->u.OtapFs.s = Arity; | ||||
|     code->u.OtapFs.extra = Extra; | ||||
|     code = NEXTOP(code,OtapFs); | ||||
| #endif /* CUT_C */ | ||||
|     code->opc = Yap_opcode(_Ystop); | ||||
|     code->u.l.l = cl->ClCode; | ||||
|   } | ||||
| @@ -1233,11 +1193,7 @@ static void | ||||
| InitVersion(void) | ||||
| { | ||||
|   Yap_PutValue(AtomVersionNumber, | ||||
| 	       MkAtomTerm(Yap_LookupAtom(YAP_SVERSION))); | ||||
| #if defined MYDDAS_MYSQL || defined MYDDAS_ODBC | ||||
|   Yap_PutValue(AtomMyddasVersionName, | ||||
| 	       MkAtomTerm(Yap_LookupAtom(MYDDAS_VERSION))); | ||||
| #endif   | ||||
| 	       MkAtomTerm(Yap_LookupAtom(YAP_FULL_VERSION))); | ||||
| } | ||||
|  | ||||
| void | ||||
| @@ -1402,9 +1358,6 @@ Yap_exit (int value) | ||||
| #ifdef LOW_PROF | ||||
|     remove("PROFPREDS"); | ||||
|     remove("PROFILING"); | ||||
| #endif | ||||
| #if defined MYDDAS_MYSQL || defined MYDDAS_ODBC | ||||
|     Yap_MYDDAS_delete_all_myddas_structs(); | ||||
| #endif | ||||
|     run_halt_hooks(value); | ||||
|     Yap_ShutdownLoadForeign(); | ||||
|   | ||||
							
								
								
									
										35
									
								
								C/inlines.c
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								C/inlines.c
									
									
									
									
									
								
							| @@ -19,9 +19,7 @@ | ||||
|  | ||||
| #include "absmi.h" | ||||
|  | ||||
| #ifdef CUT_C | ||||
| #include "cut_c.h" | ||||
| #endif | ||||
|  | ||||
| static Int    p_atom( USES_REGS1 ); | ||||
| static Int    p_atomic( USES_REGS1 ); | ||||
| @@ -325,6 +323,8 @@ eq(Term t1, Term t2 USES_REGS) | ||||
| 	    return (d0 == d1); | ||||
| 	  case (CELL)FunctorLongInt: | ||||
| 	    return(LongIntOfTerm(d0) == LongIntOfTerm(d1)); | ||||
| 	  case (CELL)FunctorString: | ||||
| 	    return(strcmp(StringOfTerm(d0), StringOfTerm(d1)) == 0); | ||||
| #ifdef USE_GMP | ||||
| 	  case (CELL)FunctorBigInt: | ||||
| 	    return (Yap_gmp_tcmp_big_big(d0, d1) == 0); | ||||
| @@ -423,9 +423,9 @@ p_dif( USES_REGS1 ) | ||||
|     /* make B and HB point to H to guarantee all bindings will | ||||
|      * be trailed | ||||
|      */ | ||||
|     HBREG = H; | ||||
|     B = (choiceptr) H; | ||||
|     B->cp_h = H; | ||||
|     HBREG = HR; | ||||
|     B = (choiceptr) HR; | ||||
|     B->cp_h = HR; | ||||
|     SET_BB(B); | ||||
|     save_hb(); | ||||
|     d0 = Yap_IUnify(d0, d1); | ||||
| @@ -440,7 +440,7 @@ p_dif( USES_REGS1 ) | ||||
|     B = pt1; | ||||
|     SET_BB(PROTECT_FROZEN_B(pt1)); | ||||
| #ifdef COROUTINING | ||||
|     H = HBREG; | ||||
|     HR = HBREG; | ||||
| #endif | ||||
|     HBREG = B->cp_h; | ||||
|     /* untrail all bindings made by Yap_IUnify */ | ||||
| @@ -508,7 +508,8 @@ p_arg( USES_REGS1 ) | ||||
|       else if (IsLongIntTerm(d0)) { | ||||
| 	d0 = LongIntOfTerm(d0); | ||||
|       } else { | ||||
| 	Yap_Error(TYPE_ERROR_INTEGER,d0,"arg 1 of arg/3"); | ||||
| 	if (!IsBigIntTerm( d0 )) | ||||
| 	  Yap_Error(TYPE_ERROR_INTEGER,d0,"arg 1 of arg/3"); | ||||
| 	return(FALSE); | ||||
|       } | ||||
|  | ||||
| @@ -611,6 +612,8 @@ p_functor( USES_REGS1 )			/* functor(?,?,?) */ | ||||
| 	d1 = MkIntTerm(0); | ||||
|       } else if (d1 == (CELL)FunctorLongInt) { | ||||
| 	d1 = MkIntTerm(0); | ||||
|       } else if (d1 == (CELL)FunctorString) { | ||||
| 	d1 = MkIntTerm(0); | ||||
|       } else | ||||
| 	  return(FALSE); | ||||
|     } else { | ||||
| @@ -703,10 +706,10 @@ p_functor( USES_REGS1 )			/* functor(?,?,?) */ | ||||
|   /* We made it!!!!! we got in d0 the name, in d1 the arity and | ||||
|    * in pt0 the variable to bind it to. */ | ||||
|   if (d0 == TermDot && d1 == 2) { | ||||
|     RESET_VARIABLE(H); | ||||
|     RESET_VARIABLE(H+1); | ||||
|     d0 = AbsPair(H); | ||||
|     H += 2; | ||||
|     RESET_VARIABLE(HR); | ||||
|     RESET_VARIABLE(HR+1); | ||||
|     d0 = AbsPair(HR); | ||||
|     HR += 2; | ||||
|   } | ||||
|   else if ((Int)d1 > 0) { | ||||
|     /* now let's build a compound term */ | ||||
| @@ -720,10 +723,10 @@ p_functor( USES_REGS1 )			/* functor(?,?,?) */ | ||||
|     } | ||||
|     else | ||||
|       d0 = (CELL) Yap_MkFunctor(AtomOfTerm(d0), (Int) d1); | ||||
|     pt1 = H; | ||||
|     pt1 = HR; | ||||
|     *pt1++ = d0; | ||||
|     d0 = AbsAppl(H); | ||||
|     if (pt1+d1 > ENV - CreepFlag) { | ||||
|     d0 = AbsAppl(HR); | ||||
|     if (pt1+d1 > ENV - StackGap( PASS_REGS1 )) { | ||||
|       if (!Yap_gcl((1+d1)*sizeof(CELL), 3, ENV, gc_P(P,CP))) { | ||||
| 	Yap_Error(OUT_OF_STACK_ERROR, TermNil, LOCAL_ErrorMessage); | ||||
| 	return FALSE; | ||||
| @@ -735,7 +738,7 @@ p_functor( USES_REGS1 )			/* functor(?,?,?) */ | ||||
|       pt1++; | ||||
|     } | ||||
|     /* done building the term */ | ||||
|     H = pt1; | ||||
|     HR = pt1; | ||||
|     ENDP(pt1); | ||||
|   } else if ((Int)d1  < 0) { | ||||
|     Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO,MkIntegerTerm(d1),"functor/3"); | ||||
| @@ -793,14 +796,12 @@ p_cut_by( USES_REGS1 ) | ||||
| #else | ||||
|   pt0 = (choiceptr)(LCL0-IntOfTerm(d0)); | ||||
| #endif | ||||
| #ifdef CUT_C | ||||
|   { | ||||
|     while (POP_CHOICE_POINT(pt0)) | ||||
|       { | ||||
| 	POP_EXECUTE(); | ||||
|       } | ||||
|   } | ||||
| #endif /* CUT_C */ | ||||
| #ifdef YAPOR | ||||
|     CUT_prune_to(pt0); | ||||
| #endif /* YAPOR */ | ||||
|   | ||||
							
								
								
									
										40
									
								
								C/iopreds.c
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								C/iopreds.c
									
									
									
									
									
								
							| @@ -31,6 +31,7 @@ static char SccsId[] = "%W% %G%"; | ||||
| #include "eval.h" | ||||
| /* stuff we want to use in standard YAP code */ | ||||
| #include "pl-shared.h" | ||||
| #include "YapText.h" | ||||
| #include <stdlib.h> | ||||
| #if HAVE_STDARG_H | ||||
| #include <stdarg.h> | ||||
| @@ -270,7 +271,7 @@ syntax_error (TokEntry * tokptr, IOSTREAM *st, Term *outp) | ||||
|   Int start, err = 0, end; | ||||
|   Term tf[7]; | ||||
|   Term *error = tf+3; | ||||
|   CELL *Hi = H; | ||||
|   CELL *Hi = HR; | ||||
|   int has_qq = FALSE; | ||||
|  | ||||
|   /* make sure to globalise variable */ | ||||
| @@ -279,12 +280,12 @@ syntax_error (TokEntry * tokptr, IOSTREAM *st, Term *outp) | ||||
|   clean_vars(LOCAL_AnonVarTable); | ||||
|   while (1) { | ||||
|     Term ts[2]; | ||||
|     if (H > ASP-1024) { | ||||
|     if (HR > ASP-1024) { | ||||
|       tf[3] = TermNil; | ||||
|       err = 0; | ||||
|       end = 0; | ||||
|       /* for some reason moving this earlier confuses gcc on solaris */ | ||||
|       H = Hi; | ||||
|       HR = Hi; | ||||
|       break; | ||||
|     } | ||||
|     if (tokptr == LOCAL_toktide) { | ||||
| @@ -301,6 +302,7 @@ syntax_error (TokEntry * tokptr, IOSTREAM *st, Term *outp) | ||||
|       } | ||||
|       break; | ||||
|     case QuasiQuotes_tok: | ||||
|     case WQuasiQuotes_tok: | ||||
|       { | ||||
| 	if (has_qq) { | ||||
| 	  Term t0[1]; | ||||
| @@ -324,7 +326,7 @@ syntax_error (TokEntry * tokptr, IOSTREAM *st, Term *outp) | ||||
| 	VarEntry *varinfo = (VarEntry *)info; | ||||
|  | ||||
| 	t[0] = MkIntTerm(0); | ||||
| 	t[1] = Yap_StringToList(varinfo->VarRep); | ||||
| 	t[1] = Yap_CharsToListOfCodes((const char *)varinfo->VarRep PASS_REGS); | ||||
| 	if (varinfo->VarAdr == TermNil) { | ||||
| 	  t[2] = varinfo->VarAdr = MkVarTerm(); | ||||
| 	} else { | ||||
| @@ -335,13 +337,13 @@ syntax_error (TokEntry * tokptr, IOSTREAM *st, Term *outp) | ||||
|       break; | ||||
|     case String_tok: | ||||
|       { | ||||
| 	Term t0 = Yap_StringToList((char *)info); | ||||
| 	Term t0 = Yap_CharsToListOfCodes((const char *)info PASS_REGS); | ||||
| 	ts[0] = Yap_MkApplTerm(Yap_MkFunctor(AtomString,1),1,&t0); | ||||
|       } | ||||
|       break; | ||||
|     case WString_tok: | ||||
|       { | ||||
| 	Term t0 = Yap_WideStringToList((wchar_t *)info); | ||||
| 	Term t0 = Yap_WCharsToListOfCodes((const wchar_t *)info PASS_REGS); | ||||
| 	ts[0] = Yap_MkApplTerm(Yap_MkFunctor(AtomString,1),1,&t0); | ||||
|       } | ||||
|       break; | ||||
| @@ -371,7 +373,7 @@ syntax_error (TokEntry * tokptr, IOSTREAM *st, Term *outp) | ||||
|   } | ||||
|   /* now we can throw away tokens, so we can unify and possibly overwrite TR */ | ||||
|   Yap_unify(*outp, MkVarTerm()); | ||||
|   if (IsVarTerm(*outp) && (VarOfTerm(*outp) > H || VarOfTerm(*outp) < H0)) { | ||||
|   if (IsVarTerm(*outp) && (VarOfTerm(*outp) > HR || VarOfTerm(*outp) < H0)) { | ||||
|     tf[0] = Yap_MkNewApplTerm(Yap_MkFunctor(AtomRead,1),1); | ||||
|   } else { | ||||
|     tf[0] = Yap_MkApplTerm(Yap_MkFunctor(AtomRead,1),1,outp); | ||||
| @@ -500,12 +502,12 @@ Yap_read_term(term_t t0, IOSTREAM *inp_stream, struct read_data_t *rd) | ||||
|     } | ||||
|     /* Scans the term using stack space */ | ||||
|     while (TRUE) { | ||||
|       old_H = H; | ||||
|       old_H = HR; | ||||
|       LOCAL_Comments = TermNil; | ||||
|       LOCAL_CommentsNextChar = LOCAL_CommentsTail = NULL; | ||||
|       tokstart = LOCAL_tokptr = LOCAL_toktide = Yap_tokenizer(inp_stream, store_comments, &tpos); | ||||
|       tokstart = LOCAL_tokptr = LOCAL_toktide = Yap_tokenizer(inp_stream, store_comments, &tpos, rd); | ||||
|       if (LOCAL_Error_TYPE != YAP_NO_ERROR && seekable) { | ||||
| 	H = old_H; | ||||
| 	HR = old_H; | ||||
| 	Yap_clean_tokenizer(tokstart, LOCAL_VarTable, LOCAL_AnonVarTable, LOCAL_Comments); | ||||
| 	if (seekable) { | ||||
| 	  Sseek64(inp_stream, cpos, SIO_SEEK_SET); | ||||
| @@ -539,7 +541,7 @@ Yap_read_term(term_t t0, IOSTREAM *inp_stream, struct read_data_t *rd) | ||||
|     LOCAL_Error_TYPE = YAP_NO_ERROR; | ||||
|     /* preserve value of H after scanning: otherwise we may lose strings | ||||
|        and floats */ | ||||
|     old_H = H; | ||||
|     old_H = HR; | ||||
|     if (tokstart != NULL && tokstart->Tok == Ord (eot_tok)) { | ||||
|       /* did we get the end of file from an abort? */ | ||||
|       if (LOCAL_ErrorMessage && | ||||
| @@ -566,7 +568,7 @@ Yap_read_term(term_t t0, IOSTREAM *inp_stream, struct read_data_t *rd) | ||||
| 	  tr_fr_ptr old_TR = TR; | ||||
|  | ||||
|  | ||||
| 	  H = old_H; | ||||
| 	  HR = old_H; | ||||
| 	  TR = (tr_fr_ptr)LOCAL_ScannerStack; | ||||
| 	   | ||||
| 	  if (!strcmp(LOCAL_ErrorMessage,"Stack Overflow")) | ||||
| @@ -578,7 +580,7 @@ Yap_read_term(term_t t0, IOSTREAM *inp_stream, struct read_data_t *rd) | ||||
| 	  if (res) { | ||||
| 	    LOCAL_ScannerStack = (char *)TR; | ||||
| 	    TR = old_TR; | ||||
| 	    old_H = H; | ||||
| 	    old_H = HR; | ||||
| 	    LOCAL_tokptr = LOCAL_toktide = tokstart; | ||||
| 	    LOCAL_ErrorMessage = NULL; | ||||
| 	    goto repeat_cycle; | ||||
| @@ -610,7 +612,7 @@ Yap_read_term(term_t t0, IOSTREAM *inp_stream, struct read_data_t *rd) | ||||
|     return FALSE; | ||||
|   if (rd->varnames) { | ||||
|     while (TRUE) { | ||||
|       CELL *old_H = H; | ||||
|       CELL *old_H = HR; | ||||
|  | ||||
|       if (setjmp(LOCAL_IOBotch) == 0) { | ||||
| 	v = Yap_VarNames(LOCAL_VarTable, TermNil); | ||||
| @@ -621,7 +623,7 @@ Yap_read_term(term_t t0, IOSTREAM *inp_stream, struct read_data_t *rd) | ||||
|  | ||||
| 	old_TR = TR; | ||||
| 	/* restart global */ | ||||
| 	H = old_H; | ||||
| 	HR = old_H; | ||||
| 	TR = (tr_fr_ptr)LOCAL_ScannerStack; | ||||
| 	Yap_growstack_in_parser(&old_TR, &tokstart, &LOCAL_VarTable); | ||||
| 	LOCAL_ScannerStack = (char *)TR; | ||||
| @@ -635,7 +637,7 @@ Yap_read_term(term_t t0, IOSTREAM *inp_stream, struct read_data_t *rd) | ||||
|  | ||||
|   if (rd->variables) { | ||||
|     while (TRUE) { | ||||
|       CELL *old_H = H; | ||||
|       CELL *old_H = HR; | ||||
|  | ||||
|       if (setjmp(LOCAL_IOBotch) == 0) { | ||||
| 	v = Yap_Variables(LOCAL_VarTable, TermNil); | ||||
| @@ -646,7 +648,7 @@ Yap_read_term(term_t t0, IOSTREAM *inp_stream, struct read_data_t *rd) | ||||
|  | ||||
| 	old_TR = TR; | ||||
| 	/* restart global */ | ||||
| 	H = old_H; | ||||
| 	HR = old_H; | ||||
| 	TR = (tr_fr_ptr)LOCAL_ScannerStack; | ||||
| 	Yap_growstack_in_parser(&old_TR, &tokstart, &LOCAL_VarTable); | ||||
| 	LOCAL_ScannerStack = (char *)TR; | ||||
| @@ -658,7 +660,7 @@ Yap_read_term(term_t t0, IOSTREAM *inp_stream, struct read_data_t *rd) | ||||
|   } | ||||
|   if (rd->singles) { | ||||
|     while (TRUE) { | ||||
|       CELL *old_H = H; | ||||
|       CELL *old_H = HR; | ||||
|  | ||||
|       if (setjmp(LOCAL_IOBotch) == 0) { | ||||
| 	v = Yap_Singletons(LOCAL_VarTable, TermNil); | ||||
| @@ -669,7 +671,7 @@ Yap_read_term(term_t t0, IOSTREAM *inp_stream, struct read_data_t *rd) | ||||
|  | ||||
| 	old_TR = TR; | ||||
| 	/* restart global */ | ||||
| 	H = old_H; | ||||
| 	HR = old_H; | ||||
| 	TR = (tr_fr_ptr)LOCAL_ScannerStack; | ||||
| 	Yap_growstack_in_parser(&old_TR, &tokstart, &LOCAL_VarTable); | ||||
| 	LOCAL_ScannerStack = (char *)TR; | ||||
|   | ||||
| @@ -21,6 +21,8 @@ static char     SccsId[] = "%W% %G%.2"; | ||||
| #include "Yatom.h" | ||||
| #include "YapHeap.h" | ||||
| #include "yapio.h" | ||||
| #include "pl-shared.h" | ||||
| #include "YapText.h" | ||||
| #include <stdlib.h> | ||||
| #if HAVE_STRING_H | ||||
| #include <string.h> | ||||
| @@ -81,7 +83,9 @@ p_load_foreign( USES_REGS1 ) | ||||
|    | ||||
|   /* call the OS specific function for dynamic loading */ | ||||
|   if(Yap_LoadForeign(ofiles,libs,InitProcName,&InitProc)==LOAD_SUCCEEDED) { | ||||
|     Int CurSlot =   Yap_StartSlots( PASS_REGS1 ); | ||||
|     (*InitProc)(); | ||||
|     LOCAL_CurSlot = CurSlot; | ||||
|     returncode = TRUE; | ||||
|   } | ||||
|    | ||||
| @@ -211,7 +215,7 @@ p_call_shared_object_function( USES_REGS1 ) { | ||||
|  | ||||
| static Int | ||||
| p_obj_suffix( USES_REGS1 ) { | ||||
|   return Yap_unify(Yap_StringToList(SO_EXT),ARG1); | ||||
|   return Yap_unify(Yap_CharsToListOfCodes(SO_EXT PASS_REGS),ARG1); | ||||
| } | ||||
|  | ||||
| static Int | ||||
|   | ||||
							
								
								
									
										26
									
								
								C/mavar.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								C/mavar.c
									
									
									
									
									
								
							| @@ -36,7 +36,7 @@ p_setarg( USES_REGS1 ) | ||||
|   Int i; | ||||
|  | ||||
|   if (IsVarTerm(t3) && | ||||
|       VarOfTerm(t3) > H &&VarOfTerm(t3) < ASP) { | ||||
|       VarOfTerm(t3) > HR &&VarOfTerm(t3) < ASP) { | ||||
|     /* local variable */ | ||||
|     Term tn = MkVarTerm(); | ||||
|     Bind_Local(VarOfTerm(t3), tn); | ||||
| @@ -124,17 +124,17 @@ NewTimedVar(CELL val USES_REGS) | ||||
|   Term out; | ||||
|   timed_var *tv; | ||||
|   if (IsVarTerm(val) && | ||||
|       VarOfTerm(val) > H) { | ||||
|       VarOfTerm(val) > HR) { | ||||
|     Term nval = MkVarTerm(); | ||||
|     Bind_Local(VarOfTerm(val), nval); | ||||
|     val = nval; | ||||
|   } | ||||
|   out = AbsAppl(H); | ||||
|   *H++ = (CELL)FunctorMutable; | ||||
|   tv = (timed_var *)H; | ||||
|   out = AbsAppl(HR); | ||||
|   *HR++ = (CELL)FunctorMutable; | ||||
|   tv = (timed_var *)HR; | ||||
|   RESET_VARIABLE(&(tv->clock)); | ||||
|   tv->value = val; | ||||
|   H += sizeof(timed_var)/sizeof(CELL); | ||||
|   HR += sizeof(timed_var)/sizeof(CELL); | ||||
|   return(out); | ||||
| } | ||||
|  | ||||
| @@ -149,13 +149,13 @@ Term | ||||
| Yap_NewEmptyTimedVar( void ) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   Term out = AbsAppl(H); | ||||
|   Term out = AbsAppl(HR); | ||||
|   timed_var *tv; | ||||
|   *H++ = (CELL)FunctorMutable; | ||||
|   tv = (timed_var *)H; | ||||
|   *HR++ = (CELL)FunctorMutable; | ||||
|   tv = (timed_var *)HR; | ||||
|   RESET_VARIABLE(&(tv->clock)); | ||||
|   RESET_VARIABLE(&(tv->value)); | ||||
|   H += sizeof(timed_var)/sizeof(CELL); | ||||
|   HR += sizeof(timed_var)/sizeof(CELL); | ||||
|   return(out); | ||||
| } | ||||
|  | ||||
| @@ -181,7 +181,7 @@ UpdateTimedVar(Term inv, Term new USES_REGS) | ||||
|   CELL t = tv->value; | ||||
|   CELL* timestmp = (CELL *)(tv->clock); | ||||
|   if (IsVarTerm(new) && | ||||
|       VarOfTerm(new) > H) { | ||||
|       VarOfTerm(new) > HR) { | ||||
|     Term nnew = MkVarTerm(); | ||||
|     Bind_Local(VarOfTerm(new), nnew); | ||||
|     new = nnew; | ||||
| @@ -200,9 +200,9 @@ UpdateTimedVar(Term inv, Term new USES_REGS) | ||||
| #endif | ||||
|       tv->value = new; | ||||
|   } else { | ||||
|     Term nclock = (Term)H; | ||||
|     Term nclock = (Term)HR; | ||||
|     MaBind(&(tv->value), new); | ||||
|     *H++ = TermFoundVar; | ||||
|     *HR++ = TermFoundVar; | ||||
|     MaBind(&(tv->clock), nclock); | ||||
|   } | ||||
|   return(t); | ||||
|   | ||||
							
								
								
									
										43
									
								
								C/modules.c
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								C/modules.c
									
									
									
									
									
								
							| @@ -249,26 +249,15 @@ init_current_module( USES_REGS1 ) | ||||
| static Int | ||||
| p_strip_module( USES_REGS1 ) | ||||
| { | ||||
|   Term t1 = Deref(ARG1), t2, tmod = CurrentModule; | ||||
|   Term t1 = Deref(ARG1), tmod = CurrentModule; | ||||
|   if (tmod == PROLOG_MODULE) { | ||||
|     tmod = TermProlog; | ||||
|   } | ||||
|   if (IsVarTerm(t1) || | ||||
|       !IsApplTerm(t1) || | ||||
|       FunctorOfTerm(t1) != FunctorModule || | ||||
|       IsVarTerm(t2 = ArgOfTerm(1,t1)) || | ||||
|       !IsAtomTerm(t2)) { | ||||
|     return Yap_unify(ARG3, t1) && | ||||
|       Yap_unify(ARG2, tmod); | ||||
|   t1 = Yap_StripModule( t1, &tmod ); | ||||
|   if (!t1) { | ||||
|     Yap_Error(TYPE_ERROR_CALLABLE,ARG1,"trying to obtain module"); | ||||
|     return FALSE; | ||||
|   } | ||||
|   do { | ||||
|     tmod = t2; | ||||
|     t1 = ArgOfTerm(2,t1); | ||||
|   } while (!IsVarTerm(t1) && | ||||
| 	   IsApplTerm(t1) && | ||||
| 	   FunctorOfTerm(t1) == FunctorModule && | ||||
| 	   !IsVarTerm(t2 = ArgOfTerm(1,t1)) && | ||||
| 	   IsAtomTerm(t2)); | ||||
|   return Yap_unify(ARG3, t1) && | ||||
|     Yap_unify(ARG2, tmod);       | ||||
| } | ||||
| @@ -303,23 +292,27 @@ Yap_StripModule(Term t,  Term *modp) | ||||
|  | ||||
|   if (modp) | ||||
|     tmod = *modp; | ||||
|   else | ||||
|   else { | ||||
|     tmod = CurrentModule; | ||||
|     if (tmod == PROLOG_MODULE) { | ||||
|       tmod = TermProlog; | ||||
|     } | ||||
|   } | ||||
|  restart: | ||||
|   if (IsVarTerm(t)) { | ||||
|     return 0L; | ||||
|   } else if (IsAtomTerm(t) || IsPairTerm(t)) { | ||||
|   if (IsVarTerm(t) || !IsApplTerm(t)) { | ||||
|     if (modp) | ||||
|       *modp = tmod; | ||||
|     return t; | ||||
|   } else if (IsApplTerm(t)) { | ||||
|   } else { | ||||
|     Functor    fun = FunctorOfTerm(t); | ||||
|     if (fun == FunctorModule) { | ||||
|       tmod = ArgOfTerm(1, t); | ||||
|       if (IsVarTerm(tmod) ) { | ||||
| 	return 0L; | ||||
|       Term t1 = ArgOfTerm(1, t);  | ||||
|       if (IsVarTerm( t1 ) ) { | ||||
| 	*modp = tmod; | ||||
| 	return t; | ||||
|       } | ||||
|       if (!IsAtomTerm(tmod) ) { | ||||
|       tmod = t1; | ||||
|       if (!IsVarTerm(tmod) && !IsAtomTerm(tmod) ) { | ||||
| 	return 0L; | ||||
|       } | ||||
|       t = ArgOfTerm(2, t); | ||||
|   | ||||
							
								
								
									
										30
									
								
								C/other.c
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								C/other.c
									
									
									
									
									
								
							| @@ -52,11 +52,11 @@ Term | ||||
| Yap_MkNewPairTerm(void) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   register CELL  *p = H; | ||||
|   register CELL  *p = HR; | ||||
|  | ||||
|   RESET_VARIABLE(H); | ||||
|   RESET_VARIABLE(H+1); | ||||
|   H+=2; | ||||
|   RESET_VARIABLE(HR); | ||||
|   RESET_VARIABLE(HR+1); | ||||
|   HR+=2; | ||||
|   return (AbsPair(p)); | ||||
| } | ||||
|  | ||||
| @@ -66,15 +66,15 @@ Yap_MkApplTerm(Functor f, unsigned int n, register Term *a) | ||||
|       * args a */ | ||||
| { | ||||
|   CACHE_REGS | ||||
|   CELL           *t = H; | ||||
|   CELL           *t = HR; | ||||
|  | ||||
|   if (n == 0) | ||||
|     return (MkAtomTerm(NameOfFunctor(f))); | ||||
|   if (f == FunctorList) | ||||
|     return MkPairTerm(a[0], a[1]); | ||||
|   *H++ = (CELL) f; | ||||
|   *HR++ = (CELL) f; | ||||
|   while (n--) | ||||
|     *H++ = (CELL) * a++; | ||||
|     *HR++ = (CELL) * a++; | ||||
|   return (AbsAppl(t)); | ||||
| } | ||||
|  | ||||
| @@ -84,20 +84,20 @@ Yap_MkNewApplTerm(Functor f, unsigned int n) | ||||
|       * args a */ | ||||
| { | ||||
|   CACHE_REGS | ||||
|   CELL           *t = H; | ||||
|   CELL           *t = HR; | ||||
|  | ||||
|   if (n == 0) | ||||
|     return (MkAtomTerm(NameOfFunctor(f))); | ||||
|   if (f == FunctorList) { | ||||
|     RESET_VARIABLE(H); | ||||
|     RESET_VARIABLE(H+1); | ||||
|     H+=2; | ||||
|     RESET_VARIABLE(HR); | ||||
|     RESET_VARIABLE(HR+1); | ||||
|     HR+=2; | ||||
|     return (AbsPair(t)); | ||||
|   } | ||||
|   *H++ = (CELL) f; | ||||
|   *HR++ = (CELL) f; | ||||
|   while (n--) { | ||||
|     RESET_VARIABLE(H); | ||||
|     H++; | ||||
|     RESET_VARIABLE(HR); | ||||
|     HR++; | ||||
|   } | ||||
|   return (AbsAppl(t)); | ||||
| } | ||||
| @@ -113,7 +113,7 @@ Yap_Globalise(Term t) | ||||
|   if (!IsVarTerm(t)) | ||||
|     return t; | ||||
|   vt = VarOfTerm(t); | ||||
|   if (vt <= H && vt > H0) | ||||
|   if (vt <= HR && vt > H0) | ||||
|     return t; | ||||
|   tn = MkVarTerm(); | ||||
|   Yap_unify(t, tn); | ||||
|   | ||||
							
								
								
									
										87
									
								
								C/parser.c
									
									
									
									
									
								
							
							
						
						
									
										87
									
								
								C/parser.c
									
									
									
									
									
								
							| @@ -53,6 +53,7 @@ static char SccsId[] = "%W% %G%"; | ||||
| #include "eval.h" | ||||
| /* stuff we want to use in standard YAP code */ | ||||
| #include "pl-shared.h" | ||||
| #include "YapText.h" | ||||
| #include "pl-read.h" | ||||
| #include "pl-text.h" | ||||
| #if HAVE_STRING_H | ||||
| @@ -82,7 +83,7 @@ static Term ParseTerm(read_data *, int, JMPBUFF * CACHE_TYPE); | ||||
| #define TRY(S,P)                               \ | ||||
|   {	Volatile JMPBUFF *saveenv, newenv;     \ | ||||
| 	Volatile TokEntry *saveT=LOCAL_tokptr;   \ | ||||
|         Volatile CELL *saveH=H;                \ | ||||
|         Volatile CELL *saveH=HR;                \ | ||||
|         Volatile int savecurprio=curprio;      \ | ||||
|         saveenv=FailBuff;                      \ | ||||
|         if(!sigsetjmp(newenv.JmpBuff, 0)) {      \ | ||||
| @@ -92,7 +93,7 @@ static Term ParseTerm(read_data *, int, JMPBUFF * CACHE_TYPE); | ||||
| 		P;                             \ | ||||
| 	  }                                    \ | ||||
| 	else { FailBuff=saveenv;               \ | ||||
| 		H=saveH;                       \ | ||||
| 		HR=saveH;                       \ | ||||
| 		curprio = savecurprio;         \ | ||||
|                 LOCAL_tokptr=saveT;              \ | ||||
| 	}                                      \ | ||||
| @@ -101,7 +102,7 @@ static Term ParseTerm(read_data *, int, JMPBUFF * CACHE_TYPE); | ||||
| #define TRY3(S,P,F)                            \ | ||||
|   {	Volatile JMPBUFF *saveenv, newenv;     \ | ||||
| 	Volatile TokEntry *saveT=LOCAL_tokptr;   \ | ||||
|         Volatile CELL *saveH=H;                \ | ||||
|         Volatile CELL *saveH=HR;                \ | ||||
|         saveenv=FailBuff;                      \ | ||||
|         if(!sigsetjmp(newenv.JmpBuff, 0)) {      \ | ||||
|                 FailBuff = &newenv;            \ | ||||
| @@ -111,7 +112,7 @@ static Term ParseTerm(read_data *, int, JMPBUFF * CACHE_TYPE); | ||||
| 	  }                                    \ | ||||
| 	else {                                 \ | ||||
|                 FailBuff=saveenv;              \ | ||||
|                 H=saveH;                       \ | ||||
|                 HR=saveH;                       \ | ||||
|                 LOCAL_tokptr=saveT;              \ | ||||
|                 F }                            \ | ||||
|    } | ||||
| @@ -192,7 +193,7 @@ VarNames(VarEntry *p,Term l USES_REGS) | ||||
|       o = Yap_MkApplTerm(FunctorEq, 2, t); | ||||
|       o = MkPairTerm(o, VarNames(p->VarRight, | ||||
| 				 VarNames(p->VarLeft,l PASS_REGS) PASS_REGS)); | ||||
|       if (H > ASP-4096) { | ||||
|       if (HR > ASP-4096) { | ||||
| 	save_machine_regs(); | ||||
| 	siglongjmp(LOCAL_IOBotch,1); | ||||
|       }   | ||||
| @@ -225,7 +226,7 @@ Singletons(VarEntry *p,Term l USES_REGS) | ||||
|       o = Yap_MkApplTerm(FunctorEq, 2, t); | ||||
|       o = MkPairTerm(o, Singletons(p->VarRight, | ||||
| 				 Singletons(p->VarLeft,l PASS_REGS) PASS_REGS)); | ||||
|       if (H > ASP-4096) { | ||||
|       if (HR > ASP-4096) { | ||||
| 	save_machine_regs(); | ||||
| 	siglongjmp(LOCAL_IOBotch,1); | ||||
|       }   | ||||
| @@ -252,7 +253,7 @@ Variables(VarEntry *p,Term l USES_REGS) | ||||
|   if (p != NULL) { | ||||
|     Term o; | ||||
|     o = MkPairTerm(p->VarAdr, Variables(p->VarRight,Variables(p->VarLeft,l PASS_REGS) PASS_REGS)); | ||||
|     if (H > ASP-4096) { | ||||
|     if (HR > ASP-4096) { | ||||
|       save_machine_regs(); | ||||
|       siglongjmp(LOCAL_IOBotch,1); | ||||
|     }   | ||||
| @@ -392,7 +393,7 @@ checkfor(wchar_t c, JMPBUFF *FailBuff USES_REGS) | ||||
|  | ||||
| static int | ||||
| is_quasi_quotation_syntax(Term goal, ReadData _PL_rd, Atom *pat) | ||||
| { GET_LD | ||||
| { CACHE_REGS | ||||
|   Term m = CurrentModule, t; | ||||
|   Atom at; | ||||
|   UInt arity; | ||||
| @@ -471,7 +472,7 @@ ParseArgs(read_data *rd, Atom a, wchar_t close, JMPBUFF *FailBuff, Term arg1 USE | ||||
| 	FAIL; | ||||
|       } | ||||
|       t = Yap_MkApplTerm(func, nargs, p); | ||||
|       if (H > ASP-4096) { | ||||
|       if (HR > ASP-4096) { | ||||
| 	LOCAL_ErrorMessage = "Stack Overflow"; | ||||
| 	return TermNil; | ||||
|       }   | ||||
| @@ -499,7 +500,7 @@ ParseArgs(read_data *rd, Atom a, wchar_t close, JMPBUFF *FailBuff, Term arg1 USE | ||||
|    * Needed because the arguments for the functor are placed in reverse | ||||
|    * order  | ||||
|    */ | ||||
|   if (H > ASP-(nargs+1)) { | ||||
|   if (HR > ASP-(nargs+1)) { | ||||
|     LOCAL_ErrorMessage = "Stack Overflow"; | ||||
|     FAIL; | ||||
|   }   | ||||
| @@ -519,7 +520,7 @@ ParseArgs(read_data *rd, Atom a, wchar_t close, JMPBUFF *FailBuff, Term arg1 USE | ||||
|   else | ||||
|     t = Yap_MkApplTerm(func, nargs, p); | ||||
| #endif | ||||
|   if (H > ASP-4096) { | ||||
|   if (HR > ASP-4096) { | ||||
|     LOCAL_ErrorMessage = "Stack Overflow"; | ||||
|     return TermNil; | ||||
|   }   | ||||
| @@ -546,10 +547,10 @@ ParseList(read_data *rd, JMPBUFF *FailBuff USES_REGS) | ||||
| { | ||||
|   Term o; | ||||
|   CELL *to_store; | ||||
|   o = AbsPair(H); | ||||
|   o = AbsPair(HR); | ||||
|  loop: | ||||
|   to_store = H; | ||||
|   H+=2; | ||||
|   to_store = HR; | ||||
|   HR+=2; | ||||
|   to_store[0] = ParseTerm(rd, 999, FailBuff PASS_REGS); | ||||
|   if (LOCAL_tokptr->Tok == Ord(Ponctuation_tok)) { | ||||
|     if (((int) LOCAL_tokptr->TokInfo) == ',') { | ||||
| @@ -560,12 +561,12 @@ ParseList(read_data *rd, JMPBUFF *FailBuff USES_REGS) | ||||
| 	to_store[1] = ParseTerm(rd, 999, FailBuff PASS_REGS); | ||||
|       } else { | ||||
| 	/* check for possible overflow against local stack */ | ||||
| 	if (H > ASP-4096) { | ||||
| 	if (HR > ASP-4096) { | ||||
| 	  to_store[1] = TermNil; | ||||
| 	  LOCAL_ErrorMessage = "Stack Overflow"; | ||||
| 	  FAIL; | ||||
| 	} else { | ||||
| 	  to_store[1] = AbsPair(H); | ||||
| 	  to_store[1] = AbsPair(HR); | ||||
| 	  goto loop; | ||||
| 	} | ||||
|       } | ||||
| @@ -663,7 +664,7 @@ ParseTerm(read_data *rd, int prio, JMPBUFF *FailBuff USES_REGS) | ||||
| 	  t = ParseTerm(rd, oprprio, FailBuff PASS_REGS); | ||||
| 	  t = Yap_MkApplTerm(func, 1, &t); | ||||
| 	  /* check for possible overflow against local stack */ | ||||
| 	  if (H > ASP-4096) { | ||||
| 	  if (HR > ASP-4096) { | ||||
| 	    LOCAL_ErrorMessage = "Stack Overflow"; | ||||
| 	    FAIL; | ||||
| 	  }   | ||||
| @@ -688,23 +689,9 @@ ParseTerm(read_data *rd, int prio, JMPBUFF *FailBuff USES_REGS) | ||||
|   case String_tok:	/* build list on the heap */ | ||||
|     { | ||||
|       Volatile char *p = (char *) LOCAL_tokptr->TokInfo; | ||||
|       if (*p == 0) | ||||
| 	t = MkAtomTerm(AtomNil); | ||||
|       else { | ||||
| 	unsigned int flags = Yap_GetModuleEntry(CurrentModule)->flags; | ||||
| 	if (flags &  DBLQ_CHARS) | ||||
| 	  t = Yap_StringToListOfAtoms(p); | ||||
| 	else if (flags & DBLQ_ATOM) { | ||||
| 	  Atom at = Yap_LookupAtom(p); | ||||
| 	  if (at == NIL) { | ||||
| 	    LOCAL_ErrorMessage = "Heap Overflow"; | ||||
| 	    FAIL;	   | ||||
| 	  } | ||||
| 	  t = MkAtomTerm(at); | ||||
| 	} else if (flags & DBLQ_STRING) { | ||||
| 	  t = Yap_MkBlobStringTerm(p, strlen(p)); | ||||
| 	} else | ||||
| 	  t = Yap_StringToList(p); | ||||
|       t = Yap_CharsToTDQ(p, CurrentModule PASS_REGS); | ||||
|       if (!t) { | ||||
| 	FAIL; | ||||
|       } | ||||
|       NextToken; | ||||
|     } | ||||
| @@ -713,26 +700,8 @@ ParseTerm(read_data *rd, int prio, JMPBUFF *FailBuff USES_REGS) | ||||
|   case WString_tok:	/* build list on the heap */ | ||||
|     { | ||||
|       Volatile wchar_t *p = (wchar_t *) LOCAL_tokptr->TokInfo; | ||||
|       if (*p == 0) | ||||
| 	t = MkAtomTerm(AtomNil); | ||||
|       else { | ||||
| 	unsigned int flags = Yap_GetModuleEntry(CurrentModule)->flags; | ||||
| 	if (flags &  DBLQ_CHARS) | ||||
| 	  t = Yap_WideStringToListOfAtoms(p); | ||||
| 	else if (flags & DBLQ_ATOM) { | ||||
| 	  Atom at = Yap_LookupWideAtom(p); | ||||
| 	  if (at == NIL) { | ||||
| 	    LOCAL_ErrorMessage = "Heap Overflow"; | ||||
| 	    FAIL;	   | ||||
| 	  } | ||||
| 	  t = MkAtomTerm(at); | ||||
| 	} else if (flags & DBLQ_STRING) { | ||||
| 	  t = Yap_MkBlobWideStringTerm(p, wcslen(p)); | ||||
| 	} else | ||||
| 	  t = Yap_WideStringToList(p); | ||||
|       } | ||||
|       if (t == 0L) { | ||||
| 	LOCAL_ErrorMessage = "Stack Overflow"; | ||||
|       t = Yap_WCharsToTDQ(p, CurrentModule PASS_REGS); | ||||
|       if (!t) { | ||||
| 	FAIL; | ||||
|       } | ||||
|       NextToken; | ||||
| @@ -780,7 +749,7 @@ ParseTerm(read_data *rd, int prio, JMPBUFF *FailBuff USES_REGS) | ||||
|       t = ParseTerm(rd, 1200, FailBuff PASS_REGS); | ||||
|       t = Yap_MkApplTerm(FunctorBraces, 1, &t); | ||||
|       /* check for possible overflow against local stack */ | ||||
|       if (H > ASP-4096) { | ||||
|       if (HR > ASP-4096) { | ||||
| 	LOCAL_ErrorMessage = "Stack Overflow"; | ||||
| 	FAIL; | ||||
|       }   | ||||
| @@ -891,7 +860,7 @@ ParseTerm(read_data *rd, int prio, JMPBUFF *FailBuff USES_REGS) | ||||
| 	       args[1] = ParseTerm(rd, oprprio, FailBuff PASS_REGS); | ||||
| 	       t = Yap_MkApplTerm(func, 2, args); | ||||
| 	       /* check for possible overflow against local stack */ | ||||
| 	       if (H > ASP-4096) { | ||||
| 	       if (HR > ASP-4096) { | ||||
| 		 LOCAL_ErrorMessage = "Stack Overflow"; | ||||
| 		 FAIL; | ||||
| 	       }   | ||||
| @@ -914,7 +883,7 @@ ParseTerm(read_data *rd, int prio, JMPBUFF *FailBuff USES_REGS) | ||||
| 	} | ||||
| 	t = Yap_MkApplTerm(func, 1, &t); | ||||
| 	/* check for possible overflow against local stack */ | ||||
| 	if (H > ASP-4096) { | ||||
| 	if (HR > ASP-4096) { | ||||
| 	  LOCAL_ErrorMessage = "Stack Overflow"; | ||||
| 	  FAIL; | ||||
| 	}   | ||||
| @@ -933,7 +902,7 @@ ParseTerm(read_data *rd, int prio, JMPBUFF *FailBuff USES_REGS) | ||||
| 	args[1] = ParseTerm(rd, 1000, FailBuff PASS_REGS); | ||||
| 	t = Yap_MkApplTerm(FunctorComma, 2, args); | ||||
| 	/* check for possible overflow against local stack */ | ||||
| 	if (H > ASP-4096) { | ||||
| 	if (HR > ASP-4096) { | ||||
| 	  LOCAL_ErrorMessage = "Stack Overflow"; | ||||
| 	  FAIL; | ||||
| 	}   | ||||
| @@ -948,7 +917,7 @@ ParseTerm(read_data *rd, int prio, JMPBUFF *FailBuff USES_REGS) | ||||
| 	args[1] = ParseTerm(rd, oprprio, FailBuff PASS_REGS); | ||||
| 	t = Yap_MkApplTerm(FunctorVBar, 2, args); | ||||
| 	/* check for possible overflow against local stack */ | ||||
| 	if (H > ASP-4096) { | ||||
| 	if (HR > ASP-4096) { | ||||
| 	  LOCAL_ErrorMessage = "Stack Overflow"; | ||||
| 	  FAIL; | ||||
| 	}   | ||||
|   | ||||
							
								
								
									
										31
									
								
								C/pl-yap.c
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								C/pl-yap.c
									
									
									
									
									
								
							| @@ -7,6 +7,7 @@ | ||||
| #include "Yap.h" | ||||
| #include "Yatom.h" | ||||
| #include "pl-incl.h" | ||||
| #include "YapText.h" | ||||
| #if HAVE_MATH_H | ||||
| #include <math.h> | ||||
| #endif | ||||
| @@ -84,13 +85,17 @@ codeToAtom(int chrcode) | ||||
| word | ||||
| globalString(size_t size, char *s) | ||||
| { | ||||
|   return Yap_MkBlobStringTerm(s, size); | ||||
|   CACHE_REGS | ||||
|  | ||||
|   return Yap_CharsToString(s PASS_REGS); | ||||
| } | ||||
|  | ||||
| word | ||||
| globalWString(size_t size, wchar_t *s) | ||||
| { | ||||
|   return Yap_MkBlobWideStringTerm(s, size); | ||||
|   CACHE_REGS | ||||
|  | ||||
|   return Yap_WCharsToString(s PASS_REGS); | ||||
| } | ||||
|  | ||||
| int | ||||
| @@ -385,14 +390,13 @@ typedef union | ||||
| int | ||||
| get_atom_ptr_text(Atom a, PL_chars_t *text) | ||||
| {  | ||||
|   YAP_Atom ya = (YAP_Atom)a; | ||||
|   if (YAP_IsWideAtom(ya)) { | ||||
|     pl_wchar_t *name = (pl_wchar_t *)YAP_WideAtomName(ya); | ||||
|   if (IsWideAtom(a)) { | ||||
|     pl_wchar_t *name = (pl_wchar_t *)a->WStrOfAE; | ||||
|     text->text.w   = name; | ||||
|     text->length   = wcslen(name); | ||||
|     text->encoding = ENC_WCHAR; | ||||
|   } else | ||||
|     { char *name = (char *)YAP_AtomName(ya); | ||||
|     { char *name = a->StrOfAE; | ||||
|     text->text.t   = name; | ||||
|     text->length   = strlen(name); | ||||
|     text->encoding = ENC_ISO_LATIN_1; | ||||
| @@ -406,7 +410,7 @@ get_atom_ptr_text(Atom a, PL_chars_t *text) | ||||
|  | ||||
| int | ||||
| get_atom_text(atom_t atom, PL_chars_t *text) | ||||
| { Atom a = (Atom)atomValue(atom); | ||||
| { Atom a = YAP_AtomFromSWIAtom(atom); | ||||
|  | ||||
|   return get_atom_ptr_text(a, text); | ||||
| } | ||||
| @@ -414,16 +418,9 @@ get_atom_text(atom_t atom, PL_chars_t *text) | ||||
| int | ||||
| get_string_text(word w, PL_chars_t *text ARG_LD) | ||||
| { | ||||
|   CELL fl = RepAppl(w)[1]; | ||||
|   if (fl == BLOB_STRING) { | ||||
|     text->text.t = Yap_BlobStringOfTerm(w); | ||||
|     text->encoding = ENC_ISO_LATIN_1; | ||||
|     text->length = strlen(text->text.t); | ||||
|   } else { | ||||
|     text->text.w = Yap_BlobWideStringOfTerm(w); | ||||
|     text->encoding = ENC_WCHAR; | ||||
|     text->length = wcslen(text->text.w); | ||||
|   } | ||||
|   text->text.t = (char *)StringOfTerm(w); | ||||
|   text->encoding = ENC_UTF8; | ||||
|   text->length = strlen(text->text.t); | ||||
|   text->storage = PL_CHARS_STACK; | ||||
|   text->canonical = TRUE; | ||||
|   return TRUE; | ||||
|   | ||||
							
								
								
									
										18
									
								
								C/qlyr.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								C/qlyr.c
									
									
									
									
									
								
							| @@ -932,18 +932,32 @@ read_clauses(IOSTREAM *stream, PredEntry *pp, UInt nclauses, UInt flags) { | ||||
| static void | ||||
| read_pred(IOSTREAM *stream, Term mod) { | ||||
|   UInt flags; | ||||
| #if SIZEOF_INT_P==4 | ||||
|   UInt eflags; | ||||
| #endif | ||||
|   UInt nclauses, fl1; | ||||
|   PredEntry *ap; | ||||
|  | ||||
|   ap = LookupPredEntry((PredEntry *)read_uint(stream)); | ||||
|   flags = read_uint(stream); | ||||
| #if SIZEOF_INT_P==4 | ||||
|   eflags = read_uint(stream); | ||||
| #endif | ||||
|   nclauses = read_uint(stream); | ||||
|   if (ap->PredFlags & IndexedPredFlag) { | ||||
|     Yap_RemoveIndexation(ap); | ||||
|   } | ||||
|   fl1 = flags & STATIC_PRED_FLAGS; | ||||
|   ap->PredFlags &= ~STATIC_PRED_FLAGS; | ||||
|  | ||||
| #if SIZEOF_INT_P==4 | ||||
|   fl1 = flags & ((UInt)STATIC_PRED_FLAGS); | ||||
|   ap->PredFlags &= ~((UInt)STATIC_PRED_FLAGS); | ||||
|   ap->PredFlags |= fl1; | ||||
|   ap->ExtraPredFlags = eflags; | ||||
| #else | ||||
|   fl1 = flags & ((UInt)STATIC_PRED_FLAGS|(UInt)EXTRA_PRED_FLAGS); | ||||
|   ap->PredFlags &= ~((UInt)STATIC_PRED_FLAGS|(UInt)EXTRA_PRED_FLAGS); | ||||
|   ap->PredFlags |= fl1; | ||||
| #endif | ||||
|   if (flags & NumberDBPredFlag) { | ||||
|     ap->src.IndxId = read_uint(stream); | ||||
|   } else { | ||||
|   | ||||
							
								
								
									
										19
									
								
								C/qlyw.c
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								C/qlyw.c
									
									
									
									
									
								
							| @@ -194,7 +194,7 @@ GrowPredTable(void) { | ||||
|     } | ||||
|     newp->val = p->val; | ||||
|     newp->arity = p->arity; | ||||
|     newp->u.f = p->u.f; | ||||
|     newp->u_af.f = p->u_af.f; | ||||
|     newp->module = p->module; | ||||
|   } | ||||
|   LOCAL_ExportPredEntryHashChain = newt; | ||||
| @@ -223,23 +223,23 @@ LookupPredEntry(PredEntry *pe) | ||||
|   p->val = pe; | ||||
|   if (pe->ModuleOfPred != IDB_MODULE) { | ||||
|     if (arity) { | ||||
|       p->u.f = pe->FunctorOfPred; | ||||
|       p->u_af.f = pe->FunctorOfPred; | ||||
|       LookupFunctor(pe->FunctorOfPred); | ||||
|     } else { | ||||
|       p->u.a = (Atom)(pe->FunctorOfPred); | ||||
|       p->u_af.a = (Atom)(pe->FunctorOfPred); | ||||
|       LookupAtom((Atom)(pe->FunctorOfPred)); | ||||
|     } | ||||
|   } else { | ||||
|     if (pe->PredFlags & AtomDBPredFlag) { | ||||
|       p->u.a = (Atom)(pe->FunctorOfPred); | ||||
|       p->u_af.a = (Atom)(pe->FunctorOfPred); | ||||
|       p->arity = (CELL)(-2); | ||||
|       LookupAtom((Atom)(pe->FunctorOfPred)); | ||||
|     } else if (!(pe->PredFlags & NumberDBPredFlag)) { | ||||
|       p->u.f = pe->FunctorOfPred; | ||||
|       p->u_af.f = pe->FunctorOfPred; | ||||
|       p->arity = (CELL)(-1); | ||||
|       LookupFunctor(pe->FunctorOfPred); | ||||
|     } else { | ||||
|       p->u.f = pe->FunctorOfPred; | ||||
|       p->u_af.f = pe->FunctorOfPred; | ||||
|     } | ||||
|   } | ||||
|   if (pe->ModuleOfPred) { | ||||
| @@ -604,7 +604,7 @@ SaveHash(IOSTREAM *stream) | ||||
|     CHECK(save_uint(stream, (UInt)(p->val))); | ||||
|     CHECK(save_uint(stream, p->arity)); | ||||
|     CHECK(save_uint(stream, (UInt)p->module)); | ||||
|     CHECK(save_uint(stream, (UInt)p->u.f)); | ||||
|     CHECK(save_uint(stream, (UInt)p->u_af.f)); | ||||
|   } | ||||
|   save_tag(stream, QLY_START_DBREFS); | ||||
|   save_uint(stream, LOCAL_ExportDBRefHashTableNum); | ||||
| @@ -688,6 +688,9 @@ static size_t | ||||
| save_pred(IOSTREAM *stream, PredEntry *ap) { | ||||
|   CHECK(save_uint(stream, (UInt)ap)); | ||||
|   CHECK(save_uint(stream, ap->PredFlags)); | ||||
| #if SIZEOF_INT_P==4 | ||||
|   CHECK(save_uint(stream, ap->ExtraPredFlags)); | ||||
| #endif | ||||
|   CHECK(save_uint(stream, ap->cs.p_code.NOfClauses)); | ||||
|   CHECK(save_uint(stream, ap->src.IndxId)); | ||||
|   CHECK(save_uint(stream, ap->TimeStampOfPred)); | ||||
| @@ -797,7 +800,7 @@ save_header(IOSTREAM *stream) | ||||
| { | ||||
|   char     msg[256]; | ||||
|  | ||||
|   sprintf(msg, "#!/bin/sh\nexec_dir=${YAPBINDIR:-%s}\nexec $exec_dir/yap $0 \"$@\"\n%s", YAP_BINDIR, YAP_SVERSION); | ||||
|   sprintf(msg, "#!/bin/sh\nexec_dir=${YAPBINDIR:-%s}\nexec $exec_dir/yap $0 \"$@\"\n%s", YAP_BINDIR, YAP_FULL_VERSION); | ||||
|   return save_bytes(stream, msg, strlen(msg)+1); | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										27
									
								
								C/save.c
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								C/save.c
									
									
									
									
									
								
							| @@ -344,7 +344,7 @@ put_info(int info, int mode USES_REGS) | ||||
| { | ||||
|   char     msg[256]; | ||||
|  | ||||
|   sprintf(msg, "#!/bin/sh\nexec_dir=${YAPBINDIR:-%s}\nexec $exec_dir/yap $0 \"$@\"\n%cYAP-%s", YAP_BINDIR, 1, YAP_SVERSION); | ||||
|   sprintf(msg, "#!/bin/sh\nexec_dir=${YAPBINDIR:-%s}\nexec $exec_dir/yap $0 \"$@\"\n%cYAP-%s", YAP_BINDIR, 1, YAP_FULL_VERSION); | ||||
|   if (mywrite(splfild, msg, strlen(msg) + 1)) | ||||
|     return -1; | ||||
|   if (putout(Unsigned(info)) < 0) | ||||
| @@ -369,7 +369,7 @@ put_info(int info, int mode USES_REGS) | ||||
|   if (putout(Unsigned(LCL0)-Unsigned(ASP)) < 0) | ||||
|     return -1; | ||||
|   /* Space used for global stack */ | ||||
|   if (putout(Unsigned(H) - Unsigned(LOCAL_GlobalBase)) < 0) | ||||
|   if (putout(Unsigned(HR) - Unsigned(LOCAL_GlobalBase)) < 0) | ||||
|     return -1; | ||||
|   /* Space used for trail */ | ||||
|   if (putout(Unsigned(TR) - Unsigned(LOCAL_TrailBase)) < 0) | ||||
| @@ -396,7 +396,7 @@ save_regs(int mode USES_REGS) | ||||
|       return -1; | ||||
|     if (putcellptr(LCL0) < 0) | ||||
|       return -1; | ||||
|     if (putcellptr(H) < 0) | ||||
|     if (putcellptr(HR) < 0) | ||||
|       return -1; | ||||
|     if (putcellptr(HB) < 0) | ||||
|       return -1; | ||||
| @@ -412,6 +412,8 @@ save_regs(int mode USES_REGS) | ||||
|       return -1; | ||||
|     if (putout(CreepFlag) < 0) | ||||
|       return -1; | ||||
|     if (putout(EventFlag) < 0) | ||||
|       return -1; | ||||
|     if (putcellptr((CELL *)EX) < 0) | ||||
|       return -1; | ||||
| #if defined(YAPOR_SBA) || defined(TABLING) | ||||
| @@ -533,7 +535,7 @@ save_stacks(int mode USES_REGS) | ||||
|     if (mywrite(splfild, (char *) ASP, j) < 0) | ||||
|       return -1; | ||||
|     /* Save the global stack */ | ||||
|     j = Unsigned(H) - Unsigned(LOCAL_GlobalBase); | ||||
|     j = Unsigned(HR) - Unsigned(LOCAL_GlobalBase); | ||||
|     if (mywrite(splfild, (char *) LOCAL_GlobalBase, j) < 0) | ||||
|       return -1; | ||||
|     /* Save the trail */ | ||||
| @@ -675,7 +677,7 @@ check_header(CELL *info, CELL *ATrail, CELL *AStack, CELL *AHeap USES_REGS) | ||||
|     } | ||||
|   } while (pp[0] != 1); | ||||
|   /* now check the version */ | ||||
|   sprintf(msg, "YAP-%s", YAP_SVERSION); | ||||
|   sprintf(msg, "YAP-%s", YAP_FULL_VERSION); | ||||
|   { | ||||
|     int count = 0, n, to_read = Unsigned(strlen(msg) + 1); | ||||
|     while (count < to_read) { | ||||
| @@ -832,7 +834,7 @@ get_regs(int flag USES_REGS) | ||||
|     LCL0 = get_cellptr(); | ||||
|     if (LOCAL_ErrorMessage) | ||||
|       return -1; | ||||
|     H = get_cellptr(); | ||||
|     HR = get_cellptr(); | ||||
|     if (LOCAL_ErrorMessage) | ||||
|       return -1; | ||||
|     HB = get_cellptr(); | ||||
| @@ -854,6 +856,9 @@ get_regs(int flag USES_REGS) | ||||
|     if (LOCAL_ErrorMessage) | ||||
|       return -1; | ||||
|     CreepFlag = get_cell(); | ||||
|     if (LOCAL_ErrorMessage) | ||||
|       return -1; | ||||
|     EventFlag = get_cell(); | ||||
|     if (LOCAL_ErrorMessage) | ||||
|       return -1; | ||||
|     EX = (struct DB_TERM *)get_cellptr(); | ||||
| @@ -924,7 +929,7 @@ get_regs(int flag USES_REGS) | ||||
|     LOCAL_OldASP = ASP; | ||||
|     LOCAL_OldLCL0 = LCL0; | ||||
|     LOCAL_OldGlobalBase = (CELL *)LOCAL_GlobalBase; | ||||
|     LOCAL_OldH = H; | ||||
|     LOCAL_OldH = HR; | ||||
|     LOCAL_OldTR = TR; | ||||
|     LOCAL_GDiff = Unsigned(NewGlobalBase) - Unsigned(LOCAL_GlobalBase); | ||||
|     LOCAL_GDiff0 = 0; | ||||
| @@ -972,7 +977,7 @@ CopyStacks( USES_REGS1 ) | ||||
|   NewASP = (char *) (Unsigned(ASP) + (Unsigned(LCL0) - Unsigned(LOCAL_OldLCL0))); | ||||
|   if (myread(splfild, (char *) NewASP, j) < 0) | ||||
|     return -1; | ||||
|   j = Unsigned(H) - Unsigned(LOCAL_OldGlobalBase); | ||||
|   j = Unsigned(HR) - Unsigned(LOCAL_OldGlobalBase); | ||||
|   if (myread(splfild, (char *) LOCAL_GlobalBase, j) < 0) | ||||
|     return -1; | ||||
|   j = Unsigned(TR) - Unsigned(LOCAL_OldTrailBase); | ||||
| @@ -1055,7 +1060,7 @@ restore_regs(int flag USES_REGS) | ||||
|     CP = PtoOpAdjust(CP); | ||||
|     ENV = PtoLocAdjust(ENV); | ||||
|     ASP = PtoLocAdjust(ASP); | ||||
|     H = PtoGloAdjust(H); | ||||
|     HR = PtoGloAdjust(HR); | ||||
|     B = (choiceptr)PtoLocAdjust(CellPtr(B)); | ||||
|     TR = PtoTRAdjust(TR); | ||||
|     P = PtoOpAdjust(P); | ||||
| @@ -1144,8 +1149,8 @@ rehash(CELL *oldcode, int NOfE, int KindOfEntries USES_REGS) | ||||
|  | ||||
|   if (LOCAL_HDiff == 0) | ||||
|       return; | ||||
|   basep = H; | ||||
|   if (H + (NOfE*2) > ASP) { | ||||
|   basep = HR; | ||||
|   if (HR + (NOfE*2) > ASP) { | ||||
|     basep = (CELL *)TR; | ||||
|     if (basep + (NOfE*2) > (CELL *)LOCAL_TrailTop) { | ||||
|       if (!Yap_growtrail((ADDR)(basep + (NOfE*2))-LOCAL_TrailTop, TRUE)) { | ||||
|   | ||||
							
								
								
									
										25
									
								
								C/scanner.c
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								C/scanner.c
									
									
									
									
									
								
							| @@ -42,7 +42,7 @@ | ||||
| /* stuff we want to use in standard YAP code */ | ||||
| #include "pl-shared.h" | ||||
| #include "pl-read.h" | ||||
| #include "pl-utf8.h" | ||||
| #include "YapText.h" | ||||
| #if _MSC_VER || defined(__MINGW32__)  | ||||
| #if HAVE_FINITE==1 | ||||
| #undef HAVE_FINITE | ||||
| @@ -631,22 +631,18 @@ get_num(int *chp, int *chbuffp, IOSTREAM *inp_stream, char *s, UInt max_size, in | ||||
|       } | ||||
|     } | ||||
|     if (ch == 'e' || ch == 'E') { | ||||
|       char cbuff = ch; | ||||
|  | ||||
|       if (--max_size == 0) { | ||||
| 	return num_send_error_message("Number Too Long"); | ||||
|       } | ||||
|       *sp++ = ch; | ||||
|       ch = getchr(inp_stream); | ||||
|       if (ch == '-') { | ||||
| 	cbuff = '-'; | ||||
| 	if (--max_size == 0) { | ||||
| 	  return num_send_error_message("Number Too Long"); | ||||
| 	} | ||||
| 	*sp++ = '-'; | ||||
| 	ch = getchr(inp_stream); | ||||
|       } else if (ch == '+') { | ||||
| 	cbuff = '+'; | ||||
| 	ch = getchr(inp_stream); | ||||
|       } | ||||
|       if (chtype(ch) != NU) { | ||||
| @@ -719,7 +715,7 @@ Yap_scan_num(IOSTREAM *inp) | ||||
|     return TermNil; | ||||
|   } | ||||
|   cherr = '\0'; | ||||
|   if (ASP-H < 1024) | ||||
|   if (ASP-HR < 1024) | ||||
|     return TermNil; | ||||
|   out = get_num(&ch, &cherr, inp, ptr, 4096, sign); /*  */ | ||||
|   PopScannerMemory(ptr, 4096); | ||||
| @@ -731,7 +727,7 @@ Yap_scan_num(IOSTREAM *inp) | ||||
|  | ||||
|  | ||||
| #define CHECK_SPACE() \ | ||||
| 	  if (ASP-H < 1024) { \ | ||||
| 	  if (ASP-HR < 1024) { \ | ||||
| 	    LOCAL_ErrorMessage = "Stack Overflow";     \ | ||||
| 	    LOCAL_Error_TYPE = OUT_OF_STACK_ERROR;	\ | ||||
| 	    LOCAL_Error_Size = 0L;	               \ | ||||
| @@ -744,8 +740,8 @@ Yap_scan_num(IOSTREAM *inp) | ||||
|  | ||||
| static void | ||||
| open_comment(int ch, IOSTREAM *inp_stream USES_REGS) { | ||||
|   CELL *h0 = H; | ||||
|   H += 5; | ||||
|   CELL *h0 = HR; | ||||
|   HR += 5; | ||||
|   h0[0] = AbsAppl(h0+2); | ||||
|   h0[1] = TermNil; | ||||
|   if (!LOCAL_CommentsTail) { | ||||
| @@ -780,7 +776,7 @@ extend_comment(int ch USES_REGS) { | ||||
| static void | ||||
| close_comment( USES_REGS1 ) { | ||||
|   LOCAL_CommentsBuff[LOCAL_CommentsBuffPos] = '\0'; | ||||
|   *LOCAL_CommentsNextChar = Yap_MkBlobWideStringTerm(LOCAL_CommentsBuff, LOCAL_CommentsBuffPos); | ||||
|   *LOCAL_CommentsNextChar = Yap_WCharsToString(LOCAL_CommentsBuff PASS_REGS); | ||||
|   free(LOCAL_CommentsBuff); | ||||
|   LOCAL_CommentsBuff = NULL; | ||||
|   LOCAL_CommentsBuffLim = 0; | ||||
| @@ -820,7 +816,7 @@ ch_to_wide(char *base, char *charp) | ||||
|   { charp = _PL__utf8_put_char(charp, ch); } } | ||||
|  | ||||
| TokEntry * | ||||
| Yap_tokenizer(IOSTREAM *inp_stream, int store_comments, Term *tposp) | ||||
| Yap_tokenizer(IOSTREAM *inp_stream, int store_comments, Term *tposp,  void *rd0) | ||||
| { | ||||
|   GET_LD | ||||
|   TokEntry *t, *l, *p; | ||||
| @@ -829,6 +825,7 @@ Yap_tokenizer(IOSTREAM *inp_stream, int store_comments, Term *tposp) | ||||
|   int ch; | ||||
|   wchar_t *wcharp; | ||||
|   struct qq_struct_t	       *cur_qq = NULL; | ||||
|   struct read_data_t *rd = rd0; | ||||
|  | ||||
|   LOCAL_ErrorMessage = NULL; | ||||
|   LOCAL_Error_Size = 0; | ||||
| @@ -843,7 +840,7 @@ Yap_tokenizer(IOSTREAM *inp_stream, int store_comments, Term *tposp) | ||||
|     ch = getchr(inp_stream); | ||||
|   } | ||||
|   *tposp = Yap_StreamPosition(inp_stream); | ||||
|   Yap_setCurrentSourceLocation(&inp_stream); | ||||
|   Yap_setCurrentSourceLocation( rd ); | ||||
|   LOCAL_StartLine = inp_stream->posbuf.lineno; | ||||
|   do { | ||||
|     wchar_t och; | ||||
| @@ -907,7 +904,7 @@ Yap_tokenizer(IOSTREAM *inp_stream, int store_comments, Term *tposp) | ||||
| 	  } | ||||
| 	  CHECK_SPACE(); | ||||
| 	  *tposp = Yap_StreamPosition(inp_stream); | ||||
| 	  Yap_setCurrentSourceLocation(&inp_stream); | ||||
| 	  Yap_setCurrentSourceLocation( rd ); | ||||
| 	} | ||||
| 	goto restart; | ||||
|       } else { | ||||
| @@ -1230,7 +1227,7 @@ Yap_tokenizer(IOSTREAM *inp_stream, int store_comments, Term *tposp) | ||||
| 	    } | ||||
| 	    CHECK_SPACE(); | ||||
| 	    *tposp = Yap_StreamPosition(inp_stream); | ||||
| 	    Yap_setCurrentSourceLocation(&inp_stream); | ||||
| 	    Yap_setCurrentSourceLocation( rd ); | ||||
| 	  } | ||||
| 	} | ||||
| 	goto restart; | ||||
|   | ||||
							
								
								
									
										51
									
								
								C/signals.c
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								C/signals.c
									
									
									
									
									
								
							| @@ -41,8 +41,11 @@ inline static void | ||||
| do_signal(yap_signals sig USES_REGS) | ||||
| { | ||||
|   LOCK(LOCAL_SignalLock); | ||||
|   if (!LOCAL_InterruptsDisabled) | ||||
|   if (!LOCAL_InterruptsDisabled) { | ||||
|     CreepFlag = Unsigned(LCL0); | ||||
|     if (sig != YAP_CREEP_SIGNAL) | ||||
|       EventFlag = Unsigned(LCL0); | ||||
|   } | ||||
|   LOCAL_ActiveSignals |= sig; | ||||
|   UNLOCK(LOCAL_SignalLock); | ||||
| } | ||||
| @@ -51,8 +54,8 @@ inline static void | ||||
| undo_signal(yap_signals sig USES_REGS) | ||||
| { | ||||
|   LOCK(LOCAL_SignalLock); | ||||
|   if ((LOCAL_ActiveSignals & ~(YAP_CREEP_SIGNAL|YAP_DELAY_CREEP_SIGNAL)) == sig) { | ||||
|     CreepFlag = CalculateStackGap(); | ||||
|   if ((LOCAL_ActiveSignals & ~(YAP_CREEP_SIGNAL)) == sig) { | ||||
|     CalculateStackGap( PASS_REGS1 ); | ||||
|   } | ||||
|   LOCAL_ActiveSignals &= ~sig; | ||||
|   UNLOCK(LOCAL_SignalLock); | ||||
| @@ -72,19 +75,7 @@ p_creep( USES_REGS1 ) | ||||
| } | ||||
|  | ||||
| static Int  | ||||
| p_stop_creeping( USES_REGS1 ) | ||||
| { | ||||
|   LOCK(LOCAL_SignalLock); | ||||
|   LOCAL_ActiveSignals &= ~(YAP_CREEP_SIGNAL|YAP_DELAY_CREEP_SIGNAL); | ||||
|   if (!LOCAL_ActiveSignals) { | ||||
|     CreepFlag = CalculateStackGap(); | ||||
|   } | ||||
|   UNLOCK(LOCAL_SignalLock); | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| static Int  | ||||
| p_meta_creep( USES_REGS1 ) | ||||
| p_creep_fail( USES_REGS1 ) | ||||
| { | ||||
|   Atom            at; | ||||
|   PredEntry      *pred; | ||||
| @@ -92,8 +83,18 @@ p_meta_creep( USES_REGS1 ) | ||||
|   at = AtomCreep; | ||||
|   pred = RepPredProp(PredPropByFunc(Yap_MkFunctor(at, 1),0)); | ||||
|   CreepCode = pred; | ||||
|   do_signal(YAP_CREEP_SIGNAL PASS_REGS); | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
| static Int  | ||||
| p_stop_creeping( USES_REGS1 ) | ||||
| { | ||||
|   LOCK(LOCAL_SignalLock); | ||||
|   LOCAL_ActiveSignals |= YAP_DELAY_CREEP_SIGNAL; | ||||
|   LOCAL_ActiveSignals &= ~(YAP_CREEP_SIGNAL); | ||||
|   if (!LOCAL_ActiveSignals) { | ||||
|     CalculateStackGap( PASS_REGS1 ); | ||||
|   } | ||||
|   UNLOCK(LOCAL_SignalLock); | ||||
|   return TRUE; | ||||
| } | ||||
| @@ -106,7 +107,7 @@ p_creep_allowed( USES_REGS1 ) | ||||
|     if (LOCAL_ActiveSignals & YAP_CREEP_SIGNAL  && !LOCAL_InterruptsDisabled) { | ||||
|       LOCAL_ActiveSignals &= ~YAP_CREEP_SIGNAL;     | ||||
|       if (!LOCAL_ActiveSignals) | ||||
| 	CreepFlag = CalculateStackGap(); | ||||
| 	CalculateStackGap( PASS_REGS1 ); | ||||
|       UNLOCK(LOCAL_SignalLock); | ||||
|     } else { | ||||
|       UNLOCK(LOCAL_SignalLock); | ||||
| @@ -205,12 +206,6 @@ p_first_signal( USES_REGS1 ) | ||||
|     UNLOCK(LOCAL_SignalLock); | ||||
|     return Yap_unify(ARG1, MkAtomTerm(AtomSigVTAlarm)); | ||||
|   } | ||||
|   if (LOCAL_ActiveSignals & YAP_DELAY_CREEP_SIGNAL) { | ||||
|     LOCAL_ActiveSignals &= ~(YAP_CREEP_SIGNAL|YAP_DELAY_CREEP_SIGNAL); | ||||
|     MUTEX_UNLOCK(&(LOCAL_ThreadHandle.tlock)); | ||||
|     UNLOCK(LOCAL_SignalLock); | ||||
|     return Yap_unify(ARG1, MkAtomTerm(AtomSigDelayCreep)); | ||||
|   } | ||||
|   if (LOCAL_ActiveSignals & YAP_CREEP_SIGNAL) { | ||||
|     LOCAL_ActiveSignals &= ~YAP_CREEP_SIGNAL; | ||||
|     MUTEX_UNLOCK(&(LOCAL_ThreadHandle.tlock)); | ||||
| @@ -286,12 +281,6 @@ p_continue_signals( USES_REGS1 ) | ||||
|   if (LOCAL_ActiveSignals & YAP_CREEP_SIGNAL) { | ||||
|     Yap_signal(YAP_CREEP_SIGNAL); | ||||
|   } | ||||
|   if (LOCAL_ActiveSignals & YAP_DELAY_CREEP_SIGNAL) { | ||||
|     Yap_signal(YAP_DELAY_CREEP_SIGNAL|YAP_CREEP_SIGNAL); | ||||
|   } | ||||
|   if (LOCAL_ActiveSignals & YAP_TRACE_SIGNAL) { | ||||
|     Yap_signal(YAP_TRACE_SIGNAL); | ||||
|   } | ||||
|   if (LOCAL_ActiveSignals & YAP_DEBUG_SIGNAL) { | ||||
|     Yap_signal(YAP_DEBUG_SIGNAL); | ||||
|   } | ||||
| @@ -316,7 +305,7 @@ Yap_InitSignalCPreds(void) | ||||
| { | ||||
|   /* Basic predicates for the debugger */ | ||||
|   Yap_InitCPred("$creep", 0, p_creep, SafePredFlag); | ||||
|   Yap_InitCPred("$meta_creep", 0, p_meta_creep, SafePredFlag); | ||||
|   Yap_InitCPred("$creep_fail", 0, p_creep_fail, SafePredFlag); | ||||
|   Yap_InitCPred("$stop_creeping", 0, p_stop_creeping, SafePredFlag); | ||||
|   Yap_InitCPred ("$first_signal", 1, p_first_signal, SafePredFlag|SyncPredFlag); | ||||
|   Yap_InitCPred ("$continue_signals", 0, p_continue_signals, SafePredFlag|SyncPredFlag); | ||||
|   | ||||
							
								
								
									
										24
									
								
								C/sort.c
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								C/sort.c
									
									
									
									
									
								
							| @@ -58,12 +58,12 @@ build_new_list(CELL *pt, Term t USES_REGS) | ||||
|     } | ||||
|     pt += 2; | ||||
|     if (pt > ASP - 4096) { | ||||
|       if (!Yap_gcl((ASP-H)*sizeof(CELL), 2, ENV, gc_P(P,CP))) { | ||||
|       if (!Yap_gcl((ASP-HR)*sizeof(CELL), 2, ENV, gc_P(P,CP))) { | ||||
| 	Yap_Error(OUT_OF_STACK_ERROR, TermNil, LOCAL_ErrorMessage); | ||||
| 	return(FALSE); | ||||
|       } | ||||
|       t = Deref(ARG1); | ||||
|       pt = H; | ||||
|       pt = HR; | ||||
|       out = 0; | ||||
|       goto restart; | ||||
|     } | ||||
| @@ -346,7 +346,7 @@ static Int | ||||
| p_sort( USES_REGS1 ) | ||||
| { | ||||
|   /* use the heap to build a new list */ | ||||
|   CELL *pt = H; | ||||
|   CELL *pt = HR; | ||||
|   Term out; | ||||
|   /* list size */ | ||||
|   Int size; | ||||
| @@ -355,13 +355,13 @@ p_sort( USES_REGS1 ) | ||||
|     return(FALSE); | ||||
|   if (size < 2) | ||||
|      return(Yap_unify(ARG1, ARG2)); | ||||
|   pt = H;            /* because of possible garbage collection */ | ||||
|   pt = HR;            /* because of possible garbage collection */ | ||||
|   /* make sure no one writes on our temp data structure */ | ||||
|   H += size*2; | ||||
|   HR += size*2; | ||||
|   /* reserve the necessary space */ | ||||
|   size = compact_mergesort(pt, size, M_EVEN); | ||||
|   /* reajust space */ | ||||
|   H = pt+size*2; | ||||
|   HR = pt+size*2; | ||||
|   adjust_vector(pt, size); | ||||
|   out = AbsPair(pt); | ||||
|   return(Yap_unify(out, ARG2)); | ||||
| @@ -371,7 +371,7 @@ static Int | ||||
| p_msort( USES_REGS1 ) | ||||
| { | ||||
|   /* use the heap to build a new list */ | ||||
|   CELL *pt = H; | ||||
|   CELL *pt = HR; | ||||
|   Term out; | ||||
|   /* list size */ | ||||
|   Int size; | ||||
| @@ -380,9 +380,9 @@ p_msort( USES_REGS1 ) | ||||
|     return(FALSE); | ||||
|   if (size < 2) | ||||
|      return(Yap_unify(ARG1, ARG2)); | ||||
|   pt = H;            /* because of possible garbage collection */ | ||||
|   pt = HR;            /* because of possible garbage collection */ | ||||
|   /* reserve the necessary space */ | ||||
|   H += size*2; | ||||
|   HR += size*2; | ||||
|   simple_mergesort(pt, size, M_EVEN); | ||||
|   adjust_vector(pt, size); | ||||
|   out = AbsPair(pt); | ||||
| @@ -393,7 +393,7 @@ static Int | ||||
| p_ksort( USES_REGS1 ) | ||||
| { | ||||
|   /* use the heap to build a new list */ | ||||
|   CELL *pt = H; | ||||
|   CELL *pt = HR; | ||||
|   Term out; | ||||
|   /* list size */ | ||||
|   Int size; | ||||
| @@ -403,8 +403,8 @@ p_ksort( USES_REGS1 ) | ||||
|   if (size < 2) | ||||
|      return(Yap_unify(ARG1, ARG2)); | ||||
|   /* reserve the necessary space */ | ||||
|   pt = H;            /* because of possible garbage collection */ | ||||
|   H += size*2; | ||||
|   pt = HR;            /* because of possible garbage collection */ | ||||
|   HR += size*2; | ||||
|   if (!key_mergesort(pt, size, M_EVEN, FunctorMinus)) | ||||
|     return(FALSE); | ||||
|   adjust_vector(pt, size); | ||||
|   | ||||
							
								
								
									
										89
									
								
								C/stdpreds.c
									
									
									
									
									
								
							
							
						
						
									
										89
									
								
								C/stdpreds.c
									
									
									
									
									
								
							| @@ -634,15 +634,15 @@ p_univ( USES_REGS1 ) | ||||
|     } | ||||
|   build_compound: | ||||
|     /* build the term directly on the heap */ | ||||
|     Ar = H; | ||||
|     H++; | ||||
|     Ar = HR; | ||||
|     HR++; | ||||
|      | ||||
|     while (!IsVarTerm(twork) && IsPairTerm(twork)) { | ||||
|       *H++ = HeadOfTerm(twork); | ||||
|       if (H > ASP - 1024) { | ||||
|       *HR++ = HeadOfTerm(twork); | ||||
|       if (HR > ASP - 1024) { | ||||
| 	/* restore space */ | ||||
| 	H = Ar; | ||||
| 	if (!Yap_gcl((ASP-H)*sizeof(CELL), 2, ENV, gc_P(P,CP))) { | ||||
| 	HR = Ar; | ||||
| 	if (!Yap_gcl((ASP-HR)*sizeof(CELL), 2, ENV, gc_P(P,CP))) { | ||||
| 	  Yap_Error(OUT_OF_STACK_ERROR, TermNil, LOCAL_ErrorMessage); | ||||
| 	  return FALSE; | ||||
| 	} | ||||
| @@ -671,11 +671,11 @@ p_univ( USES_REGS1 ) | ||||
| 			   arity, CellPtr(TR)); | ||||
|     } | ||||
| #else | ||||
|     arity = H-Ar-1; | ||||
|     arity = HR-Ar-1; | ||||
|     if (at == AtomDot && arity == 2) { | ||||
|       Ar[0] = Ar[1]; | ||||
|       Ar[1] = Ar[2]; | ||||
|       H --; | ||||
|       HR --; | ||||
|       twork = AbsPair(Ar); | ||||
|     } else {       | ||||
|       *Ar = (CELL)(Yap_MkFunctor(at, arity)); | ||||
| @@ -692,6 +692,10 @@ p_univ( USES_REGS1 ) | ||||
|     return (FALSE); | ||||
|   if (IsApplTerm(tin)) { | ||||
|     Functor         fun = FunctorOfTerm(tin); | ||||
|     if (IsExtensionFunctor ( fun ) ) { | ||||
|       twork = MkPairTerm(tin, MkAtomTerm(AtomNil)); | ||||
|       return (Yap_unify(twork, ARG2)); | ||||
|     } | ||||
|     arity = ArityOfFunctor(fun); | ||||
|     at = NameOfFunctor(fun); | ||||
| #ifdef SFUNC | ||||
| @@ -716,7 +720,7 @@ p_univ( USES_REGS1 ) | ||||
|     } else | ||||
| #endif | ||||
|       { | ||||
| 	while (H+arity*2 > ASP-1024) { | ||||
| 	while (HR+arity*2 > ASP-1024) { | ||||
| 	  if (!Yap_gcl((arity*2)*sizeof(CELL), 2, ENV, gc_P(P,CP))) { | ||||
| 	    Yap_Error(OUT_OF_STACK_ERROR, TermNil, LOCAL_ErrorMessage); | ||||
| 	    return(FALSE); | ||||
| @@ -1301,7 +1305,7 @@ Yap_show_statistics(void) | ||||
| 	     frag); | ||||
|   fprintf(GLOBAL_stderr, "Stack Space: %ld (%ld for Global, %ld for local).\n",  | ||||
| 	     (unsigned long int)(sizeof(CELL)*(LCL0-H0)), | ||||
| 	     (unsigned long int)(sizeof(CELL)*(H-H0)), | ||||
| 	     (unsigned long int)(sizeof(CELL)*(HR-H0)), | ||||
| 	     (unsigned long int)(sizeof(CELL)*(LCL0-ASP))); | ||||
|   fprintf(GLOBAL_stderr, "Trail Space: %ld (%ld used).\n",  | ||||
| 	     (unsigned long int)(sizeof(tr_fr_ptr)*(Unsigned(LOCAL_TrailTop)-Unsigned(LOCAL_TrailBase))), | ||||
| @@ -1376,7 +1380,7 @@ GlobalMax(void) | ||||
|   CELL *pt; | ||||
|  | ||||
|   if (GlobalTide != StkWidth) { | ||||
|     pt = H; | ||||
|     pt = HR; | ||||
|     while (pt+2 < ASP) { | ||||
|       if (pt[0] == 0 && | ||||
| 	  pt[1] == 0 && | ||||
| @@ -1419,7 +1423,7 @@ LocalMax(void) | ||||
|  | ||||
|   if (LocalTide != StkWidth) { | ||||
|     pt = LCL0; | ||||
|     while (pt-3 > H) { | ||||
|     while (pt-3 > HR) { | ||||
|       if (pt[-1] == 0 && | ||||
| 	  pt[-2] == 0 && | ||||
| 	  pt[-3] == 0) | ||||
| @@ -1427,7 +1431,7 @@ LocalMax(void) | ||||
|       else | ||||
| 	--pt; | ||||
|     } | ||||
|     if (pt-3 > H) | ||||
|     if (pt-3 > HR) | ||||
|       i = Unsigned(LCL0) - Unsigned(pt); | ||||
|     else | ||||
|       /* so that both Local and Global have reached maximum width */ | ||||
| @@ -1477,7 +1481,7 @@ static Int | ||||
| p_statistics_stacks_info( USES_REGS1 ) | ||||
| { | ||||
|   Term tmax = MkIntegerTerm(Unsigned(LCL0) - Unsigned(H0)); | ||||
|   Term tgusage = MkIntegerTerm(Unsigned(H) - Unsigned(H0)); | ||||
|   Term tgusage = MkIntegerTerm(Unsigned(HR) - Unsigned(H0)); | ||||
|   Term tlusage = MkIntegerTerm(Unsigned(LCL0) - Unsigned(ASP)); | ||||
|  | ||||
|   return(Yap_unify(tmax, ARG1) && Yap_unify(tgusage,ARG2) && Yap_unify(tlusage,ARG3)); | ||||
| @@ -1666,16 +1670,18 @@ p_access_yap_flags( USES_REGS1 ) | ||||
|     tout = TermNil; | ||||
|     if (IsMode_LocalTrie(yap_flags[flag])) | ||||
|       tout = MkPairTerm(MkAtomTerm(AtomLocalTrie), tout); | ||||
|     else // if (IsMode_GlobalTrie(yap_flags[flag])) | ||||
|     else if (IsMode_GlobalTrie(yap_flags[flag])) | ||||
|       tout = MkPairTerm(MkAtomTerm(AtomGlobalTrie), tout); | ||||
|     if (IsMode_LoadAnswers(yap_flags[flag])) | ||||
|       tout = MkPairTerm(MkAtomTerm(AtomLoadAnswers), tout); | ||||
|     else // if (IsMode_ExecAnswers(yap_flags[flag])) | ||||
|     else if (IsMode_ExecAnswers(yap_flags[flag])) | ||||
|       tout = MkPairTerm(MkAtomTerm(AtomExecAnswers), tout); | ||||
|     if (IsMode_Local(yap_flags[flag])) | ||||
|       tout = MkPairTerm(MkAtomTerm(AtomLocal), tout); | ||||
|     else // if (IsMode_Batched(yap_flags[flag])) | ||||
|     else if (IsMode_Batched(yap_flags[flag])) | ||||
|       tout = MkPairTerm(MkAtomTerm(AtomBatched), tout); | ||||
|     else if (IsMode_CoInductive(yap_flags[flag])) | ||||
|       tout = MkPairTerm(MkAtomTerm(AtomCoInductive), tout); | ||||
| #else | ||||
|     tout = MkAtomTerm(AtomFalse); | ||||
| #endif /* TABLING */ | ||||
| @@ -1818,6 +1824,13 @@ p_set_yap_flags( USES_REGS1 ) | ||||
| 	tab_ent = TabEnt_next(tab_ent); | ||||
|       } | ||||
|       SetMode_GlobalTrie(yap_flags[TABLING_MODE_FLAG]); | ||||
|     } else if (value == 7) {  /* CoInductive */ | ||||
|       tab_ent_ptr tab_ent = GLOBAL_root_tab_ent; | ||||
|       while(tab_ent) { | ||||
|         SetMode_CoInductive(TabEnt_mode(tab_ent)); | ||||
|         tab_ent = TabEnt_next(tab_ent); | ||||
|       } | ||||
|       SetMode_CoInductive(yap_flags[TABLING_MODE_FLAG]); | ||||
|     }  | ||||
|     break; | ||||
| #endif /* TABLING */ | ||||
| @@ -1840,11 +1853,20 @@ p_set_yap_flags( USES_REGS1 ) | ||||
| static Int | ||||
| p_system_mode( USES_REGS1 ) | ||||
| { | ||||
|   Int i = IntegerOfTerm(Deref(ARG1)); | ||||
|   if (i == 0)  | ||||
|     LOCAL_PrologMode &= ~SystemMode; | ||||
|   else | ||||
|     LOCAL_PrologMode |= SystemMode; | ||||
|   Term t1 = Deref(ARG1); | ||||
|  | ||||
|   if (IsVarTerm(t1)) { | ||||
|     if (LOCAL_PrologMode & SystemMode) | ||||
|       return Yap_unify( t1, MkAtomTerm(AtomTrue)); | ||||
|     else | ||||
|       return Yap_unify( t1, MkAtomTerm(AtomFalse)); | ||||
|   } else { | ||||
|     Atom at = AtomOfTerm(t1); | ||||
|     if (at == AtomFalse)  | ||||
|       LOCAL_PrologMode &= ~SystemMode; | ||||
|     else | ||||
|       LOCAL_PrologMode |= SystemMode; | ||||
|   } | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| @@ -1948,15 +1970,6 @@ Yap_InitBackCPreds(void) | ||||
|   Yap_InitBackIO(); | ||||
|   Yap_InitBackDB(); | ||||
|   Yap_InitUserBacks(); | ||||
| #if defined MYDDAS_MYSQL && defined CUT_C | ||||
|   Yap_InitBackMYDDAS_MySQLPreds(); | ||||
| #endif | ||||
| #if defined MYDDAS_ODBC && defined CUT_C | ||||
|   Yap_InitBackMYDDAS_ODBCPreds(); | ||||
| #endif | ||||
| #if defined CUT_C && (defined MYDDAS_ODBC || defined MYDDAS_MYSQL) | ||||
|   Yap_InitBackMYDDAS_SharedPreds(); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| typedef void (*Proc)(void); | ||||
| @@ -2002,7 +2015,7 @@ Yap_InitCPreds(void) | ||||
|   Yap_InitCPred("$walltime", 2, p_walltime, SafePredFlag|SyncPredFlag); | ||||
|   Yap_InitCPred("$access_yap_flags", 2, p_access_yap_flags, SafePredFlag); | ||||
|   Yap_InitCPred("$set_yap_flags", 2, p_set_yap_flags, SafePredFlag|SyncPredFlag); | ||||
|   Yap_InitCPred("$p_system_mode", 1, p_system_mode, SafePredFlag|SyncPredFlag); | ||||
|   Yap_InitCPred("$system_mode", 1, p_system_mode, SafePredFlag|SyncPredFlag); | ||||
|   Yap_InitCPred("abort", 0, p_abort, SyncPredFlag); | ||||
|   Yap_InitCPred("$break", 1, p_break, SafePredFlag); | ||||
| #ifdef BEAM | ||||
| @@ -2065,18 +2078,6 @@ Yap_InitCPreds(void) | ||||
|   Yap_InitUnify(); | ||||
|   Yap_InitQLY(); | ||||
|   Yap_InitQLYR(); | ||||
| #if defined CUT_C && defined MYDDAS_MYSQL  | ||||
|   Yap_InitMYDDAS_MySQLPreds(); | ||||
| #endif | ||||
| #if defined CUT_C && defined MYDDAS_ODBC  | ||||
|   Yap_InitMYDDAS_ODBCPreds(); | ||||
| #endif | ||||
| #if defined CUT_C && (defined MYDDAS_ODBC || defined MYDDAS_MYSQL) | ||||
|   Yap_InitMYDDAS_SharedPreds(); | ||||
| #endif | ||||
| #if defined MYDDAS_TOP_LEVEL && defined MYDDAS_MYSQL // && defined HAVE_LIBREADLINE | ||||
|   Yap_InitMYDDAS_TopLevelPreds(); | ||||
| #endif | ||||
|   Yap_udi_init(); | ||||
|   Yap_udi_Interval_init(); | ||||
|   Yap_InitSignalCPreds(); | ||||
|   | ||||
							
								
								
									
										20
									
								
								C/sysbits.c
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								C/sysbits.c
									
									
									
									
									
								
							| @@ -186,12 +186,14 @@ Yap_InitSysPath(void) { | ||||
|   int commons_done = FALSE; | ||||
|   { | ||||
|     char *dir; | ||||
|     if ((dir = Yap_RegistryGetString("library"))) { | ||||
|     if ((dir = Yap_RegistryGetString("library")) && | ||||
| 	is_directory(dir)) { | ||||
|       Yap_PutValue(AtomSystemLibraryDir, | ||||
| 		   MkAtomTerm(Yap_LookupAtom(dir))); | ||||
|       dir_done = TRUE; | ||||
|     } | ||||
|     if ((dir = Yap_RegistryGetString("prolog_commons"))) { | ||||
|     if ((dir = Yap_RegistryGetString("prolog_commons")) && | ||||
| 	is_directory(dir)) { | ||||
|       Yap_PutValue(AtomPrologCommonsDir, | ||||
| 		   MkAtomTerm(Yap_LookupAtom(dir))); | ||||
|       commons_done = TRUE; | ||||
| @@ -203,12 +205,10 @@ Yap_InitSysPath(void) { | ||||
|   strncpy(LOCAL_FileNameBuf, YAP_SHAREDIR, YAP_FILENAME_MAX); | ||||
| #if _MSC_VER || defined(__MINGW32__) | ||||
|   { | ||||
|     DWORD fatts; | ||||
|     int buflen; | ||||
|     char *pt; | ||||
|  | ||||
|     if ((fatts = GetFileAttributes(LOCAL_FileNameBuf)) == 0xFFFFFFFFL || | ||||
| 	!(fatts & FILE_ATTRIBUTE_DIRECTORY)) { | ||||
|     if (!is_directory(LOCAL_FileNameBuf)) { | ||||
|       /* couldn't find it where it was supposed to be, | ||||
| 	 let's try using the executable */ | ||||
|       if (!GetModuleFileNameEx( GetCurrentProcess(), NULL, LOCAL_FileNameBuf, YAP_FILENAME_MAX)) { | ||||
| @@ -2549,7 +2549,7 @@ p_alarm( USES_REGS1 ) | ||||
|     if (LOCAL_ActiveSignals & YAP_ALARM_SIGNAL) { | ||||
|       LOCAL_ActiveSignals &= ~YAP_ALARM_SIGNAL; | ||||
|       if (!LOCAL_ActiveSignals) { | ||||
| 	CreepFlag = CalculateStackGap(); | ||||
| 	CalculateStackGap( PASS_REGS1 ); | ||||
|       } | ||||
|     } | ||||
|     UNLOCK(LOCAL_SignalLock); | ||||
| @@ -2732,7 +2732,9 @@ set_fpu_exceptions(int flag) | ||||
| #if HAVE_FETESTEXCEPT | ||||
|     feclearexcept(FE_ALL_EXCEPT); | ||||
| #endif | ||||
| #ifndef _WIN32 | ||||
|     my_signal (SIGFPE, HandleMatherr); | ||||
| #endif | ||||
|   } else { | ||||
|     /* do IEEE arithmetic in the way the big boys do */ | ||||
| #if defined(__hpux) | ||||
| @@ -2747,7 +2749,9 @@ set_fpu_exceptions(int flag) | ||||
|     int v = _FPU_IEEE; | ||||
|    _FPU_SETCW(v); | ||||
| #endif     | ||||
| #ifndef _WIN32 | ||||
|     my_signal (SIGFPE, SIG_IGN); | ||||
| #endif | ||||
|   } | ||||
| } | ||||
|  | ||||
| @@ -2861,6 +2865,8 @@ p_enable_interrupts( USES_REGS1 ) | ||||
|   LOCAL_InterruptsDisabled--; | ||||
|   if (LOCAL_ActiveSignals && !LOCAL_InterruptsDisabled) { | ||||
|     CreepFlag = Unsigned(LCL0); | ||||
|     if ( LOCAL_ActiveSignals != YAP_CREEP_SIGNAL ) | ||||
|       EventFlag = Unsigned( LCL0 ); | ||||
|   } | ||||
|   UNLOCK(LOCAL_SignalLock); | ||||
|   return TRUE; | ||||
| @@ -2872,7 +2878,7 @@ p_disable_interrupts( USES_REGS1 ) | ||||
|   LOCK(LOCAL_SignalLock); | ||||
|   LOCAL_InterruptsDisabled++; | ||||
|   if (LOCAL_ActiveSignals) { | ||||
|     CreepFlag = CalculateStackGap(); | ||||
|     CalculateStackGap( PASS_REGS1 ); | ||||
|   } | ||||
|   UNLOCK(LOCAL_SignalLock); | ||||
|   return TRUE; | ||||
|   | ||||
							
								
								
									
										71
									
								
								C/threads.c
									
									
									
									
									
								
							
							
						
						
									
										71
									
								
								C/threads.c
									
									
									
									
									
								
							| @@ -127,7 +127,7 @@ store_specs(int new_worker_id, UInt ssize, UInt tsize, UInt sysize, Term *tpgoal | ||||
|     REMOTE_c_output_stream(new_worker_id) = REMOTE_c_output_stream(0); | ||||
|     REMOTE_c_error_stream(new_worker_id) = REMOTE_c_error_stream(0); | ||||
|   } | ||||
|   pm = (ssize + tsize)*1024; | ||||
|   pm = (ssize + tsize)*K1; | ||||
|   if (!(REMOTE_ThreadHandle(new_worker_id).stack_address = malloc(pm))) { | ||||
|     return FALSE; | ||||
|   } | ||||
| @@ -200,39 +200,6 @@ kill_thread_engine (int wid, int always_die) | ||||
|   free(REMOTE_ThreadHandle(wid).default_yaam_regs); | ||||
|   REMOTE_ThreadHandle(wid).default_yaam_regs = NULL; | ||||
|   LOCK(GLOBAL_ThreadHandlesLock); | ||||
| #ifdef TABLING | ||||
|   CACHE_REGS | ||||
|   tab_ent_ptr tab_ent; | ||||
|  | ||||
|   tab_ent = GLOBAL_root_tab_ent; | ||||
|   while (tab_ent) { | ||||
|     abolish_table(tab_ent); | ||||
|     tab_ent = TabEnt_next(tab_ent); | ||||
|   } | ||||
|   FREE_DEPENDENCY_FRAME(LOCAL_top_dep_fr); | ||||
|   LOCAL_top_dep_fr = NULL; | ||||
| #ifdef USE_PAGES_MALLOC | ||||
|   DETACH_PAGES(_pages_void); | ||||
| #endif /* USE_PAGES_MALLOC */ | ||||
|   DETACH_PAGES(_pages_tab_ent); | ||||
| #if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING) | ||||
|   DETACH_PAGES(_pages_sg_ent); | ||||
| #endif /* THREADS_FULL_SHARING || THREADS_CONSUMER_SHARING */ | ||||
|   DETACH_PAGES(_pages_sg_fr); | ||||
|   DETACH_PAGES(_pages_dep_fr); | ||||
|   DETACH_PAGES(_pages_sg_node); | ||||
|   DETACH_PAGES(_pages_sg_hash); | ||||
|   DETACH_PAGES(_pages_ans_node); | ||||
|   DETACH_PAGES(_pages_ans_hash); | ||||
| #if defined(THREADS_FULL_SHARING) | ||||
|   DETACH_PAGES(_pages_ans_ref_node); | ||||
| #endif /* THREADS_FULL_SHARING */ | ||||
|   DETACH_PAGES(_pages_gt_node); | ||||
|   DETACH_PAGES(_pages_gt_hash); | ||||
| #ifdef OUTPUT_THREADS_TABLING  | ||||
|   fclose(LOCAL_thread_output); | ||||
| #endif /* OUTPUT_THREADS_TABLING */ | ||||
| #endif /* TABLING */ | ||||
|   GLOBAL_NOfThreads--; | ||||
|   if (!always_die) { | ||||
|     /* called by thread itself */ | ||||
| @@ -337,6 +304,41 @@ thread_run(void *widp) | ||||
|   tgs[1] = LOCAL_ThreadHandle.tdetach; | ||||
|   tgoal = Yap_MkApplTerm(FunctorThreadRun, 2, tgs); | ||||
|   Yap_RunTopGoal(tgoal); | ||||
| #ifdef TABLING | ||||
|   { | ||||
|     tab_ent_ptr tab_ent; | ||||
|  | ||||
|     tab_ent = GLOBAL_root_tab_ent; | ||||
|     while (tab_ent) { | ||||
|       abolish_table(tab_ent); | ||||
|       tab_ent = TabEnt_next(tab_ent); | ||||
|     } | ||||
|     FREE_DEPENDENCY_FRAME(REMOTE_top_dep_fr(worker_id)); | ||||
|     REMOTE_top_dep_fr(worker_id) = NULL; | ||||
| #ifdef USE_PAGES_MALLOC | ||||
|     DETACH_PAGES(_pages_void); | ||||
| #endif /* USE_PAGES_MALLOC */ | ||||
|     DETACH_PAGES(_pages_tab_ent); | ||||
| #if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING) | ||||
|     DETACH_PAGES(_pages_sg_ent); | ||||
| #endif /* THREADS_FULL_SHARING || THREADS_CONSUMER_SHARING */ | ||||
|     DETACH_PAGES(_pages_sg_fr); | ||||
|     DETACH_PAGES(_pages_dep_fr); | ||||
|     DETACH_PAGES(_pages_sg_node); | ||||
|     DETACH_PAGES(_pages_sg_hash); | ||||
|     DETACH_PAGES(_pages_ans_node); | ||||
|     DETACH_PAGES(_pages_ans_hash); | ||||
| #if defined(THREADS_FULL_SHARING) | ||||
|     DETACH_PAGES(_pages_ans_ref_node); | ||||
| #endif /* THREADS_FULL_SHARING */ | ||||
|     DETACH_PAGES(_pages_gt_node); | ||||
|     DETACH_PAGES(_pages_gt_hash); | ||||
| #ifdef OUTPUT_THREADS_TABLING  | ||||
|     fclose(LOCAL_thread_output); | ||||
| #endif /* OUTPUT_THREADS_TABLING */ | ||||
|  | ||||
|   } | ||||
| #endif /* TABLING */ | ||||
|   thread_die(worker_id, FALSE); | ||||
|   return NULL; | ||||
| } | ||||
| @@ -915,6 +917,7 @@ p_thread_signal( USES_REGS1 ) | ||||
|   } | ||||
|   LOCK(REMOTE_SignalLock(wid)); | ||||
|   REMOTE_ThreadHandle(wid).current_yaam_regs->CreepFlag_ =  | ||||
|     REMOTE_ThreadHandle(wid).current_yaam_regs->EventFlag_ =  | ||||
|     Unsigned(REMOTE_ThreadHandle(wid).current_yaam_regs->LCL0_); | ||||
|   REMOTE_ActiveSignals(wid) |= YAP_ITI_SIGNAL; | ||||
|   UNLOCK(REMOTE_SignalLock(wid)); | ||||
|   | ||||
| @@ -140,12 +140,11 @@ low_level_trace(yap_low_level_port port, PredEntry *pred, CELL *args) | ||||
|   char *mname; | ||||
|   Int arity; | ||||
|   /*  extern int gc_calls; */ | ||||
|  | ||||
|   vsc_count++; | ||||
|  | ||||
|   // if (!worker_id) return; | ||||
|   LOCK(Yap_heap_regs->low_level_trace_lock); | ||||
|   sc = Yap_heap_regs; | ||||
|   vsc_count++; | ||||
|   //if (vsc_count == 54) jmp_deb(1); | ||||
|   //  fprintf(stderr,"B=%p ", B); | ||||
| #ifdef THREADS | ||||
| @@ -159,7 +158,6 @@ low_level_trace(yap_low_level_port port, PredEntry *pred, CELL *args) | ||||
|     gc_ENV = (CELL *) gc_ENV[E_E];	/* link to prev | ||||
| 					 * environment */ | ||||
|   } | ||||
|   UNLOCK(Yap_heap_regs->low_level_trace_lock); | ||||
|   return; | ||||
|   { | ||||
|     choiceptr b_p = B; | ||||
|   | ||||
							
								
								
									
										12
									
								
								C/unify.c
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								C/unify.c
									
									
									
									
									
								
							| @@ -376,6 +376,8 @@ oc_unify_nvar_nvar: | ||||
| 	  return(pt0[1] == pt1[1]); | ||||
| 	case (CELL)FunctorDouble: | ||||
| 	  return(FloatOfTerm(AbsAppl(pt0)) == FloatOfTerm(AbsAppl(pt1))); | ||||
| 	case (CELL)FunctorString: | ||||
| 	  return(strcmp( (const char *)(pt0+2),  (const char *)(pt1+2)) == 0); | ||||
| #ifdef USE_GMP | ||||
| 	case (CELL)FunctorBigInt: | ||||
| 	  return(Yap_gmp_tcmp_big_big(AbsAppl(pt0),AbsAppl(pt0)) == 0); | ||||
| @@ -395,7 +397,7 @@ oc_unify_nvar_nvar: | ||||
|   /* d0 is bound and d1 is unbound */ | ||||
|   Bind(pt1, d0); | ||||
|   /* local variables cannot be in a term */ | ||||
|   if (pt1 > H && pt1 < LCL0) | ||||
|   if (pt1 > HR && pt1 < LCL0) | ||||
|     return TRUE; | ||||
|   if (rational_tree(d0)) | ||||
|     return(FALSE); | ||||
| @@ -408,7 +410,7 @@ oc_unify_var_nvar: | ||||
|   /* pt0 is unbound and d1 is bound */ | ||||
|   Bind(pt0, d1); | ||||
|   /* local variables cannot be in a term */ | ||||
|   if (pt0 > H && pt0 < LCL0) | ||||
|   if (pt0 > HR && pt0 < LCL0) | ||||
|     return TRUE; | ||||
|   if (rational_tree(d1)) | ||||
|     return(FALSE); | ||||
| @@ -505,6 +507,8 @@ unify_nvar_nvar: | ||||
| 	  return(pt0 == pt1); | ||||
| 	case (CELL)FunctorLongInt: | ||||
| 	  return(pt0[1] == pt1[1]); | ||||
| 	case (CELL)FunctorString: | ||||
| 	  return(strcmp( (const char *)(pt0+2),  (const char *)(pt1+2)) == 0); | ||||
| 	case (CELL)FunctorDouble: | ||||
| 	  return(FloatOfTerm(AbsAppl(pt0)) == FloatOfTerm(AbsAppl(pt1))); | ||||
| #ifdef USE_GMP | ||||
| @@ -583,7 +587,7 @@ InitReverseLookupOpcode(void) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   bzero(OP_RTABLE, sz); | ||||
|   memset(OP_RTABLE, 0, sz); | ||||
|   opeptr = OP_RTABLE; | ||||
|   /* clear up table */ | ||||
|   { | ||||
| @@ -870,6 +874,8 @@ unifiable_nvar_nvar: | ||||
| 	  return(pt0 == pt1); | ||||
| 	case (CELL)FunctorLongInt: | ||||
| 	  return(pt0[1] == pt1[1]); | ||||
| 	case (CELL)FunctorString: | ||||
| 	  return(strcmp( (const char *)(pt0+2),  (const char *)(pt1+2)) == 0); | ||||
| 	case (CELL)FunctorDouble: | ||||
| 	  return(FloatOfTerm(AbsAppl(pt0)) == FloatOfTerm(AbsAppl(pt1))); | ||||
| #ifdef USE_GMP | ||||
|   | ||||
							
								
								
									
										1099
									
								
								C/utilpreds.c
									
									
									
									
									
								
							
							
						
						
									
										1099
									
								
								C/utilpreds.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										149
									
								
								C/write.c
									
									
									
									
									
								
							
							
						
						
									
										149
									
								
								C/write.c
									
									
									
									
									
								
							| @@ -29,6 +29,7 @@ static char     SccsId[] = "%W% %G%"; | ||||
| #include "attvar.h" | ||||
| #endif | ||||
| #include "pl-shared.h" | ||||
| #include "pl-utf8.h" | ||||
|  | ||||
| #if HAVE_STRING_H | ||||
| #include <string.h> | ||||
| @@ -65,11 +66,11 @@ typedef  struct  rewind_term { | ||||
|   union { | ||||
|     struct union_slots s; | ||||
|     struct union_direct d; | ||||
|   } u; | ||||
|   } u_sd; | ||||
| } rwts; | ||||
|  | ||||
| typedef struct write_globs { | ||||
|   void     *stream; | ||||
|   IOSTREAM*stream; | ||||
|   int      Quote_illegal, Ignore_ops, Handle_vars, Use_portray, Portray_delays; | ||||
|   int      Keep_terms; | ||||
|   int      Write_Loops; | ||||
| @@ -166,6 +167,7 @@ wrputn(Int n, struct write_globs *wglb)	/* writes an integer	 */ | ||||
|  | ||||
| #define wrputs(s, stream) Sfputs(s, stream) | ||||
|  | ||||
|  | ||||
| static void  | ||||
| wrputws(wchar_t *s, wrf stream)		/* writes a string	 */ | ||||
| { | ||||
| @@ -204,7 +206,7 @@ ensure_space(size_t sz) { | ||||
|     } | ||||
|   } | ||||
|   if (!s) { | ||||
|     s = (char *)H; | ||||
|     s = (char *)HR; | ||||
|     if (s+sz >= (char *)ASP) { | ||||
|       Yap_Error(OUT_OF_STACK_ERROR,TermNil,"not enough space to write bignum: it requires %d bytes", sz); | ||||
|       s = NULL; | ||||
| @@ -242,8 +244,14 @@ writebig(Term t, int p, int depth, int rinfixarg, struct write_globs *wglb, stru | ||||
|   CELL *pt = RepAppl(t)+1; | ||||
|   CELL big_tag = pt[0]; | ||||
|  | ||||
|   if (big_tag == ARRAY_INT || big_tag == ARRAY_FLOAT) { | ||||
|     wrputc('{', wglb->stream); | ||||
|     wrputs("...", wglb->stream); | ||||
|     wrputc('}', wglb->stream); | ||||
|     lastw = separator; | ||||
|     return; | ||||
| #ifdef USE_GMP | ||||
|   if (big_tag == BIG_INT)  | ||||
|   } else if (big_tag == BIG_INT)  | ||||
|   { | ||||
|     MP_INT *big = Yap_BigIntOfTerm(t); | ||||
|     write_mpint(big, wglb); | ||||
| @@ -252,39 +260,7 @@ writebig(Term t, int p, int depth, int rinfixarg, struct write_globs *wglb, stru | ||||
|     Term trat = Yap_RatTermToApplTerm(t); | ||||
|     writeTerm(trat, p, depth, rinfixarg, wglb, rwt); | ||||
|     return; | ||||
|   } | ||||
| #endif | ||||
|   if (big_tag == BLOB_STRING) { | ||||
|     if (wglb->Write_strings) | ||||
|       wrputc('`',wglb->stream); | ||||
|     else | ||||
|       wrputc('"',wglb->stream); | ||||
|     wrputs(Yap_BlobStringOfTerm(t),wglb->stream); | ||||
|     if (wglb->Write_strings) | ||||
|       wrputc('`',wglb->stream); | ||||
|     else | ||||
|       wrputc('"',wglb->stream); | ||||
|     return; | ||||
|   } else if (big_tag == BLOB_WIDE_STRING) { | ||||
|     wchar_t *s = Yap_BlobWideStringOfTerm(t); | ||||
|     if (wglb->Write_strings) | ||||
|       wrputc('`',wglb->stream); | ||||
|     else | ||||
|       wrputc('"', wglb->stream); | ||||
|     while (*s) { | ||||
|       wrputc(*s++, wglb->stream); | ||||
|     } | ||||
|     if (wglb->Write_strings) | ||||
|       wrputc('`',wglb->stream); | ||||
|     else | ||||
|       wrputc('"',wglb->stream); | ||||
|     return; | ||||
|   } else if (big_tag == ARRAY_INT || big_tag == ARRAY_FLOAT) { | ||||
|     wrputc('{', wglb->stream); | ||||
|     wrputs("...", wglb->stream); | ||||
|     wrputc('}', wglb->stream); | ||||
|     lastw = separator; | ||||
|     return; | ||||
|   } else if (big_tag >= USER_BLOB_START && big_tag < USER_BLOB_END) { | ||||
|     Opaque_CallOnWrite f; | ||||
|     CELL blob_info; | ||||
| @@ -391,6 +367,21 @@ wrputf(Float f, struct write_globs *wglb)	/* writes a float	 */ | ||||
|   protect_close_number(wglb, ob); | ||||
| } | ||||
|  | ||||
| int | ||||
| Yap_FormatFloat( Float f, const char *s, size_t sz ) | ||||
| { | ||||
|   struct write_globs wglb; | ||||
|   char *ws = (char *)s; | ||||
|   IOSTREAM *smem = Sopenmem(&ws, &sz, "w"); | ||||
|   wglb.stream = smem; | ||||
|   wglb.lw = separator; | ||||
|   wglb.last_atom_minus = FALSE; | ||||
|   wrputf(f, &wglb); | ||||
|   Sclose(smem);  | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
| /* writes a data base reference */ | ||||
| static void  | ||||
| wrputref(CODEADDR ref, int Quote_illegal, struct write_globs *wglb) | ||||
| @@ -429,6 +420,7 @@ wrputblob(AtomEntry * ref, int Quote_illegal, struct write_globs *wglb) | ||||
|     wrputs(s, stream); | ||||
|   } | ||||
|   lastw = alphanum; | ||||
|   return 1; | ||||
| } | ||||
|  | ||||
| static int  | ||||
| @@ -480,7 +472,7 @@ AtomIsSymbols(unsigned char *s)		/* Is this atom just formed by symbols ? */ | ||||
| } | ||||
|  | ||||
| static void | ||||
| write_quoted(int ch, int quote, wrf stream) | ||||
| write_quoted(wchar_t ch, wchar_t quote, wrf stream) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   if (!(Yap_GetModuleEntry(CurrentModule)->flags & M_CHARESCAPE)) { | ||||
| @@ -494,8 +486,17 @@ write_quoted(int ch, int quote, wrf stream) | ||||
|   } else { | ||||
|     switch (ch) { | ||||
|     case '\\': | ||||
|     case '\'': | ||||
|       wrputc('\\', stream);	 | ||||
|       wrputc('\\', stream);	 | ||||
|       break; | ||||
|     case '\'': | ||||
|       if (ch == quote) | ||||
| 	wrputc('\\', stream);	 | ||||
|       wrputc(ch, stream);	 | ||||
|       break; | ||||
|     case '"': | ||||
|       if (ch == quote) | ||||
| 	wrputc('\\', stream);	 | ||||
|       wrputc(ch, stream);	 | ||||
|       break; | ||||
|     case 7: | ||||
| @@ -542,6 +543,28 @@ write_quoted(int ch, int quote, wrf stream) | ||||
|   } | ||||
| } | ||||
|  | ||||
| static void  | ||||
| write_string(const char *s, struct write_globs *wglb)	/* writes an integer	 */ | ||||
| { | ||||
|   IOSTREAM *stream = wglb->stream; | ||||
|   int chr; | ||||
|   char *ptr = (char *)s; | ||||
|    | ||||
|   if (wglb->Write_strings) | ||||
|     wrputc('`', stream); | ||||
|   else | ||||
|     wrputc('"', stream); | ||||
|   do { | ||||
|     ptr = utf8_get_char(ptr, &chr); | ||||
|     if (chr == '\0') break; | ||||
|     write_quoted(chr, '"', stream); | ||||
|   } while (TRUE); | ||||
|   if (wglb->Write_strings) | ||||
|     wrputc('`', stream); | ||||
|   else | ||||
|     wrputc('"', stream); | ||||
| } | ||||
|  | ||||
|  | ||||
| /* writes an atom	 */ | ||||
| static void  | ||||
| @@ -552,7 +575,7 @@ putAtom(Atom atom, int Quote_illegal,  struct write_globs *wglb) | ||||
|   wrf stream = wglb->stream; | ||||
|  | ||||
|   if (IsBlob(atom)) { | ||||
|     wrputblob(RepAtom(atom),wglb->Quote_illegal,wglb); | ||||
|     wrputblob(RepAtom(atom),Quote_illegal,wglb); | ||||
|     return; | ||||
|   } | ||||
|   if (IsWideAtom(atom)) { | ||||
| @@ -598,8 +621,17 @@ putAtom(Atom atom, int Quote_illegal,  struct write_globs *wglb) | ||||
|   } | ||||
| } | ||||
|  | ||||
| void | ||||
| Yap_WriteAtom(IOSTREAM *s, Atom atom) | ||||
| { | ||||
| 	struct write_globs wglb; | ||||
| 	wglb.stream = s; | ||||
| 	wglb.Quote_illegal = FALSE; | ||||
| 	putAtom(atom, 0, &wglb); | ||||
| } | ||||
|  | ||||
| static int  | ||||
| IsStringTerm(Term string)	/* checks whether this is a string */ | ||||
| IsCodesTerm(Term string)	/* checks whether this is a string */ | ||||
| { | ||||
|   if (IsVarTerm(string)) | ||||
|     return FALSE; | ||||
| @@ -628,7 +660,7 @@ putString(Term string, struct write_globs *wglb) | ||||
|   wrf stream = wglb->stream; | ||||
|   wrputc('"', stream); | ||||
|   while (string != TermNil) { | ||||
|     int ch = IntOfTerm(HeadOfTerm(string)); | ||||
|     wchar_t ch = IntOfTerm(HeadOfTerm(string)); | ||||
|     write_quoted(ch, '"', stream); | ||||
|     string = TailOfTerm(string); | ||||
|   } | ||||
| @@ -664,23 +696,23 @@ from_pointer(CELL *ptr0, struct rewind_term *rwt, struct write_globs *wglb) | ||||
|   if (wglb->Keep_terms) { | ||||
|     struct rewind_term *x = rwt->parent; | ||||
|  | ||||
|     rwt->u.s.old = Yap_InitSlot(t PASS_REGS); | ||||
|     rwt->u.s.ptr = Yap_InitSlot((CELL)ptr0 PASS_REGS); | ||||
|     rwt->u_sd.s.old = Yap_InitSlot(t PASS_REGS); | ||||
|     rwt->u_sd.s.ptr = Yap_InitSlot((CELL)ptr0 PASS_REGS); | ||||
|     if (!IsAtomicTerm(t) && !IsVarTerm(t)) { | ||||
|       while (x) { | ||||
| 	if (Yap_GetDerefedFromSlot(x->u.s.old PASS_REGS) == t) | ||||
| 	if (Yap_GetDerefedFromSlot(x->u_sd.s.old PASS_REGS) == t) | ||||
| 	  return TermFoundVar; | ||||
| 	x = x->parent; | ||||
|       } | ||||
|     } | ||||
|   } else { | ||||
|     rwt->u.d.old = t; | ||||
|     rwt->u.d.ptr = ptr0; | ||||
|     rwt->u_sd.d.old = t; | ||||
|     rwt->u_sd.d.ptr = ptr0; | ||||
|     if ( !IsVarTerm(t) && !IsAtomicTerm(t)) { | ||||
|       struct rewind_term *x = rwt->parent; | ||||
|        | ||||
|       while (x) { | ||||
| 	if (x->u.d.old == t) | ||||
| 	if (x->u_sd.d.old == t) | ||||
| 	  return TermFoundVar; | ||||
| 	x = x->parent; | ||||
|       } | ||||
| @@ -696,12 +728,12 @@ restore_from_write(struct rewind_term *rwt, struct write_globs *wglb) | ||||
|   CELL *ptr; | ||||
|  | ||||
|   if (wglb->Keep_terms) { | ||||
|     ptr = (CELL*)Yap_GetPtrFromSlot(rwt->u.s.ptr PASS_REGS); | ||||
|     ptr = (CELL*)Yap_GetPtrFromSlot(rwt->u_sd.s.ptr PASS_REGS); | ||||
|     Yap_RecoverSlots(2 PASS_REGS); | ||||
|   } else { | ||||
|     ptr = rwt->u.d.ptr; | ||||
|     ptr = rwt->u_sd.d.ptr; | ||||
|   } | ||||
|   rwt->u.s.ptr = 0; | ||||
|   rwt->u_sd.s.ptr = 0; | ||||
|   return ptr; | ||||
| } | ||||
|  | ||||
| @@ -722,7 +754,7 @@ write_var(CELL *t,  struct write_globs *wglb, struct rewind_term *rwt) | ||||
|       exts ext = ExtFromCell(t); | ||||
|       struct rewind_term nrwt; | ||||
|       nrwt.parent = rwt; | ||||
|       nrwt.u.s.ptr = 0; | ||||
|       nrwt.u_sd.s.ptr = 0; | ||||
|  | ||||
|       wglb->Portray_delays = FALSE; | ||||
|       if (ext == attvars_ext) { | ||||
| @@ -756,13 +788,13 @@ check_infinite_loop(Term t, struct rewind_term *x, struct write_globs *wglb) | ||||
|   CACHE_REGS | ||||
|   if (wglb->Keep_terms) { | ||||
|     while (x) { | ||||
|       if (Yap_GetFromSlot(x->u.s.old PASS_REGS) == t) | ||||
|       if (Yap_GetFromSlot(x->u_sd.s.old PASS_REGS) == t) | ||||
| 	return TermFoundVar; | ||||
|       x = x->parent; | ||||
|     } | ||||
|   } else { | ||||
|     while (x) { | ||||
|       if (x->u.d.old == t) | ||||
|       if (x->u_sd.d.old == t) | ||||
| 	return TermFoundVar; | ||||
| 	x = x->parent; | ||||
|     } | ||||
| @@ -776,7 +808,7 @@ write_list(Term t, int direction, int depth, struct write_globs *wglb, struct re | ||||
|   Term ti; | ||||
|   struct rewind_term nrwt; | ||||
|   nrwt.parent = rwt; | ||||
|   nrwt.u.s.ptr = 0; | ||||
|   nrwt.u_sd.s.ptr = 0; | ||||
|  | ||||
|   while (1) { | ||||
|     int ndirection; | ||||
| @@ -845,7 +877,7 @@ writeTerm(Term t, int p, int depth, int rinfixarg, struct write_globs *wglb, str | ||||
|   CACHE_REGS | ||||
|   struct rewind_term nrwt; | ||||
|   nrwt.parent = rwt; | ||||
|   nrwt.u.s.ptr = 0; | ||||
|   nrwt.u_sd.s.ptr = 0; | ||||
|  | ||||
|   if (wglb->MaxDepth != 0 && depth > wglb->MaxDepth) { | ||||
|     putAtom(Atom3Dots, wglb->Quote_illegal, wglb); | ||||
| @@ -888,7 +920,7 @@ writeTerm(Term t, int p, int depth, int rinfixarg, struct write_globs *wglb, str | ||||
|       if (Yap_GetValue(AtomPortray) == MkAtomTerm(AtomTrue)) | ||||
| 	return; | ||||
|     } | ||||
|     if (yap_flags[WRITE_QUOTED_STRING_FLAG] && IsStringTerm(t)) { | ||||
|     if (yap_flags[WRITE_QUOTED_STRING_FLAG] && IsCodesTerm(t)) { | ||||
|       putString(t, wglb); | ||||
|     } else { | ||||
|       wrputc('[', wglb->stream); | ||||
| @@ -909,6 +941,9 @@ writeTerm(Term t, int p, int depth, int rinfixarg, struct write_globs *wglb, str | ||||
|       case (CELL)FunctorDouble: | ||||
| 	wrputf(FloatOfTerm(t),wglb); | ||||
| 	return; | ||||
|       case (CELL)FunctorString: | ||||
| 	write_string(StringOfTerm(t),wglb); | ||||
| 	return; | ||||
|       case (CELL)FunctorAttVar:	 | ||||
| 	write_var(RepAppl(t)+1, wglb, &nrwt); | ||||
| 	return; | ||||
| @@ -1099,7 +1134,7 @@ writeTerm(Term t, int p, int depth, int rinfixarg, struct write_globs *wglb, str | ||||
|       if (lastw == alphanum) { | ||||
| 	wrputc(' ', wglb->stream); | ||||
|       } | ||||
|       if (!IsVarTerm(ti) && (IsIntTerm(ti) || IsStringTerm(ti) || IsAtomTerm(ti))) { | ||||
|       if (!IsVarTerm(ti) && (IsIntTerm(ti) || IsCodesTerm(ti) || IsAtomTerm(ti))) { | ||||
| 	if (IsIntTerm(ti)) { | ||||
| 	  Int k = IntOfTerm(ti); | ||||
| 	  if (k == -1)  { | ||||
|   | ||||
							
								
								
									
										57
									
								
								C/yap-args.c
									
									
									
									
									
								
							
							
						
						
									
										57
									
								
								C/yap-args.c
									
									
									
									
									
								
							| @@ -144,7 +144,7 @@ dump_runtime_variables(void) | ||||
|   fprintf(stdout,"YAP_ROOTDIR=\"%s\"\n",YAP_ROOTDIR); | ||||
|   fprintf(stdout,"YAP_LIBS=\"%s\"\n",C_LIBS); | ||||
|   fprintf(stdout,"YAP_SHLIB_SUFFIX=\"%s\"\n",SO_EXT); | ||||
|   fprintf(stdout,"YAP_VERSION=%d\n",YAP_VERSION); | ||||
|   fprintf(stdout,"YAP_VERSION=%d\n",YAP_NUMERIC_VERSION); | ||||
|   exit(0); | ||||
|   return 1; | ||||
| } | ||||
| @@ -165,9 +165,6 @@ YAP_parse_yap_arguments(int argc, char *argv[], YAP_init_args *iap) | ||||
|   int BootMode = YAP_FULL_BOOT_FROM_PROLOG; | ||||
| #else | ||||
|   int BootMode = YAP_BOOT_FROM_SAVED_CODE; | ||||
| #endif | ||||
| #ifdef MYDDAS_MYSQL | ||||
|   char *myddas_temp; | ||||
| #endif | ||||
|   unsigned long int *ssize; | ||||
|  | ||||
| @@ -199,13 +196,6 @@ YAP_parse_yap_arguments(int argc, char *argv[], YAP_init_args *iap) | ||||
|   iap->Argc = argc; | ||||
|   iap->Argv = argv; | ||||
|   iap->def_c = 0; | ||||
| #ifdef MYDDAS_MYSQL | ||||
|   iap->myddas = 0; | ||||
|   iap->myddas_user = NULL; | ||||
|   iap->myddas_pass = NULL; | ||||
|   iap->myddas_db = NULL; | ||||
|   iap->myddas_host = NULL; | ||||
| #endif   | ||||
|   iap->ErrorNo = 0; | ||||
|   iap->ErrorCause = NULL; | ||||
|   iap->QuietMode = FALSE; | ||||
| @@ -259,36 +249,6 @@ YAP_parse_yap_arguments(int argc, char *argv[], YAP_init_args *iap) | ||||
| 	      break; | ||||
| 	    } | ||||
| 	    break; | ||||
| #ifdef MYDDAS_MYSQL  | ||||
| 	  case 'm': | ||||
| 	    if (strncmp(p,"myddas_",7) == 0) | ||||
| 	      { | ||||
| 		iap->myddas = 1; | ||||
| 		if ((*argv)[0] == '\0')  | ||||
| 		  myddas_temp = *argv; | ||||
| 		else { | ||||
| 		  argc--; | ||||
| 		  if (argc == 0) { | ||||
| 		    fprintf(stderr," [ YAP unrecoverable error: missing file name with option 'l' ]\n"); | ||||
| 		    exit(EXIT_FAILURE); | ||||
| 		  } | ||||
| 		  argv++; | ||||
| 		  myddas_temp = *argv; | ||||
| 		} | ||||
| 		 | ||||
| 		if (strstr(p,"user") != NULL) | ||||
| 		  iap->myddas_user = myddas_temp; | ||||
| 		else if (strstr(p,"pass") != NULL) | ||||
| 		  iap->myddas_pass = myddas_temp; | ||||
| 		else if (strstr(p,"db") != NULL) | ||||
| 		  iap->myddas_db = myddas_temp; | ||||
| 		else if (strstr(p,"host") != NULL) | ||||
| 		  iap->myddas_host = myddas_temp; | ||||
| 		else | ||||
| 		  goto myddas_error_print; | ||||
| 		break; | ||||
| 	      } | ||||
| #endif | ||||
|          // execution mode | ||||
|           case 'J': | ||||
| 	    switch (p[1]) { | ||||
| @@ -498,7 +458,7 @@ YAP_parse_yap_arguments(int argc, char *argv[], YAP_init_args *iap) | ||||
| 	      iap->PrologShouldHandleInterrupts = FALSE; | ||||
| 	      break; | ||||
| 	    } | ||||
| 	    goto myddas_error_print; | ||||
| 	    break; | ||||
| 	  case 'p': | ||||
| 	    if ((*argv)[0] == '\0')  | ||||
| 	      iap->YapPrologAddPath = *argv; | ||||
| @@ -540,11 +500,7 @@ YAP_parse_yap_arguments(int argc, char *argv[], YAP_init_args *iap) | ||||
| 	    break; | ||||
| 	  default: | ||||
| 	    { | ||||
| 	    myddas_error_print : | ||||
| 	      fprintf(stderr,"[ YAP unrecoverable error: unknown switch -%c ]\n", *p); | ||||
| #ifdef MYDDAS_MYSQL | ||||
| 	    myddas_error : | ||||
| #endif | ||||
| 	      print_usage(); | ||||
| 	      exit(EXIT_FAILURE); | ||||
| 	    } | ||||
| @@ -553,15 +509,6 @@ YAP_parse_yap_arguments(int argc, char *argv[], YAP_init_args *iap) | ||||
| 	iap->SavedState = p; | ||||
|       } | ||||
|     } | ||||
| #ifdef MYDDAS_MYSQL | ||||
|   /* Check MYDDAS Arguments */ | ||||
|   if (iap->myddas_user != NULL || iap->myddas_pass != NULL | ||||
|       || iap->myddas_db != NULL || iap->myddas_host != NULL) | ||||
|     if (iap->myddas_user == NULL || iap->myddas_db == NULL){ | ||||
|       fprintf(stderr,"[ YAP unrecoverable error: Missing Mandatory Arguments for MYDDAS ]\n"); | ||||
|       goto myddas_error; | ||||
|     } | ||||
| #endif | ||||
|   GD->cmdline.appl_argc = argc; | ||||
|   GD->cmdline.appl_argv = argv; | ||||
|   return BootMode; | ||||
|   | ||||
							
								
								
									
										91
									
								
								H/Regs.h
									
									
									
									
									
								
							
							
						
						
									
										91
									
								
								H/Regs.h
									
									
									
									
									
								
							| @@ -16,15 +16,9 @@ | ||||
|  | ||||
| /*********  abstract machine registers **********************************/ | ||||
| #ifdef YAP_H | ||||
| #ifdef CUT_C | ||||
| #include "cut_c.h" | ||||
| #endif | ||||
|  | ||||
| #if defined MYDDAS_ODBC || defined MYDDAS_MYSQL | ||||
| #include "myddas.h" | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #define MaxTemps	512 | ||||
| #define MaxArithms	32 | ||||
|  | ||||
| @@ -92,6 +86,7 @@ INLINE_ONLY inline EXTERN void save_B(void); | ||||
|  | ||||
| typedef struct regstore_t | ||||
|   { | ||||
|     CELL    EventFlag_;		/* 13                                         */ | ||||
|     CELL    CreepFlag_;		/* 13                                         */ | ||||
|     CELL   *HB_;		/* 4 heap (global) stack top at latest c.p.   */ | ||||
| #if defined(YAPOR_SBA) || defined(TABLING) | ||||
| @@ -106,10 +101,8 @@ typedef struct regstore_t | ||||
| #endif  /* DEPTH_LIMIT */ | ||||
|     yamop *CP_;			/* 28 continuation program counter            */ | ||||
|     CELL  *ENV_;		/* 1 current environment                      */ | ||||
| #ifdef CUT_C | ||||
|     struct cut_c_str *CUT_C_TOP; | ||||
| #endif | ||||
| #if defined CUT_C && (defined MYDDAS_ODBC || defined MYDDAS_MYSQL) | ||||
| #if defined MYDDAS_ODBC || defined MYDDAS_MYSQL | ||||
|     struct myddas_global *MYDDAS_GLOBAL_POINTER; | ||||
| #endif | ||||
|     yamop *P_;			/* 7 prolog machine program counter           */ | ||||
| @@ -230,7 +223,7 @@ extern REGSTORE Yap_REGS; | ||||
|  | ||||
| #define P               Yap_REGS.P_	/* prolog machine program counter */ | ||||
| #define YENV            Yap_REGS.YENV_	/* current environment (may differ from ENV) */ | ||||
| register CELL *H asm ("$9"); | ||||
| register CELL *HR asm ("$9"); | ||||
| register CELL *HB asm ("$10"); | ||||
| register choiceptr B asm ("$11"); | ||||
| register yamop *CP asm ("$12"); | ||||
| @@ -246,7 +239,7 @@ register CELL CreepFlag asm ("$15"); | ||||
| /* Interface with foreign code, make sure the foreign code sees all the | ||||
|    registers the way they used to be */ | ||||
| INLINE_ONLY EXTERN inline void save_machine_regs(void) { | ||||
|   Yap_REGS.H_   = H; | ||||
|   Yap_REGS.H_  = HR; | ||||
|   Yap_REGS.HB_ = HB; | ||||
|   Yap_REGS.B_   = B; | ||||
|   Yap_REGS.CP_ = CP; | ||||
| @@ -257,7 +250,7 @@ INLINE_ONLY EXTERN inline void save_machine_regs(void) { | ||||
| } | ||||
|  | ||||
| INLINE_ONLY EXTERN inline void restore_machine_regs(void) { | ||||
|   H = Yap_REGS.H_; | ||||
|   HR = Yap_REGS.H_; | ||||
|   HB = Yap_REGS.HB_; | ||||
|   B = Yap_REGS.B_; | ||||
|   CP = Yap_REGS.CP_; | ||||
| @@ -286,16 +279,16 @@ INLINE_ONLY EXTERN inline void restore_machine_regs(void) { | ||||
|   TR = BK_TR | ||||
|  | ||||
| INLINE_ONLY EXTERN inline void save_H(void) { | ||||
|   Yap_REGS.H_   = H; | ||||
|   Yap_REGS.H_   = HR; | ||||
| } | ||||
|  | ||||
| INLINE_ONLY EXTERN inline void restore_H(void) { | ||||
|   H = Yap_REGS.H_; | ||||
|   HR = Yap_REGS.H_; | ||||
| } | ||||
|  | ||||
| #define BACKUP_H()  CELL *BK_H = H; restore_H() | ||||
| #define BACKUP_H()  CELL *BK_H = HR; restore_H() | ||||
|  | ||||
| #define RECOVER_H()  save_H(); H = BK_H | ||||
| #define RECOVER_H()  save_H(); HR = BK_H | ||||
|  | ||||
| INLINE_ONLY EXTERN inline void save_B(void) { | ||||
|   Yap_REGS.B_   = B; | ||||
| @@ -324,7 +317,7 @@ INLINE_ONLY EXTERN inline void restore_TR(void) { | ||||
|  | ||||
| #define P               Yap_REGS.P_	/* prolog machine program counter */ | ||||
| #define YENV            Yap_REGS.YENV_	/* current environment (may differ from ENV) */ | ||||
| register CELL *H asm ("$16"); | ||||
| register CELL *HR asm ("$16"); | ||||
| register CELL *HB asm ("$17"); | ||||
| register choiceptr B asm ("$18"); | ||||
| register yamop *CP asm ("$19"); | ||||
| @@ -333,7 +326,7 @@ register CELL CreepFlag asm ("$21"); | ||||
| register tr_fr_ptr TR asm ("$22"); | ||||
|  | ||||
| INLINE_ONLY EXTERN inline void save_machine_regs(void) { | ||||
|   Yap_REGS.H_   = H; | ||||
|   Yap_REGS.H_   = HR; | ||||
|   Yap_REGS.HB_ = HB; | ||||
|   Yap_REGS.B_   = B; | ||||
|   Yap_REGS.CP_  = CP; | ||||
| @@ -342,7 +335,7 @@ INLINE_ONLY EXTERN inline void save_machine_regs(void) { | ||||
| } | ||||
|  | ||||
| INLINE_ONLY EXTERN inline void restore_machine_regs(void) { | ||||
|   H = Yap_REGS.H_; | ||||
|   HR = Yap_REGS.H_; | ||||
|   HB = Yap_REGS.HB_; | ||||
|   B = Yap_REGS.B_; | ||||
|   CP = Yap_REGS.CP_; | ||||
| @@ -351,7 +344,7 @@ INLINE_ONLY EXTERN inline void restore_machine_regs(void) { | ||||
| } | ||||
|  | ||||
| #define BACKUP_MACHINE_REGS()           \ | ||||
|   CELL     *BK_H = H;                   \ | ||||
|   CELL     *BK_H = HR;                   \ | ||||
|   CELL     *BK_HB = HB;                 \ | ||||
|   choiceptr BK_B = B;                   \ | ||||
|   CELL      BK_CreepFlag = CreepFlag;   \ | ||||
| @@ -361,7 +354,7 @@ INLINE_ONLY EXTERN inline void restore_machine_regs(void) { | ||||
|  | ||||
| #define RECOVER_MACHINE_REGS()          \ | ||||
|   save_machine_regs();                  \ | ||||
|   H = BK_H;                             \ | ||||
|   HR = BK_H;                             \ | ||||
|   HB = BK_HB;                           \ | ||||
|   B = BK_B;                             \ | ||||
|   CreepFlag = BK_CreepFlag;             \ | ||||
| @@ -369,16 +362,16 @@ INLINE_ONLY EXTERN inline void restore_machine_regs(void) { | ||||
|   TR = BK_TR | ||||
|  | ||||
| INLINE_ONLY EXTERN inline void save_H(void) { | ||||
|   Yap_REGS.H_   = H; | ||||
|   Yap_REGS.H_   = HR; | ||||
| } | ||||
|  | ||||
| INLINE_ONLY EXTERN inline void restore_H(void) { | ||||
|   H = Yap_REGS.H_; | ||||
|   HR = Yap_REGS.H_; | ||||
| } | ||||
|  | ||||
| #define BACKUP_H()  CELL *BK_H = H; restore_H() | ||||
| #define BACKUP_H()  CELL *BK_H = HR; restore_H() | ||||
|  | ||||
| #define RECOVER_H()  save_H(); H = BK_H | ||||
| #define RECOVER_H()  save_H(); HR = BK_H | ||||
|  | ||||
| INLINE_ONLY EXTERN inline void save_B(void) { | ||||
|   Yap_REGS.B_ = B; | ||||
| @@ -398,7 +391,7 @@ INLINE_ONLY EXTERN inline void restore_B(void) { | ||||
|  | ||||
| #define P               Yap_REGS.P_	/* prolog machine program counter */ | ||||
| #define YENV            Yap_REGS.YENV_	/* current environment (may differ from ENV) */ | ||||
| register CELL *H asm ("r12"); | ||||
| register CELL *HR asm ("r12"); | ||||
| register CELL *HB asm ("r13"); | ||||
| register choiceptr B asm ("r14"); | ||||
| register yamop *CP asm ("r15"); | ||||
| @@ -407,7 +400,7 @@ register CELL CreepFlag asm ("r17"); | ||||
| register tr_fr_ptr TR asm ("r18"); | ||||
|  | ||||
| INLINE_ONLY EXTERN inline void save_machine_regs(void) { | ||||
|   Yap_REGS.H_   = H; | ||||
|   Yap_REGS.H_   = HR; | ||||
|   Yap_REGS.HB_ = HB; | ||||
|   Yap_REGS.B_   = B; | ||||
|   Yap_REGS.CP_  = CP; | ||||
| @@ -416,7 +409,7 @@ INLINE_ONLY EXTERN inline void save_machine_regs(void) { | ||||
| } | ||||
|  | ||||
| INLINE_ONLY EXTERN inline void restore_machine_regs(void) { | ||||
|   H = Yap_REGS.H_; | ||||
|   HR = Yap_REGS.H_; | ||||
|   HB = Yap_REGS.HB_; | ||||
|   B = Yap_REGS.B_; | ||||
|   CP = Yap_REGS.CP_; | ||||
| @@ -425,7 +418,7 @@ INLINE_ONLY EXTERN inline void restore_machine_regs(void) { | ||||
| } | ||||
|  | ||||
| #define BACKUP_MACHINE_REGS()           \ | ||||
|   CELL     *BK_H = H;                   \ | ||||
|   CELL     *BK_H = HR;                   \ | ||||
|   CELL     *BK_HB = HB;                 \ | ||||
|   choiceptr BK_B = B;                   \ | ||||
|   CELL      BK_CreepFlag = CreepFlag;   \ | ||||
| @@ -435,7 +428,7 @@ INLINE_ONLY EXTERN inline void restore_machine_regs(void) { | ||||
|  | ||||
| #define RECOVER_MACHINE_REGS()          \ | ||||
|   save_machine_regs();                  \ | ||||
|   H = BK_H;                             \ | ||||
|   HR = BK_H;                             \ | ||||
|   HB = BK_HB;                           \ | ||||
|   B = BK_B;                             \ | ||||
|   CreepFlag = BK_CreepFlag;             \ | ||||
| @@ -443,16 +436,16 @@ INLINE_ONLY EXTERN inline void restore_machine_regs(void) { | ||||
|   TR = BK_TR | ||||
|  | ||||
| INLINE_ONLY EXTERN inline void save_H(void) { | ||||
|   Yap_REGS.H_   = H; | ||||
|   Yap_REGS.H_   = HR; | ||||
| } | ||||
|  | ||||
| INLINE_ONLY EXTERN inline void restore_H(void) { | ||||
|   H = Yap_REGS.H_; | ||||
|   HR = Yap_REGS.H_; | ||||
| } | ||||
|  | ||||
| #define BACKUP_H()  CELL *BK_H = H; restore_H() | ||||
| #define BACKUP_H()  CELL *BK_H = HR; restore_H() | ||||
|  | ||||
| #define RECOVER_H()  save_H(); H = BK_H | ||||
| #define RECOVER_H()  save_H(); HR = BK_H | ||||
|  | ||||
| INLINE_ONLY EXTERN inline void save_B(void) { | ||||
|   Yap_REGS.B_ = B; | ||||
| @@ -500,7 +493,7 @@ register tr_fr_ptr TR  asm ("r13"); | ||||
| #else | ||||
| register tr_fr_ptr TR asm ("r21"); | ||||
| #endif | ||||
| register CELL *H asm ("r14"); | ||||
| register CELL *HR asm ("r14"); | ||||
| register CELL *HB asm ("r15"); | ||||
| register choiceptr B asm ("r16"); | ||||
| register yamop *CP asm ("r17"); | ||||
| @@ -519,7 +512,7 @@ register CELL *YENV asm ("r19"); | ||||
|  | ||||
|  | ||||
| INLINE_ONLY EXTERN inline void save_machine_regs(void) { | ||||
|   Yap_REGS.H_   = H; | ||||
|   Yap_REGS.H_   = HR; | ||||
|   Yap_REGS.HB_ = HB; | ||||
|   Yap_REGS.B_   = B; | ||||
|   Yap_REGS.CP_ = CP; | ||||
| @@ -528,7 +521,7 @@ INLINE_ONLY EXTERN inline void save_machine_regs(void) { | ||||
| } | ||||
|  | ||||
| INLINE_ONLY EXTERN inline void restore_machine_regs(void) { | ||||
|   H = Yap_REGS.H_; | ||||
|   HR = Yap_REGS.H_; | ||||
|   HB = Yap_REGS.HB_; | ||||
|   B = Yap_REGS.B_; | ||||
|   CP = Yap_REGS.CP_; | ||||
| @@ -537,7 +530,7 @@ INLINE_ONLY EXTERN inline void restore_machine_regs(void) { | ||||
| } | ||||
|  | ||||
| #define BACKUP_MACHINE_REGS()           \ | ||||
|   CELL     *BK_H = H;                   \ | ||||
|   CELL     *BK_H = HR;                   \ | ||||
|   CELL     *BK_HB = HB;                 \ | ||||
|   choiceptr BK_B = B;                   \ | ||||
|   yamop    *BK_CP = CP;                 \ | ||||
| @@ -546,23 +539,23 @@ INLINE_ONLY EXTERN inline void restore_machine_regs(void) { | ||||
|  | ||||
| #define RECOVER_MACHINE_REGS()          \ | ||||
|   save_machine_regs();                  \ | ||||
|   H = BK_H;                             \ | ||||
|   HR = BK_H;                             \ | ||||
|   HB = BK_HB;                           \ | ||||
|   B = BK_B;                             \ | ||||
|   CP = BK_CP;                           \ | ||||
|   TR = BK_TR | ||||
|  | ||||
| INLINE_ONLY EXTERN inline void save_H(void) { | ||||
|   Yap_REGS.H_   = H; | ||||
|   Yap_REGS.H_   = HR; | ||||
| } | ||||
|  | ||||
| INLINE_ONLY EXTERN inline void restore_H(void) { | ||||
|   H = Yap_REGS.H_; | ||||
|   HR = Yap_REGS.H_; | ||||
| } | ||||
|  | ||||
| #define BACKUP_H()  CELL *BK_H = H; restore_H() | ||||
| #define BACKUP_H()  CELL *BK_H = HR; restore_H() | ||||
|  | ||||
| #define RECOVER_H()  save_H(); H = BK_H | ||||
| #define RECOVER_H()  save_H(); HR = BK_H | ||||
|  | ||||
| INLINE_ONLY EXTERN inline void save_B(void) { | ||||
|   Yap_REGS.B_   = B; | ||||
| @@ -593,7 +586,7 @@ INLINE_ONLY EXTERN inline void restore_TR(void) { | ||||
| #define P          Yap_REGS.P_	/* prolog machine program counter */ | ||||
| #define YENV       Yap_REGS.YENV_ /* current environment (may differ from ENV) */ | ||||
| #define S          Yap_REGS.S_	/* structure pointer                      */ | ||||
| #define	H          Yap_REGS.H_	/* top of heap (global)   stack           */ | ||||
| #define	HR          Yap_REGS.H_	/* top of heap (global)   stack           */ | ||||
| #define B          Yap_REGS.B_	/* latest choice point            */ | ||||
| #define TR         Yap_REGS.TR_	/* top of trail                           */ | ||||
| #define HB         Yap_REGS.HB_	/* heap (global) stack top at time of latest c.p. */ | ||||
| @@ -666,6 +659,7 @@ INLINE_ONLY EXTERN inline void restore_B(void) { | ||||
| #define Yap_isint     Yap_REGS.isint_ | ||||
| #define Yap_Floats    Yap_REGS.Floats_ | ||||
| #define Yap_Ints      Yap_REGS.Ints_ | ||||
| #define EventFlag Yap_REGS.EventFlag_ | ||||
|  | ||||
| #define REG_SIZE	sizeof(REGS)/sizeof(CELL *) | ||||
|  | ||||
| @@ -713,9 +707,8 @@ extern REGSTORE Yap_standard_regs; | ||||
|  | ||||
| /******************* controlling debugging ****************************/ | ||||
| static inline UInt | ||||
| CalculateStackGap(void) | ||||
| StackGap( USES_REGS1 ) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   UInt gmin = (LCL0-H0)>>2; | ||||
|  | ||||
|   if (gmin < MinStackGap) gmin = MinStackGap;  | ||||
| @@ -723,3 +716,9 @@ CalculateStackGap(void) | ||||
|   return gmin; | ||||
| } | ||||
|  | ||||
| static inline void | ||||
| CalculateStackGap( USES_REGS1 ) | ||||
| { | ||||
|   CreepFlag = EventFlag = StackGap( PASS_REGS1 ); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -7,6 +7,7 @@ typedef enum TokenKinds { | ||||
|   Ponctuation_tok, | ||||
|   Error_tok, | ||||
|   QuasiQuotes_tok, | ||||
|   WQuasiQuotes_tok, | ||||
|   eot_tok | ||||
| } tkinds; | ||||
|  | ||||
|   | ||||
							
								
								
									
										174
									
								
								H/TermExt.h
									
									
									
									
									
								
							
							
						
						
									
										174
									
								
								H/TermExt.h
									
									
									
									
									
								
							| @@ -45,18 +45,20 @@ typedef enum | ||||
| { | ||||
|   db_ref_e = sizeof (Functor *), | ||||
|   attvar_e = 2*sizeof (Functor *), | ||||
|   long_int_e = 3 * sizeof (Functor *), | ||||
|   big_int_e = 4 * sizeof (Functor *), | ||||
|   double_e = 5 * sizeof (Functor *) | ||||
|   double_e = 3 * sizeof (Functor *), | ||||
|   long_int_e = 4 * sizeof (Functor *), | ||||
|   big_int_e = 5 * sizeof (Functor *), | ||||
|   string_e = 6 * sizeof (Functor *) | ||||
| } | ||||
| blob_type; | ||||
|  | ||||
| #define   FunctorDBRef    ((Functor)(db_ref_e)) | ||||
| #define   FunctorAttVar   ((Functor)(attvar_e)) | ||||
| #define   FunctorDouble   ((Functor)(double_e)) | ||||
| #define   FunctorLongInt  ((Functor)(long_int_e)) | ||||
| #define   FunctorBigInt   ((Functor)(big_int_e)) | ||||
| #define   FunctorDouble   ((Functor)(double_e)) | ||||
| #define   EndSpecials     (double_e+sizeof(Functor *)) | ||||
| #define   FunctorString   ((Functor)(string_e)) | ||||
| #define   EndSpecials     (string_e+sizeof(Functor *)) | ||||
|  | ||||
| #include "inline-only.h" | ||||
|  | ||||
| @@ -69,7 +71,7 @@ __IsAttVar (CELL *pt USES_REGS) | ||||
| { | ||||
| #ifdef YAP_H | ||||
|   return (pt)[-1] == (CELL)attvar_e | ||||
|     && pt < H; | ||||
|     && pt < HR; | ||||
| #else | ||||
|   return (pt)[-1] == (CELL)attvar_e; | ||||
| #endif | ||||
| @@ -92,8 +94,6 @@ typedef enum | ||||
|     ARRAY_INT =    0x21, | ||||
|     ARRAY_FLOAT =  0x22, | ||||
|     CLAUSE_LIST =  0x40, | ||||
|     BLOB_STRING =  0x80, /* SWI style strings */ | ||||
|     BLOB_WIDE_STRING =  0x81, /* SWI style strings */ | ||||
|     EXTERNAL_BLOB =  0x100, /* generic data */ | ||||
|     USER_BLOB_START =  0x1000, /* user defined blob */ | ||||
|     USER_BLOB_END =  0x1100 /* end of user defined blob */ | ||||
| @@ -181,23 +181,23 @@ special_functors; | ||||
|  | ||||
| INLINE_ONLY inline EXTERN Float CpFloatUnaligned(CELL *ptr); | ||||
|  | ||||
| #if SIZEOF_DOUBLE == SIZEOF_LONG_INT | ||||
|  | ||||
| #define MkFloatTerm(fl) __MkFloatTerm((fl) PASS_REGS) | ||||
|  | ||||
| INLINE_ONLY inline EXTERN Term __MkFloatTerm (Float USES_REGS); | ||||
|  | ||||
| INLINE_ONLY inline EXTERN Float FloatOfTerm (Term t); | ||||
|  | ||||
| #if SIZEOF_DOUBLE == SIZEOF_INT_P | ||||
|  | ||||
| INLINE_ONLY inline EXTERN Term | ||||
| __MkFloatTerm (Float dbl USES_REGS) | ||||
| { | ||||
|   return (Term) ((H[0] = (CELL) FunctorDouble, *(Float *) (H + 1) = | ||||
| 		  dbl, H[2] = EndSpecials, H += | ||||
| 		  3, AbsAppl (H - 3))); | ||||
|   return (Term) ((HR[0] = (CELL) FunctorDouble, *(Float *) (HR + 1) = | ||||
| 		  dbl, HR[2] = EndSpecials, HR += | ||||
| 		  3, AbsAppl (HR - 3))); | ||||
| } | ||||
|  | ||||
|  | ||||
| INLINE_ONLY inline EXTERN Float FloatOfTerm (Term t); | ||||
|  | ||||
| INLINE_ONLY inline EXTERN Float | ||||
| FloatOfTerm (Term t) | ||||
| { | ||||
| @@ -216,7 +216,7 @@ CpFloatUnaligned(CELL *ptr) | ||||
|  | ||||
| #else | ||||
|  | ||||
| #if SIZEOF_DOUBLE == 2*SIZEOF_LONG_INT | ||||
| #if SIZEOF_DOUBLE == 2*SIZEOF_INT_P | ||||
|  | ||||
| #define DOUBLE_ALIGNED(ADDR) ((CELL)(ADDR) & 0x4) | ||||
|  | ||||
| @@ -228,9 +228,9 @@ AlignGlobalForDouble( USES_REGS1 ) | ||||
| { | ||||
|   /* Force Alignment for floats. Note that garbage collector may | ||||
|      break the alignment; */ | ||||
|   if (!DOUBLE_ALIGNED(H)) { | ||||
|     RESET_VARIABLE(H); | ||||
|     H++; | ||||
|   if (!DOUBLE_ALIGNED(HR)) { | ||||
|     RESET_VARIABLE(HR); | ||||
|     HR++; | ||||
|   } | ||||
| } | ||||
|  | ||||
| @@ -258,21 +258,16 @@ CpFloatUnaligned (CELL * ptr) | ||||
|  | ||||
| #endif | ||||
|  | ||||
| INLINE_ONLY inline EXTERN Term MkFloatTerm (Float); | ||||
|  | ||||
| INLINE_ONLY inline EXTERN Term | ||||
| MkFloatTerm (Float dbl) | ||||
| __MkFloatTerm (Float dbl USES_REGS) | ||||
| { | ||||
|   CACHE_REGS | ||||
|   return (Term) ((AlignGlobalForDouble ( PASS_REGS1 ), H[0] = | ||||
| 		  (CELL) FunctorDouble, *(Float *) (H + 1) = dbl, H[3] = | ||||
| 		  EndSpecials, H += | ||||
| 		  4, AbsAppl (H - 4))); | ||||
|   return (Term) ((AlignGlobalForDouble ( PASS_REGS1 ), HR[0] = | ||||
| 		  (CELL) FunctorDouble, *(Float *) (HR + 1) = dbl, HR[3] = | ||||
| 		  EndSpecials, HR += | ||||
| 		  4, AbsAppl (HR - 4))); | ||||
| } | ||||
|  | ||||
|  | ||||
| INLINE_ONLY inline EXTERN Float FloatOfTerm (Term t); | ||||
|  | ||||
| INLINE_ONLY inline EXTERN Float | ||||
| FloatOfTerm (Term t) | ||||
| { | ||||
| @@ -295,13 +290,6 @@ OOPS | ||||
| #include <stddef.h> | ||||
| #endif | ||||
|  | ||||
| Term Yap_MkBlobStringTerm(const char *, size_t len); | ||||
| Term Yap_MkBlobWideStringTerm(const wchar_t *, size_t len); | ||||
| char *Yap_BlobStringOfTerm(Term); | ||||
| wchar_t *Yap_BlobWideStringOfTerm(Term); | ||||
| char *Yap_BlobStringOfTermAndLength(Term, size_t *); | ||||
|  | ||||
|  | ||||
|  | ||||
| INLINE_ONLY inline EXTERN int IsFloatTerm (Term); | ||||
|  | ||||
| @@ -312,8 +300,6 @@ IsFloatTerm (Term t) | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /* extern Functor FunctorLongInt; */ | ||||
|  | ||||
| #define MkLongIntTerm(i) __MkLongIntTerm((i) PASS_REGS) | ||||
| @@ -323,11 +309,11 @@ INLINE_ONLY inline EXTERN Term __MkLongIntTerm (Int USES_REGS); | ||||
| INLINE_ONLY inline EXTERN Term | ||||
| __MkLongIntTerm (Int i USES_REGS) | ||||
| { | ||||
|   H[0] = (CELL) FunctorLongInt; | ||||
|   H[1] = (CELL) (i); | ||||
|   H[2] =  EndSpecials; | ||||
|   H += 3; | ||||
|   return AbsAppl(H - 3); | ||||
|   HR[0] = (CELL) FunctorLongInt; | ||||
|   HR[1] = (CELL) (i); | ||||
|   HR[2] =  EndSpecials; | ||||
|   HR += 3; | ||||
|   return AbsAppl(HR - 3); | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -350,6 +336,53 @@ IsLongIntTerm (Term t) | ||||
| } | ||||
|  | ||||
|  | ||||
| /****************************************************/ | ||||
|  | ||||
| /*********** strings, coded as UTF-8 ****************/ | ||||
|  | ||||
| #include <string.h> | ||||
|  | ||||
| /* extern Functor FunctorString; */ | ||||
|  | ||||
| #define MkStringTerm(i) __MkStringTerm((i) PASS_REGS) | ||||
|  | ||||
| INLINE_ONLY inline EXTERN Term __MkStringTerm (const char *s USES_REGS); | ||||
|  | ||||
| INLINE_ONLY inline EXTERN Term | ||||
| __MkStringTerm (const char *s USES_REGS) | ||||
| { | ||||
|   Term t = AbsAppl(HR); | ||||
|   size_t sz = ALIGN_YAPTYPE(strlen(s)+1,CELL); | ||||
|   HR[0] = (CELL) FunctorString; | ||||
|   HR[1] = (CELL) sz; | ||||
|   strcpy((char *)(HR+2), s); | ||||
|   HR[2+sz] =  EndSpecials; | ||||
|   HR += 3+sz; | ||||
|   return t; | ||||
| } | ||||
|  | ||||
|  | ||||
| INLINE_ONLY inline EXTERN const char *StringOfTerm (Term t); | ||||
|  | ||||
| INLINE_ONLY inline EXTERN const char * | ||||
| StringOfTerm (Term t) | ||||
| { | ||||
|   return (const char *) (RepAppl (t)+2); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| INLINE_ONLY inline EXTERN int IsStringTerm (Term); | ||||
|  | ||||
| INLINE_ONLY inline EXTERN int | ||||
| IsStringTerm (Term t) | ||||
| { | ||||
|   return (int) (IsApplTerm (t) && FunctorOfTerm (t) == FunctorString); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /****************************************************/ | ||||
|  | ||||
| #ifdef USE_GMP | ||||
|  | ||||
| @@ -438,30 +471,6 @@ IsLargeIntTerm (Term t) | ||||
|  | ||||
| #endif | ||||
|  | ||||
| typedef struct string_struct { | ||||
|   UInt len; | ||||
| }  blob_string_t; | ||||
|  | ||||
| INLINE_ONLY inline EXTERN int IsBlobStringTerm (Term); | ||||
|  | ||||
| INLINE_ONLY inline EXTERN int | ||||
| IsBlobStringTerm (Term t) | ||||
| { | ||||
|   return (int) (IsApplTerm (t) && | ||||
| 		FunctorOfTerm (t) == FunctorBigInt && | ||||
| 		(RepAppl(t)[1] & BLOB_STRING) == BLOB_STRING); | ||||
| } | ||||
|  | ||||
| INLINE_ONLY inline EXTERN int IsWideBlobStringTerm (Term); | ||||
|  | ||||
| INLINE_ONLY inline EXTERN int | ||||
| IsWideBlobStringTerm (Term t) | ||||
| { | ||||
|   return (int) (IsApplTerm (t) && | ||||
| 		FunctorOfTerm (t) == FunctorBigInt && | ||||
| 		RepAppl(t)[1] == BLOB_WIDE_STRING); | ||||
| } | ||||
|  | ||||
| /* extern Functor FunctorLongInt; */ | ||||
|  | ||||
| INLINE_ONLY inline EXTERN int IsLargeNumTerm (Term); | ||||
| @@ -470,8 +479,8 @@ INLINE_ONLY inline EXTERN int | ||||
| IsLargeNumTerm (Term t) | ||||
| { | ||||
|   return (int) (IsApplTerm (t) | ||||
| 		&& ((FunctorOfTerm (t) <= FunctorDouble) | ||||
| 		    && (FunctorOfTerm (t) >= FunctorLongInt))); | ||||
| 		&& ((FunctorOfTerm (t) <= FunctorBigInt) | ||||
| 		    && (FunctorOfTerm (t) >= FunctorDouble))); | ||||
| } | ||||
|  | ||||
| INLINE_ONLY inline EXTERN int IsExternalBlobTerm (Term, CELL); | ||||
| @@ -523,7 +532,7 @@ INLINE_ONLY inline EXTERN Int IsExtensionFunctor (Functor); | ||||
| INLINE_ONLY inline EXTERN Int | ||||
| IsExtensionFunctor (Functor f) | ||||
| { | ||||
|   return (Int) (f <= FunctorDouble); | ||||
|   return (Int) (f <= FunctorString); | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -533,7 +542,7 @@ INLINE_ONLY inline EXTERN Int IsBlobFunctor (Functor); | ||||
| INLINE_ONLY inline EXTERN Int | ||||
| IsBlobFunctor (Functor f) | ||||
| { | ||||
|   return (Int) ((f <= FunctorDouble && f >= FunctorDBRef)); | ||||
|   return (Int) ((f <= FunctorString && f >= FunctorDBRef)); | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -665,6 +674,8 @@ unify_extension (Functor f, CELL d0, CELL * pt0, CELL d1) | ||||
|       return (d0 == d1); | ||||
|     case long_int_e: | ||||
|       return (pt0[1] == RepAppl (d1)[1]); | ||||
|     case string_e: | ||||
|       return strcmp( (char *)(pt0+2), (char *)(RepAppl (d1)+2) ) == 0; | ||||
|     case big_int_e: | ||||
| #ifdef USE_GMP | ||||
|       return (Yap_gmp_tcmp_big_big(d0,d1) == 0); | ||||
| @@ -675,7 +686,7 @@ unify_extension (Functor f, CELL d0, CELL * pt0, CELL d1) | ||||
|       { | ||||
| 	CELL *pt1 = RepAppl (d1); | ||||
| 	return (pt0[1] == pt1[1] | ||||
| #if SIZEOF_DOUBLE == 2*SIZEOF_LONG_INT | ||||
| #if SIZEOF_DOUBLE == 2*SIZEOF_INT_P | ||||
| 		&& pt0[2] == pt1[2] | ||||
| #endif | ||||
| 	  ); | ||||
| @@ -707,7 +718,7 @@ CELL Yap_Int_key(Term t) | ||||
| static inline | ||||
| CELL Yap_DoubleP_key(CELL *pt) | ||||
| { | ||||
| #if SIZEOF_DOUBLE == 2*SIZEOF_LONG_INT | ||||
| #if SIZEOF_DOUBLE1 == 2*SIZEOF_INT_P | ||||
|   CELL val = pt[0]^pt[1]; | ||||
| #else | ||||
|   CELL val = pt[0]; | ||||
| @@ -721,4 +732,21 @@ CELL Yap_Double_key(Term t) | ||||
|   return Yap_DoubleP_key(RepAppl(t)+1); | ||||
| } | ||||
|  | ||||
| static inline | ||||
| CELL Yap_StringP_key(CELL *pt) | ||||
| { | ||||
|   UInt n = pt[1], i; | ||||
|   CELL val = pt[2]; | ||||
|   for (i=1; i<n; i++) { | ||||
|     val ^= pt[i+1]; | ||||
|   } | ||||
|   return MkIntTerm(val & (MAX_ABS_INT-1));   | ||||
| } | ||||
|  | ||||
| static inline | ||||
| CELL Yap_String_key(Term t) | ||||
| { | ||||
|   return Yap_StringP_key(RepAppl(t)+1); | ||||
| } | ||||
|  | ||||
| #endif | ||||
|   | ||||
							
								
								
									
										5
									
								
								H/Yap.h
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								H/Yap.h
									
									
									
									
									
								
							| @@ -38,6 +38,9 @@ | ||||
| #endif /* THREADS && (YAPOR_COW || YAPOR_SBA || YAPOR_COPY) */ | ||||
|  | ||||
| #include "config.h" | ||||
|  | ||||
| #define FunAdr(X) X | ||||
|  | ||||
| #include "inline-only.h" | ||||
| #if defined(YAPOR) || defined(TABLING) | ||||
| #include "opt.config.h" | ||||
| @@ -230,7 +233,6 @@ typedef char *ADDR; | ||||
| typedef CELL OFFSET; | ||||
| typedef unsigned char *CODEADDR; | ||||
|  | ||||
| #define ALIGN_YAPTYPE(X,TYPE) (((CELL)(X)+(sizeof(TYPE)-1)) & ~(sizeof(TYPE)-1)) | ||||
|  | ||||
| #define TermPtr(V)	((Term *) (V)) | ||||
| #define	Addr(V)		((ADDR) (V)) | ||||
| @@ -395,7 +397,6 @@ typedef enum | ||||
|   YAP_BREAK_SIGNAL = 0x2000,	/* received break signal */ | ||||
|   YAP_STACK_DUMP_SIGNAL = 0x4000,	/* received stack dump signal */ | ||||
|   YAP_STATISTICS_SIGNAL = 0x8000,	/* received statistics */ | ||||
|   YAP_DELAY_CREEP_SIGNAL = 0x10000,	/* received a creep but should not do it */ | ||||
|   YAP_AGC_SIGNAL = 0x20000,	/* call atom garbage collector asap */ | ||||
|   YAP_PIPE_SIGNAL = 0x40000,	/* call atom garbage collector asap */ | ||||
|   YAP_VTALARM_SIGNAL = 0x80000,	/* received SIGVTALARM */ | ||||
|   | ||||
| @@ -58,6 +58,11 @@ Yap_StartSlots( USES_REGS1 ) { | ||||
|   return CurSlot; | ||||
| } | ||||
|  | ||||
| static inline void | ||||
| Yap_CloseSlots( Int slot USES_REGS ) { | ||||
|   LOCAL_CurSlot = slot; | ||||
| } | ||||
|  | ||||
| static inline Int | ||||
| Yap_CurrentSlot( USES_REGS1 ) { | ||||
|   return IntOfTerm(ASP[0]); | ||||
|   | ||||
| @@ -76,6 +76,7 @@ | ||||
|   OPCODE(get_list                   ,x), | ||||
|   OPCODE(get_struct                 ,xfa), | ||||
|   OPCODE(get_float                  ,xd), | ||||
|   OPCODE(get_string                 ,xu), | ||||
|   OPCODE(get_longint                ,xi), | ||||
|   OPCODE(get_bigint                 ,xN), | ||||
|   OPCODE(get_dbterm                 ,xD), | ||||
| @@ -131,6 +132,8 @@ | ||||
|   OPCODE(unify_float_write          ,od), | ||||
|   OPCODE(unify_l_float              ,od), | ||||
|   OPCODE(unify_l_float_write        ,od), | ||||
|   OPCODE(unify_string               ,ou), | ||||
|   OPCODE(unify_l_string             ,ou), | ||||
|   OPCODE(unify_longint              ,oi), | ||||
|   OPCODE(unify_longint_write        ,oi), | ||||
|   OPCODE(unify_l_longint            ,oi), | ||||
| @@ -200,14 +203,10 @@ | ||||
|   OPCODE(call_c_wfail               ,slp), | ||||
|   OPCODE(try_c                      ,OtapFs), | ||||
|   OPCODE(retry_c                    ,OtapFs), | ||||
| #ifdef CUT_C | ||||
|   OPCODE(cut_c                      ,OtapFs), | ||||
| #endif | ||||
|   OPCODE(try_userc                  ,OtapFs), | ||||
|   OPCODE(retry_userc                ,OtapFs), | ||||
| #ifdef CUT_C | ||||
|   OPCODE(cut_userc                  ,OtapFs), | ||||
| #endif | ||||
|   OPCODE(lock_pred                  ,e), | ||||
|   OPCODE(index_pred                 ,e), | ||||
| #ifdef THREADS | ||||
| @@ -413,6 +412,10 @@ | ||||
|   OPCODE(trie_trust_longint         ,e), | ||||
|   OPCODE(trie_try_longint           ,e), | ||||
|   OPCODE(trie_retry_longint         ,e), | ||||
|   OPCODE(trie_do_bigint             ,e), | ||||
|   OPCODE(trie_trust_bigint          ,e), | ||||
|   OPCODE(trie_try_bigint            ,e), | ||||
|   OPCODE(trie_retry_bigint          ,e), | ||||
|   OPCODE(trie_do_gterm              ,e), | ||||
|   OPCODE(trie_trust_gterm           ,e), | ||||
|   OPCODE(trie_try_gterm             ,e), | ||||
|   | ||||
							
								
								
									
										12
									
								
								H/YapTags.h
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								H/YapTags.h
									
									
									
									
									
								
							| @@ -168,7 +168,7 @@ INLINE_ONLY inline EXTERN Term MkVarTerm__ ( USES_REGS1 ); | ||||
| INLINE_ONLY inline EXTERN Term | ||||
| MkVarTerm__ ( USES_REGS1 ) | ||||
| { | ||||
|   return (Term) ((*H = 0, H++)); | ||||
|   return (Term) ((*HR = 0, HR++)); | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -191,7 +191,7 @@ INLINE_ONLY inline EXTERN Term MkVarTerm__ ( USES_REGS1 ); | ||||
| INLINE_ONLY inline EXTERN Term | ||||
| MkVarTerm__ ( USES_REGS1 ) | ||||
| { | ||||
|   return (Term) ((*H = (CELL) H, H++)); | ||||
|   return (Term) ((*HR = (CELL) HR, HR++)); | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -319,11 +319,11 @@ INLINE_ONLY EXTERN inline Term MkPairTerm__(Term head, Term  tail USES_REGS ); | ||||
| INLINE_ONLY EXTERN inline Term | ||||
| MkPairTerm__ (Term head, Term tail USES_REGS) | ||||
| { | ||||
|   register CELL *p = H; | ||||
|   register CELL *p = HR; | ||||
|  | ||||
|   H[0] = head; | ||||
|   H[1] = tail; | ||||
|   H += 2; | ||||
|   HR[0] = head; | ||||
|   HR[1] = tail; | ||||
|   HR += 2; | ||||
|   return (AbsPair (p)); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -21,6 +21,9 @@ typedef void *Atom; | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #define ALIGN_YAPTYPE(X,TYPE) (((CELL)(X)+(sizeof(TYPE)-1)) & ~(sizeof(TYPE)-1)) | ||||
|  | ||||
|  | ||||
| #ifndef EXTERN | ||||
| #define EXTERN extern | ||||
| #endif | ||||
|   | ||||
							
								
								
									
										1011
									
								
								H/YapText.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1011
									
								
								H/YapText.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										102
									
								
								H/Yapproto.h
									
									
									
									
									
								
							
							
						
						
									
										102
									
								
								H/Yapproto.h
									
									
									
									
									
								
							| @@ -26,6 +26,8 @@ Term	Yap_GetValue(Atom); | ||||
| int     Yap_HasOp(Atom); | ||||
| struct operator_entry *Yap_GetOpPropForAModuleHavingALock(AtomEntry *, Term); | ||||
| Atom	Yap_LookupAtom(char *); | ||||
| Atom	Yap_LookupAtomWithLength(char *, size_t); | ||||
| Atom	Yap_LookupUTF8Atom(char *); | ||||
| Atom	Yap_LookupMaybeWideAtom(wchar_t *); | ||||
| Atom	Yap_LookupMaybeWideAtomWithLength(wchar_t *, size_t); | ||||
| Atom	Yap_FullLookupAtom(char *); | ||||
| @@ -39,19 +41,6 @@ Functor	Yap_MkFunctor(Atom,unsigned int); | ||||
| void	Yap_MkFunctorWithAddress(Atom,unsigned int,FunctorEntry *); | ||||
| void	Yap_PutValue(Atom,Term); | ||||
| void	Yap_ReleaseAtom(Atom); | ||||
| Term	Yap_StringToList(char *); | ||||
| Term	Yap_NStringToList(char *, size_t); | ||||
| Term	Yap_WideStringToList(wchar_t *); | ||||
| Term	Yap_NWideStringToList(wchar_t *, size_t); | ||||
| Term	Yap_StringToDiffList(char *,Term CACHE_TYPE); | ||||
| Term	Yap_NStringToDiffList(char *,Term, size_t); | ||||
| Term	Yap_WideStringToDiffList(wchar_t *,Term); | ||||
| Term	Yap_NWideStringToDiffList(wchar_t *,Term, size_t); | ||||
| Term	Yap_StringToListOfAtoms(char *); | ||||
| Term	Yap_NStringToListOfAtoms(char *, size_t); | ||||
| Term	Yap_WideStringToListOfAtoms(wchar_t *); | ||||
| Term	Yap_NWideStringToListOfAtoms(wchar_t *, size_t); | ||||
| Term	Yap_NWideStringToDiffListOfAtoms(wchar_t *, Term, size_t); | ||||
| int     Yap_AtomIncreaseHold(Atom); | ||||
| int     Yap_AtomDecreaseHold(Atom); | ||||
| struct operator_entry *Yap_OpPropForModule(Atom, Term); | ||||
| @@ -117,6 +106,8 @@ Term   Yap_RatTermToApplTerm(Term); | ||||
| void   Yap_InitBigNums(void); | ||||
| Term   Yap_AllocExternalDataInStack(CELL, size_t); | ||||
| int    Yap_CleanOpaqueVariable(CELL *); | ||||
| CELL  *Yap_HeapStoreOpaqueTerm(Term t); | ||||
| size_t Yap_OpaqueTermToString(Term t, char *str, size_t max); | ||||
|  | ||||
| /* c_interface.c */ | ||||
| Int    YAP_Execute(struct pred_entry *, CPredicate); | ||||
| @@ -127,7 +118,7 @@ Int    YAP_RunGoalOnce(Term); | ||||
|  | ||||
| /* cdmgr.c */ | ||||
| Term	Yap_all_calls(void); | ||||
| Atom	Yap_ConsultingFile(void); | ||||
| Atom  Yap_ConsultingFile( USES_REGS1 ); | ||||
| struct pred_entry *Yap_PredForChoicePt(choiceptr); | ||||
| void	Yap_InitCdMgr(void); | ||||
| void	Yap_init_consult(int, char *); | ||||
| @@ -138,7 +129,7 @@ void	Yap_EraseMegaClause(yamop *,struct pred_entry *); | ||||
| void	Yap_ResetConsultStack(void); | ||||
| void	Yap_AssertzClause(struct pred_entry *, yamop *); | ||||
| void    Yap_HidePred(struct pred_entry *pe); | ||||
|  | ||||
| int     Yap_SetNoTrace(char *name, UInt arity, Term tmod); | ||||
|  | ||||
| /* cmppreds.c */ | ||||
| Int	Yap_compare_terms(Term,Term); | ||||
| @@ -169,6 +160,8 @@ void	Yap_RestartYap(int); | ||||
| void	Yap_exit(int); | ||||
| yamop  *Yap_Error(yap_error_number,Term,char *msg, ...); | ||||
| yamop  *Yap_NilError(yap_error_number,char *msg, ...); | ||||
| int     Yap_HandleError( const char *msg, ... ); | ||||
| int     Yap_SWIHandleError( const char *, ... ); | ||||
|  | ||||
| /* eval.c */ | ||||
| void	Yap_InitEval(void); | ||||
| @@ -245,9 +238,7 @@ void	Yap_InitAsmPred(char *, unsigned long int, int, CPredicate, UInt); | ||||
| void	Yap_InitCmpPred(char *, unsigned long int, CmpPredicate, UInt); | ||||
| void	Yap_InitCPredBack(char *, unsigned long int, unsigned int, CPredicate,CPredicate,UInt); | ||||
| void	Yap_InitCPredBackCut(char *, unsigned long int, unsigned int, CPredicate,CPredicate,CPredicate,UInt); | ||||
| #ifdef CUT_C | ||||
| void    Yap_InitCPredBack_(char *, unsigned long int, unsigned int, CPredicate,CPredicate,CPredicate,UInt); | ||||
| #endif | ||||
| void	Yap_InitWorkspace(UInt,UInt,UInt,UInt,UInt,int,int,int); | ||||
|  | ||||
| #ifdef YAPOR | ||||
| @@ -348,6 +339,7 @@ void	Yap_InitSignalCPreds(void); | ||||
| /* sort.c */ | ||||
| void    Yap_InitSortPreds(void); | ||||
|  | ||||
|  | ||||
| /* stdpreds.c */ | ||||
| void	Yap_InitBackCPreds(void); | ||||
| void	Yap_InitCPreds(void); | ||||
| @@ -430,81 +422,7 @@ Int     Yap_SkipList(Term *, Term **); | ||||
|  | ||||
| /* write.c */ | ||||
| void	Yap_plwrite(Term, void *, int, int, int); | ||||
|  | ||||
|  | ||||
| /* MYDDAS */ | ||||
|  | ||||
| #if defined MYDDAS_MYSQL || defined MYDDAS_ODBC | ||||
|  | ||||
| /* myddas_initialization.c */ | ||||
| MYDDAS_GLOBAL          myddas_init_initialize_myddas(void); | ||||
| MYDDAS_UTIL_CONNECTION myddas_init_initialize_connection(void *,void *,MYDDAS_UTIL_CONNECTION); | ||||
| MYDDAS_UTIL_PREDICATE  myddas_init_initialize_predicate(char *, int, char *,MYDDAS_UTIL_PREDICATE); | ||||
|  | ||||
| #ifdef MYDDAS_STATS | ||||
| /* myddas_statistics.c */ | ||||
| MYDDAS_GLOBAL          myddas_stats_initialize_global_stats(MYDDAS_GLOBAL); | ||||
| MYDDAS_STATS_STRUCT    myddas_stats_initialize_connection_stats(void); | ||||
| void                   myddas_stats_delete_stats_list(MYDDAS_STATS_STRUCT); | ||||
| #endif /* MYDDAS_STATS */ | ||||
|  | ||||
| #ifdef MYDDAS_MYSQL | ||||
| /* myddas_util.c */ | ||||
| void                   myddas_util_table_write(MYSQL_RES *); | ||||
| #endif | ||||
| Short                  myddas_util_connection_type(void *); | ||||
| MYDDAS_UTIL_CONNECTION myddas_util_add_connection(void *,void *); | ||||
| MYDDAS_UTIL_CONNECTION myddas_util_search_connection(void *); | ||||
| void                   myddas_util_delete_connection(void *); | ||||
| MYDDAS_UTIL_CONNECTION myddas_util_add_predicate(char * ,Int , char *,void *); | ||||
| MYDDAS_UTIL_PREDICATE  myddas_util_search_predicate(char * ,Int , char *); | ||||
| void                   myddas_util_delete_predicate(MYDDAS_UTIL_PREDICATE); | ||||
|  | ||||
| /* Get's the number of queries to save */ | ||||
| UInt                   myddas_util_get_total_multi_queries_number(MYDDAS_UTIL_CONNECTION); | ||||
| void                   myddas_util_set_total_multi_queries_number(MYDDAS_UTIL_CONNECTION,UInt); | ||||
| #ifdef MYDDAS_ODBC | ||||
| /* Return enviromment identifier*/ | ||||
| SQLHENV                myddas_util_get_odbc_enviromment(SQLHDBC); | ||||
| #endif | ||||
|  | ||||
| void *                 myddas_util_get_list_pred(MYDDAS_UTIL_CONNECTION); | ||||
| void *                 myddas_util_get_pred_next(void *); | ||||
| char *                 myddas_util_get_pred_module(void *); | ||||
| char *                 myddas_util_get_pred_name(void *); | ||||
| MyddasInt              myddas_util_get_pred_arity(void *); | ||||
| //DELETE THIS WHEN DB_STATS  IS COMPLETED | ||||
| MyddasInt              get_myddas_top(void); | ||||
|  | ||||
| #ifdef DEBUG | ||||
| void check_int(void); | ||||
| #endif | ||||
|  | ||||
| #endif /* MYDDAS_MYSQL || MYDDAS_ODBC */ | ||||
|  | ||||
| /* myddas_mysql.c */ | ||||
| #if defined MYDDAS_MYSQL | ||||
| void    Yap_InitMYDDAS_MySQLPreds(void); | ||||
| void    Yap_InitBackMYDDAS_MySQLPreds(void); | ||||
| #endif | ||||
|  | ||||
| /* myddas_odbc.c */ | ||||
| #if defined MYDDAS_ODBC | ||||
| void    Yap_InitMYDDAS_ODBCPreds(void); | ||||
| void    Yap_InitBackMYDDAS_ODBCPreds(void); | ||||
| #endif | ||||
|  | ||||
| /* myddas_shared.c */ | ||||
| #if defined MYDDAS_ODBC || defined MYDDAS_MYSQL | ||||
| void    Yap_MYDDAS_delete_all_myddas_structs(void); | ||||
| void    Yap_InitMYDDAS_SharedPreds(void); | ||||
| void    Yap_InitBackMYDDAS_SharedPreds(void); | ||||
| #endif | ||||
|  | ||||
| /* myddas_top_level.c */ | ||||
| #if defined MYDDAS_TOP_LEVEL && defined MYDDAS_MYSQL //&& defined HAVE_LIBREADLINE | ||||
| void    Yap_InitMYDDAS_TopLevelPreds(void); | ||||
| #endif | ||||
| int     Yap_FormatFloat( Float f, const char *s, size_t sz ); | ||||
|  | ||||
| /* yap2swi.c */ | ||||
| void	Yap_swi_install(void); | ||||
|   | ||||
							
								
								
									
										16
									
								
								H/Yatom.h
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								H/Yatom.h
									
									
									
									
									
								
							| @@ -650,10 +650,14 @@ IsValProperty (int flags) | ||||
| 	    for	the pred. | ||||
|     C_Preds are	things write, read, ...	implemented in C. In this case | ||||
| 	    CodeOfPred holds the address of the	correspondent C-function. | ||||
|  | ||||
| don;t forget to also add in qly.h | ||||
| */ | ||||
| typedef enum | ||||
| { | ||||
|   QuasiQuotationPredFlag = ((UInt)0x00000001 << EXTRA_FLAG_BASE),		/* SWI-like quasi quotations */ | ||||
|   NoDebugPredFlag = ((UInt)0x00000004L << EXTRA_FLAG_BASE),		/* cannot trace this preducate */ | ||||
|   NoTracePredFlag = ((UInt)0x00000002L << EXTRA_FLAG_BASE),		/* cannot trace this preducate */ | ||||
|   QuasiQuotationPredFlag = ((UInt)0x00000001L << EXTRA_FLAG_BASE),		/* SWI-like quasi quotations */ | ||||
|   MegaClausePredFlag =   0x80000000L, /* predicate is implemented as a mega-clause */ | ||||
|   ThreadLocalPredFlag = 0x40000000L,	/* local to a thread */ | ||||
|   MultiFileFlag = 0x20000000L,	/* is multi-file */ | ||||
| @@ -1277,6 +1281,12 @@ IsTranslationProperty (int flags) | ||||
| } | ||||
|  | ||||
|  | ||||
| typedef enum { | ||||
|   STATIC_ARRAY = 1, | ||||
|   DYNAMIC_ARRAY = 2, | ||||
|   MMAP_ARRAY = 4, | ||||
|   FIXED_ARRAY = 8 | ||||
| } array_type; | ||||
|  | ||||
|  | ||||
| /*		array property entry structure				*/ | ||||
| @@ -1286,6 +1296,7 @@ typedef struct array_entry | ||||
|   Prop NextOfPE;		/* used to chain properties             */ | ||||
|   PropFlags KindOfPE;		/* kind of property                     */ | ||||
|   Int ArrayEArity;		/* Arity of Array (positive)            */ | ||||
|   array_type TypeOfAE; | ||||
| #if defined(YAPOR) || defined(THREADS) | ||||
|   rwlock_t ArRWLock;		/* a read-write lock to protect the entry */ | ||||
| #if THREADS | ||||
| @@ -1337,6 +1348,7 @@ typedef struct static_array_entry | ||||
|   Prop NextOfPE;		/* used to chain properties             */ | ||||
|   PropFlags KindOfPE;		/* kind of property                     */ | ||||
|   Int ArrayEArity;		/* Arity of Array (negative)            */ | ||||
|   array_type TypeOfAE; | ||||
| #if defined(YAPOR) || defined(THREADS) | ||||
|   rwlock_t ArRWLock;		/* a read-write lock to protect the entry */ | ||||
| #endif | ||||
| @@ -1437,7 +1449,7 @@ INLINE_ONLY inline EXTERN int ArrayIsDynamic (ArrayEntry *); | ||||
| INLINE_ONLY inline EXTERN int | ||||
| ArrayIsDynamic (ArrayEntry * are) | ||||
| { | ||||
|   return (int) (((are)->ArrayEArity > 0)); | ||||
|   return (int) (((are)->TypeOfAE & DYNAMIC_ARRAY)); | ||||
| } | ||||
|  | ||||
|  | ||||
|   | ||||
							
								
								
									
										55
									
								
								H/absmi.h
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								H/absmi.h
									
									
									
									
									
								
							| @@ -72,7 +72,7 @@ static char SccsId[] = "%W% %G%"; | ||||
| #ifdef BP_FREE | ||||
| /*************************************************************** | ||||
| * Use bp as PREG for X86 machines		               * | ||||
| ***************************************************************/ | ||||
| ********************************************Term*******************/ | ||||
| #if defined(IN_ABSMI_C) | ||||
| register struct yami* P1REG asm ("bp"); /* can't use yamop before Yap.h */ | ||||
| #define PREG P1REG | ||||
| @@ -769,9 +769,9 @@ Macros to check the limits of stacks | ||||
| 		   COUNT_CPS();					       \ | ||||
|                    S_YREG = (CELL *)((choiceptr)((S_YREG)-(I))-1);     \ | ||||
|                    /* Save Information */                        \ | ||||
| 		   HBREG = H;                                    \ | ||||
| 		   HBREG = HR;                                    \ | ||||
|                    B_YREG->cp_tr = TR;				 \ | ||||
|                    B_YREG->cp_h  = H;				 \ | ||||
|                    B_YREG->cp_h  = HR;				 \ | ||||
|                    B_YREG->cp_b  = B;				 \ | ||||
|                    store_yaam_reg_cpdepth(B_YREG);               \ | ||||
|                    B_YREG->cp_cp = CPREG;			 \ | ||||
| @@ -783,9 +783,9 @@ Macros to check the limits of stacks | ||||
|                 COUNT_CPS();					 \ | ||||
|                  pt1 --; /* Jump to CP_BASE */		         \ | ||||
|                  /* Save Information */                          \ | ||||
| 		 HBREG = H;                                      \ | ||||
| 		 HBREG = HR;                                      \ | ||||
|                  pt1->cp_tr = TR;	                         \ | ||||
|                  pt1->cp_h = H;		                         \ | ||||
|                  pt1->cp_h = HR;		                         \ | ||||
| 		 pt1->cp_b = B;		                         \ | ||||
|                  store_yaam_reg_cpdepth(pt1);                    \ | ||||
|                  pt1->cp_cp = d0;                                \ | ||||
| @@ -850,7 +850,7 @@ Macros to check the limits of stacks | ||||
| #define restore_yaam_regs(AP)                                    \ | ||||
|                  { register CELL *x1 = B_YREG->cp_env;	         \ | ||||
|                    register yamop *x2;				 \ | ||||
|                    H = HBREG = PROTECT_FROZEN_H(B_YREG);            \ | ||||
|                    HR = HBREG = PROTECT_FROZEN_H(B_YREG);            \ | ||||
| 		   restore_yaam_reg_cpdepth(B_YREG);	         \ | ||||
|                    CPREG  = B_YREG->cp_cp;		                 \ | ||||
| 		   /* AP may depend on H */			 \ | ||||
| @@ -914,7 +914,7 @@ Macros to check the limits of stacks | ||||
|  | ||||
| #define pop_yaam_regs()                                           \ | ||||
|                  {                                                \ | ||||
|                    H = PROTECT_FROZEN_H(B_YREG);                  \ | ||||
|                    HR = PROTECT_FROZEN_H(B_YREG);                  \ | ||||
| 		   B = B_YREG->cp_b;	                          \ | ||||
|                    pop_yaam_reg_cpdepth(B_YREG);                  \ | ||||
| 		   CPREG = B_YREG->cp_cp;		          \ | ||||
| @@ -999,20 +999,20 @@ Macros to check the limits of stacks | ||||
|   }                                                                | ||||
|  | ||||
| #define UnifyGlobalCellToCell(b, a)	                          \ | ||||
| if ((a) < H) { /* two globals */				  \ | ||||
| if ((a) < HR) { /* two globals */				  \ | ||||
|   UnifyGlobalCells(a,b);					  \ | ||||
| } else {							  \ | ||||
|       Bind_Local((a),(CELL)(b));				  \ | ||||
| } | ||||
|  | ||||
| #define UnifyCells(a, b)		                          \ | ||||
| if ((a) < H) { /* at least one global */			  \ | ||||
|   if ((b) > H) { Bind_Local((b),(CELL)(a)); }			  \ | ||||
| if ((a) < HR) { /* at least one global */			  \ | ||||
|   if ((b) > HR) { Bind_Local((b),(CELL)(a)); }			  \ | ||||
|   else { UnifyGlobalCells(a,b); }				  \ | ||||
| } else {                                                          \ | ||||
|   if ((b) > (a)) { Bind_Local((a),(CELL)(b)); }			  \ | ||||
|   else if ((a) > (b)) {						  \ | ||||
|     if ((b) < H) { Bind_Local((a),(CELL)(b)); }                   \ | ||||
|     if ((b) < HR) { Bind_Local((a),(CELL)(b)); }                   \ | ||||
|     else { Bind_Local((b),(CELL)(a)); }			          \ | ||||
|   }								  \ | ||||
| } | ||||
| @@ -1597,14 +1597,37 @@ void SET_ASP__(CELL *yreg, Int sz USES_REGS) { | ||||
| /* l1: bind a, l2 bind b, l3 no binding */ | ||||
| #define UnifyAndTrailCells(a, b)                                            \ | ||||
|      if((a) > (b)) {                                                        \ | ||||
|        if ((a) < H) { *(a) = (CELL)(b); DO_TRAIL((a),(CELL)(b)); }	    \ | ||||
|        else if ((b) <= H) { *(a) =(CELL)(b); DO_TRAIL((a),(CELL)(b));}	   \ | ||||
|        if ((a) < HR) { *(a) = (CELL)(b); DO_TRAIL((a),(CELL)(b)); }	    \ | ||||
|        else if ((b) <= HR) { *(a) =(CELL)(b); DO_TRAIL((a),(CELL)(b));}	   \ | ||||
|        else { *(b) = (CELL)(a);  DO_TRAIL((b),(CELL)(a)); }		    \ | ||||
|      } else if((a) < (b)){                                                  \ | ||||
|        if ((b) <= H) { *(b) = (CELL)(a); DO_TRAIL((b),(CELL)(a)); }         \ | ||||
|        else if ((a) <= H) { *(b) = (CELL) (a); DO_TRAIL((b),(CELL)(a));}    \ | ||||
|        if ((b) <= HR) { *(b) = (CELL)(a); DO_TRAIL((b),(CELL)(a)); }         \ | ||||
|        else if ((a) <= HR) { *(b) = (CELL) (a); DO_TRAIL((b),(CELL)(a));}    \ | ||||
|        else { *(a) = (CELL) (b);  DO_TRAIL((a),(CELL)(b));}                 \ | ||||
|      } | ||||
|  | ||||
|  | ||||
| #define CHECK_ALARM(CONT) | ||||
| #ifdef SHADOW_S | ||||
| #define PROCESS_INT( F, C ) \ | ||||
|       BEGD(d0); \ | ||||
|       Yap_REGS.S_ = SREG; \ | ||||
|       saveregs(); \ | ||||
|       d0 = F ( PASS_REGS1 );\ | ||||
|       setregs(); \ | ||||
|       SREG = Yap_REGS.S_; \ | ||||
|       if (!d0) FAIL(); \ | ||||
|       if (d0 == 2) goto C; \ | ||||
|       JMPNext(); \ | ||||
|       ENDD(d0); | ||||
| #else | ||||
| #define PROCESS_INT( F, C ) \ | ||||
|       BEGD(d0); \ | ||||
|       saveregs(); \ | ||||
|       d0 = F ( PASS_REGS1 );\ | ||||
|       setregs(); \ | ||||
|       if (!d0) FAIL(); \ | ||||
|       if (d0 == 2) goto C; \ | ||||
|       JMPNext(); \ | ||||
|       ENDD(d0); | ||||
| #endif | ||||
|  | ||||
|   | ||||
							
								
								
									
										11
									
								
								H/amidefs.h
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								H/amidefs.h
									
									
									
									
									
								
							| @@ -273,6 +273,7 @@ typedef enum { | ||||
|   p: predicate, struct pred_entry * | ||||
|   s: small integer, COUNT | ||||
|   t: pointer to table entry, used by yaptab, struct table_entry * | ||||
|   u: utf-8 string | ||||
|   x: wam register, wamreg | ||||
|   y: environment slot | ||||
|  | ||||
| @@ -558,6 +559,11 @@ typedef struct yami { | ||||
|       COUNT               s; | ||||
|       CELL next; | ||||
|     } os; | ||||
|     struct { | ||||
|       OPCODE              opcw; | ||||
|       Term    u; | ||||
|       CELL next; | ||||
|     } ou; | ||||
|     struct { | ||||
|       OPCODE              opcw; | ||||
|       wamreg                x; | ||||
| @@ -783,6 +789,11 @@ typedef struct yami { | ||||
|       wamreg                xr; | ||||
|       CELL next; | ||||
|     } xx; | ||||
|     struct { | ||||
|       wamreg                x; | ||||
|       Term                  u; | ||||
|       CELL next; | ||||
|     } xu; | ||||
|     struct { | ||||
|       wamreg                x; | ||||
|       wamreg                xi; | ||||
|   | ||||
| @@ -253,7 +253,7 @@ extern void	Yap_WakeUp(CELL *v); | ||||
|  | ||||
| #define Bind_Local(A,D)	   { TRAIL_LOCAL(A,D); *(A) = (D); } | ||||
| #define Bind_Global(A,D)       { *(A) = (D); if (__builtin_expect(GlobalIsAttVar(A),0)) Yap_WakeUp(A); else TRAIL_GLOBAL(A,D);   } | ||||
| #define Bind(A,D)              { *(A) = (D); if (A < H) {  if (__builtin_expect(GlobalIsAttVar(A),0)) Yap_WakeUp(A); else TRAIL_GLOBAL(A,D);  } else { TRAIL_LOCAL(A,D); }	 } | ||||
| #define Bind(A,D)              { *(A) = (D); if (A < HR) {  if (__builtin_expect(GlobalIsAttVar(A),0)) Yap_WakeUp(A); else TRAIL_GLOBAL(A,D);  } else { TRAIL_LOCAL(A,D); }	 } | ||||
| #define Bind_NonAtt(A,D)       { *(A) = (D); TRAIL(A,D);	 } | ||||
| #define Bind_Global_NonAtt(A,D)       { *(A) = (D); TRAIL_GLOBAL(A,D); } | ||||
| #define Bind_and_Trail(A,D)       { *(A) = (D); DO_TRAIL(A, D); } | ||||
| @@ -412,11 +412,9 @@ Yap_unify_constant(register Term a, register Term cons) | ||||
| static inline int | ||||
| do_cut(int i) { | ||||
|   CACHE_REGS | ||||
| #ifdef CUT_C | ||||
|   if (POP_CHOICE_POINT(B->cp_b)) { | ||||
|     cut_c_pop(); | ||||
|   } | ||||
| #endif | ||||
|   Yap_TrimTrail(); | ||||
|   B = B->cp_b; | ||||
|   return i; | ||||
|   | ||||
							
								
								
									
										81
									
								
								H/arith2.h
									
									
									
									
									
								
							
							
						
						
									
										81
									
								
								H/arith2.h
									
									
									
									
									
								
							| @@ -75,8 +75,29 @@ mul_overflow(Int z, Int i1, Int i2) | ||||
| } | ||||
|  | ||||
| #ifndef OPTIMIZE_MULTIPLI | ||||
| #define DO_MULTI() z = i1*i2;			\ | ||||
|   if (i2 &&  z/i2 != i1) goto overflow | ||||
| #if __clang__ && FALSE  /* not in OSX yet */ | ||||
| #define DO_MULTI() if (__builtin_smul_overflow( i1, i2, & z ) ) { goto overflow; } | ||||
| #elif  SIZEOF_DOUBLE == 2*SIZEOF_INT_P | ||||
| #define DO_MULTI() {\ | ||||
|   int64_t w = (int64_t)i1*i2; \ | ||||
|   if (w >= 0) {\ | ||||
|     if ((w | ((int64_t)(2^31)-1)) != ((int64_t)(2^31)-1)) goto overflow; \ | ||||
|   } else {\ | ||||
|     if ((-w | ((int64_t)(2^31)-1)) != ((int64_t)(2^31)-1)) goto overflow; \ | ||||
|   }\ | ||||
|   z = w;\ | ||||
| } | ||||
| #else | ||||
| #define DO_MULTI() {\ | ||||
|   __int128_t w = (__int128_t)i1*i2; \ | ||||
|   if (w >= 0) {\ | ||||
|     if ((w | ((__int128_t)(2^63)-1)) != ((__int128_t)(2^63)-1)) goto overflow; \ | ||||
|   } else {\ | ||||
|     if ((-w | ((__int128_t)(2^63)-1)) != ((__int128_t)(2^63)-1)) goto overflow; \ | ||||
|   }\ | ||||
|   z = (Int)w;					\ | ||||
| } | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| inline static Term | ||||
| @@ -148,62 +169,6 @@ do_sll(Int i, Int j USES_REGS) /* j > 0 */ | ||||
| } | ||||
|  | ||||
|  | ||||
| static inline Term | ||||
| p_plus(Term t1, Term t2 USES_REGS) { | ||||
|   switch (ETypeOfTerm(t1)) { | ||||
|   case long_int_e: | ||||
|     switch (ETypeOfTerm(t2)) { | ||||
|     case long_int_e: | ||||
|       /* two integers */ | ||||
|       return add_int(IntegerOfTerm(t1),IntegerOfTerm(t2) PASS_REGS); | ||||
|     case double_e: | ||||
|       { | ||||
| 	/* integer, double */ | ||||
| 	Float fl1 = (Float)IntegerOfTerm(t1); | ||||
| 	Float fl2 = FloatOfTerm(t2); | ||||
| 	RFLOAT(fl1+fl2); | ||||
|       } | ||||
|     case big_int_e: | ||||
| #ifdef USE_GMP | ||||
|       return(Yap_gmp_add_int_big(IntegerOfTerm(t1), t2)); | ||||
| #endif | ||||
|     default: | ||||
|       RERROR(); | ||||
|     } | ||||
|   case double_e: | ||||
|     switch (ETypeOfTerm(t2)) { | ||||
|     case long_int_e: | ||||
|       /* float * integer */ | ||||
|       RFLOAT(FloatOfTerm(t1)+IntegerOfTerm(t2)); | ||||
|     case double_e: | ||||
|       RFLOAT(FloatOfTerm(t1)+FloatOfTerm(t2)); | ||||
|     case big_int_e: | ||||
| #ifdef USE_GMP | ||||
|       return Yap_gmp_add_float_big(FloatOfTerm(t1),t2); | ||||
| #endif | ||||
|     default: | ||||
|       RERROR(); | ||||
|     } | ||||
|   case big_int_e: | ||||
| #ifdef USE_GMP | ||||
|     switch (ETypeOfTerm(t2)) { | ||||
|     case long_int_e: | ||||
|       return Yap_gmp_add_int_big(IntegerOfTerm(t2), t1); | ||||
|     case big_int_e: | ||||
|       /* two bignums */ | ||||
|       return Yap_gmp_add_big_big(t1, t2); | ||||
|     case double_e: | ||||
|       return Yap_gmp_add_float_big(FloatOfTerm(t2),t1); | ||||
|     default: | ||||
|       RERROR(); | ||||
|     } | ||||
| #endif | ||||
|   default: | ||||
|     RERROR(); | ||||
|   } | ||||
|   RERROR(); | ||||
| } | ||||
|  | ||||
| static Term | ||||
| p_minus(Term t1, Term t2 USES_REGS) { | ||||
|   switch (ETypeOfTerm(t1)) { | ||||
|   | ||||
| @@ -26,5 +26,3 @@ typedef struct array_access_struct { | ||||
| 				   keep it as an integer! */ | ||||
| } array_access; | ||||
|  | ||||
|  | ||||
|  | ||||
|   | ||||
							
								
								
									
										28
									
								
								H/clause.h
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								H/clause.h
									
									
									
									
									
								
							| @@ -281,6 +281,8 @@ void	Yap_ErCl(DynamicClause *); | ||||
| void	Yap_ErLogUpdCl(LogUpdClause *); | ||||
| void    Yap_ErLogUpdIndex(LogUpdIndex *); | ||||
| Int	Yap_Recordz(Atom, Term); | ||||
| Int     Yap_db_nth_recorded( PredEntry *, Int USES_REGS ); | ||||
| Int     Yap_unify_immediate_ref(DBRef ref USES_REGS ); | ||||
|  | ||||
| /* exec.c */ | ||||
| Term    Yap_cp_as_integer(choiceptr); | ||||
| @@ -395,6 +397,32 @@ Yap_MegaClausePredicateFromTerm(Term t) | ||||
|   return (PredEntry *)IntegerOfTerm(ArgOfTerm(1,t)); | ||||
| } | ||||
|  | ||||
| #define Yap_MkExoRefTerm(ap, i) __Yap_MkExoRefTerm((ap), (i) PASS_REGS) | ||||
|  | ||||
| static inline Term  | ||||
| __Yap_MkExoRefTerm(PredEntry *ap,Int i USES_REGS) | ||||
| { | ||||
|   Term t[2]; | ||||
|   t[0] = MkIntegerTerm((Int)ap); | ||||
|   t[1] = MkIntegerTerm((Int)i); | ||||
|   return Yap_MkApplTerm(FunctorExoClause,2,t); | ||||
| } | ||||
|  | ||||
| static inline Int  | ||||
| Yap_ExoClauseFromTerm(Term t) | ||||
| { | ||||
|   return IntegerOfTerm(ArgOfTerm(2,t)); | ||||
| } | ||||
|  | ||||
| static inline PredEntry *  | ||||
| Yap_ExoClausePredicateFromTerm(Term t) | ||||
| { | ||||
|   return (PredEntry *)IntegerOfTerm(ArgOfTerm(1,t)); | ||||
| } | ||||
|  | ||||
| #define DEAD_REF(ref) FALSE | ||||
|  | ||||
|  | ||||
| typedef enum { | ||||
|   FIND_PRED_FROM_ANYWHERE, | ||||
|   FIND_PRED_FROM_CP, | ||||
|   | ||||
| @@ -34,6 +34,8 @@ typedef enum compiler_op { | ||||
|   put_dbterm_op, | ||||
|   get_longint_op, | ||||
|   put_longint_op, | ||||
|   get_string_op, | ||||
|   put_string_op, | ||||
|   get_bigint_op, | ||||
|   put_bigint_op, | ||||
|   get_list_op, | ||||
| @@ -55,6 +57,8 @@ typedef enum compiler_op { | ||||
|   write_dbterm_op, | ||||
|   unify_longint_op, | ||||
|   write_longint_op, | ||||
|   unify_string_op, | ||||
|   write_string_op, | ||||
|   unify_bigint_op, | ||||
|   write_bigint_op, | ||||
|   unify_list_op, | ||||
| @@ -76,6 +80,7 @@ typedef enum compiler_op { | ||||
|   unify_last_float_op, | ||||
|   unify_last_dbterm_op, | ||||
|   unify_last_longint_op, | ||||
|   unify_last_string_op, | ||||
|   unify_last_bigint_op, | ||||
|   ensure_space_op, | ||||
|   native_op, | ||||
| @@ -126,6 +131,7 @@ typedef enum compiler_op { | ||||
|   if_not_op, | ||||
|   index_dbref_op, | ||||
|   index_blob_op, | ||||
|   index_string_op, | ||||
|   index_long_op, | ||||
|   if_nonvar_op, | ||||
|   save_pair_op, | ||||
| @@ -182,6 +188,7 @@ typedef enum compiler_op { | ||||
|   fetch_args_for_bccall, | ||||
|   bccall_op, | ||||
|   blob_op, | ||||
|   string_op, | ||||
|   label_ctl_op | ||||
| #ifdef SFUNC | ||||
|   , | ||||
|   | ||||
| @@ -141,6 +141,7 @@ | ||||
| #define PredIs Yap_heap_regs->pred_is | ||||
| #define PredSafeCallCleanup Yap_heap_regs->pred_safe_call_cleanup | ||||
| #define PredRestoreRegs Yap_heap_regs->pred_restore_regs | ||||
| #define PredCommentHook Yap_heap_regs->pred_comment_hook | ||||
| #ifdef YAPOR | ||||
| #define PredGetwork Yap_heap_regs->pred_getwork | ||||
| #define PredGetworkSeq Yap_heap_regs->pred_getwork_seq | ||||
|   | ||||
| @@ -417,4 +417,6 @@ | ||||
| #define REMOTE_CurSlot(wid) REMOTE(wid)->CurSlot_ | ||||
| #define LOCAL_SourceModule LOCAL->SourceModule_ | ||||
| #define REMOTE_SourceModule(wid) REMOTE(wid)->SourceModule_ | ||||
| #define LOCAL_MAX_SIZE LOCAL->MAX_SIZE_ | ||||
| #define REMOTE_MAX_SIZE(wid) REMOTE(wid)->MAX_SIZE_ | ||||
|  | ||||
|   | ||||
							
								
								
									
										88
									
								
								H/eval.h
									
									
									
									
									
								
							
							
						
						
									
										88
									
								
								H/eval.h
									
									
									
									
									
								
							| @@ -233,6 +233,8 @@ ETypeOfTerm(Term t) | ||||
| } | ||||
|  | ||||
| #if USE_GMP | ||||
| char *Yap_mpz_to_string(MP_INT *b, char *s, size_t sz, int base); | ||||
|  | ||||
| Term  Yap_gmq_rdiv_int_int(Int, Int); | ||||
| Term  Yap_gmq_rdiv_int_big(Int, Term); | ||||
| Term  Yap_gmq_rdiv_big_int(Term, Int); | ||||
| @@ -345,28 +347,82 @@ __Yap_Mk64IntegerTerm(YAP_LONG_LONG i USES_REGS) | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| inline static int | ||||
| add_overflow(Int x, Int i, Int j) | ||||
| { | ||||
|   return ((i & j & ~x) | (~i & ~j & x)) < 0; | ||||
| } | ||||
| #if __clang__ && FALSE  /* not in OSX yet */ | ||||
| #define DO_ADD() if (__builtin_sadd_overflow( i1, i2, & z ) ) { goto overflow; } | ||||
| #endif | ||||
|  | ||||
| inline static Term | ||||
| add_int(Int i, Int j USES_REGS) | ||||
| { | ||||
|   Int x = i+j; | ||||
| #if USE_GMP | ||||
|   /* Integer overflow, we need to use big integers */ | ||||
|   Int overflow = (i & j & ~x) | (~i & ~j & x); | ||||
|   if (overflow < 0) { | ||||
|     return(Yap_gmp_add_ints(i, j)); | ||||
|   UInt w = (UInt)i+(UInt)j; | ||||
|   if (i > 0) { | ||||
|     if (j > 0 && (Int)w < 0) goto overflow; | ||||
|   } else { | ||||
|     if (j < 0 && (Int)w > 0) goto overflow; | ||||
|   } | ||||
| #endif | ||||
| #ifdef BEAM | ||||
|   RINT(x); | ||||
|   return( MkIntegerTerm (x)); | ||||
|   RINT( (Int)w); | ||||
|   /* Integer overflow, we need to use big integers */ | ||||
|  overflow: | ||||
|     return Yap_gmp_add_ints(i, j); | ||||
| #else | ||||
|   RINT(x); | ||||
|     RINT(i+j); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| static inline Term | ||||
| p_plus(Term t1, Term t2 USES_REGS) { | ||||
|   switch (ETypeOfTerm(t1)) { | ||||
|   case long_int_e: | ||||
|     switch (ETypeOfTerm(t2)) { | ||||
|     case long_int_e: | ||||
|       /* two integers */ | ||||
|       return add_int(IntegerOfTerm(t1),IntegerOfTerm(t2) PASS_REGS); | ||||
|     case double_e: | ||||
|       { | ||||
| 	/* integer, double */ | ||||
| 	Float fl1 = (Float)IntegerOfTerm(t1); | ||||
| 	Float fl2 = FloatOfTerm(t2); | ||||
| 	RFLOAT(fl1+fl2); | ||||
|       } | ||||
|     case big_int_e: | ||||
| #ifdef USE_GMP | ||||
|       return(Yap_gmp_add_int_big(IntegerOfTerm(t1), t2)); | ||||
| #endif | ||||
|     default: | ||||
|       RERROR(); | ||||
|     } | ||||
|   case double_e: | ||||
|     switch (ETypeOfTerm(t2)) { | ||||
|     case long_int_e: | ||||
|       /* float * integer */ | ||||
|       RFLOAT(FloatOfTerm(t1)+IntegerOfTerm(t2)); | ||||
|     case double_e: | ||||
|       RFLOAT(FloatOfTerm(t1)+FloatOfTerm(t2)); | ||||
|     case big_int_e: | ||||
| #ifdef USE_GMP | ||||
|       return Yap_gmp_add_float_big(FloatOfTerm(t1),t2); | ||||
| #endif | ||||
|     default: | ||||
|       RERROR(); | ||||
|     } | ||||
|   case big_int_e: | ||||
| #ifdef USE_GMP | ||||
|     switch (ETypeOfTerm(t2)) { | ||||
|     case long_int_e: | ||||
|       return Yap_gmp_add_int_big(IntegerOfTerm(t2), t1); | ||||
|     case big_int_e: | ||||
|       /* two bignums */ | ||||
|       return Yap_gmp_add_big_big(t1, t2); | ||||
|     case double_e: | ||||
|       return Yap_gmp_add_float_big(FloatOfTerm(t2),t1); | ||||
|     default: | ||||
|       RERROR(); | ||||
|     } | ||||
| #endif | ||||
|   default: | ||||
|     RERROR(); | ||||
|   } | ||||
|   RERROR(); | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										122
									
								
								H/findclause.h
									
									
									
									
									
								
							
							
						
						
									
										122
									
								
								H/findclause.h
									
									
									
									
									
								
							| @@ -29,7 +29,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cc.c1)) { | ||||
|           CELL *pt = RepAppl(cl->u.cc.c1); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cc.c1; | ||||
| 	  clause->ucd.t_ptr = cl->u.cc.c1; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cc.c1; | ||||
| 	return; | ||||
| @@ -38,7 +38,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cc.c2)) { | ||||
|           CELL *pt = RepAppl(cl->u.cc.c2); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cc.c2; | ||||
| 	  clause->ucd.t_ptr = cl->u.cc.c2; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cc.c2; | ||||
| 	return; | ||||
| @@ -50,7 +50,7 @@ | ||||
| 	if (IsApplTerm(cl->u.ccc.c1)) { | ||||
|           CELL *pt = RepAppl(cl->u.ccc.c1); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.ccc.c1; | ||||
| 	  clause->ucd.t_ptr = cl->u.ccc.c1; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.ccc.c1; | ||||
| 	return; | ||||
| @@ -59,7 +59,7 @@ | ||||
| 	if (IsApplTerm(cl->u.ccc.c2)) { | ||||
|           CELL *pt = RepAppl(cl->u.ccc.c2); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.ccc.c2; | ||||
| 	  clause->ucd.t_ptr = cl->u.ccc.c2; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.ccc.c2; | ||||
| 	return; | ||||
| @@ -68,7 +68,7 @@ | ||||
| 	if (IsApplTerm(cl->u.ccc.c3)) { | ||||
|           CELL *pt = RepAppl(cl->u.ccc.c3); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.ccc.c3; | ||||
| 	  clause->ucd.t_ptr = cl->u.ccc.c3; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.ccc.c3; | ||||
| 	return; | ||||
| @@ -80,7 +80,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cccc.c1)) { | ||||
|           CELL *pt = RepAppl(cl->u.cccc.c1); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cccc.c1; | ||||
| 	  clause->ucd.t_ptr = cl->u.cccc.c1; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cccc.c1; | ||||
| 	return; | ||||
| @@ -89,7 +89,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cccc.c2)) { | ||||
|           CELL *pt = RepAppl(cl->u.cccc.c2); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cccc.c2; | ||||
| 	  clause->ucd.t_ptr = cl->u.cccc.c2; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cccc.c2; | ||||
| 	return; | ||||
| @@ -98,7 +98,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cccc.c3)) { | ||||
|           CELL *pt = RepAppl(cl->u.cccc.c3); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cccc.c3; | ||||
| 	  clause->ucd.t_ptr = cl->u.cccc.c3; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cccc.c3; | ||||
| 	return; | ||||
| @@ -107,7 +107,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cccc.c4)) { | ||||
|           CELL *pt = RepAppl(cl->u.cccc.c4); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cccc.c4; | ||||
| 	  clause->ucd.t_ptr = cl->u.cccc.c4; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cccc.c4; | ||||
| 	return; | ||||
| @@ -119,7 +119,7 @@ | ||||
| 	if (IsApplTerm(cl->u.ccccc.c1)) { | ||||
|           CELL *pt = RepAppl(cl->u.ccccc.c1); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.ccccc.c1; | ||||
| 	  clause->ucd.t_ptr = cl->u.ccccc.c1; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.ccccc.c1; | ||||
| 	return; | ||||
| @@ -128,7 +128,7 @@ | ||||
| 	if (IsApplTerm(cl->u.ccccc.c2)) { | ||||
|           CELL *pt = RepAppl(cl->u.ccccc.c2); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.ccccc.c2; | ||||
| 	  clause->ucd.t_ptr = cl->u.ccccc.c2; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.ccccc.c2; | ||||
| 	return; | ||||
| @@ -137,7 +137,7 @@ | ||||
| 	if (IsApplTerm(cl->u.ccccc.c3)) { | ||||
|           CELL *pt = RepAppl(cl->u.ccccc.c3); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.ccccc.c3; | ||||
| 	  clause->ucd.t_ptr = cl->u.ccccc.c3; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.ccccc.c3; | ||||
| 	return; | ||||
| @@ -146,7 +146,7 @@ | ||||
| 	if (IsApplTerm(cl->u.ccccc.c4)) { | ||||
|           CELL *pt = RepAppl(cl->u.ccccc.c4); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.ccccc.c4; | ||||
| 	  clause->ucd.t_ptr = cl->u.ccccc.c4; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.ccccc.c4; | ||||
| 	return; | ||||
| @@ -155,7 +155,7 @@ | ||||
| 	if (IsApplTerm(cl->u.ccccc.c5)) { | ||||
|           CELL *pt = RepAppl(cl->u.ccccc.c5); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.ccccc.c5; | ||||
| 	  clause->ucd.t_ptr = cl->u.ccccc.c5; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.ccccc.c5; | ||||
| 	return; | ||||
| @@ -167,7 +167,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cccccc.c1)) { | ||||
|           CELL *pt = RepAppl(cl->u.cccccc.c1); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cccccc.c1; | ||||
| 	  clause->ucd.t_ptr = cl->u.cccccc.c1; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cccccc.c1; | ||||
| 	return; | ||||
| @@ -176,7 +176,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cccccc.c2)) { | ||||
|           CELL *pt = RepAppl(cl->u.cccccc.c2); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cccccc.c2; | ||||
| 	  clause->ucd.t_ptr = cl->u.cccccc.c2; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cccccc.c2; | ||||
| 	return; | ||||
| @@ -185,7 +185,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cccccc.c3)) { | ||||
|           CELL *pt = RepAppl(cl->u.cccccc.c3); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cccccc.c3; | ||||
| 	  clause->ucd.t_ptr = cl->u.cccccc.c3; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cccccc.c3; | ||||
| 	return; | ||||
| @@ -194,7 +194,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cccccc.c4)) { | ||||
|           CELL *pt = RepAppl(cl->u.cccccc.c4); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cccccc.c4; | ||||
| 	  clause->ucd.t_ptr = cl->u.cccccc.c4; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cccccc.c4; | ||||
| 	return; | ||||
| @@ -203,7 +203,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cccccc.c5)) { | ||||
|           CELL *pt = RepAppl(cl->u.cccccc.c5); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cccccc.c5; | ||||
| 	  clause->ucd.t_ptr = cl->u.cccccc.c5; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cccccc.c5; | ||||
| 	return; | ||||
| @@ -212,7 +212,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cccccc.c6)) { | ||||
|           CELL *pt = RepAppl(cl->u.cccccc.c6); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cccccc.c6; | ||||
| 	  clause->ucd.t_ptr = cl->u.cccccc.c6; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cccccc.c6; | ||||
| 	return; | ||||
| @@ -236,12 +236,12 @@ | ||||
| 	    CELL *pt = RepAppl(t); | ||||
|  | ||||
| 	    clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	    clause->u.c_sreg = pt; | ||||
| 	    clause->ucd.c_sreg = pt; | ||||
| 	  } else if (IsPairTerm(t)) { | ||||
| 	    CELL *pt = RepPair(t); | ||||
|  | ||||
| 	    clause->Tag = AbsPair(NULL); | ||||
| 	    clause->u.c_sreg = pt-1; | ||||
| 	    clause->ucd.c_sreg = pt-1; | ||||
| 	  } else { | ||||
| 	    clause->Tag = t; | ||||
| 	  } | ||||
| @@ -271,12 +271,12 @@ | ||||
| 	    CELL *pt = RepAppl(t); | ||||
|  | ||||
| 	    clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	    clause->u.c_sreg = pt; | ||||
| 	    clause->ucd.c_sreg = pt; | ||||
| 	  } else if (IsPairTerm(t)) { | ||||
| 	    CELL *pt = RepPair(t); | ||||
|  | ||||
| 	    clause->Tag = AbsPair(NULL); | ||||
| 	    clause->u.c_sreg = pt-1; | ||||
| 	    clause->ucd.c_sreg = pt-1; | ||||
| 	  } else { | ||||
| 	    clause->Tag = t; | ||||
| 	  } | ||||
| @@ -409,6 +409,12 @@ | ||||
|     case _unify_n_atoms_write: | ||||
|       cl = NEXTOP(cl,osc); | ||||
|       break; | ||||
|     case _unify_l_string: | ||||
|       cl = NEXTOP(cl,ou); | ||||
|       break; | ||||
|     case _unify_string: | ||||
|       cl = NEXTOP(cl,ou); | ||||
|       break; | ||||
|     case _save_appl_x: | ||||
|       if (!(nofregs = delete_regcopy(myregs, nofregs, cl->u.ox.x))) { | ||||
| 	clause->Tag = (CELL)NULL; | ||||
| @@ -643,7 +649,7 @@ | ||||
|     case _get_list: | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.x.x)) { | ||||
| 	clause->Tag = AbsPair(NULL); | ||||
| 	clause->u.WorkPC = NEXTOP(cl,x); | ||||
| 	clause->ucd.WorkPC = NEXTOP(cl,x); | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,x); | ||||
| @@ -682,7 +688,7 @@ | ||||
|     case _get_bigint: | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.xN.x)) { | ||||
| 	clause->Tag = AbsAppl((CELL *)FunctorBigInt); | ||||
| 	clause->u.t_ptr = (CELL)NULL; | ||||
| 	clause->ucd.t_ptr = (CELL)NULL; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xN); | ||||
| @@ -699,7 +705,7 @@ | ||||
| 	if (IsApplTerm(cl->u.xc.c)) { | ||||
|           CELL *pt = RepAppl(cl->u.xc.c); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.xc.c; | ||||
| 	  clause->ucd.t_ptr = cl->u.xc.c; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.xc.c; | ||||
| 	return; | ||||
| @@ -716,7 +722,7 @@ | ||||
|     case _get_float: | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.xd.x)) { | ||||
| 	clause->Tag = AbsAppl((CELL *)FunctorDouble); | ||||
| 	clause->u.t_ptr = AbsAppl(cl->u.xd.d); | ||||
| 	clause->ucd.t_ptr = AbsAppl(cl->u.xd.d); | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xd); | ||||
| @@ -731,7 +737,7 @@ | ||||
|     case _get_struct: | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.xfa.x)) { | ||||
| 	clause->Tag = AbsAppl((CELL *)cl->u.xfa.f); | ||||
| 	clause->u.WorkPC = NEXTOP(cl,xfa); | ||||
| 	clause->ucd.WorkPC = NEXTOP(cl,xfa); | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xfa); | ||||
| @@ -746,7 +752,7 @@ | ||||
|     case _get_longint: | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.xi.x)) { | ||||
| 	clause->Tag = AbsAppl((CELL *)FunctorLongInt); | ||||
| 	clause->u.t_ptr = AbsAppl(cl->u.xi.i); | ||||
| 	clause->ucd.t_ptr = AbsAppl(cl->u.xi.i); | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xi); | ||||
| @@ -765,7 +771,7 @@ | ||||
|       } | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.xl.x)) { | ||||
| 	clause->Tag = (_atom+1)*sizeof(CELL); | ||||
| 	clause->u.t_ptr = (CELL)NULL; | ||||
| 	clause->ucd.t_ptr = (CELL)NULL; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xl); | ||||
| @@ -777,7 +783,7 @@ | ||||
|       } | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.xl.x)) { | ||||
| 	clause->Tag = (_atomic+1)*sizeof(CELL); | ||||
| 	clause->u.t_ptr = (CELL)NULL; | ||||
| 	clause->ucd.t_ptr = (CELL)NULL; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xl); | ||||
| @@ -789,7 +795,7 @@ | ||||
|       } | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.xl.x)) { | ||||
| 	clause->Tag = (_compound+1)*sizeof(CELL); | ||||
| 	clause->u.t_ptr = (CELL)NULL; | ||||
| 	clause->ucd.t_ptr = (CELL)NULL; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xl); | ||||
| @@ -801,7 +807,7 @@ | ||||
|       } | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.xl.x)) { | ||||
| 	clause->Tag = AbsAppl((CELL *)FunctorDBRef); | ||||
| 	clause->u.t_ptr = (CELL)NULL; | ||||
| 	clause->ucd.t_ptr = (CELL)NULL; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xl); | ||||
| @@ -813,7 +819,7 @@ | ||||
|       } | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.xl.x)) { | ||||
| 	clause->Tag = AbsAppl((CELL *)FunctorDouble); | ||||
| 	clause->u.t_ptr = (CELL)NULL; | ||||
| 	clause->ucd.t_ptr = (CELL)NULL; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xl); | ||||
| @@ -825,7 +831,7 @@ | ||||
|       } | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.xl.x)) { | ||||
| 	clause->Tag = (_integer+1)*sizeof(CELL); | ||||
| 	clause->u.t_ptr = (CELL)NULL; | ||||
| 	clause->ucd.t_ptr = (CELL)NULL; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xl); | ||||
| @@ -844,7 +850,7 @@ | ||||
|       } | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.xl.x)) { | ||||
| 	clause->Tag = (_number+1)*sizeof(CELL); | ||||
| 	clause->u.t_ptr = (CELL)NULL; | ||||
| 	clause->ucd.t_ptr = (CELL)NULL; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xl); | ||||
| @@ -856,7 +862,7 @@ | ||||
|       } | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.xl.x)) { | ||||
| 	clause->Tag = (_primitive+1)*sizeof(CELL); | ||||
| 	clause->u.t_ptr = (CELL)NULL; | ||||
| 	clause->ucd.t_ptr = (CELL)NULL; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xl); | ||||
| @@ -868,11 +874,19 @@ | ||||
|       } | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.xl.x)) { | ||||
| 	clause->Tag = (_var+1)*sizeof(CELL); | ||||
| 	clause->u.t_ptr = (CELL)NULL; | ||||
| 	clause->ucd.t_ptr = (CELL)NULL; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xl); | ||||
|       break; | ||||
|     case _get_string: | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.xu.x)) { | ||||
| 	clause->Tag = AbsAppl((CELL *)FunctorString); | ||||
| 	clause->ucd.t_ptr = (CELL)NULL; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xu); | ||||
|       break; | ||||
|     case _get_x_val: | ||||
|       if (!(nofregs = link_regcopies(myregs, nofregs, cl->u.xx.xl, cl->u.xx.xr))) { | ||||
| 	clause->Tag = (CELL)NULL; | ||||
| @@ -890,7 +904,7 @@ | ||||
|     case _gl_void_valx: | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.xx.xl)) { | ||||
| 	clause->Tag = AbsPair(NULL); | ||||
| 	clause->u.WorkPC = cl; | ||||
| 	clause->ucd.WorkPC = cl; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xx); | ||||
| @@ -898,7 +912,7 @@ | ||||
|     case _gl_void_varx: | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.xx.xl)) { | ||||
| 	clause->Tag = AbsPair(NULL); | ||||
| 	clause->u.WorkPC = cl; | ||||
| 	clause->ucd.WorkPC = cl; | ||||
| 	return; | ||||
|       } | ||||
|       if (!(nofregs = delete_regcopy(myregs, nofregs, cl->u.xx.xr))) { | ||||
| @@ -910,7 +924,7 @@ | ||||
|     case _glist_valx: | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.xx.xl)) { | ||||
| 	clause->Tag = AbsPair(NULL); | ||||
| 	clause->u.WorkPC = cl; | ||||
| 	clause->ucd.WorkPC = cl; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xx); | ||||
| @@ -1146,7 +1160,7 @@ | ||||
|       } | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.yl.y)) { | ||||
| 	clause->Tag = (_atom+1)*sizeof(CELL); | ||||
| 	clause->u.t_ptr = (CELL)NULL; | ||||
| 	clause->ucd.t_ptr = (CELL)NULL; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,yl); | ||||
| @@ -1158,7 +1172,7 @@ | ||||
|       } | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.yl.y)) { | ||||
| 	clause->Tag = (_atomic+1)*sizeof(CELL); | ||||
| 	clause->u.t_ptr = (CELL)NULL; | ||||
| 	clause->ucd.t_ptr = (CELL)NULL; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,yl); | ||||
| @@ -1170,7 +1184,7 @@ | ||||
|       } | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.yl.y)) { | ||||
| 	clause->Tag = (_compound+1)*sizeof(CELL); | ||||
| 	clause->u.t_ptr = (CELL)NULL; | ||||
| 	clause->ucd.t_ptr = (CELL)NULL; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,yl); | ||||
| @@ -1182,7 +1196,7 @@ | ||||
|       } | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.yl.y)) { | ||||
| 	clause->Tag = AbsAppl((CELL *)FunctorDBRef); | ||||
| 	clause->u.t_ptr = (CELL)NULL; | ||||
| 	clause->ucd.t_ptr = (CELL)NULL; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,yl); | ||||
| @@ -1194,7 +1208,7 @@ | ||||
|       } | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.yl.y)) { | ||||
| 	clause->Tag = AbsAppl((CELL *)FunctorDouble); | ||||
| 	clause->u.t_ptr = (CELL)NULL; | ||||
| 	clause->ucd.t_ptr = (CELL)NULL; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,yl); | ||||
| @@ -1206,7 +1220,7 @@ | ||||
|       } | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.yl.y)) { | ||||
| 	clause->Tag = (_integer+1)*sizeof(CELL); | ||||
| 	clause->u.t_ptr = (CELL)NULL; | ||||
| 	clause->ucd.t_ptr = (CELL)NULL; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,yl); | ||||
| @@ -1225,7 +1239,7 @@ | ||||
|       } | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.yl.y)) { | ||||
| 	clause->Tag = (_number+1)*sizeof(CELL); | ||||
| 	clause->u.t_ptr = (CELL)NULL; | ||||
| 	clause->ucd.t_ptr = (CELL)NULL; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,yl); | ||||
| @@ -1237,7 +1251,7 @@ | ||||
|       } | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.yl.y)) { | ||||
| 	clause->Tag = (_primitive+1)*sizeof(CELL); | ||||
| 	clause->u.t_ptr = (CELL)NULL; | ||||
| 	clause->ucd.t_ptr = (CELL)NULL; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,yl); | ||||
| @@ -1249,7 +1263,7 @@ | ||||
|       } | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.yl.y)) { | ||||
| 	clause->Tag = (_var+1)*sizeof(CELL); | ||||
| 	clause->u.t_ptr = (CELL)NULL; | ||||
| 	clause->ucd.t_ptr = (CELL)NULL; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,yl); | ||||
| @@ -1271,7 +1285,7 @@ | ||||
|     case _gl_void_valy: | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.yx.y)) { | ||||
| 	clause->Tag = AbsPair(NULL); | ||||
| 	clause->u.WorkPC = cl; | ||||
| 	clause->ucd.WorkPC = cl; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,yx); | ||||
| @@ -1279,7 +1293,7 @@ | ||||
|     case _gl_void_vary: | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.yx.y)) { | ||||
| 	clause->Tag = AbsPair(NULL); | ||||
| 	clause->u.WorkPC = cl; | ||||
| 	clause->ucd.WorkPC = cl; | ||||
| 	return; | ||||
|       } | ||||
|       if (!(nofregs = delete_regcopy(myregs, nofregs, cl->u.yx.y))) { | ||||
| @@ -1291,7 +1305,7 @@ | ||||
|     case _glist_valy: | ||||
|       if (is_regcopy(myregs, nofregs, cl->u.yx.x)) { | ||||
| 	clause->Tag = AbsPair(NULL); | ||||
| 	clause->u.WorkPC = cl; | ||||
| 	clause->ucd.WorkPC = cl; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,yx); | ||||
|   | ||||
| @@ -17,7 +17,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cc.c1)) { | ||||
|           CELL *pt = RepAppl(cl->u.cc.c1); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cc.c1; | ||||
| 	  clause->ucd.t_ptr = cl->u.cc.c1; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cc.c1; | ||||
| 	return; | ||||
| @@ -26,7 +26,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cc.c2)) { | ||||
|           CELL *pt = RepAppl(cl->u.cc.c2); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cc.c2; | ||||
| 	  clause->ucd.t_ptr = cl->u.cc.c2; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cc.c2; | ||||
| 	return; | ||||
| @@ -38,7 +38,7 @@ | ||||
| 	if (IsApplTerm(cl->u.ccc.c1)) { | ||||
|           CELL *pt = RepAppl(cl->u.ccc.c1); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.ccc.c1; | ||||
| 	  clause->ucd.t_ptr = cl->u.ccc.c1; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.ccc.c1; | ||||
| 	return; | ||||
| @@ -47,7 +47,7 @@ | ||||
| 	if (IsApplTerm(cl->u.ccc.c2)) { | ||||
|           CELL *pt = RepAppl(cl->u.ccc.c2); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.ccc.c2; | ||||
| 	  clause->ucd.t_ptr = cl->u.ccc.c2; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.ccc.c2; | ||||
| 	return; | ||||
| @@ -56,7 +56,7 @@ | ||||
| 	if (IsApplTerm(cl->u.ccc.c3)) { | ||||
|           CELL *pt = RepAppl(cl->u.ccc.c3); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.ccc.c3; | ||||
| 	  clause->ucd.t_ptr = cl->u.ccc.c3; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.ccc.c3; | ||||
| 	return; | ||||
| @@ -68,7 +68,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cccc.c1)) { | ||||
|           CELL *pt = RepAppl(cl->u.cccc.c1); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cccc.c1; | ||||
| 	  clause->ucd.t_ptr = cl->u.cccc.c1; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cccc.c1; | ||||
| 	return; | ||||
| @@ -77,7 +77,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cccc.c2)) { | ||||
|           CELL *pt = RepAppl(cl->u.cccc.c2); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cccc.c2; | ||||
| 	  clause->ucd.t_ptr = cl->u.cccc.c2; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cccc.c2; | ||||
| 	return; | ||||
| @@ -86,7 +86,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cccc.c3)) { | ||||
|           CELL *pt = RepAppl(cl->u.cccc.c3); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cccc.c3; | ||||
| 	  clause->ucd.t_ptr = cl->u.cccc.c3; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cccc.c3; | ||||
| 	return; | ||||
| @@ -95,7 +95,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cccc.c4)) { | ||||
|           CELL *pt = RepAppl(cl->u.cccc.c4); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cccc.c4; | ||||
| 	  clause->ucd.t_ptr = cl->u.cccc.c4; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cccc.c4; | ||||
| 	return; | ||||
| @@ -107,7 +107,7 @@ | ||||
| 	if (IsApplTerm(cl->u.ccccc.c1)) { | ||||
|           CELL *pt = RepAppl(cl->u.ccccc.c1); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.ccccc.c1; | ||||
| 	  clause->ucd.t_ptr = cl->u.ccccc.c1; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.ccccc.c1; | ||||
| 	return; | ||||
| @@ -116,7 +116,7 @@ | ||||
| 	if (IsApplTerm(cl->u.ccccc.c2)) { | ||||
|           CELL *pt = RepAppl(cl->u.ccccc.c2); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.ccccc.c2; | ||||
| 	  clause->ucd.t_ptr = cl->u.ccccc.c2; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.ccccc.c2; | ||||
| 	return; | ||||
| @@ -125,7 +125,7 @@ | ||||
| 	if (IsApplTerm(cl->u.ccccc.c3)) { | ||||
|           CELL *pt = RepAppl(cl->u.ccccc.c3); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.ccccc.c3; | ||||
| 	  clause->ucd.t_ptr = cl->u.ccccc.c3; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.ccccc.c3; | ||||
| 	return; | ||||
| @@ -134,7 +134,7 @@ | ||||
| 	if (IsApplTerm(cl->u.ccccc.c4)) { | ||||
|           CELL *pt = RepAppl(cl->u.ccccc.c4); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.ccccc.c4; | ||||
| 	  clause->ucd.t_ptr = cl->u.ccccc.c4; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.ccccc.c4; | ||||
| 	return; | ||||
| @@ -143,7 +143,7 @@ | ||||
| 	if (IsApplTerm(cl->u.ccccc.c5)) { | ||||
|           CELL *pt = RepAppl(cl->u.ccccc.c5); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.ccccc.c5; | ||||
| 	  clause->ucd.t_ptr = cl->u.ccccc.c5; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.ccccc.c5; | ||||
| 	return; | ||||
| @@ -155,7 +155,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cccccc.c1)) { | ||||
|           CELL *pt = RepAppl(cl->u.cccccc.c1); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cccccc.c1; | ||||
| 	  clause->ucd.t_ptr = cl->u.cccccc.c1; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cccccc.c1; | ||||
| 	return; | ||||
| @@ -164,7 +164,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cccccc.c2)) { | ||||
|           CELL *pt = RepAppl(cl->u.cccccc.c2); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cccccc.c2; | ||||
| 	  clause->ucd.t_ptr = cl->u.cccccc.c2; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cccccc.c2; | ||||
| 	return; | ||||
| @@ -173,7 +173,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cccccc.c3)) { | ||||
|           CELL *pt = RepAppl(cl->u.cccccc.c3); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cccccc.c3; | ||||
| 	  clause->ucd.t_ptr = cl->u.cccccc.c3; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cccccc.c3; | ||||
| 	return; | ||||
| @@ -182,7 +182,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cccccc.c4)) { | ||||
|           CELL *pt = RepAppl(cl->u.cccccc.c4); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cccccc.c4; | ||||
| 	  clause->ucd.t_ptr = cl->u.cccccc.c4; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cccccc.c4; | ||||
| 	return; | ||||
| @@ -191,7 +191,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cccccc.c5)) { | ||||
|           CELL *pt = RepAppl(cl->u.cccccc.c5); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cccccc.c5; | ||||
| 	  clause->ucd.t_ptr = cl->u.cccccc.c5; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cccccc.c5; | ||||
| 	return; | ||||
| @@ -200,7 +200,7 @@ | ||||
| 	if (IsApplTerm(cl->u.cccccc.c6)) { | ||||
|           CELL *pt = RepAppl(cl->u.cccccc.c6); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.cccccc.c6; | ||||
| 	  clause->ucd.t_ptr = cl->u.cccccc.c6; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.cccccc.c6; | ||||
| 	return; | ||||
| @@ -222,15 +222,15 @@ | ||||
| 	 | ||||
| 	    clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	    if (IsExtensionFunctor(FunctorOfTerm(t))) { | ||||
| 	      clause->u.t_ptr = t; | ||||
| 	      clause->ucd.t_ptr = t; | ||||
| 	    } else { | ||||
| 	      clause->u.c_sreg = pt; | ||||
| 	      clause->ucd.c_sreg = pt; | ||||
| 	    } | ||||
| 	  } else if (IsPairTerm(t)) { | ||||
| 	    CELL *pt = RepPair(t); | ||||
|  | ||||
| 	    clause->Tag = AbsPair(NULL); | ||||
| 	    clause->u.c_sreg = pt-1; | ||||
| 	    clause->ucd.c_sreg = pt-1; | ||||
| 	  } else { | ||||
| 	    clause->Tag = t; | ||||
| 	  } | ||||
| @@ -257,15 +257,15 @@ | ||||
| 	 | ||||
| 	    clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	    if (IsExtensionFunctor(FunctorOfTerm(t))) { | ||||
| 	      clause->u.t_ptr = t; | ||||
| 	      clause->ucd.t_ptr = t; | ||||
| 	    } else { | ||||
| 	      clause->u.c_sreg = pt; | ||||
| 	      clause->ucd.c_sreg = pt; | ||||
| 	    } | ||||
| 	  } else if (IsPairTerm(t)) { | ||||
| 	    CELL *pt = RepPair(t); | ||||
|  | ||||
| 	    clause->Tag = AbsPair(NULL); | ||||
| 	    clause->u.c_sreg = pt-1; | ||||
| 	    clause->ucd.c_sreg = pt-1; | ||||
| 	  } else { | ||||
| 	    clause->Tag = t; | ||||
| 	  } | ||||
| @@ -376,6 +376,12 @@ | ||||
|     case _unify_n_atoms_write: | ||||
|       cl = NEXTOP(cl,osc); | ||||
|       break; | ||||
|     case _unify_l_string: | ||||
|       cl = NEXTOP(cl,ou); | ||||
|       break; | ||||
|     case _unify_string: | ||||
|       cl = NEXTOP(cl,ou); | ||||
|       break; | ||||
|     case _save_appl_x: | ||||
|       if (iarg == cl->u.ox.x) { | ||||
| 	clause->Tag = (CELL)NULL; | ||||
| @@ -554,7 +560,7 @@ | ||||
|     case _get_list: | ||||
|       if (iarg == cl->u.x.x) { | ||||
| 	clause->Tag = AbsPair(NULL); | ||||
| 	clause->u.WorkPC = NEXTOP(cl,x); | ||||
| 	clause->ucd.WorkPC = NEXTOP(cl,x); | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,x); | ||||
| @@ -576,7 +582,7 @@ | ||||
|     case _get_bigint: | ||||
|       if (iarg == cl->u.xN.x) { | ||||
| 	clause->Tag = AbsAppl((CELL *)FunctorBigInt); | ||||
| 	clause->u.t_ptr = (CELL)NULL; | ||||
| 	clause->ucd.t_ptr = (CELL)NULL; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xN); | ||||
| @@ -593,7 +599,7 @@ | ||||
| 	if (IsApplTerm(cl->u.xc.c)) { | ||||
|           CELL *pt = RepAppl(cl->u.xc.c); | ||||
| 	  clause->Tag = AbsAppl((CELL *)pt[0]); | ||||
| 	  clause->u.t_ptr = cl->u.xc.c; | ||||
| 	  clause->ucd.t_ptr = cl->u.xc.c; | ||||
| 	} else | ||||
| 	  clause->Tag = cl->u.xc.c; | ||||
| 	return; | ||||
| @@ -610,7 +616,7 @@ | ||||
|     case _get_float: | ||||
|       if (iarg == cl->u.xd.x) { | ||||
| 	clause->Tag = AbsAppl((CELL *)FunctorDouble); | ||||
| 	clause->u.t_ptr = AbsAppl(cl->u.xd.d); | ||||
| 	clause->ucd.t_ptr = AbsAppl(cl->u.xd.d); | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xd); | ||||
| @@ -625,7 +631,7 @@ | ||||
|     case _get_struct: | ||||
|       if (iarg == cl->u.xfa.x) { | ||||
| 	clause->Tag = AbsAppl((CELL *)cl->u.xfa.f); | ||||
| 	clause->u.WorkPC = NEXTOP(cl,xfa); | ||||
| 	clause->ucd.WorkPC = NEXTOP(cl,xfa); | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xfa); | ||||
| @@ -640,7 +646,7 @@ | ||||
|     case _get_longint: | ||||
|       if (iarg == cl->u.xi.x) { | ||||
| 	clause->Tag = AbsAppl((CELL *)FunctorLongInt); | ||||
| 	clause->u.t_ptr = AbsAppl(cl->u.xi.i); | ||||
| 	clause->ucd.t_ptr = AbsAppl(cl->u.xi.i); | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xi); | ||||
| @@ -652,6 +658,14 @@ | ||||
|       } | ||||
|       cl = NEXTOP(cl,xi); | ||||
|       break; | ||||
|     case _get_string: | ||||
|       if (iarg == cl->u.xu.x) { | ||||
| 	clause->Tag = AbsAppl((CELL *)FunctorString); | ||||
| 	clause->ucd.t_ptr = (CELL)NULL; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xu); | ||||
|       break; | ||||
|     case _get_x_val: | ||||
|       if (cl->u.xx.xl == iarg || | ||||
|         cl->u.xx.xr == iarg) { | ||||
| @@ -671,7 +685,7 @@ | ||||
|     case _gl_void_valx: | ||||
|       if (iarg == cl->u.xx.xl) { | ||||
| 	clause->Tag = AbsPair(NULL); | ||||
| 	clause->u.WorkPC = cl; | ||||
| 	clause->ucd.WorkPC = cl; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xx); | ||||
| @@ -679,7 +693,7 @@ | ||||
|     case _gl_void_varx: | ||||
|       if (iarg == cl->u.xx.xl) { | ||||
| 	clause->Tag = AbsPair(NULL); | ||||
| 	clause->u.WorkPC = cl; | ||||
| 	clause->ucd.WorkPC = cl; | ||||
| 	return; | ||||
|       } | ||||
|       if (iarg == cl->u.xx.xr) { | ||||
| @@ -691,7 +705,7 @@ | ||||
|     case _glist_valx: | ||||
|       if (iarg == cl->u.xx.xl) { | ||||
| 	clause->Tag = AbsPair(NULL); | ||||
| 	clause->u.WorkPC = cl; | ||||
| 	clause->ucd.WorkPC = cl; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,xx); | ||||
| @@ -751,7 +765,7 @@ | ||||
|     case _glist_valy: | ||||
|       if (iarg == cl->u.yx.x) { | ||||
| 	clause->Tag = AbsPair(NULL); | ||||
| 	clause->u.WorkPC = cl; | ||||
| 	clause->ucd.WorkPC = cl; | ||||
| 	return; | ||||
|       } | ||||
|       cl = NEXTOP(cl,yx); | ||||
|   | ||||
| @@ -45,7 +45,7 @@ | ||||
| #endif | ||||
|  | ||||
| /* is ptr a pointer to the heap? */ | ||||
| #define ONHEAP(ptr) (CellPtr(ptr) >= H0  && CellPtr(ptr) < H) | ||||
| #define ONHEAP(ptr) (CellPtr(ptr) >= H0  && CellPtr(ptr) < HR) | ||||
|  | ||||
| /* is ptr a pointer to code space? */ | ||||
| #if USE_SYSTEM_MALLOC | ||||
|   | ||||
| @@ -235,4 +235,5 @@ typedef struct worker_local { | ||||
|  | ||||
|   Int  CurSlot_; | ||||
|   Term  SourceModule_; | ||||
|   size_t  MAX_SIZE_; | ||||
| } w_local; | ||||
|   | ||||
| @@ -141,6 +141,7 @@ | ||||
|   struct pred_entry  *pred_is; | ||||
|   struct pred_entry  *pred_safe_call_cleanup; | ||||
|   struct pred_entry  *pred_restore_regs; | ||||
|   struct pred_entry  *pred_comment_hook; | ||||
| #ifdef YAPOR | ||||
|   struct pred_entry  *pred_getwork; | ||||
|   struct pred_entry  *pred_getwork_seq; | ||||
|   | ||||
| @@ -34,6 +34,7 @@ | ||||
|   AtomBatched = Yap_LookupAtom("batched"); | ||||
|   AtomBetween = Yap_LookupAtom("between"); | ||||
|   AtomHugeInt = Yap_LookupAtom("huge_int"); | ||||
|   AtomBigNum = Yap_LookupAtom("big_num"); | ||||
|   AtomBinaryStream = Yap_LookupAtom("binary_stream"); | ||||
|   AtomBraces = Yap_LookupAtom("{}"); | ||||
|   AtomBreak = Yap_FullLookupAtom("$break"); | ||||
| @@ -53,7 +54,9 @@ | ||||
|   AtomColomn = Yap_LookupAtom(":"); | ||||
|   AtomCodeSpace = Yap_LookupAtom("code_space"); | ||||
|   AtomCodes = Yap_LookupAtom("codes"); | ||||
|   AtomCoInductive = Yap_LookupAtom("coinductive"); | ||||
|   AtomComma = Yap_LookupAtom(","); | ||||
|   AtomCommentHook = Yap_LookupAtom("comment_hook"); | ||||
|   AtomCompound = Yap_LookupAtom("compound"); | ||||
|   AtomConsistencyError = Yap_LookupAtom("consistency_error"); | ||||
|   AtomConsultOnBoot = Yap_FullLookupAtom("$consult_on_boot"); | ||||
| @@ -296,6 +299,7 @@ | ||||
|   AtomStreamPos = Yap_FullLookupAtom("$stream_position"); | ||||
|   AtomStreamPosition = Yap_LookupAtom("stream_position"); | ||||
|   AtomString = Yap_LookupAtom("string"); | ||||
|   AtomSTRING = Yap_FullLookupAtom("String"); | ||||
|   AtomSwi = Yap_LookupAtom("swi"); | ||||
|   AtomSyntaxError = Yap_LookupAtom("syntax_error"); | ||||
|   AtomSyntaxErrorHandler = Yap_LookupAtom("syntax_error_handler"); | ||||
| @@ -305,6 +309,7 @@ | ||||
|   AtomTerm = Yap_LookupAtom("term"); | ||||
|   AtomTerms = Yap_LookupAtom("terms"); | ||||
|   AtomTermExpansion = Yap_LookupAtom("term_expansion"); | ||||
|   AtomText = Yap_LookupAtom("text"); | ||||
|   AtomTextStream = Yap_LookupAtom("text_stream"); | ||||
|   AtomThreads = Yap_LookupAtom("threads"); | ||||
|   AtomThrow = Yap_LookupAtom("throw"); | ||||
| @@ -358,6 +363,7 @@ | ||||
|   FunctorClist = Yap_MkFunctor(AtomWhen,4); | ||||
|   FunctorCodes = Yap_MkFunctor(AtomCodes,2); | ||||
|   FunctorComma = Yap_MkFunctor(AtomComma,2); | ||||
|   FunctorCommentHook = Yap_MkFunctor(AtomCommentHook,3); | ||||
|   FunctorContext2 = Yap_MkFunctor(AtomContext,2); | ||||
|   FunctorConsistencyError = Yap_MkFunctor(AtomConsistencyError,1); | ||||
|   FunctorCreep = Yap_MkFunctor(AtomCreep,1); | ||||
|   | ||||
| @@ -141,6 +141,7 @@ | ||||
|   PredIs = RepPredProp(PredPropByFunc(FunctorIs,PROLOG_MODULE)); | ||||
|   PredSafeCallCleanup = RepPredProp(PredPropByFunc(FunctorSafeCallCleanup,PROLOG_MODULE)); | ||||
|   PredRestoreRegs = RepPredProp(PredPropByFunc(FunctorRestoreRegs,PROLOG_MODULE)); | ||||
|   PredCommentHook = RepPredProp(PredPropByFunc(FunctorCommentHook,PROLOG_MODULE)); | ||||
| #ifdef YAPOR | ||||
|   PredGetwork = RepPredProp(PredPropByAtom(AtomGetwork,PROLOG_MODULE)); | ||||
|   PredGetworkSeq = RepPredProp(PredPropByAtom(AtomGetworkSeq,PROLOG_MODULE)); | ||||
|   | ||||
| @@ -235,4 +235,5 @@ static void InitWorker(int wid) { | ||||
|  | ||||
|   REMOTE_CurSlot(wid) = 0; | ||||
|   REMOTE_SourceModule(wid) = 0; | ||||
|   REMOTE_MAX_SIZE(wid) = 1024L; | ||||
| } | ||||
|   | ||||
| @@ -47,7 +47,7 @@ typedef struct StructClauseDef { | ||||
|     yamop *WorkPC;		/* start of code for clause */ | ||||
|     Term   t_ptr; | ||||
|     CELL  *c_sreg; | ||||
|   } u; | ||||
|   } ucd; | ||||
| } ClauseDef; | ||||
|  | ||||
|  | ||||
| @@ -70,7 +70,7 @@ typedef struct { | ||||
|   union { | ||||
|     UInt  Label; | ||||
|     yamop *labp; | ||||
|   } u; | ||||
|   } u_a; | ||||
| } AtomSwiEntry; | ||||
|  | ||||
| /* switch_on_func */ | ||||
| @@ -79,7 +79,7 @@ typedef struct { | ||||
|   union { | ||||
|     UInt  Label; | ||||
|     yamop *labp; | ||||
|   } u; | ||||
|   } u_f; | ||||
| } FuncSwiEntry; | ||||
|  | ||||
| /* switch_on_type */ | ||||
| @@ -116,7 +116,7 @@ typedef struct { | ||||
|       ClauseUnion *block; | ||||
|       yamop **entry_code; | ||||
|     } cle; | ||||
|   } u; | ||||
|   } uip; | ||||
| } path_stack_entry; | ||||
|  | ||||
| #define MAX_ISTACK_DEPTH 32 | ||||
|   | ||||
| @@ -54,3 +54,4 @@ typedef int (*GetsFunc)(int, UInt, char *); | ||||
| void Yap_InitStdStreams(void); | ||||
| Term Yap_StreamPosition(struct io_stream *); | ||||
| void Yap_InitPlIO(void); | ||||
|  | ||||
|   | ||||
							
								
								
									
										39
									
								
								H/pl-incl.h
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								H/pl-incl.h
									
									
									
									
									
								
							| @@ -34,7 +34,7 @@ | ||||
| /* include all stuff that is exported to yap */ | ||||
| #include "pl-shared.h" | ||||
|  | ||||
| #define PLVERSION YAP_VERSION | ||||
| #define PLVERSION YAP_NUMERIC_VERSION | ||||
| #define PLNAME "yap" | ||||
|  | ||||
| #define SWIP "swi_" | ||||
| @@ -59,14 +59,6 @@ typedef struct pred_entry *      Procedure;      /* predicate */ | ||||
| #undef H | ||||
| #endif | ||||
|  | ||||
| // used by swi | ||||
| #ifdef SIZEOF_INT_P | ||||
| #define SIZEOF_VOIDP SIZEOF_INT_P | ||||
| #define SIZEOF_LONG  SIZEOF_LONG_INT | ||||
| #else | ||||
| bad config | ||||
| #endif | ||||
|  | ||||
| /* swi code called from pl-incl.h */ | ||||
| /* should have messages here */ | ||||
| #ifdef  DEBUG | ||||
| @@ -511,7 +503,6 @@ typedef struct wakeup_state | ||||
| Defining built-in predicates using the new interface  | ||||
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | ||||
|  | ||||
| #define EOS '\0' | ||||
| #define ESC			((char) 27) | ||||
| #define streq(s, q)		((strcmp((s), (q)) == 0)) | ||||
|  | ||||
| @@ -574,6 +565,7 @@ extern void PL_cleanup_fork(void); | ||||
| extern int PL_rethrow(void); | ||||
| extern void PL_get_number(term_t l, number *n); | ||||
| extern int PL_unify_atomic(term_t t, PL_atomic_t a); | ||||
| extern int PL_unify_termv(term_t l, va_list args); | ||||
| extern int _PL_unify_atomic(term_t t, PL_atomic_t a); | ||||
| extern int _PL_unify_string(term_t t, word w); | ||||
|  | ||||
| @@ -726,7 +718,6 @@ extern atom_t	lookupUCSAtom(const pl_wchar_t *s, size_t len); | ||||
| extern int toIntegerNumber(Number n, int flags); | ||||
| extern int get_atom_ptr_text(Atom a, PL_chars_t *text); | ||||
| extern int warning(const char *fm, ...); | ||||
| extern int raiseSignal(PL_local_data_t *ld, int sig); | ||||
|  | ||||
| /**** stuff from pl-files.c ****/ | ||||
| void initFiles(void); | ||||
| @@ -884,6 +875,32 @@ extern void unallocStream(IOSTREAM *s); | ||||
| extern atom_t accessLevel(void); | ||||
| int currentBreakLevel(void); | ||||
|  | ||||
| #ifdef __WINDOWS__ | ||||
| int hasConsole(void); | ||||
| int PL_wait_for_console_input(void *handle); | ||||
| void PlMessage(const char *fm, ...); | ||||
| const char *WinError(void); | ||||
| word pl_win_exec(term_t cmd, term_t how); | ||||
| foreign_t pl_win_module_file(term_t module, term_t file); | ||||
|  | ||||
| #ifdef EMULATE_DLOPEN | ||||
| 	/* file is in UTF-8, POSIX path */ | ||||
| void *dlopen(const char *file, int flags); | ||||
| const char *dlerror(void); | ||||
| void *dlsym(void *handle, char *symbol); | ||||
| int dlclose(void *handle); | ||||
| #endif | ||||
|  | ||||
| int ms_snprintf(char *buffer, size_t count, const char *fmt, ...); | ||||
| void getDefaultsFromRegistry(void); | ||||
|  | ||||
| DWORD RunSilent(const char* strCommand); | ||||
| FILE *pt_popen(const char *cmd, const char *mode); | ||||
| int pt_pclose(FILE *fd); | ||||
|  | ||||
| int PL_w32thread_raise(DWORD id, int sig); | ||||
| #endif | ||||
|  | ||||
| extern const PL_extension PL_predicates_from_ctype[]; | ||||
| extern const PL_extension PL_predicates_from_file[]; | ||||
| extern const PL_extension PL_predicates_from_files[]; | ||||
|   | ||||
| @@ -56,7 +56,7 @@ | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #include <SWI-Stream.h> | ||||
| #include <SWI-Prolog.h> | ||||
|  | ||||
| #define COMMON(X) extern X | ||||
| @@ -128,7 +128,7 @@ typedef int bool; | ||||
|  | ||||
| typedef struct redir_context | ||||
| { int		magic;			/* REDIR_MAGIC */ | ||||
|   IOSTREAM     *stream;			/* temporary output */ | ||||
|   struct io_stream     *stream;			/* temporary output */ | ||||
|   int		is_stream;		/* redirect to stream */ | ||||
|   int		redirected;		/* output is redirected */ | ||||
|   term_t	term;			/* redirect target */ | ||||
| @@ -141,6 +141,8 @@ typedef struct redir_context | ||||
|  | ||||
| #include "pl-file.h" | ||||
|  | ||||
| #define EOS '\0' | ||||
|  | ||||
| 		/******************************** | ||||
| 		*       HASH TABLES             * | ||||
| 		*********************************/ | ||||
| @@ -262,9 +264,32 @@ getUnknownModule(module_t m); | ||||
|  | ||||
| COMMON(int)		debugmode(debug_type new, debug_type *old); | ||||
| COMMON(int)		tracemode(debug_type new, debug_type *old); | ||||
| COMMON(void)		Yap_setCurrentSourceLocation(IOSTREAM **s); | ||||
| COMMON(void)		Yap_setCurrentSourceLocation( void *rd ); | ||||
|  | ||||
| extern int raiseSignal(PL_local_data_t *ld, int sig); | ||||
|  | ||||
| #ifdef YATOM_H | ||||
|  | ||||
| static inline atom_t | ||||
| AtomToSWIAtom(Atom at) | ||||
| { | ||||
|   TranslationEntry *p; | ||||
|  | ||||
|   if ((p = Yap_GetTranslationProp(at)) != NULL) | ||||
|     return (atom_t)(p->Translation*2+1); | ||||
|   return (atom_t)at; | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| static inline Atom | ||||
| SWIAtomToAtom(atom_t at) | ||||
| { | ||||
|   if ((CELL)at & 1) | ||||
|     return SWI_Atoms[at/2]; | ||||
|   return (Atom)at; | ||||
| } | ||||
|  | ||||
| #define SWIAtomToAtom(X) SWI_Atoms[(X)>>1] | ||||
| Atom                  YAP_AtomFromSWIAtom(atom_t at); | ||||
| atom_t                YAP_SWIAtomFromAtom(Atom at); | ||||
|  | ||||
| @@ -273,7 +298,7 @@ atom_t                YAP_SWIAtomFromAtom(Atom at); | ||||
| static inline Functor | ||||
| SWIFunctorToFunctor(functor_t f) | ||||
| { | ||||
|   if ((CELL)(f) & 2 && ((CELL)f) < N_SWI_FUNCTORS*4+2) | ||||
|   if (((CELL)(f) & 2) && ((CELL)f) < N_SWI_FUNCTORS*4+2) | ||||
|     return SWI_Functors[((CELL)f)/4]; | ||||
|   return (Functor)f; | ||||
| } | ||||
| @@ -284,14 +309,14 @@ OpenList(int n USES_REGS) | ||||
|   Term t; | ||||
|   BACKUP_H(); | ||||
|  | ||||
|   while (H+2*n > ASP-1024) { | ||||
|   while (HR+2*n > ASP-1024) { | ||||
|     if (!Yap_dogc( 0, NULL PASS_REGS )) { | ||||
|       RECOVER_H(); | ||||
|       return FALSE; | ||||
|     } | ||||
|   } | ||||
|   t = AbsPair(H); | ||||
|   H += 2*n; | ||||
|   t = AbsPair(HR); | ||||
|   HR += 2*n; | ||||
|  | ||||
|   RECOVER_H(); | ||||
|   return t; | ||||
|   | ||||
| @@ -34,8 +34,9 @@ extern Int     Yap_GetCurrentPredArity(void); | ||||
| extern term_t Yap_fetch_module_for_format(term_t args, Term *modp); | ||||
| extern IOENC Yap_DefaultEncoding(void); | ||||
| extern void Yap_SetDefaultEncoding(IOENC); | ||||
| extern void Yap_setCurrentSourceLocation(IOSTREAM **s); | ||||
| extern void Yap_setCurrentSourceLocation( void *rd ); | ||||
| extern void   *Yap_GetStreamHandle(Atom at); | ||||
| extern void	Yap_WriteAtom(IOSTREAM *s, Atom atom); | ||||
|  | ||||
| extern atom_t codeToAtom(int chrcode); | ||||
|  | ||||
| @@ -124,7 +125,7 @@ void PL_license(const char *license, const char *module); | ||||
|  | ||||
| #define stringAtom(w)	(YAP_AtomFromSWIAtom(w)->StrOfAE) | ||||
| #define isInteger(A) (!IsVarTerm(A) && ( IsIntegerTerm((A)) || YAP_IsBigNumTerm((A)) )) | ||||
| #define isString(A) (!IsVarTerm(A) && Yap_IsStringTerm(A) ) | ||||
| #define isString(A) (!IsVarTerm(A) && IsStringTerm(A) ) | ||||
| #define isAtom(A) (!IsVarTerm(A) && IsAtomTerm((A)) ) | ||||
| #define isList(A) (!IsVarTerm(A) && IsPairTerm((A)) ) | ||||
| #define isNil(A) ((A) == TermNil) | ||||
| @@ -133,7 +134,7 @@ void PL_license(const char *license, const char *module); | ||||
| #define isVar(A) IsVarTerm((A)) | ||||
| #define valReal(w) FloatOfTerm((w)) | ||||
| #define valFloat(w) FloatOfTerm((w)) | ||||
| #define atomValue(atom) YAP_AtomFromSWIAtom(atom) | ||||
| #define atomValue(atom) AtomOfTerm(atom) | ||||
| #define atomFromTerm(term) YAP_SWIAtomFromAtom(AtomOfTerm(term)) | ||||
|  | ||||
| inline static char * | ||||
| @@ -184,7 +185,7 @@ charCode(Term w) | ||||
| 	return -1; | ||||
|       } | ||||
|       if (strlen(a->StrOfAE) == 1) | ||||
| 	return a->StrOfAE[0]; | ||||
| 	return ((unsigned char *)(a->StrOfAE))[0]; | ||||
|       return -1; | ||||
|     } | ||||
|   return -1; | ||||
|   | ||||
							
								
								
									
										9
									
								
								H/qly.h
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								H/qly.h
									
									
									
									
									
								
							| @@ -56,7 +56,7 @@ typedef struct export_pred_entry_hash_entry_struct { | ||||
|   union { | ||||
|     Functor f; | ||||
|     Atom a; | ||||
|   } u; | ||||
|   } u_af; | ||||
|   Atom module; | ||||
|   UInt arity; | ||||
| } export_pred_entry_hash_entry_t; | ||||
| @@ -102,15 +102,14 @@ typedef enum { | ||||
| } qlf_tag_t; | ||||
|  | ||||
| #define STATIC_PRED_FLAGS (SourcePredFlag|DynamicPredFlag|LogUpdatePredFlag|CompiledPredFlag|MultiFileFlag|TabledPredFlag|MegaClausePredFlag|CountPredFlag|ProfiledPredFlag|ThreadLocalPredFlag|AtomDBPredFlag|ModuleTransparentPredFlag|NumberDBPredFlag|MetaPredFlag|SyncPredFlag|BackCPredFlag) | ||||
| #define EXTRA_PRED_FLAGS (QuasiQuotationPredFlag|NoTracePredFlag|NoDebugPredFlag) | ||||
|  | ||||
| #define SYSTEM_PRED_FLAGS (BackCPredFlag|UserCPredFlag|CArgsPredFlag|AsmPredFlag|CPredFlag|BinaryPredFlag) | ||||
|  | ||||
| #define NEXTOP(V,TYPE)    ((yamop *)(&((V)->u.TYPE.next))) | ||||
|  | ||||
| #define CHECK(F) { size_t r = (F); if (!r) return r; } | ||||
| #define RCHECK(F)  if(!(F)) { QLYR_ERROR(MISMATCH); return; } | ||||
|  | ||||
| #define AllocTempSpace() (H) | ||||
| #define EnoughTempSpace(sz) ((ASP-H)*sizeof(CELL) > sz) | ||||
| #define AllocTempSpace() (HR) | ||||
| #define EnoughTempSpace(sz) ((ASP-HR)*sizeof(CELL) > sz) | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -34,6 +34,7 @@ | ||||
|   AtomBatched = AtomAdjust(AtomBatched); | ||||
|   AtomBetween = AtomAdjust(AtomBetween); | ||||
|   AtomHugeInt = AtomAdjust(AtomHugeInt); | ||||
|   AtomBigNum = AtomAdjust(AtomBigNum); | ||||
|   AtomBinaryStream = AtomAdjust(AtomBinaryStream); | ||||
|   AtomBraces = AtomAdjust(AtomBraces); | ||||
|   AtomBreak = AtomAdjust(AtomBreak); | ||||
| @@ -53,7 +54,9 @@ | ||||
|   AtomColomn = AtomAdjust(AtomColomn); | ||||
|   AtomCodeSpace = AtomAdjust(AtomCodeSpace); | ||||
|   AtomCodes = AtomAdjust(AtomCodes); | ||||
|   AtomCoInductive = AtomAdjust(AtomCoInductive); | ||||
|   AtomComma = AtomAdjust(AtomComma); | ||||
|   AtomCommentHook = AtomAdjust(AtomCommentHook); | ||||
|   AtomCompound = AtomAdjust(AtomCompound); | ||||
|   AtomConsistencyError = AtomAdjust(AtomConsistencyError); | ||||
|   AtomConsultOnBoot = AtomAdjust(AtomConsultOnBoot); | ||||
| @@ -296,6 +299,7 @@ | ||||
|   AtomStreamPos = AtomAdjust(AtomStreamPos); | ||||
|   AtomStreamPosition = AtomAdjust(AtomStreamPosition); | ||||
|   AtomString = AtomAdjust(AtomString); | ||||
|   AtomSTRING = AtomAdjust(AtomSTRING); | ||||
|   AtomSwi = AtomAdjust(AtomSwi); | ||||
|   AtomSyntaxError = AtomAdjust(AtomSyntaxError); | ||||
|   AtomSyntaxErrorHandler = AtomAdjust(AtomSyntaxErrorHandler); | ||||
| @@ -305,6 +309,7 @@ | ||||
|   AtomTerm = AtomAdjust(AtomTerm); | ||||
|   AtomTerms = AtomAdjust(AtomTerms); | ||||
|   AtomTermExpansion = AtomAdjust(AtomTermExpansion); | ||||
|   AtomText = AtomAdjust(AtomText); | ||||
|   AtomTextStream = AtomAdjust(AtomTextStream); | ||||
|   AtomThreads = AtomAdjust(AtomThreads); | ||||
|   AtomThrow = AtomAdjust(AtomThrow); | ||||
| @@ -358,6 +363,7 @@ | ||||
|   FunctorClist = FuncAdjust(FunctorClist); | ||||
|   FunctorCodes = FuncAdjust(FunctorCodes); | ||||
|   FunctorComma = FuncAdjust(FunctorComma); | ||||
|   FunctorCommentHook = FuncAdjust(FunctorCommentHook); | ||||
|   FunctorContext2 = FuncAdjust(FunctorContext2); | ||||
|   FunctorConsistencyError = FuncAdjust(FunctorConsistencyError); | ||||
|   FunctorCreep = FuncAdjust(FunctorCreep); | ||||
|   | ||||
							
								
								
									
										21
									
								
								H/rclause.h
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								H/rclause.h
									
									
									
									
									
								
							| @@ -107,12 +107,8 @@ restore_opcodes(yamop *pc, yamop *max USES_REGS) | ||||
|       pc = pc->u.OtaLl.n; | ||||
|       break; | ||||
|       /* instructions type OtapFs */ | ||||
| #ifdef CUT_C | ||||
|     case _cut_c: | ||||
| #endif | ||||
| #ifdef CUT_C | ||||
|     case _cut_userc: | ||||
| #endif | ||||
|     case _retry_c: | ||||
|     case _retry_userc: | ||||
|     case _try_c: | ||||
| @@ -389,6 +385,13 @@ restore_opcodes(yamop *pc, yamop *max USES_REGS) | ||||
|       pc->u.osc.c = ConstantTermAdjust(pc->u.osc.c); | ||||
|       pc = NEXTOP(pc,osc); | ||||
|       break; | ||||
|       /* instructions type ou */ | ||||
|     case _unify_l_string: | ||||
|     case _unify_string: | ||||
|       pc->u.ou.opcw = OpcodeAdjust(pc->u.ou.opcw); | ||||
|       pc->u.ou.u = BlobTermInCodeAdjust(pc->u.ou.u); | ||||
|       pc = NEXTOP(pc,ou); | ||||
|       break; | ||||
|       /* instructions type ox */ | ||||
|     case _save_appl_x: | ||||
|     case _save_appl_x_write: | ||||
| @@ -637,6 +640,12 @@ restore_opcodes(yamop *pc, yamop *max USES_REGS) | ||||
|       pc->u.xps.s = ConstantAdjust(pc->u.xps.s); | ||||
|       pc = NEXTOP(pc,xps); | ||||
|       break; | ||||
|       /* instructions type xu */ | ||||
|     case _get_string: | ||||
|       pc->u.xu.x = XAdjust(pc->u.xu.x); | ||||
|       pc->u.xu.u = BlobTermInCodeAdjust(pc->u.xu.u); | ||||
|       pc = NEXTOP(pc,xu); | ||||
|       break; | ||||
|       /* instructions type xx */ | ||||
|     case _get_x_val: | ||||
|     case _get_x_var: | ||||
| @@ -867,6 +876,7 @@ restore_opcodes(yamop *pc, yamop *max USES_REGS) | ||||
|     case _trie_do_appl_in_pair: | ||||
|     case _trie_do_atom: | ||||
|     case _trie_do_atom_in_pair: | ||||
|     case _trie_do_bigint: | ||||
|     case _trie_do_double: | ||||
|     case _trie_do_extension: | ||||
|     case _trie_do_gterm: | ||||
| @@ -882,6 +892,7 @@ restore_opcodes(yamop *pc, yamop *max USES_REGS) | ||||
|     case _trie_retry_appl_in_pair: | ||||
|     case _trie_retry_atom: | ||||
|     case _trie_retry_atom_in_pair: | ||||
|     case _trie_retry_bigint: | ||||
|     case _trie_retry_double: | ||||
|     case _trie_retry_extension: | ||||
|     case _trie_retry_gterm: | ||||
| @@ -897,6 +908,7 @@ restore_opcodes(yamop *pc, yamop *max USES_REGS) | ||||
|     case _trie_trust_appl_in_pair: | ||||
|     case _trie_trust_atom: | ||||
|     case _trie_trust_atom_in_pair: | ||||
|     case _trie_trust_bigint: | ||||
|     case _trie_trust_double: | ||||
|     case _trie_trust_extension: | ||||
|     case _trie_trust_gterm: | ||||
| @@ -912,6 +924,7 @@ restore_opcodes(yamop *pc, yamop *max USES_REGS) | ||||
|     case _trie_try_appl_in_pair: | ||||
|     case _trie_try_atom: | ||||
|     case _trie_try_atom_in_pair: | ||||
|     case _trie_try_bigint: | ||||
|     case _trie_try_double: | ||||
|     case _trie_try_extension: | ||||
|     case _trie_try_gterm: | ||||
|   | ||||
| @@ -141,6 +141,7 @@ | ||||
|   PredIs = PtoPredAdjust(PredIs); | ||||
|   PredSafeCallCleanup = PtoPredAdjust(PredSafeCallCleanup); | ||||
|   PredRestoreRegs = PtoPredAdjust(PredRestoreRegs); | ||||
|   PredCommentHook = PtoPredAdjust(PredCommentHook); | ||||
| #ifdef YAPOR | ||||
|   PredGetwork = PtoPredAdjust(PredGetwork); | ||||
|   PredGetworkSeq = PtoPredAdjust(PredGetworkSeq); | ||||
|   | ||||
| @@ -233,6 +233,7 @@ static void RestoreWorker(int wid USES_REGS) { | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -117,12 +117,8 @@ | ||||
|       pc = NEXTOP(pc,OtaLl); | ||||
|       break; | ||||
|       /* instructions type OtapFs */ | ||||
| #ifdef CUT_C | ||||
|     case _cut_c: | ||||
| #endif | ||||
| #ifdef CUT_C | ||||
|     case _cut_userc: | ||||
| #endif | ||||
|     case _retry_c: | ||||
|     case _retry_userc: | ||||
|     case _try_c: | ||||
| @@ -406,6 +402,13 @@ | ||||
|       CHECK(save_ConstantTerm(stream, pc->u.osc.c)); | ||||
|       pc = NEXTOP(pc,osc); | ||||
|       break; | ||||
|       /* instructions type ou */ | ||||
|     case _unify_l_string: | ||||
|     case _unify_string: | ||||
|       CHECK(save_Opcode(stream, pc->u.ou.opcw)); | ||||
|       CHECK(save_BlobTermInCode(stream, pc->u.ou.u)); | ||||
|       pc = NEXTOP(pc,ou); | ||||
|       break; | ||||
|       /* instructions type ox */ | ||||
|     case _save_appl_x: | ||||
|     case _save_appl_x_write: | ||||
| @@ -653,6 +656,12 @@ | ||||
|       CHECK(save_Constant(stream, pc->u.xps.s)); | ||||
|       pc = NEXTOP(pc,xps); | ||||
|       break; | ||||
|       /* instructions type xu */ | ||||
|     case _get_string: | ||||
|       CHECK(save_X(stream, pc->u.xu.x)); | ||||
|       CHECK(save_BlobTermInCode(stream, pc->u.xu.u)); | ||||
|       pc = NEXTOP(pc,xu); | ||||
|       break; | ||||
|       /* instructions type xx */ | ||||
|     case _get_x_val: | ||||
|     case _get_x_var: | ||||
| @@ -891,6 +900,7 @@ | ||||
|     case _trie_do_appl_in_pair: | ||||
|     case _trie_do_atom: | ||||
|     case _trie_do_atom_in_pair: | ||||
|     case _trie_do_bigint: | ||||
|     case _trie_do_double: | ||||
|     case _trie_do_extension: | ||||
|     case _trie_do_gterm: | ||||
| @@ -906,6 +916,7 @@ | ||||
|     case _trie_retry_appl_in_pair: | ||||
|     case _trie_retry_atom: | ||||
|     case _trie_retry_atom_in_pair: | ||||
|     case _trie_retry_bigint: | ||||
|     case _trie_retry_double: | ||||
|     case _trie_retry_extension: | ||||
|     case _trie_retry_gterm: | ||||
| @@ -921,6 +932,7 @@ | ||||
|     case _trie_trust_appl_in_pair: | ||||
|     case _trie_trust_atom: | ||||
|     case _trie_trust_atom_in_pair: | ||||
|     case _trie_trust_bigint: | ||||
|     case _trie_trust_double: | ||||
|     case _trie_trust_extension: | ||||
|     case _trie_trust_gterm: | ||||
| @@ -936,6 +948,7 @@ | ||||
|     case _trie_try_appl_in_pair: | ||||
|     case _trie_try_atom: | ||||
|     case _trie_try_atom_in_pair: | ||||
|     case _trie_try_bigint: | ||||
|     case _trie_try_double: | ||||
|     case _trie_try_extension: | ||||
|     case _trie_try_gterm: | ||||
|   | ||||
| @@ -1116,7 +1116,7 @@ INLINE_ONLY inline EXTERN int IsGlobal__ (CELL CACHE_TYPE); | ||||
| INLINE_ONLY inline EXTERN int | ||||
| IsGlobal__ (CELL reg USES_REGS) | ||||
| { | ||||
|   return (int) (IN_BETWEEN (LOCAL_GlobalBase, reg, H)); | ||||
|   return (int) (IN_BETWEEN (LOCAL_GlobalBase, reg, HR)); | ||||
| } | ||||
|  | ||||
|  | ||||
|   | ||||
							
								
								
									
										12
									
								
								H/tatoms.h
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								H/tatoms.h
									
									
									
									
									
								
							| @@ -66,6 +66,8 @@ | ||||
| #define AtomBetween Yap_heap_regs->AtomBetween_ | ||||
|   Atom AtomHugeInt_; | ||||
| #define AtomHugeInt Yap_heap_regs->AtomHugeInt_ | ||||
|   Atom AtomBigNum_; | ||||
| #define AtomBigNum Yap_heap_regs->AtomBigNum_ | ||||
|   Atom AtomBinaryStream_; | ||||
| #define AtomBinaryStream Yap_heap_regs->AtomBinaryStream_ | ||||
|   Atom AtomBraces_; | ||||
| @@ -104,8 +106,12 @@ | ||||
| #define AtomCodeSpace Yap_heap_regs->AtomCodeSpace_ | ||||
|   Atom AtomCodes_; | ||||
| #define AtomCodes Yap_heap_regs->AtomCodes_ | ||||
|   Atom AtomCoInductive_; | ||||
| #define AtomCoInductive Yap_heap_regs->AtomCoInductive_ | ||||
|   Atom AtomComma_; | ||||
| #define AtomComma Yap_heap_regs->AtomComma_ | ||||
|   Atom AtomCommentHook_; | ||||
| #define AtomCommentHook Yap_heap_regs->AtomCommentHook_ | ||||
|   Atom AtomCompound_; | ||||
| #define AtomCompound Yap_heap_regs->AtomCompound_ | ||||
|   Atom AtomConsistencyError_; | ||||
| @@ -590,6 +596,8 @@ | ||||
| #define AtomStreamPosition Yap_heap_regs->AtomStreamPosition_ | ||||
|   Atom AtomString_; | ||||
| #define AtomString Yap_heap_regs->AtomString_ | ||||
|   Atom AtomSTRING_; | ||||
| #define AtomSTRING Yap_heap_regs->AtomSTRING_ | ||||
|   Atom AtomSwi_; | ||||
| #define AtomSwi Yap_heap_regs->AtomSwi_ | ||||
|   Atom AtomSyntaxError_; | ||||
| @@ -608,6 +616,8 @@ | ||||
| #define AtomTerms Yap_heap_regs->AtomTerms_ | ||||
|   Atom AtomTermExpansion_; | ||||
| #define AtomTermExpansion Yap_heap_regs->AtomTermExpansion_ | ||||
|   Atom AtomText_; | ||||
| #define AtomText Yap_heap_regs->AtomText_ | ||||
|   Atom AtomTextStream_; | ||||
| #define AtomTextStream Yap_heap_regs->AtomTextStream_ | ||||
|   Atom AtomThreads_; | ||||
| @@ -714,6 +724,8 @@ | ||||
| #define FunctorCodes Yap_heap_regs->FunctorCodes_ | ||||
|   Functor FunctorComma_; | ||||
| #define FunctorComma Yap_heap_regs->FunctorComma_ | ||||
|   Functor FunctorCommentHook_; | ||||
| #define FunctorCommentHook Yap_heap_regs->FunctorCommentHook_ | ||||
|   Functor FunctorContext2_; | ||||
| #define FunctorContext2 Yap_heap_regs->FunctorContext2_ | ||||
|   Functor FunctorConsistencyError_; | ||||
|   | ||||
| @@ -27,7 +27,7 @@ | ||||
| 	    /* skip, this is a problem because we lose information, | ||||
| 	       namely active references */ | ||||
| 	    pt1 = (tr_fr_ptr)pt; | ||||
| 	  } else if (IN_BETWEEN(H0,pt,H) && IsAttVar(pt)) { | ||||
| 	  } else if (IN_BETWEEN(H0,pt,HR) && IsAttVar(pt)) { | ||||
| 	    CELL val = Deref(*pt); | ||||
| 	    if (IsVarTerm(val)) { | ||||
| 	      Bind(pt, MkAtomTerm(AtomCut)); | ||||
| @@ -128,7 +128,7 @@ | ||||
|       } else if (IsPairTerm(d1)) { | ||||
| 	CELL *pt = RepPair(d1); | ||||
| 	       | ||||
| 	if (IN_BETWEEN(H0,pt,H) && IsAttVar(pt)) { | ||||
| 	if (IN_BETWEEN(H0,pt,HR) && IsAttVar(pt)) { | ||||
| 	  CELL val = Deref(*pt); | ||||
| 	  if (IsVarTerm(val)) { | ||||
| 	    Bind(VarOfTerm(val), MkAtomTerm(AtomCut)); | ||||
|   | ||||
| @@ -67,12 +67,8 @@ | ||||
|       pc = pc->u.OtaLl.n; | ||||
|       break; | ||||
|       /* instructions type OtapFs */ | ||||
| #ifdef CUT_C | ||||
|     case _cut_c: | ||||
| #endif | ||||
| #ifdef CUT_C | ||||
|     case _cut_userc: | ||||
| #endif | ||||
|     case _retry_c: | ||||
|     case _retry_userc: | ||||
|     case _try_c: | ||||
| @@ -293,6 +289,11 @@ | ||||
|     case _unify_n_atoms_write: | ||||
|       pc = NEXTOP(pc,osc); | ||||
|       break; | ||||
|       /* instructions type ou */ | ||||
|     case _unify_l_string: | ||||
|     case _unify_string: | ||||
|       pc = NEXTOP(pc,ou); | ||||
|       break; | ||||
|       /* instructions type ox */ | ||||
|     case _save_appl_x: | ||||
|     case _save_appl_x_write: | ||||
| @@ -478,6 +479,10 @@ | ||||
|     case _commit_b_x: | ||||
|       pc = NEXTOP(pc,xps); | ||||
|       break; | ||||
|       /* instructions type xu */ | ||||
|     case _get_string: | ||||
|       pc = NEXTOP(pc,xu); | ||||
|       break; | ||||
|       /* instructions type xx */ | ||||
|     case _get_x_val: | ||||
|     case _get_x_var: | ||||
| @@ -657,6 +662,7 @@ | ||||
|     case _trie_do_appl_in_pair: | ||||
|     case _trie_do_atom: | ||||
|     case _trie_do_atom_in_pair: | ||||
|     case _trie_do_bigint: | ||||
|     case _trie_do_double: | ||||
|     case _trie_do_extension: | ||||
|     case _trie_do_gterm: | ||||
| @@ -672,6 +678,7 @@ | ||||
|     case _trie_retry_appl_in_pair: | ||||
|     case _trie_retry_atom: | ||||
|     case _trie_retry_atom_in_pair: | ||||
|     case _trie_retry_bigint: | ||||
|     case _trie_retry_double: | ||||
|     case _trie_retry_extension: | ||||
|     case _trie_retry_gterm: | ||||
| @@ -687,6 +694,7 @@ | ||||
|     case _trie_trust_appl_in_pair: | ||||
|     case _trie_trust_atom: | ||||
|     case _trie_trust_atom_in_pair: | ||||
|     case _trie_trust_bigint: | ||||
|     case _trie_trust_double: | ||||
|     case _trie_trust_extension: | ||||
|     case _trie_trust_gterm: | ||||
| @@ -702,6 +710,7 @@ | ||||
|     case _trie_try_appl_in_pair: | ||||
|     case _trie_try_atom: | ||||
|     case _trie_try_atom_in_pair: | ||||
|     case _trie_try_bigint: | ||||
|     case _trie_try_double: | ||||
|     case _trie_try_extension: | ||||
|     case _trie_try_gterm: | ||||
|   | ||||
| @@ -240,7 +240,7 @@ Term Yap_Variables(VarEntry *,Term); | ||||
| Term Yap_Singletons(VarEntry *,Term); | ||||
|  | ||||
| /* routines in scanner.c */ | ||||
| TokEntry *Yap_tokenizer(struct io_stream *, int, Term *); | ||||
| TokEntry *Yap_tokenizer(struct io_stream *, int, Term *, void *rd); | ||||
| void     Yap_clean_tokenizer(TokEntry *, VarEntry *, VarEntry *,Term); | ||||
| Term     Yap_scan_num(struct io_stream *); | ||||
| char	 *Yap_AllocScannerMemory(unsigned int); | ||||
|   | ||||
							
								
								
									
										110
									
								
								ICLP2014_examples.yap
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								ICLP2014_examples.yap
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,110 @@ | ||||
|  | ||||
| :- initialization(yap_flag(tabling_mode, load_answers)). | ||||
| % Required to activate rational term support within the table space. | ||||
|  | ||||
| /* | ||||
|     ICLP2014 submission - instack/2 | ||||
| */ | ||||
| instack(E, [H|T]) :- E == H. | ||||
| instack(E, [_H|T]) :- instack(E, T). | ||||
|  | ||||
| /* | ||||
|     ICLP2014 submission - Example 1. member_1/2 | ||||
|     Cyclic safe predicate with the use of instack/2 predicate. | ||||
| */ | ||||
| member_1(E, L) :- | ||||
|   member(E, L, []). | ||||
|  | ||||
| member(E, [E|_T], _). | ||||
| member(_E, L, S) :- | ||||
|   instack(L, S), | ||||
|   !, | ||||
|   fail. | ||||
| member(E, [H|T], S) :- | ||||
|   member(E, T, [[H|T]|S]). | ||||
|  | ||||
| /* | ||||
|     ICLP2014 submission - Example 2. member_2/2 | ||||
|     Cyclic safe predicate with the use of tabling. | ||||
| */ | ||||
| :- table member_2/2. | ||||
|  | ||||
| member_2(E, [E|_T]). | ||||
| member_2(E, [_H|T]) :- | ||||
|   member_2(E, T). | ||||
|  | ||||
| /* | ||||
|     ICLP2014 submission - Example 3. bin/1 | ||||
| */ | ||||
| :- table bin/1. | ||||
| :- tabling_mode(bin/1, coinductive). | ||||
| % The two above directives are the equivalent of the :- coinductive bin/1 directive | ||||
| bin([0|T]) :- bin(T). | ||||
| bin([1|T]) :- bin(T). | ||||
|  | ||||
| /* | ||||
|     ICLP2014 submission - Example 4. comember/2 | ||||
| */ | ||||
|  | ||||
| :- table comember/2. | ||||
| :- tabling_mode(comember/2, coinductive). | ||||
| % The two above directives are the equivalent of the :- coinductive comember/2 directive | ||||
| comember(H, L) :- | ||||
|   drop(H, L, L1), | ||||
|   comember(H, L1). | ||||
|  | ||||
| :- table(drop/3). | ||||
| drop(H, [H|T], T). | ||||
| drop(H, [_|T], T1) :- drop(H, T, T1). | ||||
|  | ||||
|  | ||||
| %%%%%%%%%% | ||||
| /* | ||||
|     ICLP2014 submission - Example 5. alternative drop_2/3 definition. | ||||
|     This definition uses instack instead of tabling. | ||||
| */ | ||||
|  | ||||
| drop_2(E, L, NL) :- | ||||
|   drop(E, L, NL, []). | ||||
|  | ||||
| drop(_E, L, _NL, S) :- | ||||
|   instack(L, S), | ||||
|   !, | ||||
|   fail. | ||||
| drop(E, [E|T], T, _). | ||||
| drop(E, [H|T], T1, S) :- | ||||
|   drop(E, T, T1, [[H|T]|S]). | ||||
|  | ||||
| /* | ||||
|     ICLP2014 submission - Example 6. canonical_term/2 | ||||
|     The following predicate takes a rational term and returns | ||||
|     the same rational term in canonical form. | ||||
| */ | ||||
|  | ||||
| canonical_term(Term, Canonical) :- | ||||
| 	Term =.. InList, | ||||
| 	decompose_cyclic_term(Term, InList, OutList, OpenEnd, [Term]), | ||||
| 	Canonical =.. OutList, | ||||
| 	Canonical = OpenEnd. | ||||
|   | ||||
| decompose_cyclic_term(_CyclicTerm, [], [], _OpenEnd, _Stack). | ||||
| decompose_cyclic_term(CyclicTerm, [Term|Tail], [Term|NewTail], OpenEnd, Stack) :- | ||||
| 	acyclic_term(Term), !, | ||||
| 	decompose_cyclic_term(CyclicTerm, Tail, NewTail, OpenEnd, Stack). | ||||
| decompose_cyclic_term(CyclicTerm, [Term|Tail], [OpenEnd|NewTail], OpenEnd, Stack) :- | ||||
| 	CyclicTerm == Term, !, | ||||
| 	decompose_cyclic_term(CyclicTerm, Tail, NewTail, OpenEnd, Stack). | ||||
| decompose_cyclic_term(CyclicTerm, [Term|Tail], [Canonical|NewTail], OpenEnd, Stack) :- | ||||
| 	\+ instack(Term, Stack), !, | ||||
| 	Term =.. InList, | ||||
| 	decompose_cyclic_term(Term, InList, OutList, OpenEnd2, [Term|Stack]), | ||||
| 	Canonical =.. OutList, | ||||
| 	(	Canonical = OpenEnd2, | ||||
| 		Canonical == Term, | ||||
| 		! | ||||
| 	;	OpenEnd2 = OpenEnd | ||||
| 	), | ||||
| 	decompose_cyclic_term(CyclicTerm, Tail, NewTail, OpenEnd, Stack). | ||||
| decompose_cyclic_term(CyclicTerm, [_Term|Tail], [OpenEnd|NewTail], OpenEnd, Stack) :- | ||||
| 	decompose_cyclic_term(CyclicTerm, Tail, NewTail, OpenEnd, Stack). | ||||
|  | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user