1135 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
		
		
			
		
	
	
			1135 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
| 
								 | 
							
								#ifdef LOW_LEVEL_TRACER
							 | 
						||
| 
								 | 
							
								#define P_FUNCTOR_INSTINIT \
							 | 
						||
| 
								 | 
							
								      if (Yap_do_low_level_trace) \
							 | 
						||
| 
								 | 
							
									low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor,0)),XREGS+1); \
							 | 
						||
| 
								 | 
							
									BLOCKADDRESS = (CELL)(*_PREG); \
							 | 
						||
| 
								 | 
							
								    register CELL d0, d1; \
							 | 
						||
| 
								 | 
							
								    register CELL *pt0, *pt1; \
							 | 
						||
| 
								 | 
							
									while (1) { \
							 | 
						||
| 
								 | 
							
								      d0 = ARG1; \
							 | 
						||
| 
								 | 
							
									  if (IsVarTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									    (pt0) = (CELL *)(d0); \
							 | 
						||
| 
								 | 
							
								        (d0) = *(CELL *)(d0); \
							 | 
						||
| 
								 | 
							
										while (Unsigned(pt0) != (d0)) { \
							 | 
						||
| 
								 | 
							
										  if(!IsVarTerm(d0)) { \
							 | 
						||
| 
								 | 
							
								            if (IsApplTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									          d1 = *RepAppl(d0); \
							 | 
						||
| 
								 | 
							
									          if (IsExtensionFunctor((Functor) d1)) { \
							 | 
						||
| 
								 | 
							
									            if (d1 <= (CELL)FunctorDouble && d1 >= (CELL)FunctorLongInt ) { \
							 | 
						||
| 
								 | 
							
									              d1 = MkIntTerm(0); \
							 | 
						||
| 
								 | 
							
									            } else { \
							 | 
						||
| 
								 | 
							
									              YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												  break; \
							 | 
						||
| 
								 | 
							
												} \
							 | 
						||
| 
								 | 
							
									          } else { \
							 | 
						||
| 
								 | 
							
									            d0 = MkAtomTerm(NameOfFunctor((Functor) d1)); \
							 | 
						||
| 
								 | 
							
									            d1 = MkIntTerm(ArityOfFunctor((Functor) d1)); \
							 | 
						||
| 
								 | 
							
									          } \
							 | 
						||
| 
								 | 
							
								            } \
							 | 
						||
| 
								 | 
							
								            else if (IsPairTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									          d0 = TermDot; \
							 | 
						||
| 
								 | 
							
									          d1 = MkIntTerm(2); \
							 | 
						||
| 
								 | 
							
								            } \
							 | 
						||
| 
								 | 
							
								            else { \
							 | 
						||
| 
								 | 
							
									          d1 = MkIntTerm(0); \
							 | 
						||
| 
								 | 
							
								            } \
							 | 
						||
| 
								 | 
							
									        register CELL arity = d1; \
							 | 
						||
| 
								 | 
							
									        d1 = ARG2; \
							 | 
						||
| 
								 | 
							
											if (IsVarTerm(d1) { \
							 | 
						||
| 
								 | 
							
											  (pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								              (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										      while (Unsigned(pt0) != (d1)) { \
							 | 
						||
| 
								 | 
							
										        if(!IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
									              if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									                YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
													break; \
							 | 
						||
| 
								 | 
							
									              } \
							 | 
						||
| 
								 | 
							
									              d0 = arity; \
							 | 
						||
| 
								 | 
							
											      d1 = ARG3; \
							 | 
						||
| 
								 | 
							
									              if (IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
											        (pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								                    (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										            while (Unsigned(pt0) != (d1)) { \
							 | 
						||
| 
								 | 
							
										              if(!IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
													    if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									                      YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
														  break; \
							 | 
						||
| 
								 | 
							
									                    } \
							 | 
						||
| 
								 | 
							
									                    (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									                    GONext(); \
							 | 
						||
| 
								 | 
							
														break; \
							 | 
						||
| 
								 | 
							
													  } \
							 | 
						||
| 
								 | 
							
													  (pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								                      (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
													} \
							 | 
						||
| 
								 | 
							
													(*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									                Bind(pt0, d0); \
							 | 
						||
| 
								 | 
							
									                GONext(); \
							 | 
						||
| 
								 | 
							
													break; \
							 | 
						||
| 
								 | 
							
												  } \
							 | 
						||
| 
								 | 
							
												  else { \
							 | 
						||
| 
								 | 
							
									                if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									                  YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
													  break; \
							 | 
						||
| 
								 | 
							
									                } \
							 | 
						||
| 
								 | 
							
									                (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									                GONext(); \
							 | 
						||
| 
								 | 
							
													break; \
							 | 
						||
| 
								 | 
							
												  } \
							 | 
						||
| 
								 | 
							
												} \
							 | 
						||
| 
								 | 
							
												(pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								                (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
											  } \
							 | 
						||
| 
								 | 
							
											  Bind(pt0, d0); \
							 | 
						||
| 
								 | 
							
									          d0 = arity; \
							 | 
						||
| 
								 | 
							
											} \
							 | 
						||
| 
								 | 
							
											else { \
							 | 
						||
| 
								 | 
							
									          if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									            YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												break; \
							 | 
						||
| 
								 | 
							
									          } \
							 | 
						||
| 
								 | 
							
									          d0 = arity; \
							 | 
						||
| 
								 | 
							
											} \
							 | 
						||
| 
								 | 
							
											d1 = ARG3; \
							 | 
						||
| 
								 | 
							
											if (IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
											  (pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								              (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										      while (Unsigned(pt0) != (d1)) { \
							 | 
						||
| 
								 | 
							
										        if(!IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
												  if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									                YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
													break; \
							 | 
						||
| 
								 | 
							
									              } \
							 | 
						||
| 
								 | 
							
									              (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									              GONext(); \
							 | 
						||
| 
								 | 
							
												  break; \
							 | 
						||
| 
								 | 
							
												} \
							 | 
						||
| 
								 | 
							
												(pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								                (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
											  } \
							 | 
						||
| 
								 | 
							
											  (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									          Bind(pt0, d0); \
							 | 
						||
| 
								 | 
							
									          GONext(); \
							 | 
						||
| 
								 | 
							
											  break; \
							 | 
						||
| 
								 | 
							
											} \
							 | 
						||
| 
								 | 
							
								            else { \
							 | 
						||
| 
								 | 
							
									          if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									            YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												break; \
							 | 
						||
| 
								 | 
							
									          } \
							 | 
						||
| 
								 | 
							
									          (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									          GONext(); \
							 | 
						||
| 
								 | 
							
											  break; \
							 | 
						||
| 
								 | 
							
											} \
							 | 
						||
| 
								 | 
							
										  } \
							 | 
						||
| 
								 | 
							
										  (pt0) = (CELL *)(d0); \
							 | 
						||
| 
								 | 
							
								          (d0) = *(CELL *)(d0); \
							 | 
						||
| 
								 | 
							
										} \
							 | 
						||
| 
								 | 
							
										d0 = ARG2; \
							 | 
						||
| 
								 | 
							
										if (IsVarTerm(d0)) { \
							 | 
						||
| 
								 | 
							
										  (pt1) = (CELL *)(d0); \
							 | 
						||
| 
								 | 
							
								          (d0) = *(CELL *)(d0); \
							 | 
						||
| 
								 | 
							
										  while (Unsigned(pt1) != (d0)) { \
							 | 
						||
| 
								 | 
							
										    if(!IsVarTerm(d0)) { \
							 | 
						||
| 
								 | 
							
											  d1 = ARG3; \
							 | 
						||
| 
								 | 
							
										      if (IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
										        (pt1) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								                (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										        while (Unsigned(pt1) != (d1)) { \
							 | 
						||
| 
								 | 
							
										          if(!IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
												    if (IsIntTerm(d1)) { \
							 | 
						||
| 
								 | 
							
									                  d1 = IntOfTerm(d1); \
							 | 
						||
| 
								 | 
							
								                    } else { \
							 | 
						||
| 
								 | 
							
									                  saveregs(); \
							 | 
						||
| 
								 | 
							
									                  Yap_Error(TYPE_ERROR_INTEGER,ARG3,"functor/3"); \
							 | 
						||
| 
								 | 
							
									                  setregs(); \
							 | 
						||
| 
								 | 
							
									                  YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
													  break; \
							 | 
						||
| 
								 | 
							
								                    } \
							 | 
						||
| 
								 | 
							
								                    if (!IsAtomicTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									                  saveregs(); \
							 | 
						||
| 
								 | 
							
									                  Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); \
							 | 
						||
| 
								 | 
							
									                  setregs(); \
							 | 
						||
| 
								 | 
							
									                  YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
													  break; \
							 | 
						||
| 
								 | 
							
								                    } \
							 | 
						||
| 
								 | 
							
								                    if (d0 == TermDot && d1 == 2) { \
							 | 
						||
| 
								 | 
							
									                  RESET_VARIABLE(HR); \
							 | 
						||
| 
								 | 
							
									                  RESET_VARIABLE(HR+1); \
							 | 
						||
| 
								 | 
							
									                  d0 = AbsPair(HR); \
							 | 
						||
| 
								 | 
							
									                  HR += 2; \
							 | 
						||
| 
								 | 
							
								                    } \
							 | 
						||
| 
								 | 
							
								                    else if ((Int)d1 > 0) { \
							 | 
						||
| 
								 | 
							
									                  if (!IsAtomTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									                    saveregs(); \
							 | 
						||
| 
								 | 
							
									                    Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); \
							 | 
						||
| 
								 | 
							
									                    setregs(); \
							 | 
						||
| 
								 | 
							
									                    YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
														break; \
							 | 
						||
| 
								 | 
							
									                  } \
							 | 
						||
| 
								 | 
							
									                  if (!IsAtomTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									                    YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
														break; \
							 | 
						||
| 
								 | 
							
									                  } \
							 | 
						||
| 
								 | 
							
									                  else { \
							 | 
						||
| 
								 | 
							
									                    d0 = (CELL) Yap_MkFunctor(AtomOfTerm(d0), (Int) d1); \
							 | 
						||
| 
								 | 
							
										              } \
							 | 
						||
| 
								 | 
							
									                  pt1 = HR; \
							 | 
						||
| 
								 | 
							
									                  *pt1++ = d0; \
							 | 
						||
| 
								 | 
							
									                  d0 = AbsAppl(HR); \
							 | 
						||
| 
								 | 
							
									                  if (pt1+d1 > ENV || pt1+d1 > (CELL *)B) { \
							 | 
						||
| 
								 | 
							
									                    saveregs(); \
							 | 
						||
| 
								 | 
							
									                    if (!Yap_gcl((1+d1)*sizeof(CELL), 3, YREG, NEXTOP(NEXTOP((*_PREG),e),Osbmp))) { \
							 | 
						||
| 
								 | 
							
									                      Yap_NilError(OUT_OF_STACK_ERROR,LOCAL_ErrorMessage); \
							 | 
						||
| 
								 | 
							
									                      setregs(); \
							 | 
						||
| 
								 | 
							
									                      JMPNext(); \
							 | 
						||
| 
								 | 
							
														  break; \
							 | 
						||
| 
								 | 
							
									                    } else { \
							 | 
						||
| 
								 | 
							
									                      setregs(); \
							 | 
						||
| 
								 | 
							
									                    } \
							 | 
						||
| 
								 | 
							
									                    continue; \
							 | 
						||
| 
								 | 
							
									                  } \
							 | 
						||
| 
								 | 
							
									                  while ((Int)d1--) { \
							 | 
						||
| 
								 | 
							
									                    RESET_VARIABLE(pt1); \
							 | 
						||
| 
								 | 
							
									                    pt1++; \
							 | 
						||
| 
								 | 
							
									                  } \
							 | 
						||
| 
								 | 
							
									                  HR = pt1; \
							 | 
						||
| 
								 | 
							
								                    } else if ((Int)d1  < 0) { \
							 | 
						||
| 
								 | 
							
									                  saveregs(); \
							 | 
						||
| 
								 | 
							
									                  Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO,MkIntegerTerm(d1),"functor/3"); \
							 | 
						||
| 
								 | 
							
									                  setregs(); \
							 | 
						||
| 
								 | 
							
									                  YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
													  break; \
							 | 
						||
| 
								 | 
							
								                    } \
							 | 
						||
| 
								 | 
							
								                    (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbpp),l); \
							 | 
						||
| 
								 | 
							
								                    Bind(pt0, d0); \
							 | 
						||
| 
								 | 
							
								                    GONext(); \
							 | 
						||
| 
								 | 
							
													break; \
							 | 
						||
| 
								 | 
							
											      } \
							 | 
						||
| 
								 | 
							
											      (pt1) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								                  (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										        } \
							 | 
						||
| 
								 | 
							
										        saveregs(); \
							 | 
						||
| 
								 | 
							
								                Yap_Error(INSTANTIATION_ERROR, d1, "functor/3"); \
							 | 
						||
| 
								 | 
							
								                setregs(); \
							 | 
						||
| 
								 | 
							
								                YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												break; \
							 | 
						||
| 
								 | 
							
										      } \
							 | 
						||
| 
								 | 
							
										      else { \
							 | 
						||
| 
								 | 
							
								               if (IsIntTerm(d1)) { \
							 | 
						||
| 
								 | 
							
									              d1 = IntOfTerm(d1); \
							 | 
						||
| 
								 | 
							
								                } else { \
							 | 
						||
| 
								 | 
							
									              saveregs(); \
							 | 
						||
| 
								 | 
							
									              Yap_Error(TYPE_ERROR_INTEGER,ARG3,"functor/3"); \
							 | 
						||
| 
								 | 
							
									              setregs(); \
							 | 
						||
| 
								 | 
							
									              YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												  break; \
							 | 
						||
| 
								 | 
							
								                } \
							 | 
						||
| 
								 | 
							
								                if (!IsAtomicTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									              saveregs(); \
							 | 
						||
| 
								 | 
							
									              Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); \
							 | 
						||
| 
								 | 
							
									              setregs(); \
							 | 
						||
| 
								 | 
							
									              YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												  break; \
							 | 
						||
| 
								 | 
							
								                } \
							 | 
						||
| 
								 | 
							
								                if (d0 == TermDot && d1 == 2) { \
							 | 
						||
| 
								 | 
							
									              RESET_VARIABLE(HR); \
							 | 
						||
| 
								 | 
							
									              RESET_VARIABLE(HR+1); \
							 | 
						||
| 
								 | 
							
									              d0 = AbsPair(HR); \
							 | 
						||
| 
								 | 
							
									              HR += 2; \
							 | 
						||
| 
								 | 
							
								                } \
							 | 
						||
| 
								 | 
							
								                else if ((Int)d1 > 0) { \
							 | 
						||
| 
								 | 
							
									              if (!IsAtomTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									                saveregs(); \
							 | 
						||
| 
								 | 
							
									                Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); \
							 | 
						||
| 
								 | 
							
									                setregs(); \
							 | 
						||
| 
								 | 
							
									                YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
													break; \
							 | 
						||
| 
								 | 
							
									              } \
							 | 
						||
| 
								 | 
							
									              if (!IsAtomTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									                YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
													break; \
							 | 
						||
| 
								 | 
							
									              } \
							 | 
						||
| 
								 | 
							
									              else { \
							 | 
						||
| 
								 | 
							
									                d0 = (CELL) Yap_MkFunctor(AtomOfTerm(d0), (Int) d1); \
							 | 
						||
| 
								 | 
							
										          } \
							 | 
						||
| 
								 | 
							
									              pt1 = HR; \
							 | 
						||
| 
								 | 
							
									              *pt1++ = d0; \
							 | 
						||
| 
								 | 
							
									              d0 = AbsAppl(HR); \
							 | 
						||
| 
								 | 
							
									              if (pt1+d1 > ENV || pt1+d1 > (CELL *)B) { \
							 | 
						||
| 
								 | 
							
									                saveregs(); \
							 | 
						||
| 
								 | 
							
									                if (!Yap_gcl((1+d1)*sizeof(CELL), 3, YREG, NEXTOP(NEXTOP((*_PREG),e),Osbmp))) { \
							 | 
						||
| 
								 | 
							
									                  Yap_NilError(OUT_OF_STACK_ERROR,LOCAL_ErrorMessage); \
							 | 
						||
| 
								 | 
							
									                  setregs(); \
							 | 
						||
| 
								 | 
							
									                  JMPNext(); \
							 | 
						||
| 
								 | 
							
													  break; \
							 | 
						||
| 
								 | 
							
									                } else { \
							 | 
						||
| 
								 | 
							
									                  setregs(); \
							 | 
						||
| 
								 | 
							
									                } \
							 | 
						||
| 
								 | 
							
									                continue; \
							 | 
						||
| 
								 | 
							
									              } \
							 | 
						||
| 
								 | 
							
									              while ((Int)d1--) { \
							 | 
						||
| 
								 | 
							
									                RESET_VARIABLE(pt1); \
							 | 
						||
| 
								 | 
							
									                pt1++; \
							 | 
						||
| 
								 | 
							
									              } \
							 | 
						||
| 
								 | 
							
									              HR = pt1; \
							 | 
						||
| 
								 | 
							
								                } else if ((Int)d1  < 0) { \
							 | 
						||
| 
								 | 
							
									              saveregs(); \
							 | 
						||
| 
								 | 
							
									              Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO,MkIntegerTerm(d1),"functor/3"); \
							 | 
						||
| 
								 | 
							
									              setregs(); \
							 | 
						||
| 
								 | 
							
									              YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												  break; \
							 | 
						||
| 
								 | 
							
								                } \
							 | 
						||
| 
								 | 
							
								                (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbpp),l); \
							 | 
						||
| 
								 | 
							
								                Bind(pt0, d0); \
							 | 
						||
| 
								 | 
							
								                GONext(); \
							 | 
						||
| 
								 | 
							
												break; \
							 | 
						||
| 
								 | 
							
									          } \
							 | 
						||
| 
								 | 
							
											} \
							 | 
						||
| 
								 | 
							
											(pt1) = (CELL *)(d0); \
							 | 
						||
| 
								 | 
							
								            (d0) = *(CELL *)(d0); \
							 | 
						||
| 
								 | 
							
										  } \
							 | 
						||
| 
								 | 
							
										  saveregs(); \
							 | 
						||
| 
								 | 
							
								          Yap_Error(INSTANTIATION_ERROR, d0, "functor/3"); \
							 | 
						||
| 
								 | 
							
								          setregs(); \
							 | 
						||
| 
								 | 
							
								          YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
										  break; \
							 | 
						||
| 
								 | 
							
										} \
							 | 
						||
| 
								 | 
							
										else { \
							 | 
						||
| 
								 | 
							
								          d1 = ARG3; \
							 | 
						||
| 
								 | 
							
										  if (IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
										    (pt1) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								            (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										    while (Unsigned(pt1) != (d1)) { \
							 | 
						||
| 
								 | 
							
										      if(!IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
												if (IsIntTerm(d1)) { \
							 | 
						||
| 
								 | 
							
									              d1 = IntOfTerm(d1); \
							 | 
						||
| 
								 | 
							
								                } else { \
							 | 
						||
| 
								 | 
							
									              saveregs(); \
							 | 
						||
| 
								 | 
							
									              Yap_Error(TYPE_ERROR_INTEGER,ARG3,"functor/3"); \
							 | 
						||
| 
								 | 
							
									              setregs(); \
							 | 
						||
| 
								 | 
							
									              YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												  break; \
							 | 
						||
| 
								 | 
							
								                } \
							 | 
						||
| 
								 | 
							
								                if (!IsAtomicTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									              saveregs(); \
							 | 
						||
| 
								 | 
							
									              Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); \
							 | 
						||
| 
								 | 
							
									              setregs(); \
							 | 
						||
| 
								 | 
							
									              YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												  break; \
							 | 
						||
| 
								 | 
							
								                } \
							 | 
						||
| 
								 | 
							
								                if (d0 == TermDot && d1 == 2) { \
							 | 
						||
| 
								 | 
							
									              RESET_VARIABLE(HR); \
							 | 
						||
| 
								 | 
							
									              RESET_VARIABLE(HR+1); \
							 | 
						||
| 
								 | 
							
									              d0 = AbsPair(HR); \
							 | 
						||
| 
								 | 
							
									              HR += 2; \
							 | 
						||
| 
								 | 
							
								                } \
							 | 
						||
| 
								 | 
							
								                else if ((Int)d1 > 0) { \
							 | 
						||
| 
								 | 
							
									              if (!IsAtomTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									                saveregs(); \
							 | 
						||
| 
								 | 
							
									                Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); \
							 | 
						||
| 
								 | 
							
									                setregs(); \
							 | 
						||
| 
								 | 
							
									                YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
													break; \
							 | 
						||
| 
								 | 
							
									              } \
							 | 
						||
| 
								 | 
							
									              if (!IsAtomTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									                YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
													break; \
							 | 
						||
| 
								 | 
							
									              } \
							 | 
						||
| 
								 | 
							
									              else { \
							 | 
						||
| 
								 | 
							
									                d0 = (CELL) Yap_MkFunctor(AtomOfTerm(d0), (Int) d1); \
							 | 
						||
| 
								 | 
							
										          } \
							 | 
						||
| 
								 | 
							
									              pt1 = HR; \
							 | 
						||
| 
								 | 
							
									              *pt1++ = d0; \
							 | 
						||
| 
								 | 
							
									              d0 = AbsAppl(HR); \
							 | 
						||
| 
								 | 
							
									              if (pt1+d1 > ENV || pt1+d1 > (CELL *)B) { \
							 | 
						||
| 
								 | 
							
									                saveregs(); \
							 | 
						||
| 
								 | 
							
									                if (!Yap_gcl((1+d1)*sizeof(CELL), 3, YREG, NEXTOP(NEXTOP((*_PREG),e),Osbmp))) { \
							 | 
						||
| 
								 | 
							
									                  Yap_NilError(OUT_OF_STACK_ERROR,LOCAL_ErrorMessage); \
							 | 
						||
| 
								 | 
							
									                  setregs(); \
							 | 
						||
| 
								 | 
							
									                  JMPNext(); \
							 | 
						||
| 
								 | 
							
													  break; \
							 | 
						||
| 
								 | 
							
									                } else { \
							 | 
						||
| 
								 | 
							
									                  setregs(); \
							 | 
						||
| 
								 | 
							
									                } \
							 | 
						||
| 
								 | 
							
									                continue; \
							 | 
						||
| 
								 | 
							
									              } \
							 | 
						||
| 
								 | 
							
									              while ((Int)d1--) { \
							 | 
						||
| 
								 | 
							
									                RESET_VARIABLE(pt1); \
							 | 
						||
| 
								 | 
							
									                pt1++; \
							 | 
						||
| 
								 | 
							
									              } \
							 | 
						||
| 
								 | 
							
									              HR = pt1; \
							 | 
						||
| 
								 | 
							
								                } else if ((Int)d1  < 0) { \
							 | 
						||
| 
								 | 
							
									              saveregs(); \
							 | 
						||
| 
								 | 
							
									              Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO,MkIntegerTerm(d1),"functor/3"); \
							 | 
						||
| 
								 | 
							
									              setregs(); \
							 | 
						||
| 
								 | 
							
									              YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												  break; \
							 | 
						||
| 
								 | 
							
								                } \
							 | 
						||
| 
								 | 
							
								                (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbpp),l); \
							 | 
						||
| 
								 | 
							
								                Bind(pt0, d0); \
							 | 
						||
| 
								 | 
							
								                GONext(); \
							 | 
						||
| 
								 | 
							
												break; \
							 | 
						||
| 
								 | 
							
											  } \
							 | 
						||
| 
								 | 
							
											  (pt1) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								              (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										    } \
							 | 
						||
| 
								 | 
							
										    saveregs(); \
							 | 
						||
| 
								 | 
							
								            Yap_Error(INSTANTIATION_ERROR, d1, "functor/3"); \
							 | 
						||
| 
								 | 
							
								            setregs(); \
							 | 
						||
| 
								 | 
							
								            YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
											break; \
							 | 
						||
| 
								 | 
							
										  } \
							 | 
						||
| 
								 | 
							
										  else { \
							 | 
						||
| 
								 | 
							
								            if (IsIntTerm(d1)) { \
							 | 
						||
| 
								 | 
							
									          d1 = IntOfTerm(d1); \
							 | 
						||
| 
								 | 
							
								            } else { \
							 | 
						||
| 
								 | 
							
									          saveregs(); \
							 | 
						||
| 
								 | 
							
									          Yap_Error(TYPE_ERROR_INTEGER,ARG3,"functor/3"); \
							 | 
						||
| 
								 | 
							
									          setregs(); \
							 | 
						||
| 
								 | 
							
									          YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
											  break; \
							 | 
						||
| 
								 | 
							
								            } \
							 | 
						||
| 
								 | 
							
								            if (!IsAtomicTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									          saveregs(); \
							 | 
						||
| 
								 | 
							
									          Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); \
							 | 
						||
| 
								 | 
							
									          setregs(); \
							 | 
						||
| 
								 | 
							
									          YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
											  break; \
							 | 
						||
| 
								 | 
							
								            } \
							 | 
						||
| 
								 | 
							
								            if (d0 == TermDot && d1 == 2) { \
							 | 
						||
| 
								 | 
							
									          RESET_VARIABLE(HR); \
							 | 
						||
| 
								 | 
							
									          RESET_VARIABLE(HR+1); \
							 | 
						||
| 
								 | 
							
									          d0 = AbsPair(HR); \
							 | 
						||
| 
								 | 
							
									          HR += 2; \
							 | 
						||
| 
								 | 
							
								            } \
							 | 
						||
| 
								 | 
							
								            else if ((Int)d1 > 0) { \
							 | 
						||
| 
								 | 
							
									          if (!IsAtomTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									            saveregs(); \
							 | 
						||
| 
								 | 
							
									            Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); \
							 | 
						||
| 
								 | 
							
									            setregs(); \
							 | 
						||
| 
								 | 
							
									            YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												break; \
							 | 
						||
| 
								 | 
							
									          } \
							 | 
						||
| 
								 | 
							
									          if (!IsAtomTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									            YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												break; \
							 | 
						||
| 
								 | 
							
									          } \
							 | 
						||
| 
								 | 
							
									          else { \
							 | 
						||
| 
								 | 
							
									            d0 = (CELL) Yap_MkFunctor(AtomOfTerm(d0), (Int) d1); \
							 | 
						||
| 
								 | 
							
										      } \
							 | 
						||
| 
								 | 
							
									          pt1 = HR; \
							 | 
						||
| 
								 | 
							
									          *pt1++ = d0; \
							 | 
						||
| 
								 | 
							
									          d0 = AbsAppl(HR); \
							 | 
						||
| 
								 | 
							
									          if (pt1+d1 > ENV || pt1+d1 > (CELL *)B) { \
							 | 
						||
| 
								 | 
							
									            saveregs(); \
							 | 
						||
| 
								 | 
							
									            if (!Yap_gcl((1+d1)*sizeof(CELL), 3, YREG, NEXTOP(NEXTOP((*_PREG),e),Osbmp))) { \
							 | 
						||
| 
								 | 
							
									              Yap_NilError(OUT_OF_STACK_ERROR,LOCAL_ErrorMessage); \
							 | 
						||
| 
								 | 
							
									              setregs(); \
							 | 
						||
| 
								 | 
							
									              JMPNext(); \
							 | 
						||
| 
								 | 
							
												  break; \
							 | 
						||
| 
								 | 
							
									            } else { \
							 | 
						||
| 
								 | 
							
									              setregs(); \
							 | 
						||
| 
								 | 
							
									            } \
							 | 
						||
| 
								 | 
							
									            continue; \
							 | 
						||
| 
								 | 
							
									          } \
							 | 
						||
| 
								 | 
							
									          while ((Int)d1--) { \
							 | 
						||
| 
								 | 
							
									            RESET_VARIABLE(pt1); \
							 | 
						||
| 
								 | 
							
									            pt1++; \
							 | 
						||
| 
								 | 
							
									          } \
							 | 
						||
| 
								 | 
							
									          HR = pt1; \
							 | 
						||
| 
								 | 
							
								            } else if ((Int)d1  < 0) { \
							 | 
						||
| 
								 | 
							
									          saveregs(); \
							 | 
						||
| 
								 | 
							
									          Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO,MkIntegerTerm(d1),"functor/3"); \
							 | 
						||
| 
								 | 
							
									          setregs(); \
							 | 
						||
| 
								 | 
							
									          YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
											  break; \
							 | 
						||
| 
								 | 
							
								            } \
							 | 
						||
| 
								 | 
							
								            (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbpp),l); \
							 | 
						||
| 
								 | 
							
								            Bind(pt0, d0); \
							 | 
						||
| 
								 | 
							
								            GONext(); \
							 | 
						||
| 
								 | 
							
											break; \
							 | 
						||
| 
								 | 
							
									      } \
							 | 
						||
| 
								 | 
							
										} \
							 | 
						||
| 
								 | 
							
									  } \
							 | 
						||
| 
								 | 
							
									  else { \
							 | 
						||
| 
								 | 
							
									    if (IsApplTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									      d1 = *RepAppl(d0); \
							 | 
						||
| 
								 | 
							
									      if (IsExtensionFunctor((Functor) d1)) { \
							 | 
						||
| 
								 | 
							
									        if (d1 <= (CELL)FunctorDouble && d1 >= (CELL)FunctorLongInt ) { \
							 | 
						||
| 
								 | 
							
									          d1 = MkIntTerm(0); \
							 | 
						||
| 
								 | 
							
									        } else { \
							 | 
						||
| 
								 | 
							
									          YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
											  break; \
							 | 
						||
| 
								 | 
							
											} \
							 | 
						||
| 
								 | 
							
									      } else { \
							 | 
						||
| 
								 | 
							
									        d0 = MkAtomTerm(NameOfFunctor((Functor) d1)); \
							 | 
						||
| 
								 | 
							
									        d1 = MkIntTerm(ArityOfFunctor((Functor) d1)); \
							 | 
						||
| 
								 | 
							
									      } \
							 | 
						||
| 
								 | 
							
								        } \
							 | 
						||
| 
								 | 
							
								        else if (IsPairTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									      d0 = TermDot; \
							 | 
						||
| 
								 | 
							
									      d1 = MkIntTerm(2); \
							 | 
						||
| 
								 | 
							
								        } \
							 | 
						||
| 
								 | 
							
								        else { \
							 | 
						||
| 
								 | 
							
									      d1 = MkIntTerm(0); \
							 | 
						||
| 
								 | 
							
								        } \
							 | 
						||
| 
								 | 
							
									    register CELL arity = d1; \
							 | 
						||
| 
								 | 
							
									    d1 = ARG2; \
							 | 
						||
| 
								 | 
							
										if (IsVarTerm(d1) { \
							 | 
						||
| 
								 | 
							
										  (pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								          (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										  while (Unsigned(pt0) != (d1)) { \
							 | 
						||
| 
								 | 
							
										    if(!IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
									          if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									            YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												break; \
							 | 
						||
| 
								 | 
							
									          } \
							 | 
						||
| 
								 | 
							
									          d0 = arity; \
							 | 
						||
| 
								 | 
							
										      d1 = ARG3; \
							 | 
						||
| 
								 | 
							
									          if (IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
											    (pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								                (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										        while (Unsigned(pt0) != (d1)) { \
							 | 
						||
| 
								 | 
							
										          if(!IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
											        if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									                  YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
													  break; \
							 | 
						||
| 
								 | 
							
									                } \
							 | 
						||
| 
								 | 
							
									                (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									                GONext(); \
							 | 
						||
| 
								 | 
							
													break; \
							 | 
						||
| 
								 | 
							
												  } \
							 | 
						||
| 
								 | 
							
												  (pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								                  (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
												} \
							 | 
						||
| 
								 | 
							
												(*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									            Bind(pt0, d0); \
							 | 
						||
| 
								 | 
							
									            GONext(); \
							 | 
						||
| 
								 | 
							
												break; \
							 | 
						||
| 
								 | 
							
											  } \
							 | 
						||
| 
								 | 
							
											  else { \
							 | 
						||
| 
								 | 
							
									            if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									              YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												  break; \
							 | 
						||
| 
								 | 
							
									            } \
							 | 
						||
| 
								 | 
							
									            (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									            GONext(); \
							 | 
						||
| 
								 | 
							
												break; \
							 | 
						||
| 
								 | 
							
											  } \
							 | 
						||
| 
								 | 
							
											} \
							 | 
						||
| 
								 | 
							
											(pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								            (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										  } \
							 | 
						||
| 
								 | 
							
										  Bind(pt0, d0); \
							 | 
						||
| 
								 | 
							
									      d0 = arity; \
							 | 
						||
| 
								 | 
							
										} \
							 | 
						||
| 
								 | 
							
										else { \
							 | 
						||
| 
								 | 
							
									      if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									        YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
											break; \
							 | 
						||
| 
								 | 
							
									      } \
							 | 
						||
| 
								 | 
							
									      d0 = arity; \
							 | 
						||
| 
								 | 
							
										} \
							 | 
						||
| 
								 | 
							
										d1 = ARG3; \
							 | 
						||
| 
								 | 
							
										if (IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
										  (pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								          (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										  while (Unsigned(pt0) != (d1)) { \
							 | 
						||
| 
								 | 
							
										    if(!IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
											  if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									            YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												break; \
							 | 
						||
| 
								 | 
							
									          } \
							 | 
						||
| 
								 | 
							
									          (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									          GONext(); \
							 | 
						||
| 
								 | 
							
											  break; \
							 | 
						||
| 
								 | 
							
											} \
							 | 
						||
| 
								 | 
							
											(pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								            (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										  } \
							 | 
						||
| 
								 | 
							
									      (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									      Bind(pt0, d0); \
							 | 
						||
| 
								 | 
							
									      GONext(); \
							 | 
						||
| 
								 | 
							
										  break; \
							 | 
						||
| 
								 | 
							
										} \
							 | 
						||
| 
								 | 
							
								        else { \
							 | 
						||
| 
								 | 
							
									      if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									        YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
											break; \
							 | 
						||
| 
								 | 
							
									      } \
							 | 
						||
| 
								 | 
							
									      (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									      GONext(); \
							 | 
						||
| 
								 | 
							
										  break; \
							 | 
						||
| 
								 | 
							
										} \
							 | 
						||
| 
								 | 
							
									  } \
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								#else /* LOW_LEVEL_TRACER */
							 | 
						||
| 
								 | 
							
								#define P_FUNCTOR_INSTINIT \
							 | 
						||
| 
								 | 
							
								    BLOCKADDRESS = (CELL)(*_PREG); \
							 | 
						||
| 
								 | 
							
								    register CELL d0, d1; \
							 | 
						||
| 
								 | 
							
								    register CELL *pt0, *pt1; \
							 | 
						||
| 
								 | 
							
									while (1) { \
							 | 
						||
| 
								 | 
							
								      d0 = ARG1; \
							 | 
						||
| 
								 | 
							
									  if (IsVarTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									    (pt0) = (CELL *)(d0); \
							 | 
						||
| 
								 | 
							
								        (d0) = *(CELL *)(d0); \
							 | 
						||
| 
								 | 
							
										while (Unsigned(pt0) != (d0)) { \
							 | 
						||
| 
								 | 
							
										  if(!IsVarTerm(d0)) { \
							 | 
						||
| 
								 | 
							
								            if (IsApplTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									          d1 = *RepAppl(d0); \
							 | 
						||
| 
								 | 
							
									          if (IsExtensionFunctor((Functor) d1)) { \
							 | 
						||
| 
								 | 
							
									            if (d1 <= (CELL)FunctorDouble && d1 >= (CELL)FunctorLongInt ) { \
							 | 
						||
| 
								 | 
							
									              d1 = MkIntTerm(0); \
							 | 
						||
| 
								 | 
							
									            } else { \
							 | 
						||
| 
								 | 
							
									              YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												  break; \
							 | 
						||
| 
								 | 
							
												} \
							 | 
						||
| 
								 | 
							
									          } else { \
							 | 
						||
| 
								 | 
							
									            d0 = MkAtomTerm(NameOfFunctor((Functor) d1)); \
							 | 
						||
| 
								 | 
							
									            d1 = MkIntTerm(ArityOfFunctor((Functor) d1)); \
							 | 
						||
| 
								 | 
							
									          } \
							 | 
						||
| 
								 | 
							
								            } \
							 | 
						||
| 
								 | 
							
								            else if (IsPairTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									          d0 = TermDot; \
							 | 
						||
| 
								 | 
							
									          d1 = MkIntTerm(2); \
							 | 
						||
| 
								 | 
							
								            } \
							 | 
						||
| 
								 | 
							
								            else { \
							 | 
						||
| 
								 | 
							
									          d1 = MkIntTerm(0); \
							 | 
						||
| 
								 | 
							
								            } \
							 | 
						||
| 
								 | 
							
									        register CELL arity = d1; \
							 | 
						||
| 
								 | 
							
									        d1 = ARG2; \
							 | 
						||
| 
								 | 
							
											if (IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
											  (pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								              (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										      while (Unsigned(pt0) != (d1)) { \
							 | 
						||
| 
								 | 
							
										        if(!IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
									              if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									                YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
													break; \
							 | 
						||
| 
								 | 
							
									              } \
							 | 
						||
| 
								 | 
							
									              d0 = arity; \
							 | 
						||
| 
								 | 
							
											      d1 = ARG3; \
							 | 
						||
| 
								 | 
							
									              if (IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
											        (pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								                    (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										            while (Unsigned(pt0) != (d1)) { \
							 | 
						||
| 
								 | 
							
										              if(!IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
													    if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									                      YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
														  break; \
							 | 
						||
| 
								 | 
							
									                    } \
							 | 
						||
| 
								 | 
							
									                    (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									                    GONext(); \
							 | 
						||
| 
								 | 
							
														break; \
							 | 
						||
| 
								 | 
							
													  } \
							 | 
						||
| 
								 | 
							
													  (pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								                      (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
													} \
							 | 
						||
| 
								 | 
							
													(*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									                Bind(pt0, d0); \
							 | 
						||
| 
								 | 
							
									                GONext(); \
							 | 
						||
| 
								 | 
							
													break; \
							 | 
						||
| 
								 | 
							
												  } \
							 | 
						||
| 
								 | 
							
												  else { \
							 | 
						||
| 
								 | 
							
									                if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									                  YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
													  break; \
							 | 
						||
| 
								 | 
							
									                } \
							 | 
						||
| 
								 | 
							
									                (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									                GONext(); \
							 | 
						||
| 
								 | 
							
													break; \
							 | 
						||
| 
								 | 
							
												  } \
							 | 
						||
| 
								 | 
							
												} \
							 | 
						||
| 
								 | 
							
												(pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								                (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
											  } \
							 | 
						||
| 
								 | 
							
											  Bind(pt0, d0); \
							 | 
						||
| 
								 | 
							
									          d0 = arity; \
							 | 
						||
| 
								 | 
							
											} \
							 | 
						||
| 
								 | 
							
											else { \
							 | 
						||
| 
								 | 
							
									          if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									            YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												break; \
							 | 
						||
| 
								 | 
							
									          } \
							 | 
						||
| 
								 | 
							
									          d0 = arity; \
							 | 
						||
| 
								 | 
							
											} \
							 | 
						||
| 
								 | 
							
											d1 = ARG3; \
							 | 
						||
| 
								 | 
							
											if (IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
											  (pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								              (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										      while (Unsigned(pt0) != (d1)) { \
							 | 
						||
| 
								 | 
							
										        if(!IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
												  if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									                YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
													break; \
							 | 
						||
| 
								 | 
							
									              } \
							 | 
						||
| 
								 | 
							
									              (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									              GONext(); \
							 | 
						||
| 
								 | 
							
												  break; \
							 | 
						||
| 
								 | 
							
												} \
							 | 
						||
| 
								 | 
							
												(pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								                (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
											  } \
							 | 
						||
| 
								 | 
							
											  (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									          Bind(pt0, d0); \
							 | 
						||
| 
								 | 
							
									          GONext(); \
							 | 
						||
| 
								 | 
							
											  break; \
							 | 
						||
| 
								 | 
							
											} \
							 | 
						||
| 
								 | 
							
								            else { \
							 | 
						||
| 
								 | 
							
									          if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									            YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												break; \
							 | 
						||
| 
								 | 
							
									          } \
							 | 
						||
| 
								 | 
							
									          (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									          GONext(); \
							 | 
						||
| 
								 | 
							
											  break; \
							 | 
						||
| 
								 | 
							
											} \
							 | 
						||
| 
								 | 
							
										  } \
							 | 
						||
| 
								 | 
							
										  (pt0) = (CELL *)(d0); \
							 | 
						||
| 
								 | 
							
								          (d0) = *(CELL *)(d0); \
							 | 
						||
| 
								 | 
							
										} \
							 | 
						||
| 
								 | 
							
										d0 = ARG2; \
							 | 
						||
| 
								 | 
							
										if (IsVarTerm(d0)) { \
							 | 
						||
| 
								 | 
							
										  (pt1) = (CELL *)(d0); \
							 | 
						||
| 
								 | 
							
								          (d0) = *(CELL *)(d0); \
							 | 
						||
| 
								 | 
							
										  while (Unsigned(pt1) != (d0)) { \
							 | 
						||
| 
								 | 
							
										    if(!IsVarTerm(d0)) { \
							 | 
						||
| 
								 | 
							
											  d1 = ARG3; \
							 | 
						||
| 
								 | 
							
										      if (IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
										        (pt1) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								                (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										        while (Unsigned(pt1) != (d1)) { \
							 | 
						||
| 
								 | 
							
										          if(!IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
												    if (IsIntTerm(d1)) { \
							 | 
						||
| 
								 | 
							
									                  d1 = IntOfTerm(d1); \
							 | 
						||
| 
								 | 
							
								                    } else { \
							 | 
						||
| 
								 | 
							
									                  saveregs(); \
							 | 
						||
| 
								 | 
							
									                  Yap_Error(TYPE_ERROR_INTEGER,ARG3,"functor/3"); \
							 | 
						||
| 
								 | 
							
									                  setregs(); \
							 | 
						||
| 
								 | 
							
									                  YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
													  break; \
							 | 
						||
| 
								 | 
							
								                    } \
							 | 
						||
| 
								 | 
							
								                    if (!IsAtomicTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									                  saveregs(); \
							 | 
						||
| 
								 | 
							
									                  Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); \
							 | 
						||
| 
								 | 
							
									                  setregs(); \
							 | 
						||
| 
								 | 
							
									                  YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
													  break; \
							 | 
						||
| 
								 | 
							
								                    } \
							 | 
						||
| 
								 | 
							
								                    if (d0 == TermDot && d1 == 2) { \
							 | 
						||
| 
								 | 
							
									                  RESET_VARIABLE(HR); \
							 | 
						||
| 
								 | 
							
									                  RESET_VARIABLE(HR+1); \
							 | 
						||
| 
								 | 
							
									                  d0 = AbsPair(HR); \
							 | 
						||
| 
								 | 
							
									                  HR += 2; \
							 | 
						||
| 
								 | 
							
								                    } \
							 | 
						||
| 
								 | 
							
								                    else if ((Int)d1 > 0) { \
							 | 
						||
| 
								 | 
							
									                  if (!IsAtomTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									                    saveregs(); \
							 | 
						||
| 
								 | 
							
									                    Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); \
							 | 
						||
| 
								 | 
							
									                    setregs(); \
							 | 
						||
| 
								 | 
							
									                    YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
														break; \
							 | 
						||
| 
								 | 
							
									                  } \
							 | 
						||
| 
								 | 
							
									                  if (!IsAtomTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									                    YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
														break; \
							 | 
						||
| 
								 | 
							
									                  } \
							 | 
						||
| 
								 | 
							
									                  else { \
							 | 
						||
| 
								 | 
							
									                    d0 = (CELL) Yap_MkFunctor(AtomOfTerm(d0), (Int) d1); \
							 | 
						||
| 
								 | 
							
										              } \
							 | 
						||
| 
								 | 
							
									                  pt1 = HR; \
							 | 
						||
| 
								 | 
							
									                  *pt1++ = d0; \
							 | 
						||
| 
								 | 
							
									                  d0 = AbsAppl(HR); \
							 | 
						||
| 
								 | 
							
									                  if (pt1+d1 > ENV || pt1+d1 > (CELL *)B) { \
							 | 
						||
| 
								 | 
							
									                    saveregs(); \
							 | 
						||
| 
								 | 
							
									                    if (!Yap_gcl((1+d1)*sizeof(CELL), 3, YREG, NEXTOP(NEXTOP((*_PREG),e),Osbmp))) { \
							 | 
						||
| 
								 | 
							
									                      Yap_NilError(OUT_OF_STACK_ERROR,LOCAL_ErrorMessage); \
							 | 
						||
| 
								 | 
							
									                      setregs(); \
							 | 
						||
| 
								 | 
							
									                      JMPNext(); \
							 | 
						||
| 
								 | 
							
														  break; \
							 | 
						||
| 
								 | 
							
									                    } else { \
							 | 
						||
| 
								 | 
							
									                      setregs(); \
							 | 
						||
| 
								 | 
							
									                    } \
							 | 
						||
| 
								 | 
							
									                    continue; \
							 | 
						||
| 
								 | 
							
									                  } \
							 | 
						||
| 
								 | 
							
									                  while ((Int)d1--) { \
							 | 
						||
| 
								 | 
							
									                    RESET_VARIABLE(pt1); \
							 | 
						||
| 
								 | 
							
									                    pt1++; \
							 | 
						||
| 
								 | 
							
									                  } \
							 | 
						||
| 
								 | 
							
									                  HR = pt1; \
							 | 
						||
| 
								 | 
							
								                    } else if ((Int)d1  < 0) { \
							 | 
						||
| 
								 | 
							
									                  saveregs(); \
							 | 
						||
| 
								 | 
							
									                  Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO,MkIntegerTerm(d1),"functor/3"); \
							 | 
						||
| 
								 | 
							
									                  setregs(); \
							 | 
						||
| 
								 | 
							
									                  YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
													  break; \
							 | 
						||
| 
								 | 
							
								                    } \
							 | 
						||
| 
								 | 
							
								                    (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbpp),l); \
							 | 
						||
| 
								 | 
							
								                    Bind(pt0, d0); \
							 | 
						||
| 
								 | 
							
								                    GONext(); \
							 | 
						||
| 
								 | 
							
													break; \
							 | 
						||
| 
								 | 
							
											      } \
							 | 
						||
| 
								 | 
							
											      (pt1) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								                  (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										        } \
							 | 
						||
| 
								 | 
							
										        saveregs(); \
							 | 
						||
| 
								 | 
							
								                Yap_Error(INSTANTIATION_ERROR, d1, "functor/3"); \
							 | 
						||
| 
								 | 
							
								                setregs(); \
							 | 
						||
| 
								 | 
							
								                YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												break; \
							 | 
						||
| 
								 | 
							
										      } \
							 | 
						||
| 
								 | 
							
										      else { \
							 | 
						||
| 
								 | 
							
								               if (IsIntTerm(d1)) { \
							 | 
						||
| 
								 | 
							
									              d1 = IntOfTerm(d1); \
							 | 
						||
| 
								 | 
							
								                } else { \
							 | 
						||
| 
								 | 
							
									              saveregs(); \
							 | 
						||
| 
								 | 
							
									              Yap_Error(TYPE_ERROR_INTEGER,ARG3,"functor/3"); \
							 | 
						||
| 
								 | 
							
									              setregs(); \
							 | 
						||
| 
								 | 
							
									              YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												  break; \
							 | 
						||
| 
								 | 
							
								                } \
							 | 
						||
| 
								 | 
							
								                if (!IsAtomicTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									              saveregs(); \
							 | 
						||
| 
								 | 
							
									              Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); \
							 | 
						||
| 
								 | 
							
									              setregs(); \
							 | 
						||
| 
								 | 
							
									              YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												  break; \
							 | 
						||
| 
								 | 
							
								                } \
							 | 
						||
| 
								 | 
							
								                if (d0 == TermDot && d1 == 2) { \
							 | 
						||
| 
								 | 
							
									              RESET_VARIABLE(HR); \
							 | 
						||
| 
								 | 
							
									              RESET_VARIABLE(HR+1); \
							 | 
						||
| 
								 | 
							
									              d0 = AbsPair(HR); \
							 | 
						||
| 
								 | 
							
									              HR += 2; \
							 | 
						||
| 
								 | 
							
								                } \
							 | 
						||
| 
								 | 
							
								                else if ((Int)d1 > 0) { \
							 | 
						||
| 
								 | 
							
									              if (!IsAtomTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									                saveregs(); \
							 | 
						||
| 
								 | 
							
									                Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); \
							 | 
						||
| 
								 | 
							
									                setregs(); \
							 | 
						||
| 
								 | 
							
									                YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
													break; \
							 | 
						||
| 
								 | 
							
									              } \
							 | 
						||
| 
								 | 
							
									              if (!IsAtomTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									                YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
													break; \
							 | 
						||
| 
								 | 
							
									              } \
							 | 
						||
| 
								 | 
							
									              else { \
							 | 
						||
| 
								 | 
							
									                d0 = (CELL) Yap_MkFunctor(AtomOfTerm(d0), (Int) d1); \
							 | 
						||
| 
								 | 
							
										          } \
							 | 
						||
| 
								 | 
							
									              pt1 = HR; \
							 | 
						||
| 
								 | 
							
									              *pt1++ = d0; \
							 | 
						||
| 
								 | 
							
									              d0 = AbsAppl(HR); \
							 | 
						||
| 
								 | 
							
									              if (pt1+d1 > ENV || pt1+d1 > (CELL *)B) { \
							 | 
						||
| 
								 | 
							
									                saveregs(); \
							 | 
						||
| 
								 | 
							
									                if (!Yap_gcl((1+d1)*sizeof(CELL), 3, YREG, NEXTOP(NEXTOP((*_PREG),e),Osbmp))) { \
							 | 
						||
| 
								 | 
							
									                  Yap_NilError(OUT_OF_STACK_ERROR,LOCAL_ErrorMessage); \
							 | 
						||
| 
								 | 
							
									                  setregs(); \
							 | 
						||
| 
								 | 
							
									                  JMPNext(); \
							 | 
						||
| 
								 | 
							
													  break; \
							 | 
						||
| 
								 | 
							
									                } else { \
							 | 
						||
| 
								 | 
							
									                  setregs(); \
							 | 
						||
| 
								 | 
							
									                } \
							 | 
						||
| 
								 | 
							
									                continue; \
							 | 
						||
| 
								 | 
							
									              } \
							 | 
						||
| 
								 | 
							
									              while ((Int)d1--) { \
							 | 
						||
| 
								 | 
							
									                RESET_VARIABLE(pt1); \
							 | 
						||
| 
								 | 
							
									                pt1++; \
							 | 
						||
| 
								 | 
							
									              } \
							 | 
						||
| 
								 | 
							
									              HR = pt1; \
							 | 
						||
| 
								 | 
							
								                } else if ((Int)d1  < 0) { \
							 | 
						||
| 
								 | 
							
									              saveregs(); \
							 | 
						||
| 
								 | 
							
									              Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO,MkIntegerTerm(d1),"functor/3"); \
							 | 
						||
| 
								 | 
							
									              setregs(); \
							 | 
						||
| 
								 | 
							
									              YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												  break; \
							 | 
						||
| 
								 | 
							
								                } \
							 | 
						||
| 
								 | 
							
								                (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbpp),l); \
							 | 
						||
| 
								 | 
							
								                Bind(pt0, d0); \
							 | 
						||
| 
								 | 
							
								                GONext(); \
							 | 
						||
| 
								 | 
							
												break; \
							 | 
						||
| 
								 | 
							
									          } \
							 | 
						||
| 
								 | 
							
											} \
							 | 
						||
| 
								 | 
							
											(pt1) = (CELL *)(d0); \
							 | 
						||
| 
								 | 
							
								            (d0) = *(CELL *)(d0); \
							 | 
						||
| 
								 | 
							
										  } \
							 | 
						||
| 
								 | 
							
										  saveregs(); \
							 | 
						||
| 
								 | 
							
								          Yap_Error(INSTANTIATION_ERROR, d0, "functor/3"); \
							 | 
						||
| 
								 | 
							
								          setregs(); \
							 | 
						||
| 
								 | 
							
								          YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
										  break; \
							 | 
						||
| 
								 | 
							
										} \
							 | 
						||
| 
								 | 
							
										else { \
							 | 
						||
| 
								 | 
							
								          d1 = ARG3; \
							 | 
						||
| 
								 | 
							
										  if (IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
										    (pt1) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								            (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										    while (Unsigned(pt1) != (d1)) { \
							 | 
						||
| 
								 | 
							
										      if(!IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
												if (IsIntTerm(d1)) { \
							 | 
						||
| 
								 | 
							
									              d1 = IntOfTerm(d1); \
							 | 
						||
| 
								 | 
							
								                } else { \
							 | 
						||
| 
								 | 
							
									              saveregs(); \
							 | 
						||
| 
								 | 
							
									              Yap_Error(TYPE_ERROR_INTEGER,ARG3,"functor/3"); \
							 | 
						||
| 
								 | 
							
									              setregs(); \
							 | 
						||
| 
								 | 
							
									              YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												  break; \
							 | 
						||
| 
								 | 
							
								                } \
							 | 
						||
| 
								 | 
							
								                if (!IsAtomicTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									              saveregs(); \
							 | 
						||
| 
								 | 
							
									              Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); \
							 | 
						||
| 
								 | 
							
									              setregs(); \
							 | 
						||
| 
								 | 
							
									              YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												  break; \
							 | 
						||
| 
								 | 
							
								                } \
							 | 
						||
| 
								 | 
							
								                if (d0 == TermDot && d1 == 2) { \
							 | 
						||
| 
								 | 
							
									              RESET_VARIABLE(HR); \
							 | 
						||
| 
								 | 
							
									              RESET_VARIABLE(HR+1); \
							 | 
						||
| 
								 | 
							
									              d0 = AbsPair(HR); \
							 | 
						||
| 
								 | 
							
									              HR += 2; \
							 | 
						||
| 
								 | 
							
								                } \
							 | 
						||
| 
								 | 
							
								                else if ((Int)d1 > 0) { \
							 | 
						||
| 
								 | 
							
									              if (!IsAtomTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									                saveregs(); \
							 | 
						||
| 
								 | 
							
									                Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); \
							 | 
						||
| 
								 | 
							
									                setregs(); \
							 | 
						||
| 
								 | 
							
									                YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
													break; \
							 | 
						||
| 
								 | 
							
									              } \
							 | 
						||
| 
								 | 
							
									              if (!IsAtomTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									                YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
													break; \
							 | 
						||
| 
								 | 
							
									              } \
							 | 
						||
| 
								 | 
							
									              else { \
							 | 
						||
| 
								 | 
							
									                d0 = (CELL) Yap_MkFunctor(AtomOfTerm(d0), (Int) d1); \
							 | 
						||
| 
								 | 
							
										          } \
							 | 
						||
| 
								 | 
							
									              pt1 = HR; \
							 | 
						||
| 
								 | 
							
									              *pt1++ = d0; \
							 | 
						||
| 
								 | 
							
									              d0 = AbsAppl(HR); \
							 | 
						||
| 
								 | 
							
									              if (pt1+d1 > ENV || pt1+d1 > (CELL *)B) { \
							 | 
						||
| 
								 | 
							
									                saveregs(); \
							 | 
						||
| 
								 | 
							
									                if (!Yap_gcl((1+d1)*sizeof(CELL), 3, YREG, NEXTOP(NEXTOP((*_PREG),e),Osbmp))) { \
							 | 
						||
| 
								 | 
							
									                  Yap_NilError(OUT_OF_STACK_ERROR,LOCAL_ErrorMessage); \
							 | 
						||
| 
								 | 
							
									                  setregs(); \
							 | 
						||
| 
								 | 
							
									                  JMPNext(); \
							 | 
						||
| 
								 | 
							
													  break; \
							 | 
						||
| 
								 | 
							
									                } else { \
							 | 
						||
| 
								 | 
							
									                  setregs(); \
							 | 
						||
| 
								 | 
							
									                } \
							 | 
						||
| 
								 | 
							
									                continue; \
							 | 
						||
| 
								 | 
							
									              } \
							 | 
						||
| 
								 | 
							
									              while ((Int)d1--) { \
							 | 
						||
| 
								 | 
							
									                RESET_VARIABLE(pt1); \
							 | 
						||
| 
								 | 
							
									                pt1++; \
							 | 
						||
| 
								 | 
							
									              } \
							 | 
						||
| 
								 | 
							
									              HR = pt1; \
							 | 
						||
| 
								 | 
							
								                } else if ((Int)d1  < 0) { \
							 | 
						||
| 
								 | 
							
									              saveregs(); \
							 | 
						||
| 
								 | 
							
									              Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO,MkIntegerTerm(d1),"functor/3"); \
							 | 
						||
| 
								 | 
							
									              setregs(); \
							 | 
						||
| 
								 | 
							
									              YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												  break; \
							 | 
						||
| 
								 | 
							
								                } \
							 | 
						||
| 
								 | 
							
								                (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbpp),l); \
							 | 
						||
| 
								 | 
							
								                Bind(pt0, d0); \
							 | 
						||
| 
								 | 
							
								                GONext(); \
							 | 
						||
| 
								 | 
							
												break; \
							 | 
						||
| 
								 | 
							
											  } \
							 | 
						||
| 
								 | 
							
											  (pt1) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								              (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										    } \
							 | 
						||
| 
								 | 
							
										    saveregs(); \
							 | 
						||
| 
								 | 
							
								            Yap_Error(INSTANTIATION_ERROR, d1, "functor/3"); \
							 | 
						||
| 
								 | 
							
								            setregs(); \
							 | 
						||
| 
								 | 
							
								            YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
											break; \
							 | 
						||
| 
								 | 
							
										  } \
							 | 
						||
| 
								 | 
							
										  else { \
							 | 
						||
| 
								 | 
							
								            if (IsIntTerm(d1)) { \
							 | 
						||
| 
								 | 
							
									          d1 = IntOfTerm(d1); \
							 | 
						||
| 
								 | 
							
								            } else { \
							 | 
						||
| 
								 | 
							
									          saveregs(); \
							 | 
						||
| 
								 | 
							
									          Yap_Error(TYPE_ERROR_INTEGER,ARG3,"functor/3"); \
							 | 
						||
| 
								 | 
							
									          setregs(); \
							 | 
						||
| 
								 | 
							
									          YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
											  break; \
							 | 
						||
| 
								 | 
							
								            } \
							 | 
						||
| 
								 | 
							
								            if (!IsAtomicTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									          saveregs(); \
							 | 
						||
| 
								 | 
							
									          Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); \
							 | 
						||
| 
								 | 
							
									          setregs(); \
							 | 
						||
| 
								 | 
							
									          YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
											  break; \
							 | 
						||
| 
								 | 
							
								            } \
							 | 
						||
| 
								 | 
							
								            if (d0 == TermDot && d1 == 2) { \
							 | 
						||
| 
								 | 
							
									          RESET_VARIABLE(HR); \
							 | 
						||
| 
								 | 
							
									          RESET_VARIABLE(HR+1); \
							 | 
						||
| 
								 | 
							
									          d0 = AbsPair(HR); \
							 | 
						||
| 
								 | 
							
									          HR += 2; \
							 | 
						||
| 
								 | 
							
								            } \
							 | 
						||
| 
								 | 
							
								            else if ((Int)d1 > 0) { \
							 | 
						||
| 
								 | 
							
									          if (!IsAtomTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									            saveregs(); \
							 | 
						||
| 
								 | 
							
									            Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); \
							 | 
						||
| 
								 | 
							
									            setregs(); \
							 | 
						||
| 
								 | 
							
									            YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												break; \
							 | 
						||
| 
								 | 
							
									          } \
							 | 
						||
| 
								 | 
							
									          if (!IsAtomTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									            YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												break; \
							 | 
						||
| 
								 | 
							
									          } \
							 | 
						||
| 
								 | 
							
									          else { \
							 | 
						||
| 
								 | 
							
									            d0 = (CELL) Yap_MkFunctor(AtomOfTerm(d0), (Int) d1); \
							 | 
						||
| 
								 | 
							
										      } \
							 | 
						||
| 
								 | 
							
									          pt1 = HR; \
							 | 
						||
| 
								 | 
							
									          *pt1++ = d0; \
							 | 
						||
| 
								 | 
							
									          d0 = AbsAppl(HR); \
							 | 
						||
| 
								 | 
							
									          if (pt1+d1 > ENV || pt1+d1 > (CELL *)B) { \
							 | 
						||
| 
								 | 
							
									            saveregs(); \
							 | 
						||
| 
								 | 
							
									            if (!Yap_gcl((1+d1)*sizeof(CELL), 3, YREG, NEXTOP(NEXTOP((*_PREG),e),Osbmp))) { \
							 | 
						||
| 
								 | 
							
									              Yap_NilError(OUT_OF_STACK_ERROR,LOCAL_ErrorMessage); \
							 | 
						||
| 
								 | 
							
									              setregs(); \
							 | 
						||
| 
								 | 
							
									              JMPNext(); \
							 | 
						||
| 
								 | 
							
												  break; \
							 | 
						||
| 
								 | 
							
									            } else { \
							 | 
						||
| 
								 | 
							
									              setregs(); \
							 | 
						||
| 
								 | 
							
									            } \
							 | 
						||
| 
								 | 
							
									            continue; \
							 | 
						||
| 
								 | 
							
									          } \
							 | 
						||
| 
								 | 
							
									          while ((Int)d1--) { \
							 | 
						||
| 
								 | 
							
									            RESET_VARIABLE(pt1); \
							 | 
						||
| 
								 | 
							
									            pt1++; \
							 | 
						||
| 
								 | 
							
									          } \
							 | 
						||
| 
								 | 
							
									          HR = pt1; \
							 | 
						||
| 
								 | 
							
								            } else if ((Int)d1  < 0) { \
							 | 
						||
| 
								 | 
							
									          saveregs(); \
							 | 
						||
| 
								 | 
							
									          Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO,MkIntegerTerm(d1),"functor/3"); \
							 | 
						||
| 
								 | 
							
									          setregs(); \
							 | 
						||
| 
								 | 
							
									          YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
											  break; \
							 | 
						||
| 
								 | 
							
								            } \
							 | 
						||
| 
								 | 
							
								            (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbpp),l); \
							 | 
						||
| 
								 | 
							
								            Bind(pt0, d0); \
							 | 
						||
| 
								 | 
							
								            GONext(); \
							 | 
						||
| 
								 | 
							
											break; \
							 | 
						||
| 
								 | 
							
									      } \
							 | 
						||
| 
								 | 
							
										} \
							 | 
						||
| 
								 | 
							
									  } \
							 | 
						||
| 
								 | 
							
									  else { \
							 | 
						||
| 
								 | 
							
									    if (IsApplTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									      d1 = *RepAppl(d0); \
							 | 
						||
| 
								 | 
							
									      if (IsExtensionFunctor((Functor) d1)) { \
							 | 
						||
| 
								 | 
							
									        if (d1 <= (CELL)FunctorDouble && d1 >= (CELL)FunctorLongInt ) { \
							 | 
						||
| 
								 | 
							
									          d1 = MkIntTerm(0); \
							 | 
						||
| 
								 | 
							
									        } else { \
							 | 
						||
| 
								 | 
							
									          YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
											  break; \
							 | 
						||
| 
								 | 
							
											} \
							 | 
						||
| 
								 | 
							
									      } else { \
							 | 
						||
| 
								 | 
							
									        d0 = MkAtomTerm(NameOfFunctor((Functor) d1)); \
							 | 
						||
| 
								 | 
							
									        d1 = MkIntTerm(ArityOfFunctor((Functor) d1)); \
							 | 
						||
| 
								 | 
							
									      } \
							 | 
						||
| 
								 | 
							
								        } \
							 | 
						||
| 
								 | 
							
								        else if (IsPairTerm(d0)) { \
							 | 
						||
| 
								 | 
							
									      d0 = TermDot; \
							 | 
						||
| 
								 | 
							
									      d1 = MkIntTerm(2); \
							 | 
						||
| 
								 | 
							
								        } \
							 | 
						||
| 
								 | 
							
								        else { \
							 | 
						||
| 
								 | 
							
									      d1 = MkIntTerm(0); \
							 | 
						||
| 
								 | 
							
								        } \
							 | 
						||
| 
								 | 
							
									    register CELL arity = d1; \
							 | 
						||
| 
								 | 
							
									    d1 = ARG2; \
							 | 
						||
| 
								 | 
							
										if (IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
										  (pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								          (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										  while (Unsigned(pt0) != (d1)) { \
							 | 
						||
| 
								 | 
							
										    if(!IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
									          if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									            YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												break; \
							 | 
						||
| 
								 | 
							
									          } \
							 | 
						||
| 
								 | 
							
									          d0 = arity; \
							 | 
						||
| 
								 | 
							
										      d1 = ARG3; \
							 | 
						||
| 
								 | 
							
									          if (IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
											    (pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								                (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										        while (Unsigned(pt0) != (d1)) { \
							 | 
						||
| 
								 | 
							
										          if(!IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
											        if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									                  YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
													  break; \
							 | 
						||
| 
								 | 
							
									                } \
							 | 
						||
| 
								 | 
							
									                (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									                GONext(); \
							 | 
						||
| 
								 | 
							
													break; \
							 | 
						||
| 
								 | 
							
												  } \
							 | 
						||
| 
								 | 
							
												  (pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								                  (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
												} \
							 | 
						||
| 
								 | 
							
												(*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									            Bind(pt0, d0); \
							 | 
						||
| 
								 | 
							
									            GONext(); \
							 | 
						||
| 
								 | 
							
												break; \
							 | 
						||
| 
								 | 
							
											  } \
							 | 
						||
| 
								 | 
							
											  else { \
							 | 
						||
| 
								 | 
							
									            if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									              YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												  break; \
							 | 
						||
| 
								 | 
							
									            } \
							 | 
						||
| 
								 | 
							
									            (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									            GONext(); \
							 | 
						||
| 
								 | 
							
												break; \
							 | 
						||
| 
								 | 
							
											  } \
							 | 
						||
| 
								 | 
							
											} \
							 | 
						||
| 
								 | 
							
											(pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								            (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										  } \
							 | 
						||
| 
								 | 
							
										  Bind(pt0, d0); \
							 | 
						||
| 
								 | 
							
									      d0 = arity; \
							 | 
						||
| 
								 | 
							
										} \
							 | 
						||
| 
								 | 
							
										else { \
							 | 
						||
| 
								 | 
							
									      if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									        YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
											break; \
							 | 
						||
| 
								 | 
							
									      } \
							 | 
						||
| 
								 | 
							
									      d0 = arity; \
							 | 
						||
| 
								 | 
							
										} \
							 | 
						||
| 
								 | 
							
										d1 = ARG3; \
							 | 
						||
| 
								 | 
							
										if (IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
										  (pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								          (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										  while (Unsigned(pt0) != (d1)) { \
							 | 
						||
| 
								 | 
							
										    if(!IsVarTerm(d1)) { \
							 | 
						||
| 
								 | 
							
											  if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									            YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
												break; \
							 | 
						||
| 
								 | 
							
									          } \
							 | 
						||
| 
								 | 
							
									          (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									          GONext(); \
							 | 
						||
| 
								 | 
							
											  break; \
							 | 
						||
| 
								 | 
							
											} \
							 | 
						||
| 
								 | 
							
											(pt0) = (CELL *)(d1); \
							 | 
						||
| 
								 | 
							
								            (d1) = *(CELL *)(d1); \
							 | 
						||
| 
								 | 
							
										  } \
							 | 
						||
| 
								 | 
							
									      (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									      Bind(pt0, d0); \
							 | 
						||
| 
								 | 
							
									      GONext(); \
							 | 
						||
| 
								 | 
							
										  break; \
							 | 
						||
| 
								 | 
							
										} \
							 | 
						||
| 
								 | 
							
								        else { \
							 | 
						||
| 
								 | 
							
									      if (d0 != d1) { \
							 | 
						||
| 
								 | 
							
									        YAAM_FAIL; \
							 | 
						||
| 
								 | 
							
											break; \
							 | 
						||
| 
								 | 
							
									      } \
							 | 
						||
| 
								 | 
							
									      (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
							 | 
						||
| 
								 | 
							
									      GONext(); \
							 | 
						||
| 
								 | 
							
										  break; \
							 | 
						||
| 
								 | 
							
										} \
							 | 
						||
| 
								 | 
							
									  } \
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								#endif /* LOW_LEVEL_TRACER */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define P_FUNCTOR_END \
							 | 
						||
| 
								 | 
							
								      BLOCK = (CELL)P_FUNCTOR_END;
							 |