fix fflush

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@125 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
vsc 2001-07-16 15:26:14 +00:00
parent 3e6060a84f
commit eade18026c
18 changed files with 3521 additions and 3726 deletions

View File

@ -313,7 +313,15 @@ YP_putc(int ch, int sno)
int int
YP_fflush(int sno) YP_fflush(int sno)
{ {
if (Stream[sno].status & (Null_Stream_f|InMemory_Stream_f|Socket_Stream_f|Pipe_Stream_f)) if ( (Stream[sno].status & Output_Stream_f) &&
! (Stream[sno].status &
(Null_Stream_f|
InMemory_Stream_f|
Socket_Stream_f|
Pipe_Stream_f|
Free_Stream_f)) )
return(fflush(Stream[sno].u.file.file));
else
return(0); return(0);
return(fflush(Stream[sno].u.file.file)); return(fflush(Stream[sno].u.file.file));
} }
@ -2541,7 +2549,7 @@ p_write (void)
static Int static Int
p_write2 (void) p_write2 (void)
{ /* '$write'(+Flags,?Term) */ { /* '$write'(+Stream,+Flags,?Term) */
int old_output_stream = c_output_stream; int old_output_stream = c_output_stream;
c_output_stream = CheckStream (ARG1, Output_Stream_f, "write/2"); c_output_stream = CheckStream (ARG1, Output_Stream_f, "write/2");
if (c_output_stream == -1) { if (c_output_stream == -1) {
@ -4338,7 +4346,14 @@ p_flush (void)
static Int static Int
p_flush_all_streams (void) p_flush_all_streams (void)
{ /* $flush_all_streams */ { /* $flush_all_streams */
#if BROKEN_FFLUSH_NULL
int i;
for (i = 0; i < MaxStreams; ++i)
YP_fflush (i);
#else
fflush (NULL); fflush (NULL);
#endif
return (TRUE); return (TRUE);
} }

View File

@ -1595,6 +1595,14 @@ RestoreClause(Clause *Cl)
case _getwork: case _getwork:
case _getwork_seq: case _getwork_seq:
case _sync: case _sync:
#endif
#ifdef TABLING
case _table_try_me_single:
case _table_try_me:
case _table_retry_me:
case _table_trust_me:
case _table_answer_resolution:
case _table_completion:
#endif #endif
pc->u.ld.p = CodeAddrAdjust(pc->u.ld.p); pc->u.ld.p = CodeAddrAdjust(pc->u.ld.p);
pc->u.ld.d = CodeAddrAdjust(pc->u.ld.d); pc->u.ld.d = CodeAddrAdjust(pc->u.ld.d);
@ -1646,6 +1654,28 @@ RestoreClause(Clause *Cl)
case _p_functor: case _p_functor:
#ifdef YAPOR #ifdef YAPOR
case _getwork_first_time: case _getwork_first_time:
#endif
#ifdef TABLING
case _trie_do_var:
case _trie_trust_var:
case _trie_try_var:
case _trie_retry_var:
case _trie_do_val:
case _trie_trust_val:
case _trie_try_val:
case _trie_retry_val:
case _trie_do_atom:
case _trie_trust_atom:
case _trie_try_atom:
case _trie_retry_atom:
case _trie_do_list:
case _trie_trust_list:
case _trie_try_list:
case _trie_retry_list:
case _trie_do_struct:
case _trie_trust_struct:
case _trie_try_struct:
case _trie_retry_struct:
#endif #endif
pc = NEXTOP(pc,e); pc = NEXTOP(pc,e);
break; break;
@ -1891,6 +1921,9 @@ RestoreClause(Clause *Cl)
/* instructions type s */ /* instructions type s */
case _write_n_voids: case _write_n_voids:
case _pop_n: case _pop_n:
#ifdef TABLING
case _table_new_answer:
#endif
pc = NEXTOP(pc,s); pc = NEXTOP(pc,s);
break; break;
/* instructions type c */ /* instructions type c */

View File

@ -1473,7 +1473,8 @@ int TrueFileName (char *source, char *result, int in_lib)
#if __simplescalar__ #if __simplescalar__
/* does not implement getcwd */ /* does not implement getcwd */
strncpy(ares1,".",YAP_FILENAME_MAX); char *yap_pwd = getenv("PWD");
strncpy(ares1,yap_pwd,YAP_FILENAME_MAX);
#elif HAVE_GETCWD #elif HAVE_GETCWD
if (getcwd (ares1, YAP_FILENAME_MAX) == NULL) if (getcwd (ares1, YAP_FILENAME_MAX) == NULL)
return (FALSE); return (FALSE);
@ -1562,7 +1563,8 @@ p_getcwd(void)
#if __simplescalar__ #if __simplescalar__
/* does not implement getcwd */ /* does not implement getcwd */
strncpy(FileNameBuf,".",YAP_FILENAME_MAX); char *yap_pwd = getenv("PWD");
strncpy(FileNameBuf,yap_pwd,YAP_FILENAME_MAX);
#elif HAVE_GETCWD #elif HAVE_GETCWD
if (getcwd (FileNameBuf, YAP_FILENAME_MAX) == NULL) if (getcwd (FileNameBuf, YAP_FILENAME_MAX) == NULL)
return (FALSE); return (FALSE);
@ -1752,6 +1754,11 @@ p_cd (void)
return(FALSE); return(FALSE);
} }
TrueFileName (FileNameBuf, FileNameBuf2, FALSE); TrueFileName (FileNameBuf, FileNameBuf2, FALSE);
#if __simplescalar__
strncpy(FileNameBuf,"PWD=",YAP_FILENAME_MAX);
strncat(FileNameBuf,FileNameBuf2,YAP_FILENAME_MAX);
putenv(FileNameBuf);
#endif
return (!chdir (FileNameBuf2)); return (!chdir (FileNameBuf2));
#else #else
#ifdef MACYAP #ifdef MACYAP

View File

@ -129,7 +129,7 @@ low_level_trace(yap_low_level_port port, PredEntry *pred, CELL *args)
extern int gc_calls; extern int gc_calls;
vsc_count++; vsc_count++;
if (vsc_count < 2518) return; /* if (vsc_count < 2518) return; */
/* if (vsc_count > 500000) exit(0); */ /* if (vsc_count > 500000) exit(0); */
/* if (gc_calls < 1) return;*/ /* if (gc_calls < 1) return;*/
YP_fprintf(YP_stderr,"%lu (%p)", vsc_count, H); YP_fprintf(YP_stderr,"%lu (%p)", vsc_count, H);

View File

@ -1,113 +1,109 @@
/************************************************************************* /*************************************************************************
* * * *
* YAP Prolog %W% %G% * YAP Prolog %W% %G%
* * * *
* Yap Prolog was developed at NCCUP - Universidade do Porto * * Yap Prolog was developed at NCCUP - Universidade do Porto *
* * * *
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
* * * *
************************************************************************** **************************************************************************
* * * *
* File: Atoms.h.m4 * * File: Atoms.h.m4 *
* Last rev: 19/2/88 * * Last rev: 19/2/88 *
* mods: * * mods: *
* comments: atom properties header file for YAP * * comments: atom properties header file for YAP *
* * * *
*************************************************************************/ *************************************************************************/
#undef EXTERN #undef EXTERN
#ifndef ADTDEFS_C #ifndef ADTDEFS_C
#define EXTERN static #define EXTERN static
#else #else
#define EXTERN #define EXTERN
#endif #endif
/********* operations for atoms ****************************************/ /********* operations for atoms ****************************************/
/* Atoms are assumed to be uniquely represented by an OFFSET and to have /* Atoms are assumed to be uniquely represented by an OFFSET and to have
associated with them a struct of type AtomEntry associated with them a struct of type AtomEntry
The two functions The two functions
RepAtom : Atom -> *AtomEntry RepAtom : Atom -> *AtomEntry
AbsAtom : *AtomEntry -> Atom AbsAtom : *AtomEntry -> Atom
are used to encapsulate the implementation of atoms are used to encapsulate the implementation of atoms
*/ */
typedef struct AtomEntryStruct *Atom; typedef struct AtomEntryStruct *Atom;
typedef struct PropEntryStruct *Prop; typedef struct PropEntryStruct *Prop;
/* I can only define the structure after I define the actual atoms */ /* I can only define the structure after I define the actual atoms */
/* atom structure */ /* atom structure */
typedef struct AtomEntryStruct typedef struct AtomEntryStruct {
{ Atom NextOfAE; /* used to build hash chains */
Atom NextOfAE; /* used to build hash chains */ Prop PropOfAE; /* property list for this atom */
Prop PropOfAE; /* property list for this atom */ #if defined(YAPOR) || defined(THREADS)
#if defined(YAPOR) || defined(THREADS) rwlock_t ARWLock;
rwlock_t ARWLock; #endif
#endif
char StrOfAE[MIN_ARRAY]; /* representation of atom as a string */
char StrOfAE[MIN_ARRAY]; /* representation of atom as a string */ }
} AtomEntry;
AtomEntry;
/* Props and Atoms are stored in chains, ending with a NIL */
/* Props and Atoms are stored in chains, ending with a NIL */ #if USE_OFFSETS
#if USE_OFFSETS # define EndOfPAEntr(P) ( Addr(P) == AtomBase)
# define EndOfPAEntr(P) ( Addr(P) == AtomBase) #else
#else # define EndOfPAEntr(P) ( Addr(P) == NIL )
# define EndOfPAEntr(P) ( Addr(P) == NIL ) #endif
#endif
#define AtomName(at) RepAtom(at)->StrOfAE
#define AtomName(at) RepAtom(at)->StrOfAE
/* ********************** Properties **********************************/
/* ********************** Properties **********************************/
#if USE_OFFSETS
#if USE_OFFSETS #define USE_OFFSETS_IN_PROPS 1
#define USE_OFFSETS_IN_PROPS 1 #else
#else #define USE_OFFSETS_IN_PROPS 0
#define USE_OFFSETS_IN_PROPS 0 #endif
#endif
typedef SFLAGS PropFlags;
typedef SFLAGS PropFlags;
/* basic property entry structure */
/* basic property entry structure */ typedef struct PropEntryStruct {
typedef struct PropEntryStruct Prop NextOfPE; /* used to chain properties */
{ PropFlags KindOfPE; /* kind of property */
Prop NextOfPE; /* used to chain properties */ } PropEntry;
PropFlags KindOfPE; /* kind of property */
} /* ************************* Functors **********************************/
PropEntry;
/* Functor data type
/* ************************* Functors **********************************/ abstype Functor = atom # int
with MkFunctor(a,n) = ...
/* Functor data type and NameOfFunctor(f) = ...
abstype Functor = atom # int and ArityOfFunctor(f) = ... */
with MkFunctor(a,n) = ...
and NameOfFunctor(f) = ... #define MaxArity 255
and ArityOfFunctor(f) = ... */
#define MaxArity 255 #define FunctorProperty ((PropFlags)(0xbb00))
/* functor property */
#define FunctorProperty ((PropFlags)(0xbb00)) typedef struct FunctorEntryStruct {
Prop NextOfPE; /* used to chain properties */
/* functor property */ PropFlags KindOfPE; /* kind of property */
typedef struct FunctorEntryStruct unsigned int ArityOfFE; /* arity of functor */
{ Atom NameOfFE; /* back pointer to owner atom */
Prop NextOfPE; /* used to chain properties */ Prop PropsOfFE; /* pointer to list of properties for this functor */
PropFlags KindOfPE; /* kind of property */ } FunctorEntry;
unsigned int ArityOfFE; /* arity of functor */
Atom NameOfFE; /* back pointer to owner atom */ typedef FunctorEntry *Functor;
Prop PropsOfFE; /* pointer to list of properties for this functor */
}
FunctorEntry;
typedef FunctorEntry *Functor;

View File

@ -1,187 +1,177 @@
/************************************************************************* /*************************************************************************
* * * *
* YAP Prolog %W% %G% * * YAP Prolog %W% %G% *
* Yap Prolog was developed at NCCUP - Universidade do Porto * * Yap Prolog was developed at NCCUP - Universidade do Porto *
* * * *
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
* * * *
************************************************************************** **************************************************************************
* * * *
* File: Tags_24bits.h.m4 * * File: Tags_24bits.h.m4 *
* Last rev: December 90 * * Last rev: December 90 *
* mods: * * mods: *
* comments: Tag Scheme for machines with 24 bits adresses (m68000) * * comments: Tag Scheme for machines with 24 bits adresses (m68000) *
* version: $Id: Tags_24bits.h,v 1.1.1.1 2001-04-09 19:53:40 vsc Exp $ * * version: $Id: Tags_24bits.h,v 1.2 2001-07-16 15:26:14 vsc Exp $ *
*************************************************************************/ *************************************************************************/
/* Version for 24 bit addresses (68000) /* Version for 24 bit addresses (68000)
Each term is represented internally as an unsigned 32 bit integer as Each term is represented internally as an unsigned 32 bit integer as
follows: follows:
tag value tag value
ints 1m1000 numeric value ints 1m1000 numeric value
floats 1m1001 floating point value floats 1m1001 floating point value
pairs 1mr10. ptr to pair pairs 1mr10. ptr to pair
aplied functor 1mr01. ptr to functor followed by args aplied functor 1mr01. ptr to functor followed by args
ref 0mr000 address of cell ref 0mr000 address of cell
undefined 0mr000 pointing to itself undefined 0mr000 pointing to itself
*/ */
#define AllTagBits 0xfc000000L #define AllTagBits 0xfc000000L
#define TagBits 0xbc000000L #define TagBits 0xbc000000L
#define MaskAdr 0x03ffffffL #define MaskAdr 0x03ffffffL
#define AdrHiBit 0x02000000L #define AdrHiBit 0x02000000L
#define NumberTag 0xa0000000L #define NumberTag 0xa0000000L
#define FloatTag 0xa4000000L #define FloatTag 0xa4000000L
#define AtomTag 0x84000000L #define AtomTag 0x84000000L
#define PairTag 0x90000000L #define PairTag 0x90000000L
#define ApplTag 0x88000000L #define ApplTag 0x88000000L
#define RefTag 0x80000000L #define RefTag 0x80000000L
#define MaskBits 6 #define MaskBits 6
#define PairBit 0x10000000L #define PairBit 0x10000000L
#define ApplBit 0x08000000L #define ApplBit 0x08000000L
#define CompBits 0x18000000L #define CompBits 0x18000000L
#define NumberMask 0xb8000000L #define NumberMask 0xb8000000L
#define MAX_ABS_INT /* 0xfe00000LL */ ((((UInt)(1<<7))-1) << SHIFT_HIGH_TAG) #define MAX_ABS_INT /* 0xfe00000LL */ ((((UInt)(1<<7))-1) << SHIFT_HIGH_TAG)
#define NonTagPart(X) (Signed(X) & MaskAdr) #define NonTagPart(X) (Signed(X) & MaskAdr)
#define TAGGEDA(TAG,V) (TAG | Unsigned(V)) #define TAGGEDA(TAG,V) (TAG | Unsigned(V))
#define TAGGED(TAG,V) (TAG | NonTagPart(Unsigned(V))) #define TAGGED(TAG,V) (TAG | NonTagPart(Unsigned(V)))
#define NONTAGGED(TAG,V) NonTagPart(Unsigned(V)) #define NONTAGGED(TAG,V) NonTagPart(Unsigned(V))
#define BitOn(Bit,V) (Bit & Unsigned(V)) #define BitOn(Bit,V) (Bit & Unsigned(V))
#define CHKTAG(t,Tag) ((Unsigned(t)&TagBits)==Tag) #define CHKTAG(t,Tag) ((Unsigned(t)&TagBits)==Tag)
/* bits that should not be used by anyone but us */ /* bits that should not be used by anyone but us */
#define YAP_PROTECTED_MASK 0x00000000L #define YAP_PROTECTED_MASK 0x00000000L
inline EXTERN int IsVarTerm (Term); inline EXTERN int IsVarTerm(Term);
inline EXTERN int inline EXTERN int IsVarTerm(Term t)
IsVarTerm (Term t) {
{ return (int) (Signed(t) >= 0);
return (int) (Signed (t) >= 0); }
}
inline EXTERN int IsNonVarTerm(Term);
inline EXTERN int IsNonVarTerm (Term);
inline EXTERN int IsNonVarTerm(Term t)
inline EXTERN int {
IsNonVarTerm (Term t) return (int) (Signed(t) < 0);
{ }
return (int) (Signed (t) < 0);
}
inline EXTERN Term * RepPair(Term);
inline EXTERN Term *RepPair (Term); inline EXTERN Term * RepPair(Term t)
{
inline EXTERN Term * return (Term *) (NonTagPart(t));
RepPair (Term t) }
{
return (Term *) (NonTagPart (t));
}
inline EXTERN Term AbsPair(Term *);
inline EXTERN Term AbsPair(Term * p)
inline EXTERN Term AbsPair (Term *); {
return (Term) (TAGGEDA(PairTag, (p)));
inline EXTERN Term }
AbsPair (Term * p)
{
return (Term) (TAGGEDA (PairTag, (p)));
} inline EXTERN Int IsPairTerm(Term);
inline EXTERN Int IsPairTerm(Term t)
{
inline EXTERN Int IsPairTerm (Term); return (Int) (BitOn(PairBit, (t)));
}
inline EXTERN Int
IsPairTerm (Term t)
{
return (Int) (BitOn (PairBit, (t))); inline EXTERN Term * RepAppl(Term);
}
inline EXTERN Term * RepAppl(Term t)
{
return (Term *) (NonTagPart(t));
inline EXTERN Term *RepAppl (Term); }
inline EXTERN Term *
RepAppl (Term t)
{ inline EXTERN Term AbsAppl(Term *);
return (Term *) (NonTagPart (t));
} inline EXTERN Term AbsAppl(Term * p)
{
return (Term) (TAGGEDA(ApplTag, (p)));
}
inline EXTERN Term AbsAppl (Term *);
inline EXTERN Term
AbsAppl (Term * p) inline EXTERN Int IsApplTerm(Term);
{
return (Term) (TAGGEDA (ApplTag, (p))); inline EXTERN Int IsApplTerm(Term t)
} {
return (Int) (BitOn(ApplBit, (t)));
}
inline EXTERN Int IsApplTerm (Term);
inline EXTERN Int inline EXTERN Int IsAtomOrIntTerm(Term);
IsApplTerm (Term t)
{ inline EXTERN Int IsAtomOrIntTerm(Term t)
return (Int) (BitOn (ApplBit, (t))); {
} return (Int) (!(Unsigned(t) & CompBits));
}
inline EXTERN Int IsAtomOrIntTerm (Term);
inline EXTERN Int inline EXTERN Term AdjustPtr(Term t, Term off);
IsAtomOrIntTerm (Term t)
{ inline EXTERN Term AdjustPtr(Term t, Term off)
return (Int) (!(Unsigned (t) & CompBits)); {
} return (Term) ((t)+off);
}
inline EXTERN Term AdjustPtr (Term t, Term off); inline EXTERN Term AdjustIDBPtr(Term t, Term off);
inline EXTERN Term inline EXTERN Term AdjustIDBPtr(Term t, Term off)
AdjustPtr (Term t, Term off) {
{ return (Term) ((t)+off);
return (Term) ((t) + off); }
}
static inline Int
inline EXTERN Term AdjustIDBPtr (Term t, Term off); IntOfTerm(Term t)
{
inline EXTERN Term Int n;
AdjustIDBPtr (Term t, Term off) n = (Unsigned(t) & MaskPrim) >> 2;
{
return (Term) ((t) + off); if (Unsigned(t) & AdrHiBit)
} n |= 0xfc000000;
return (n);
}
static inline Int
IntOfTerm (Term t)
{
Int n;
n = (Unsigned (t) & MaskPrim) >> 2;
if (Unsigned (t) & AdrHiBit)
n |= 0xfc000000;
return (n);
}

View File

@ -1,203 +1,194 @@
/************************************************************************* /*************************************************************************
* * * *
* YAP Prolog %W% %G% * * YAP Prolog %W% %G% *
* Yap Prolog was developed at NCCUP - Universidade do Porto * * Yap Prolog was developed at NCCUP - Universidade do Porto *
* * * *
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
* * * *
************************************************************************** **************************************************************************
* * * *
* File: Tags_32LowTag.h.m4 * * File: Tags_32LowTag.h.m4 *
* Last rev: December 90 * * Last rev: December 90 *
* mods: * * mods: *
* comments: Original Tag Scheme for machines with 32 bits adresses * * comments: Original Tag Scheme for machines with 32 bits adresses *
* version: $Id: Tags_32LowTag.h,v 1.1.1.1 2001-04-09 19:53:40 vsc Exp $ * * version: $Id: Tags_32LowTag.h,v 1.2 2001-07-16 15:26:14 vsc Exp $ *
*************************************************************************/ *************************************************************************/
#define TAG_LOW_BITS_32 1 #define TAG_LOW_BITS_32 1
/* Version for 32 bit addresses machines, /* Version for 32 bit addresses machines,
Each term is represented internally as an unsigned 32 bit integer as Each term is represented internally as an unsigned 32 bit integer as
follows: follows:
tag value tag value
ints m.....110 numeric value ints m.....110 numeric value
atoms m.....010 offset of atom entry atoms m.....010 offset of atom entry
pairs mr.....11 ptr to pair pairs mr.....11 ptr to pair
aplied functor mr.....01 ptr to functor followed by args aplied functor mr.....01 ptr to functor followed by args
ref mr.....00 address of cell ref mr.....00 address of cell
undefined mr.....00 address of cell pointing to itself undefined mr.....00 address of cell pointing to itself
functors are represented as ptrs to the functor entry in the atom functors are represented as ptrs to the functor entry in the atom
property list property list
*/ */
#define SHIFT_LOW_TAG 2 #define SHIFT_LOW_TAG 2
#define SHIFT_HIGH_TAG 2 #define SHIFT_HIGH_TAG 2
#define MKTAG(HI,LO) ((((UInt) (HI))<<SHIFT_HIGH_TAG)|(LO)) #define MKTAG(HI,LO) ((((UInt) (HI))<<SHIFT_HIGH_TAG)|(LO))
#define TagBits /* 0x00000007L */ MKTAG(0x1,3) #define TagBits /* 0x00000007L */ MKTAG(0x1,3)
#define LowTagBits /* 0x00000003L */ MKTAG(0x0,3) #define LowTagBits /* 0x00000003L */ MKTAG(0x0,3)
#define LowBit /* 0x00000001L */ MKTAG(0x0,1) #define LowBit /* 0x00000001L */ MKTAG(0x0,1)
#define HighTagBits /* 0x0000000cL */ MKTAG(0x1,0) #define HighTagBits /* 0x0000000cL */ MKTAG(0x1,0)
#define NumberTag /* 0x0000000dL */ MKTAG(0x1,2) #define NumberTag /* 0x0000000dL */ MKTAG(0x1,2)
#define AtomTag /* 0x00000006L */ MKTAG(0x0,2) #define AtomTag /* 0x00000006L */ MKTAG(0x0,2)
/* /*
subtract the total for tag bits, plus 1 bit for GC, plus another subtract the total for tag bits, plus 1 bit for GC, plus another
for sign for sign
*/ */
#define MAX_ABS_INT ((Int)0x04000000L) #define MAX_ABS_INT ((Int)0x04000000L)
/* /*
UNIQUE_TAG_FOR_PAIR gives the representation for pair an UNIQUE_TAG_FOR_PAIR gives the representation for pair an
unique tag unique tag
This allows optimisation of switch_list This allows optimisation of switch_list
*/ */
#define UNIQUE_TAG_FOR_PAIRS 1 #define UNIQUE_TAG_FOR_PAIRS 1
#define PairBits /* 0x00000003L */ MKTAG(0x0,3) #define PairBits /* 0x00000003L */ MKTAG(0x0,3)
#define ApplBit /* 0x00000001L */ MKTAG(0x0,1) #define ApplBit /* 0x00000001L */ MKTAG(0x0,1)
#define PrimiBits /* 0x00000002L */ MKTAG(0x0,2) #define PrimiBits /* 0x00000002L */ MKTAG(0x0,2)
#define NumberBits /* 0x0000000aL */ MKTAG(0x2,2) #define NumberBits /* 0x0000000aL */ MKTAG(0x2,2)
#define NumberMask /* 0x0000000bL */ MKTAG(0x2,3) #define NumberMask /* 0x0000000bL */ MKTAG(0x2,3)
#define NonTagPart(V) (Unsigned(V)>>(SHIFT_LOW_TAG+SHIFT_HIGH_TAG)) #define NonTagPart(V) (Unsigned(V)>>(SHIFT_LOW_TAG+SHIFT_HIGH_TAG))
#define TAGGED(TAG,V) (((Unsigned(V)<<(SHIFT_HIGH_TAG+SHIFT_LOW_TAG+1))>>1)|(TAG)) #define TAGGED(TAG,V) (((Unsigned(V)<<(SHIFT_HIGH_TAG+SHIFT_LOW_TAG+1))>>1)|(TAG))
#define NONTAGGED(TAG,V) ((Unsigned(V)<<(SHIFT_HIGH_TAG+SHIFT_LOW_TAG+1))>>1) #define NONTAGGED(TAG,V) ((Unsigned(V)<<(SHIFT_HIGH_TAG+SHIFT_LOW_TAG+1))>>1)
#define TAGGEDA(TAG,V) ((Unsigned(V) << (SHIFT_HIGH_TAG+SHIFT_LOW_TAG))|(TAG)) #define TAGGEDA(TAG,V) ((Unsigned(V) << (SHIFT_HIGH_TAG+SHIFT_LOW_TAG))|(TAG))
#define CHKTAG(t,Tag) ((Unsigned(t)&TagBits)==Tag) #define CHKTAG(t,Tag) ((Unsigned(t)&TagBits)==Tag)
/* bits that should not be used by anyone but us */ /* bits that should not be used by anyone but us */
#define YAP_PROTECTED_MASK 0xc0000000L #define YAP_PROTECTED_MASK 0xc0000000L
inline EXTERN int IsVarTerm (Term); inline EXTERN int IsVarTerm(Term);
inline EXTERN int inline EXTERN int IsVarTerm(Term t)
IsVarTerm (Term t) {
{ return (int) (!((t) & LowTagBits));
return (int) (!((t) & LowTagBits)); }
}
inline EXTERN int IsNonVarTerm(Term);
inline EXTERN int IsNonVarTerm (Term);
inline EXTERN int IsNonVarTerm(Term t)
inline EXTERN int {
IsNonVarTerm (Term t) return (int) (((t) & LowTagBits));
{ }
return (int) (((t) & LowTagBits));
}
inline EXTERN Term * RepPair(Term);
inline EXTERN Term *RepPair (Term); inline EXTERN Term * RepPair(Term t)
{
inline EXTERN Term * return (Term *) ((t)-PairBits);
RepPair (Term t) }
{
return (Term *) ((t) - PairBits);
}
inline EXTERN Term AbsPair(Term *);
inline EXTERN Term AbsPair(Term * p)
inline EXTERN Term AbsPair (Term *); {
return (Term) (Unsigned(p)+PairBits);
inline EXTERN Term }
AbsPair (Term * p)
{
return (Term) (Unsigned (p) + PairBits);
} inline EXTERN Int IsPairTerm(Term);
inline EXTERN Int IsPairTerm(Term t)
{
inline EXTERN Int IsPairTerm (Term); return (Int) ((((t) & LowTagBits) == PairBits));
}
inline EXTERN Int
IsPairTerm (Term t)
{
return (Int) ((((t) & LowTagBits) == PairBits)); inline EXTERN Term * RepAppl(Term);
}
inline EXTERN Term * RepAppl(Term t)
{
return (Term *) (((t)-ApplBit));
inline EXTERN Term *RepAppl (Term); }
inline EXTERN Term *
RepAppl (Term t)
{ inline EXTERN Term AbsAppl(Term *);
return (Term *) (((t) - ApplBit));
} inline EXTERN Term AbsAppl(Term * p)
{
return (Term) (Unsigned(p)+ApplBit);
}
inline EXTERN Term AbsAppl (Term *);
inline EXTERN Term
AbsAppl (Term * p) inline EXTERN Int IsApplTerm(Term);
{
return (Term) (Unsigned (p) + ApplBit); inline EXTERN Int IsApplTerm(Term t)
} {
return (Int) ((((t) & LowTagBits) == ApplBit));
}
inline EXTERN Int IsApplTerm (Term);
inline EXTERN Int inline EXTERN Int IsAtomOrIntTerm(Term);
IsApplTerm (Term t)
{ inline EXTERN Int IsAtomOrIntTerm(Term t)
return (Int) ((((t) & LowTagBits) == ApplBit)); {
} return (Int) ((((t) & LowTagBits) == 2));
}
inline EXTERN Int IsAtomOrIntTerm (Term);
inline EXTERN Int inline EXTERN Term AdjustPtr(Term t, Term off);
IsAtomOrIntTerm (Term t)
{ inline EXTERN Term AdjustPtr(Term t, Term off)
return (Int) ((((t) & LowTagBits) == 2)); {
} return (Term) ((t)+off);
}
inline EXTERN Term AdjustPtr (Term t, Term off); inline EXTERN Term AdjustIDBPtr(Term t, Term off);
inline EXTERN Term inline EXTERN Term AdjustIDBPtr(Term t, Term off)
AdjustPtr (Term t, Term off) {
{ return (Term) ((t)+off);
return (Term) ((t) + off); }
}
inline EXTERN Term AdjustIDBPtr (Term t, Term off); inline EXTERN Int IntOfTerm(Term);
inline EXTERN Term inline EXTERN Int IntOfTerm(Term t)
AdjustIDBPtr (Term t, Term off) {
{ return (Int) (((Int)(t << 1))>>(SHIFT_LOW_TAG+SHIFT_HIGH_TAG+1));
return (Term) ((t) + off); }
}
inline EXTERN Int IntOfTerm (Term);
inline EXTERN Int
IntOfTerm (Term t)
{
return (Int) (((Int) (t << 1)) >> (SHIFT_LOW_TAG + SHIFT_HIGH_TAG + 1));
}

View File

@ -1,319 +1,290 @@
/************************************************************************* /*************************************************************************
* * * *
* YAP Prolog %W% %G% * * YAP Prolog %W% %G% *
* Yap Prolog was developed at NCCUP - Universidade do Porto * * Yap Prolog was developed at NCCUP - Universidade do Porto *
* * * *
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
* * * *
************************************************************************** **************************************************************************
* * * *
* File: Tags_32Ops.h.m4 * * File: Tags_32Ops.h.m4 *
* Last rev: December 90 * * Last rev: December 90 *
* mods: * * mods: *
* comments: Original Tag Scheme for machines with 32 bits adresses * * comments: Original Tag Scheme for machines with 32 bits adresses *
* version: $Id: Tags_32Ops.h,v 1.1.1.1 2001-04-09 19:53:40 vsc Exp $ * * version: $Id: Tags_32Ops.h,v 1.2 2001-07-16 15:26:14 vsc Exp $ *
*************************************************************************/ *************************************************************************/
/* /*
Version for 32 bit addresses machines, Version for 32 bit addresses machines,
Each term is represented internally as an unsigned 32 bit integer as Each term is represented internally as an unsigned 32 bit integer as
follows: follows:
tag value tag value
ints 1m1....01 numeric value ints 1m1....01 numeric value
atoms 1m0....01 offset of atom entry atoms 1m0....01 offset of atom entry
pairs 1mr....11 ptr to pair pairs 1mr....11 ptr to pair
aplied functor 1mr....00 ptr to functor followed by args aplied functor 1mr....00 ptr to functor followed by args
undefined 0mr....00 address of cell pointing to itself undefined 0mr....00 address of cell pointing to itself
functors are represented as ptrs to the functor entry in the atom functors are represented as ptrs to the functor entry in the atom
property list property list
This version speeds up access to lists and to compound This version speeds up access to lists and to compound
terms by using the XOR and NOT operations to build their tags. This terms by using the XOR and NOT operations to build their tags. This
saves operations on RISC machines. saves operations on RISC machines.
As a further optimisation, only pairs or compound terms have As a further optimisation, only pairs or compound terms have
the second lowest bit set. This allows one to recognise lists or the second lowest bit set. This allows one to recognise lists or
compound terms with a single operation. compound terms with a single operation.
The main problem is that the default value of the M and R bits for GC The main problem is that the default value of the M and R bits for GC
are now 1 in compound terms and structures. are now 1 in compound terms and structures.
*/ */
#define TAGS_FAST_OPS 1 #define TAGS_FAST_OPS 1
#define SHIFT_HIGH_TAG 29 #define SHIFT_HIGH_TAG 29
#define MKTAG(HI,LO) ((((UInt) (HI))<<SHIFT_HIGH_TAG)|(LO)) #define MKTAG(HI,LO) ((((UInt) (HI))<<SHIFT_HIGH_TAG)|(LO))
#define TagBits /* 0xb0000003L */ MKTAG(0x5,3) #define TagBits /* 0xb0000003L */ MKTAG(0x5,3)
#define LowTagBits /* 0x00000003L */ MKTAG(0x0,3) #define LowTagBits /* 0x00000003L */ MKTAG(0x0,3)
#define LowBit /* 0x00000001L */ MKTAG(0x0,1) #define LowBit /* 0x00000001L */ MKTAG(0x0,1)
#define HighTagBits /* 0xf0000000L */ MKTAG(0x7,0) #define HighTagBits /* 0xf0000000L */ MKTAG(0x7,0)
#define AdrHiBit /* 0x08000000L */ (((UInt)1) << (SHIFT_HIGH_TAG-1)) #define AdrHiBit /* 0x08000000L */ (((UInt)1) << (SHIFT_HIGH_TAG-1))
#define MaskAdr /* 0x1ffffffcL */ ((((UInt)1) << (SHIFT_HIGH_TAG))-4) #define MaskAdr /* 0x1ffffffcL */ ((((UInt)1) << (SHIFT_HIGH_TAG))-4)
#define MaskPrim /* 0x0ffffffcL */ ((((UInt)1) << (SHIFT_HIGH_TAG))-4) #define MaskPrim /* 0x0ffffffcL */ ((((UInt)1) << (SHIFT_HIGH_TAG))-4)
#define NumberTag /* 0xb0000001L */ MKTAG(0x5,2) #define NumberTag /* 0xb0000001L */ MKTAG(0x5,2)
#define AtomTag /* 0x90000001L */ MKTAG(0x4,2) #define AtomTag /* 0x90000001L */ MKTAG(0x4,2)
#define MAX_ABS_INT /* 0xfe00000LL */ ((Int)0x04000000L) #define MAX_ABS_INT /* 0xfe00000LL */ ((Int)0x04000000L)
/* bits that should not be used by anyone but us */ /* bits that should not be used by anyone but us */
#define YAP_PROTECTED_MASK 0xe0000000L #define YAP_PROTECTED_MASK 0xe0000000L
#define MaskBits 4 #define MaskBits 4
/* /*
UNIQUE_TAG_FOR_PAIR gives the representation for pair an UNIQUE_TAG_FOR_PAIR gives the representation for pair an
unique tag unique tag
This allows optimisation of switch_list This allows optimisation of switch_list
*/ */
#if defined(i386) || defined(sparc) || defined(_POWER) #if defined(i386) || defined(sparc) || defined(_POWER)
#define UNIQUE_TAG_FOR_PAIRS 1 #define UNIQUE_TAG_FOR_PAIRS 1
#endif #endif
#if UNIQUE_TAG_FOR_PAIRS #if UNIQUE_TAG_FOR_PAIRS
#define PairBit /* 0x00000001L */ 1 #define PairBit /* 0x00000001L */ 1
#define ApplBit /* 0x00000000L */ 0 #define ApplBit /* 0x00000000L */ 0
#else #else
#define PairBit /* 0x00000000L */ 0 #define PairBit /* 0x00000000L */ 0
#define ApplBit /* 0x00000001L */ 1 #define ApplBit /* 0x00000001L */ 1
#endif #endif
#define NonTagPart(X) (Signed(X) & MaskPrim) #define NonTagPart(X) (Signed(X) & MaskPrim)
#define TAGGEDA(TAG,V) (TAG | Unsigned(V)) #define TAGGEDA(TAG,V) (TAG | Unsigned(V))
#define TAGGED(TAG,V) (TAG | NonTagPart(Unsigned(V)<<2)) #define TAGGED(TAG,V) (TAG | NonTagPart(Unsigned(V)<<2))
#define NONTAGGED(TAG,V) NonTagPart(Unsigned(V)<<2) #define NONTAGGED(TAG,V) NonTagPart(Unsigned(V)<<2)
#define BitOn(Bit,V) (Bit & Unsigned(V)) #define BitOn(Bit,V) (Bit & Unsigned(V))
#define CHKTAG(t,Tag) ((Unsigned(t)&TagBits)==Tag) #define CHKTAG(t,Tag) ((Unsigned(t)&TagBits)==Tag)
/* never forget to surround arguments to a macro by brackets */ /* never forget to surround arguments to a macro by brackets */
inline EXTERN int IsVarTerm (Term); inline EXTERN int IsVarTerm(Term);
inline EXTERN int inline EXTERN int IsVarTerm(Term t)
IsVarTerm (Term t) {
{ return (int) (Signed(t) >= 0);
return (int) (Signed (t) >= 0); }
}
inline EXTERN int IsNonVarTerm(Term);
inline EXTERN int IsNonVarTerm (Term);
inline EXTERN int IsNonVarTerm(Term t)
inline EXTERN int {
IsNonVarTerm (Term t) return (int) (Signed(t) < 0);
{ }
return (int) (Signed (t) < 0);
}
#if UNIQUE_TAG_FOR_PAIRS
#if UNIQUE_TAG_FOR_PAIRS inline EXTERN Term * RepPair(Term);
inline EXTERN Term *RepPair (Term); inline EXTERN Term * RepPair(Term t)
{
inline EXTERN Term * return (Term *) ((~(t)));
RepPair (Term t) }
{
return (Term *) ((~(t)));
}
inline EXTERN Term AbsPair(Term *);
inline EXTERN Term AbsPair(Term * p)
inline EXTERN Term AbsPair (Term *); {
return (Term) ((~Unsigned(p)));
inline EXTERN Term }
AbsPair (Term * p)
{
return (Term) ((~Unsigned (p)));
} inline EXTERN Int IsPairTerm(Term);
inline EXTERN Int IsPairTerm(Term t)
{
inline EXTERN Int IsPairTerm (Term); return (Int) (((t) & PairBit));
}
inline EXTERN Int
IsPairTerm (Term t)
{
return (Int) (((t) & PairBit)); inline EXTERN Term * RepAppl(Term);
}
inline EXTERN Term * RepAppl(Term t)
{
return (Term *) ((-Signed(t)));
inline EXTERN Term *RepAppl (Term); }
inline EXTERN Term *
RepAppl (Term t)
{ inline EXTERN Term AbsAppl(Term *);
return (Term *) ((-Signed (t)));
} inline EXTERN Term AbsAppl(Term * p)
{
return (Term) ((-Signed(p)));
}
inline EXTERN Term AbsAppl (Term *);
inline EXTERN Term
AbsAppl (Term * p) inline EXTERN Int IsApplTerm(Term);
{
return (Term) ((-Signed (p))); inline EXTERN Int IsApplTerm(Term t)
} {
return (Int) ((!((t) & LowTagBits)));
}
inline EXTERN Int IsApplTerm (Term);
#else
inline EXTERN Int
IsApplTerm (Term t) inline EXTERN Term * RepPair(Term);
{
return (Int) ((!((t) & LowTagBits))); inline EXTERN Term * RepPair(Term t)
} {
return (Term *) ((-Signed(t)));
}
#else
inline EXTERN Term *RepPair (Term);
inline EXTERN Term AbsPair(Term *);
inline EXTERN Term *
RepPair (Term t) inline EXTERN Term AbsPair(Term * p)
{ {
return (Term *) ((-Signed (t))); return (Term) (((CELL)(-Signed(p))));
} }
inline EXTERN Term AbsPair (Term *); inline EXTERN Int IsPairTerm(Term);
inline EXTERN Term inline EXTERN Int IsPairTerm(Term t)
AbsPair (Term * p) {
{ return (Int) ((!((t) & LowTagBits)));
return (Term) (((CELL) (-Signed (p)))); }
}
inline EXTERN Term * RepAppl(Term);
inline EXTERN Int IsPairTerm (Term);
inline EXTERN Term * RepAppl(Term t)
inline EXTERN Int {
IsPairTerm (Term t) return (Term *) ((~(t)));
{ }
return (Int) ((!((t) & LowTagBits)));
}
inline EXTERN Term AbsAppl(Term *);
inline EXTERN Term *RepAppl (Term); inline EXTERN Term AbsAppl(Term * p)
{
inline EXTERN Term * return (Term) ((~Unsigned(p)));
RepAppl (Term t) }
{
return (Term *) ((~(t)));
}
inline EXTERN Int IsApplTerm(Term);
inline EXTERN Int IsApplTerm(Term t)
inline EXTERN Term AbsAppl (Term *); {
return (Int) (((t) & ApplBit));
inline EXTERN Term }
AbsAppl (Term * p)
{
return (Term) ((~Unsigned (p))); #endif
}
inline EXTERN Int IsAtomOrIntTerm(Term);
inline EXTERN Int IsAtomOrIntTerm(Term t)
inline EXTERN Int IsApplTerm (Term); {
return (Int) (((Unsigned(t) & LowTagBits) == 0x2));
inline EXTERN Int }
IsApplTerm (Term t)
{
return (Int) (((t) & ApplBit));
}
inline EXTERN Int IntOfTerm(Term);
#endif inline EXTERN Int IntOfTerm(Term t)
{
inline EXTERN Int IsAtomOrIntTerm (Term); return (Int) ((Int)(Unsigned(t) << 3) >> 5);
}
inline EXTERN Int
IsAtomOrIntTerm (Term t)
{
return (Int) (((Unsigned (t) & LowTagBits) == 0x2)); #if UNIQUE_TAG_FOR_PAIRS
}
inline EXTERN Term AdjustPtr(Term t, Term off);
inline EXTERN Term AdjustPtr(Term t, Term off)
{
inline EXTERN Int IntOfTerm (Term); return (Term) (((IsVarTerm(t) || IsAtomOrIntTerm(t)) ? (t)+(off) : (IsPairTerm(t) ? (CELL)AbsPair((CELL *)((CELL)RepPair(t)+(off))) : (t)-(off))));
}
inline EXTERN Int
IntOfTerm (Term t)
{
return (Int) ((Int) (Unsigned (t) << 3) >> 5); inline EXTERN Term AdjustIDBPtr(Term t, Term off);
}
inline EXTERN Term AdjustIDBPtr(Term t, Term off)
{
return (Term) (IsVarTerm(t) ? (t)+(off) : (t)-(off));
#if UNIQUE_TAG_FOR_PAIRS }
inline EXTERN Term AdjustPtr (Term t, Term off);
#else
inline EXTERN Term
AdjustPtr (Term t, Term off) inline EXTERN Term AdjustPtr(Term t, Term off);
{
return (Term) (((IsVarTerm (t) inline EXTERN Term AdjustPtr(Term t, Term off)
|| IsAtomOrIntTerm (t)) ? (t) + {
(off) : (IsPairTerm (t) ? (CELL) return (Term) (((IsVarTerm(t) || IsAtomOrIntTerm(t)) ? (t)+(off) : (IsApplTerm(t) ? (CELL)AbsAppl((CELL *)((CELL)RepAppl(t)+(off))) : (t)-(off))));
AbsPair ((CELL *) ((CELL) RepPair (t) + }
(off))) : (t) - (off))));
}
inline EXTERN Term AdjustIDBPtr(Term t, Term off);
inline EXTERN Term AdjustIDBPtr (Term t, Term off); inline EXTERN Term AdjustIDBPtr(Term t, Term off)
{
inline EXTERN Term return (Term) (IsVarTerm(t) ? (t)+(off) : (IsApplTerm(t) ? (CELL)AbsAppl((CELL *)((CELL)RepAppl(t)+(off))) : (t)-(off)));
AdjustIDBPtr (Term t, Term off) }
{
return (Term) (IsVarTerm (t) ? (t) + (off) : (t) - (off));
} #endif
#else
inline EXTERN Term AdjustPtr (Term t, Term off);
inline EXTERN Term
AdjustPtr (Term t, Term off)
{
return (Term) (((IsVarTerm (t)
|| IsAtomOrIntTerm (t)) ? (t) +
(off) : (IsApplTerm (t) ? (CELL)
AbsAppl ((CELL *) ((CELL) RepAppl (t) +
(off))) : (t) - (off))));
}
inline EXTERN Term AdjustIDBPtr (Term t, Term off);
inline EXTERN Term
AdjustIDBPtr (Term t, Term off)
{
return (Term) (IsVarTerm (t) ? (t) +
(off) : (IsApplTerm (t) ? (CELL)
AbsAppl ((CELL *) ((CELL) RepAppl (t) +
(off))) : (t) - (off)));
}
#endif

View File

@ -1,190 +1,182 @@
/************************************************************************* /*************************************************************************
* * * *
* YAP Prolog %W% %G% * * YAP Prolog %W% %G% *
* Yap Prolog was developed at NCCUP - Universidade do Porto * * Yap Prolog was developed at NCCUP - Universidade do Porto *
* * * *
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
* * * *
************************************************************************** **************************************************************************
* * * *
* File: Tags_32bits.h.m4 * * File: Tags_32bits.h.m4 *
* Last rev: December 90 * * Last rev: December 90 *
* mods: * * mods: *
* comments: Original Tag Scheme for machines with 32 bits adresses * * comments: Original Tag Scheme for machines with 32 bits adresses *
* version: $Id: Tags_32bits.h,v 1.1.1.1 2001-04-09 19:53:41 vsc Exp $ * * version: $Id: Tags_32bits.h,v 1.2 2001-07-16 15:26:14 vsc Exp $ *
*************************************************************************/ *************************************************************************/
/* Original version for 32 bit addresses machines, /* Original version for 32 bit addresses machines,
Each term is represented internally as an unsigned 32 bit integer as Each term is represented internally as an unsigned 32 bit integer as
follows: follows:
tag value tag value
ints 1m1....00 numeric value ints 1m1....00 numeric value
atoms 1m0....00 offset of atom entry atoms 1m0....00 offset of atom entry
pairs 1mr....01 ptr to pair pairs 1mr....01 ptr to pair
aplied functor 1mr....10 ptr to functor followed by args aplied functor 1mr....10 ptr to functor followed by args
ref 0mr....00 address of cell ref 0mr....00 address of cell
undefined 0mr....00 address of cell pointing to itself undefined 0mr....00 address of cell pointing to itself
functors are represented as ptrs to the functor entry in the atom functors are represented as ptrs to the functor entry in the atom
property list property list
*/ */
#define SHIFT_HIGH_TAG 29 #define SHIFT_HIGH_TAG 29
#define MKTAG(HI,LO) ((((UInt) (HI))<<SHIFT_HIGH_TAG)|(LO)) #define MKTAG(HI,LO) ((((UInt) (HI))<<SHIFT_HIGH_TAG)|(LO))
#define TagBits /* 0xe0000003L */ MKTAG(0x7,3) #define TagBits /* 0xe0000003L */ MKTAG(0x7,3)
#define LowTagBits /* 0x00000003L */ MKTAG(0x0,3) #define LowTagBits /* 0x00000003L */ MKTAG(0x0,3)
#define HighTagBits /* 0xe0000000L */ MKTAG(0x7,0) #define HighTagBits /* 0xe0000000L */ MKTAG(0x7,0)
#define AdrHiBit /* 0x10000000L */ (((UInt)1) << (SHIFT_HIGH_TAG-1)) #define AdrHiBit /* 0x10000000L */ (((UInt)1) << (SHIFT_HIGH_TAG-1))
#define MaskAdr /* 0x1ffffffcL */ ((((UInt)1) << SHIFT_HIGH_TAG)-4) #define MaskAdr /* 0x1ffffffcL */ ((((UInt)1) << SHIFT_HIGH_TAG)-4)
#define MaskPrim /* 0x0ffffffcL */ ((((UInt)1) << (SHIFT_HIGH_TAG))-4) #define MaskPrim /* 0x0ffffffcL */ ((((UInt)1) << (SHIFT_HIGH_TAG))-4)
#define NumberTag /* 0xa0000000L */ MKTAG(0x5,0) #define NumberTag /* 0xa0000000L */ MKTAG(0x5,0)
#define AtomTag /* 0x80000000L */ MKTAG(0x4,0) #define AtomTag /* 0x80000000L */ MKTAG(0x4,0)
#define PairTag /* 0x80000001L */ MKTAG(0x4,1) #define PairTag /* 0x80000001L */ MKTAG(0x4,1)
#define ApplTag /* 0x80000002L */ MKTAG(0x4,2) #define ApplTag /* 0x80000002L */ MKTAG(0x4,2)
#define MAX_ABS_INT /* 0x04000000L */ (1 << (SHIFT_HIGH_TAG-3)) #define MAX_ABS_INT /* 0x04000000L */ (1 << (SHIFT_HIGH_TAG-3))
/* bits that should not be used by anyone but us */ /* bits that should not be used by anyone but us */
#define YAP_PROTECTED_MASK 0xe0000000L #define YAP_PROTECTED_MASK 0xe0000000L
#define MaskBits 4 #define MaskBits 4
#define PairBit /* 0x00000001L */ 1 #define PairBit /* 0x00000001L */ 1
#define ApplBit /* 0x00000002L */ 2 #define ApplBit /* 0x00000002L */ 2
#define NonTagPart(X) (Signed(X) & MaskPrim) #define NonTagPart(X) (Signed(X) & MaskPrim)
#define TAGGEDA(TAG,V) (TAG | Unsigned(V)) #define TAGGEDA(TAG,V) (TAG | Unsigned(V))
#define TAGGED(TAG,V) (TAG | NonTagPart(Unsigned(V)<<2)) #define TAGGED(TAG,V) (TAG | NonTagPart(Unsigned(V)<<2))
#define NONTAGGED(TAG,V) NonTagPart(Unsigned(V)<<2) #define NONTAGGED(TAG,V) NonTagPart(Unsigned(V)<<2)
#define BitOn(Bit,V) (Bit & Unsigned(V)) #define BitOn(Bit,V) (Bit & Unsigned(V))
#define CHKTAG(t,Tag) ((Unsigned(t)&TagBits)==Tag) #define CHKTAG(t,Tag) ((Unsigned(t)&TagBits)==Tag)
inline EXTERN int IsVarTerm (Term); inline EXTERN int IsVarTerm(Term);
inline EXTERN int inline EXTERN int IsVarTerm(Term t)
IsVarTerm (Term t) {
{ return (int) (Signed(t) >= 0);
return (int) (Signed (t) >= 0); }
}
inline EXTERN int IsNonVarTerm(Term);
inline EXTERN int IsNonVarTerm (Term);
inline EXTERN int IsNonVarTerm(Term t)
inline EXTERN int {
IsNonVarTerm (Term t) return (int) (Signed(t) < 0);
{ }
return (int) (Signed (t) < 0);
}
inline EXTERN Term * RepPair(Term);
inline EXTERN Term *RepPair (Term); inline EXTERN Term * RepPair(Term t)
{
inline EXTERN Term * return (Term *) (NonTagPart(t));
RepPair (Term t) }
{
return (Term *) (NonTagPart (t));
}
inline EXTERN Term AbsPair(Term *);
inline EXTERN Term AbsPair(Term * p)
inline EXTERN Term AbsPair (Term *); {
return (Term) (TAGGEDA(PairTag, (p)));
inline EXTERN Term }
AbsPair (Term * p)
{
return (Term) (TAGGEDA (PairTag, (p)));
} inline EXTERN Int IsPairTerm(Term);
inline EXTERN Int IsPairTerm(Term t)
{
inline EXTERN Int IsPairTerm (Term); return (Int) (BitOn(PairBit, (t)));
}
inline EXTERN Int
IsPairTerm (Term t)
{
return (Int) (BitOn (PairBit, (t))); inline EXTERN Term * RepAppl(Term);
}
inline EXTERN Term * RepAppl(Term t)
{
return (Term *) (NonTagPart(t));
inline EXTERN Term *RepAppl (Term); }
inline EXTERN Term *
RepAppl (Term t)
{ inline EXTERN Term AbsAppl(Term *);
return (Term *) (NonTagPart (t));
} inline EXTERN Term AbsAppl(Term * p)
{
return (Term) (TAGGEDA(ApplTag, (p)));
}
inline EXTERN Term AbsAppl (Term *);
inline EXTERN Term
AbsAppl (Term * p) inline EXTERN Int IsApplTerm(Term);
{
return (Term) (TAGGEDA (ApplTag, (p))); inline EXTERN Int IsApplTerm(Term t)
} {
return (Int) (BitOn(ApplBit, (t)));
}
inline EXTERN Int IsApplTerm (Term);
inline EXTERN Int inline EXTERN int IsAtomOrIntTerm(Term);
IsApplTerm (Term t)
{ inline EXTERN int IsAtomOrIntTerm(Term t)
return (Int) (BitOn (ApplBit, (t))); {
} return (int) (((Unsigned(t) & LowTagBits) == 0));
}
inline EXTERN int IsAtomOrIntTerm (Term);
inline EXTERN int inline EXTERN Term AdjustPtr(Term t, Term off);
IsAtomOrIntTerm (Term t)
{ inline EXTERN Term AdjustPtr(Term t, Term off)
return (int) (((Unsigned (t) & LowTagBits) == 0)); {
} return (Term) ((t)+off);
}
inline EXTERN Term AdjustPtr (Term t, Term off); inline EXTERN Term AdjustIDBPtr(Term t, Term off);
inline EXTERN Term inline EXTERN Term AdjustIDBPtr(Term t, Term off)
AdjustPtr (Term t, Term off) {
{ return (Term) ((t)+off);
return (Term) ((t) + off); }
}
inline EXTERN Term AdjustIDBPtr (Term t, Term off); inline EXTERN Int IntOfTerm(Term);
inline EXTERN Term inline EXTERN Int IntOfTerm(Term t)
AdjustIDBPtr (Term t, Term off) {
{ return (Int) (((Int)(t << 3))>>(3+2));
return (Term) ((t) + off); }
}
inline EXTERN Int IntOfTerm (Term);
inline EXTERN Int
IntOfTerm (Term t)
{
return (Int) (((Int) (t << 3)) >> (3 + 2));
}

View File

@ -1,192 +1,183 @@
/************************************************************************* /*************************************************************************
* * * *
* YAP Prolog %W% %G% * * YAP Prolog %W% %G% *
* Yap Prolog was developed at NCCUP - Universidade do Porto * * Yap Prolog was developed at NCCUP - Universidade do Porto *
* * * *
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
* * * *
************************************************************************** **************************************************************************
* * * *
* File: Tags_32Ops.h.m4 * * File: Tags_32Ops.h.m4 *
* Last rev: December 90 * * Last rev: December 90 *
* mods: * * mods: *
* comments: Original Tag Scheme for machines with 32 bits adresses * * comments: Original Tag Scheme for machines with 32 bits adresses *
* version: $Id: Tags_64bits.h,v 1.1.1.1 2001-04-09 19:53:41 vsc Exp $ * * version: $Id: Tags_64bits.h,v 1.2 2001-07-16 15:26:14 vsc Exp $ *
*************************************************************************/ *************************************************************************/
#define TAG_64BITS 1 #define TAG_64BITS 1
/* Version for 64 bit addresses machines, /* Version for 64 bit addresses machines,
Each term is represented internally as an unsigned 64 bit integer as Each term is represented internally as an unsigned 64 bit integer as
follows: follows:
tag value tag value
ints 0m1....001 numeric value ints 0m1....001 numeric value
atoms 0m0....001 offset of atom entry atoms 0m0....001 offset of atom entry
pairs 0mr....011 ptr to pair pairs 0mr....011 ptr to pair
aplied functor 0mr....101 ptr to functor followed by args aplied functor 0mr....101 ptr to functor followed by args
undefined 0mr....000 address of cell pointing to itself undefined 0mr....000 address of cell pointing to itself
functors are represented as ptrs to the functor entry in the atom functors are represented as ptrs to the functor entry in the atom
property list property list
We rely on the fact that addresses are always multiple of 8. We rely on the fact that addresses are always multiple of 8.
*/ */
#define SHIFT_HIGH_TAG 61 #define SHIFT_HIGH_TAG 61
#define MKTAG(HI,LO) ((((UInt) (HI))<<SHIFT_HIGH_TAG)|(LO)) #define MKTAG(HI,LO) ((((UInt) (HI))<<SHIFT_HIGH_TAG)|(LO))
#define TagBits /* 0x30000007L */ MKTAG(0x1,7) #define TagBits /* 0x30000007L */ MKTAG(0x1,7)
#define LowTagBits /* 0x00000007L */ MKTAG(0x0,7) #define LowTagBits /* 0x00000007L */ MKTAG(0x0,7)
#define HighTagBits /* 0x70000000L */ MKTAG(0x1,0) #define HighTagBits /* 0x70000000L */ MKTAG(0x1,0)
#define AdrHiBit /* 0x08000000L */ (((UInt)1) << (SHIFT_HIGH_TAG-1)) #define AdrHiBit /* 0x08000000L */ (((UInt)1) << (SHIFT_HIGH_TAG-1))
#define MaskPrim /* 0x0ffffff8L */ ((((UInt)1) << (SHIFT_HIGH_TAG))-8) #define MaskPrim /* 0x0ffffff8L */ ((((UInt)1) << (SHIFT_HIGH_TAG))-8)
#define NumberTag /* 0x30000001L */ MKTAG(0x1,1) #define NumberTag /* 0x30000001L */ MKTAG(0x1,1)
#define AtomTag /* 0x10000001L */ MKTAG(0x0,1) #define AtomTag /* 0x10000001L */ MKTAG(0x0,1)
#define MAX_ABS_INT /* 0xfe00000LL */ (((UInt)1) << (63-(2+4))) #define MAX_ABS_INT /* 0xfe00000LL */ (((Int)1) << (63-(2+4)))
/* bits that should not be used by anyone but us */ /* bits that should not be used by anyone but us */
#define YAP_PROTECTED_MASK 0xe000000000000000L #define YAP_PROTECTED_MASK 0xe000000000000000L
#define UNIQUE_TAG_FOR_PAIRS 1 #define UNIQUE_TAG_FOR_PAIRS 1
#define PrimiBit /* 0x00000001L */ 1 #define PrimiBit /* 0x00000001L */ 1
#define PairBits /* 0x00000003L */ 3 #define PairBits /* 0x00000003L */ 3
#define ApplBits /* 0x00000005L */ 5 #define ApplBits /* 0x00000005L */ 5
#define PrimiBits /* 0x70000004L */ MKTAG(0x7,7) #define PrimiBits /* 0x70000004L */ MKTAG(0x7,7)
#define NumberMask /* 0x20000007L */ MKTAG(0x2,7) #define NumberMask /* 0x20000007L */ MKTAG(0x2,7)
#define NonTagPart(X) (Signed(X) & MaskPrim) #define NonTagPart(X) (Signed(X) & MaskPrim)
#define TAGGEDA(TAG,V) (TAG | Unsigned(V)) #define TAGGEDA(TAG,V) (TAG | Unsigned(V))
#define TAGGED(TAG,V) (TAG | NonTagPart(Unsigned(V)<<3)) /* SQRT(8) */ #define TAGGED(TAG,V) (TAG | NonTagPart(Unsigned(V)<<3)) /* SQRT(8) */
#define NONTAGGED(TAG,V) NonTagPart(Unsigned(V)<<3) /* SQRT(8) */ #define NONTAGGED(TAG,V) NonTagPart(Unsigned(V)<<3) /* SQRT(8) */
#define CHKTAG(t,Tag) ((Unsigned(t)&TagBits)==Tag) #define CHKTAG(t,Tag) ((Unsigned(t)&TagBits)==Tag)
inline EXTERN int IsVarTerm (Term); inline EXTERN int IsVarTerm(Term);
inline EXTERN int inline EXTERN int IsVarTerm(Term t)
IsVarTerm (Term t) {
{ return (int) ((!((t) & 0x1)));
return (int) ((!((t) & 0x1))); }
}
inline EXTERN int IsNonVarTerm(Term);
inline EXTERN int IsNonVarTerm (Term);
inline EXTERN int IsNonVarTerm(Term t)
inline EXTERN int {
IsNonVarTerm (Term t) return (int) (((t) & 0x1));
{ }
return (int) (((t) & 0x1));
}
inline EXTERN Term * RepPair(Term);
inline EXTERN Term *RepPair (Term); inline EXTERN Term * RepPair(Term t)
{
inline EXTERN Term * return (Term *) (((t)-PairBits));
RepPair (Term t) }
{
return (Term *) (((t) - PairBits));
}
inline EXTERN Term AbsPair(Term *);
inline EXTERN Term AbsPair(Term * p)
inline EXTERN Term AbsPair (Term *); {
return (Term) (((CELL)(p)+PairBits));
inline EXTERN Term }
AbsPair (Term * p)
{
return (Term) (((CELL) (p) + PairBits));
} inline EXTERN Int IsPairTerm(Term);
inline EXTERN Int IsPairTerm(Term t)
{
inline EXTERN Int IsPairTerm (Term); return (Int) (((t) & 0x2));
}
inline EXTERN Int
IsPairTerm (Term t)
{
return (Int) (((t) & 0x2)); inline EXTERN Term * RepAppl(Term);
}
inline EXTERN Term * RepAppl(Term t)
{
return (Term *) (((t)-ApplBits));
inline EXTERN Term *RepAppl (Term); }
inline EXTERN Term *
RepAppl (Term t)
{ inline EXTERN Term AbsAppl(Term *);
return (Term *) (((t) - ApplBits));
} inline EXTERN Term AbsAppl(Term * p)
{
return (Term) (((CELL)(p)+ApplBits));
}
inline EXTERN Term AbsAppl (Term *);
inline EXTERN Term
AbsAppl (Term * p) inline EXTERN Int IsApplTerm(Term);
{
return (Term) (((CELL) (p) + ApplBits)); inline EXTERN Int IsApplTerm(Term t)
} {
return (Int) ((((t) & 0x4)));
}
inline EXTERN Int IsApplTerm (Term);
inline EXTERN Int inline EXTERN Int IsAtomOrIntTerm(Term);
IsApplTerm (Term t)
{ inline EXTERN Int IsAtomOrIntTerm(Term t)
return (Int) ((((t) & 0x4))); {
} return (Int) ((((t) & LowTagBits) == 0x1));
}
inline EXTERN Int IsAtomOrIntTerm (Term);
inline EXTERN Int inline EXTERN Term AdjustPtr(Term t, Term off);
IsAtomOrIntTerm (Term t)
{ inline EXTERN Term AdjustPtr(Term t, Term off)
return (Int) ((((t) & LowTagBits) == 0x1)); {
} return (Term) (((t)+off));
}
inline EXTERN Term AdjustPtr (Term t, Term off); inline EXTERN Term AdjustIDBPtr(Term t, Term off);
inline EXTERN Term inline EXTERN Term AdjustIDBPtr(Term t, Term off)
AdjustPtr (Term t, Term off) {
{ return (Term) ((t)+off);
return (Term) (((t) + off)); }
}
inline EXTERN Term AdjustIDBPtr (Term t, Term off); inline EXTERN Int IntOfTerm(Term);
inline EXTERN Term inline EXTERN Int IntOfTerm(Term t)
AdjustIDBPtr (Term t, Term off) {
{ return (Int) ((Int)(Unsigned(t) << 3) >> 6);
return (Term) ((t) + off); }
}
inline EXTERN Int IntOfTerm (Term);
inline EXTERN Int
IntOfTerm (Term t)
{
return (Int) ((Int) (Unsigned (t) << 3) >> 6);
}

View File

@ -1,482 +1,432 @@
/************************************************************************* /*************************************************************************
* * * *
* YAP Prolog %W% %G% * * YAP Prolog %W% %G% *
* Yap Prolog was developed at NCCUP - Universidade do Porto * * Yap Prolog was developed at NCCUP - Universidade do Porto *
* * * *
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
* * * *
************************************************************************** **************************************************************************
* * * *
* File: TermExt.h * * File: TermExt.h *
* mods: * * mods: *
* comments: Extensions to standard terms for YAP * * comments: Extensions to standard terms for YAP *
* version: $Id: TermExt.h,v 1.1.1.1 2001-04-09 19:53:41 vsc Exp $ * * version: $Id: TermExt.h,v 1.2 2001-07-16 15:26:14 vsc Exp $ *
*************************************************************************/ *************************************************************************/
#if USE_OFFSETS #if USE_OFFSETS
#define AtomFoundVar ((Atom)(&(((special_functors *)(NULL))->AtFoundVar))) #define AtomFoundVar ((Atom)(&(((special_functors *)(NULL))->AtFoundVar)))
#define AtomNil ((Atom)(&(((special_functors *)(NULL))->AtNil))) #define AtomNil ((Atom)(&(((special_functors *)(NULL))->AtNil)))
#define AtomDot ((Atom)(&(((special_functors *)(NULL))->AtDot))) #define AtomDot ((Atom)(&(((special_functors *)(NULL))->AtDot)))
#else #else
#define AtomFoundVar AbsAtom(&(SF_STORE->AtFoundVar)) #define AtomFoundVar AbsAtom(&(SF_STORE->AtFoundVar))
#define AtomNil AbsAtom(&(SF_STORE->AtNil)) #define AtomNil AbsAtom(&(SF_STORE->AtNil))
#define AtomDot AbsAtom(&(SF_STORE->AtDot)) #define AtomDot AbsAtom(&(SF_STORE->AtDot))
#endif #endif
#define TermFoundVar MkAtomTerm(AtomFoundVar) #define TermFoundVar MkAtomTerm(AtomFoundVar)
#define TermNil MkAtomTerm(AtomNil) #define TermNil MkAtomTerm(AtomNil)
#define TermDot MkAtomTerm(AtomDot) #define TermDot MkAtomTerm(AtomDot)
#ifdef IN_SECOND_QUADRANT #ifdef IN_SECOND_QUADRANT
typedef enum typedef enum {
{ db_ref_e = sizeof(Functor *)|RBIT,
db_ref_e = sizeof (Functor *) | RBIT, long_int_e = 2*sizeof(Functor *)|RBIT,
long_int_e = 2 * sizeof (Functor *) | RBIT, #ifdef USE_GMP
#ifdef USE_GMP big_int_e = 3*sizeof(Functor *)|RBIT,
big_int_e = 3 * sizeof (Functor *) | RBIT, double_e = 4*sizeof(Functor *)|RBIT
double_e = 4 * sizeof (Functor *) | RBIT #else
#else double_e = 3*sizeof(Functor *)|RBIT
double_e = 3 * sizeof (Functor *) | RBIT #endif
#endif } blob_type;
} #else
blob_type; typedef enum {
#else db_ref_e = sizeof(Functor *),
typedef enum long_int_e = 2*sizeof(Functor *),
{ #ifdef USE_GMP
db_ref_e = sizeof (Functor *), big_int_e = 3*sizeof(Functor *),
long_int_e = 2 * sizeof (Functor *), double_e = 4*sizeof(Functor *)
#ifdef USE_GMP #else
big_int_e = 3 * sizeof (Functor *), double_e = 3*sizeof(Functor *)
double_e = 4 * sizeof (Functor *) #endif
#else } blob_type;
double_e = 3 * sizeof (Functor *) #endif
#endif
} #define FunctorDBRef ((Functor)(db_ref_e))
blob_type; #define FunctorLongInt ((Functor)(long_int_e))
#endif #ifdef USE_GMP
#define FunctorBigInt ((Functor)(big_int_e))
#define FunctorDBRef ((Functor)(db_ref_e)) #endif
#define FunctorLongInt ((Functor)(long_int_e)) #define FunctorDouble ((Functor)(double_e))
#ifdef USE_GMP #define EndSpecials (double_e)
#define FunctorBigInt ((Functor)(big_int_e))
#endif
#define FunctorDouble ((Functor)(double_e)) inline EXTERN blob_type BlobOfFunctor(Functor f);
#define EndSpecials (double_e)
inline EXTERN blob_type BlobOfFunctor(Functor f)
{
inline EXTERN blob_type BlobOfFunctor (Functor f); return (blob_type) ((CELL)f);
}
inline EXTERN blob_type
BlobOfFunctor (Functor f)
{
return (blob_type) ((CELL) f); #define SF_STORE ((special_functors *)HEAP_INIT_BASE)
}
#ifdef COROUTINING
typedef struct {
#define SF_STORE ((special_functors *)HEAP_INIT_BASE) /* what to do when someone tries to bind our term to someone else
in some predefined context */
#ifdef COROUTINING void (*bind_op)(Term *, Term);
/* what to do if someone wants to copy our constraint */
typedef struct int (*copy_term_op)(Term, CELL ***);
{ /* op called to do marking in GC */
/* what to do when someone tries to bind our term to someone else void (*mark_op)(CELL *);
in some predefined context */ } ext_op;
void (*bind_op) (Term *, Term);
/* what to do if someone wants to copy our constraint */ /* known delays */
int (*copy_term_op) (Term, CELL ***); typedef enum {
/* op called to do marking in GC */ empty_ext = 0*sizeof(ext_op), /* default op, this should never be called */
void (*mark_op) (CELL *); susp_ext = 1*sizeof(ext_op), /* support for delayable goals */
} attvars_ext = 2*sizeof(ext_op), /* support for attributed variables */
ext_op; /* add your own extensions here */
/* keep this one */
/* known delays */ } exts;
typedef enum
{
empty_ext = 0 * sizeof (ext_op), /* default op, this should never be called */ /* array with the ops for your favourite extensions */
susp_ext = 1 * sizeof (ext_op), /* support for delayable goals */ extern ext_op attas[attvars_ext+1];
attvars_ext = 2 * sizeof (ext_op), /* support for attributed variables */
/* add your own extensions here */ #endif
/* keep this one */
} /* make sure that these data structures are the first thing to be allocated
exts; in the heap when we start the system */
typedef struct special_functors_struct
{
/* array with the ops for your favourite extensions */ AtomEntry AtFoundVar;
extern ext_op attas[attvars_ext + 1]; char AtFoundVarChars[8];
AtomEntry AtNil;
#endif char AtNilChars[8];
AtomEntry AtDot;
/* make sure that these data structures are the first thing to be allocated char AtDotChars[8];
in the heap when we start the system */ }
typedef struct special_functors_struct special_functors;
{
AtomEntry AtFoundVar; #if SIZEOF_DOUBLE == SIZEOF_LONG_INT
char AtFoundVarChars[8];
AtomEntry AtNil; inline EXTERN Term MkFloatTerm(Float);
char AtNilChars[8];
AtomEntry AtDot; inline EXTERN Term MkFloatTerm(Float dbl)
char AtDotChars[8]; {
} return (Term) ((H[0] = (CELL)FunctorDouble, *(Float *)(H+1) = dbl, H[2]=((2*sizeof(CELL)+EndSpecials)|MBIT),H+=3,AbsAppl(H-3)));
special_functors; }
#if SIZEOF_DOUBLE == SIZEOF_LONG_INT
inline EXTERN Term MkFloatTerm (Float);
inline EXTERN Float FloatOfTerm(Term t);
inline EXTERN Term
MkFloatTerm (Float dbl) inline EXTERN Float FloatOfTerm(Term t)
{ {
return (Term) ((H[0] = (CELL) FunctorDouble, *(Float *) (H + 1) = return (Float) (*(Float *)(RepAppl(t)+1));
dbl, H[2] = ((2 * sizeof (CELL) + EndSpecials) | MBIT), H += }
3, AbsAppl (H - 3)));
}
#define InitUnalignedFloat()
#else
inline EXTERN Float FloatOfTerm (Term t);
#if SIZEOF_DOUBLE == 2*SIZEOF_LONG_INT
inline EXTERN Float
FloatOfTerm (Term t) #ifdef i386X
{ #define DOUBLE_ALIGNED(ADDR) TRUE
return (Float) (*(Float *) (RepAppl (t) + 1)); #else
} /* first, need to address the alignment problem */
#define DOUBLE_ALIGNED(ADDR) ((CELL)(ADDR) & 0x4)
#endif
#define InitUnalignedFloat() inline EXTERN Float STD_PROTO(CpFloatUnaligned,(CELL *));
#else
inline EXTERN void STD_PROTO(AlignGlobalForDouble,(void));
#if SIZEOF_DOUBLE == 2*SIZEOF_LONG_INT
inline EXTERN Float
#ifdef i386X CpFloatUnaligned(CELL *ptr)
#define DOUBLE_ALIGNED(ADDR) TRUE {
#else union { Float f; CELL d[2]; } u;
/* first, need to address the alignment problem */ u.d[0] = ptr[1];
#define DOUBLE_ALIGNED(ADDR) ((CELL)(ADDR) & 0x4) u.d[1] = ptr[2];
#endif return(u.f);
}
inline EXTERN Float STD_PROTO (CpFloatUnaligned, (CELL *));
inline EXTERN Term MkFloatTerm(Float);
inline EXTERN void STD_PROTO (AlignGlobalForDouble, (void));
inline EXTERN Term MkFloatTerm(Float dbl)
inline EXTERN Float {
CpFloatUnaligned (CELL * ptr) return (Term) ((AlignGlobalForDouble(), H[0] = (CELL)FunctorDouble, *(Float *)(H+1) = dbl, H[3]=((3*sizeof(CELL)+EndSpecials)|MBIT), H+=4, AbsAppl(H-4)));
{ }
union
{
Float f;
CELL d[2];
} inline EXTERN Float FloatOfTerm(Term t);
u;
u.d[0] = ptr[1]; inline EXTERN Float FloatOfTerm(Term t)
u.d[1] = ptr[2]; {
return (u.f); return (Float) ((DOUBLE_ALIGNED(RepAppl(t)) ? *(Float *)(RepAppl(t)+1) : CpFloatUnaligned(RepAppl(t))));
} }
inline EXTERN Term MkFloatTerm (Float); /* no alignment problems for 64 bit machines */
#else
inline EXTERN Term /* OOPS, YAP only understands Floats that are as large as cells or that
MkFloatTerm (Float dbl) take two cells!!! */
{ #endif
return (Term) ((AlignGlobalForDouble (), H[0] = #endif
(CELL) FunctorDouble, *(Float *) (H + 1) = dbl, H[3] =
((3 * sizeof (CELL) + EndSpecials) | MBIT), H +=
4, AbsAppl (H - 4))); inline EXTERN int IsFloatTerm(Term);
}
inline EXTERN int IsFloatTerm(Term t)
{
return (int) (IsApplTerm(t) && FunctorOfTerm(t) == FunctorDouble);
}
inline EXTERN Float FloatOfTerm (Term t);
inline EXTERN Float
FloatOfTerm (Term t)
{ /* extern Functor FunctorLongInt; */
return (Float) ((DOUBLE_ALIGNED (RepAppl (t)) ? *(Float *) (RepAppl (t) + 1)
: CpFloatUnaligned (RepAppl (t)))); inline EXTERN Term MkLongIntTerm(Int);
}
inline EXTERN Term MkLongIntTerm(Int i)
{
/* no alignment problems for 64 bit machines */ return (Term) ((H[0] = (CELL)FunctorLongInt,H[1] = (CELL)(i),H[2]=((2*sizeof(CELL)+EndSpecials)|MBIT),H+=3,AbsAppl(H-3)));
#else }
/* OOPS, YAP only understands Floats that are as large as cells or that
take two cells!!! */
#endif
#endif inline EXTERN Int LongIntOfTerm(Term t);
inline EXTERN Int LongIntOfTerm(Term t)
inline EXTERN int IsFloatTerm (Term); {
return (Int) (RepAppl(t)[1]);
inline EXTERN int }
IsFloatTerm (Term t)
{
return (int) (IsApplTerm (t) && FunctorOfTerm (t) == FunctorDouble);
} inline EXTERN int IsLongIntTerm(Term);
inline EXTERN int IsLongIntTerm(Term t)
{
return (int) (IsApplTerm(t) && FunctorOfTerm(t) == FunctorLongInt);
/* extern Functor FunctorLongInt; */ }
inline EXTERN Term MkLongIntTerm (Int);
inline EXTERN Term
MkLongIntTerm (Int i) #ifdef USE_GMP
{ #include <stdio.h>
return (Term) ((H[0] = (CELL) FunctorLongInt, H[1] = (CELL) i, H[2] = #include <gmp.h>
((2 * sizeof (CELL) + EndSpecials) | MBIT), H +=
3, AbsAppl (H - 3)));
} MP_INT *STD_PROTO(PreAllocBigNum,(void));
void STD_PROTO(ClearAllocBigNum,(void));
MP_INT *STD_PROTO(InitBigNum,(Int));
Term STD_PROTO(MkBigIntTerm, (MP_INT *));
inline EXTERN Int LongIntOfTerm (Term t); MP_INT *STD_PROTO(BigIntOfTerm, (Term));
inline EXTERN Int
LongIntOfTerm (Term t) inline EXTERN int IsBigIntTerm(Term);
{
return (Int) (RepAppl (t)[1]); inline EXTERN int IsBigIntTerm(Term t)
} {
return (int) (IsApplTerm(t) && FunctorOfTerm(t) == FunctorBigInt);
}
inline EXTERN int IsLongIntTerm (Term);
inline EXTERN int
IsLongIntTerm (Term t) inline EXTERN int IsLargeIntTerm(Term);
{
return (int) (IsApplTerm (t) && FunctorOfTerm (t) == FunctorLongInt); inline EXTERN int IsLargeIntTerm(Term t)
} {
return (int) (IsApplTerm(t) && ((FunctorOfTerm(t) <= FunctorBigInt) && (FunctorOfTerm(t) >= FunctorLongInt)));
}
#ifdef USE_GMP
#include <stdio.h> #else
#include <gmp.h>
inline EXTERN int IsBigIntTerm(Term);
MP_INT *STD_PROTO (PreAllocBigNum, (void));
void STD_PROTO (ClearAllocBigNum, (void)); inline EXTERN int IsBigIntTerm(Term t)
MP_INT *STD_PROTO (InitBigNum, (Int)); {
Term STD_PROTO (MkBigIntTerm, (MP_INT *)); return (int) (FALSE);
MP_INT *STD_PROTO (BigIntOfTerm, (Term)); }
inline EXTERN int IsBigIntTerm (Term);
inline EXTERN int inline EXTERN int IsLargeIntTerm(Term);
IsBigIntTerm (Term t)
{ inline EXTERN int IsLargeIntTerm(Term t)
return (int) (IsApplTerm (t) && FunctorOfTerm (t) == FunctorBigInt); {
} return (int) (IsApplTerm(t) && FunctorOfTerm(t) == FunctorLongInt);
}
inline EXTERN int IsLargeIntTerm (Term); #endif
inline EXTERN int /* extern Functor FunctorLongInt; */
IsLargeIntTerm (Term t)
{ inline EXTERN int IsLargeNumTerm(Term);
return (int) (IsApplTerm (t)
&& ((FunctorOfTerm (t) <= FunctorBigInt) inline EXTERN int IsLargeNumTerm(Term t)
&& (FunctorOfTerm (t) >= FunctorLongInt))); {
} return (int) (IsApplTerm(t) && ((FunctorOfTerm(t) <= FunctorDouble) && (FunctorOfTerm(t) >= FunctorLongInt)));
}
#else
inline EXTERN int IsNumTerm(Term);
inline EXTERN int IsBigIntTerm (Term);
inline EXTERN int IsNumTerm(Term t)
inline EXTERN int {
IsBigIntTerm (Term t) return (int) ((IsIntTerm(t) || IsLargeNumTerm(t)));
{ }
return (int) (FALSE);
}
inline EXTERN Int IsAtomicTerm(Term);
inline EXTERN int IsLargeIntTerm (Term); inline EXTERN Int IsAtomicTerm(Term t)
{
inline EXTERN int return (Int) (IsAtomOrIntTerm(t) || IsLargeNumTerm(t));
IsLargeIntTerm (Term t) }
{
return (int) (IsApplTerm (t) && FunctorOfTerm (t) == FunctorLongInt);
}
inline EXTERN Int IsExtensionFunctor(Functor);
#endif inline EXTERN Int IsExtensionFunctor(Functor f)
{
/* extern Functor FunctorLongInt; */ return (Int) (f <= FunctorDouble);
}
inline EXTERN int IsLargeNumTerm (Term);
inline EXTERN int
IsLargeNumTerm (Term t) inline EXTERN Int IsBlobFunctor(Functor);
{
return (int) (IsApplTerm (t) inline EXTERN Int IsBlobFunctor(Functor f)
&& ((FunctorOfTerm (t) <= FunctorDouble) {
&& (FunctorOfTerm (t) >= FunctorLongInt))); return (Int) ((f <= FunctorDouble && f >= FunctorDBRef));
} }
inline EXTERN Int IsPrimitiveTerm(Term);
inline EXTERN int IsNumTerm (Term);
inline EXTERN Int IsPrimitiveTerm(Term t)
inline EXTERN int {
IsNumTerm (Term t) return (Int) ((IsAtomOrIntTerm(t) || (IsApplTerm(t) && IsBlobFunctor(FunctorOfTerm(t)))));
{ }
return (int) ((IsIntTerm (t) || IsLargeNumTerm (t)));
}
#ifdef TERM_EXTENSIONS
inline EXTERN Int IsAtomicTerm (Term); inline EXTERN Int IsAttachFunc(Functor);
inline EXTERN Int inline EXTERN Int IsAttachFunc(Functor f)
IsAtomicTerm (Term t) {
{ return (Int) (FALSE);
return (Int) (IsAtomOrIntTerm (t) || IsLargeNumTerm (t)); }
}
inline EXTERN Int IsAttachedTerm(Term);
inline EXTERN Int IsExtensionFunctor (Functor);
inline EXTERN Int IsAttachedTerm(Term t)
inline EXTERN Int {
IsExtensionFunctor (Functor f) return (Int) ((IsVarTerm(t) && VarOfTerm(t) < H0) );
{ }
return (Int) (f <= FunctorDouble);
}
inline EXTERN exts ExtFromCell(CELL *);
inline EXTERN Int IsBlobFunctor (Functor);
inline EXTERN exts ExtFromCell(CELL * pt)
inline EXTERN Int {
IsBlobFunctor (Functor f) return (exts) (pt[1]);
{ }
return (Int) ((f <= FunctorDouble && f >= FunctorDBRef));
}
#else
inline EXTERN Int IsPrimitiveTerm (Term);
inline EXTERN Int IsAttachFunc(Functor);
inline EXTERN Int
IsPrimitiveTerm (Term t) inline EXTERN Int IsAttachFunc(Functor f)
{ {
return (Int) ((IsAtomOrIntTerm (t) return (Int) (FALSE);
|| (IsApplTerm (t) && IsBlobFunctor (FunctorOfTerm (t))))); }
}
#ifdef TERM_EXTENSIONS inline EXTERN Int IsAttachedTerm(Term);
inline EXTERN Int IsAttachedTerm(Term t)
inline EXTERN Int IsAttachFunc (Functor); {
return (Int) (FALSE);
inline EXTERN Int }
IsAttachFunc (Functor f)
{
return (Int) (FALSE);
} #endif
EXTERN int STD_PROTO(unify_extension,(Functor, CELL, CELL *, CELL));
inline EXTERN int
inline EXTERN Int IsAttachedTerm (Term); unify_extension(Functor f, CELL d0, CELL *pt0, CELL d1)
{
inline EXTERN Int switch(BlobOfFunctor(f)) {
IsAttachedTerm (Term t) case db_ref_e:
{ return (d0 == d1);
return (Int) ((IsVarTerm (t) && VarOfTerm (t) < H0)); case long_int_e:
} return(pt0[1] == RepAppl(d1)[1]);
#ifdef USE_GMP
case big_int_e:
return (mpz_cmp(BigIntOfTerm(d0),BigIntOfTerm(d1)) == 0);
#endif /* USE_GMP */
inline EXTERN exts ExtFromCell (CELL *); case double_e:
{
inline EXTERN exts CELL *pt1 = RepAppl(d1);
ExtFromCell (CELL * pt) return (pt0[1] == pt1[1]
{ #if SIZEOF_DOUBLE == 2*SIZEOF_LONG_INT
return (exts) (pt[1]); && pt0[2] == pt1[2]
} #endif
);
}
}
#else return(FALSE);
}
inline EXTERN Int IsAttachFunc (Functor);
inline EXTERN Int
IsAttachFunc (Functor f)
{
return (Int) (FALSE);
}
inline EXTERN Int IsAttachedTerm (Term);
inline EXTERN Int
IsAttachedTerm (Term t)
{
return (Int) (FALSE);
}
#endif
EXTERN int STD_PROTO (unify_extension, (Functor, CELL, CELL *, CELL));
inline EXTERN int
unify_extension (Functor f, CELL d0, CELL * pt0, CELL d1)
{
switch (BlobOfFunctor (f))
{
case db_ref_e:
return (d0 == d1);
case long_int_e:
return (pt0[1] == RepAppl (d1)[1]);
#ifdef USE_GMP
case big_int_e:
return (mpz_cmp (BigIntOfTerm (d0), BigIntOfTerm (d1)) == 0);
#endif /* USE_GMP */
case double_e:
{
CELL *pt1 = RepAppl (d1);
return (pt0[1] == pt1[1]
#if SIZEOF_DOUBLE == 2*SIZEOF_LONG_INT
&& pt0[2] == pt1[2]
#endif
);
}
}
return (FALSE);
}

View File

@ -17,7 +17,7 @@
* File: Yap.h.m4 * * File: Yap.h.m4 *
* mods: * * mods: *
* comments: main header file for YAP * * comments: main header file for YAP *
* version: $Id: Yap.h,v 1.1.1.1 2001-04-09 19:53:41 vsc Exp $ * * version: $Id: Yap.h,v 1.2 2001-07-16 15:26:14 vsc Exp $ *
*************************************************************************/ *************************************************************************/
#include "config.h" #include "config.h"
@ -71,7 +71,7 @@
#endif /* YAPOR */ #endif /* YAPOR */
#if defined(YAPOR) || defined(TABLING) #if defined(YAPOR) || defined(TABLING)
#undef TRAILING_REQUIRES_BRANCH #undef TRAILING_REQUIRES_BRANCH
#endif /* YAPOR || TABLING */ #endif /* YAPOR || TABLING */
#if ANALYST #if ANALYST
@ -86,7 +86,21 @@
#endif #endif
#endif #endif
#ifdef _MSC_VER /* Microsoft's Visual C++ Compiler */ #ifdef SBA
#ifdef YAPOR
#ifndef FROZEN_STACKS
#define FROZEN_STACKS 1
#endif
#endif
#endif
#ifdef TABLING
#ifndef FROZEN_STACKS
#define FROZEN_STACKS 1
#endif
#endif
#ifdef _MSC_VER /* Microsoft's Visual C++ Compiler */
/* adjust a config.h from mingw32 to work with vc++ */ /* adjust a config.h from mingw32 to work with vc++ */
#ifdef HAVE_GCC #ifdef HAVE_GCC
#undef HAVE_GCC #undef HAVE_GCC
@ -121,7 +135,7 @@
#if HAVE_GCC #if HAVE_GCC
#define MIN_ARRAY 0 #define MIN_ARRAY 0
#define DUMMY_FILLER_FOR_ABS_TYPE #define DUMMY_FILLER_FOR_ABS_TYPE
#else #else
#define MIN_ARRAY 1 #define MIN_ARRAY 1
#define DUMMY_FILLER_FOR_ABS_TYPE int dummy; #define DUMMY_FILLER_FOR_ABS_TYPE int dummy;
@ -157,15 +171,17 @@
/* */ typedef unsigned long int UInt; /* */ typedef unsigned long int UInt;
#else #else
error Yap require integer types of the same size as a pointer error Yap require integer types of the same size as a pointer
#endif #endif
#if SIZEOF_SHORT_INT==2 #if SIZEOF_SHORT_INT==2
/* */ typedef short int Short; /* */ typedef short int Short;
/* */ typedef unsigned short int UShort; /* */ typedef unsigned short int UShort;
#else #else
error Yap requires integer types half the size of a pointer error Yap requires integer types half the size of a pointer
#endif #endif
#elif SIZEOF_INT_P==8 #elif SIZEOF_INT_P==8
# if SIZEOF_INT==8 # if SIZEOF_INT==8
@ -181,8 +197,9 @@ error Yap require integer types of the same size as a pointer
/* */ typedef unsigned long long int UInt; /* */ typedef unsigned long long int UInt;
# else # else
error Yap requires integer types of the same size as a pointer error Yap requires integer types of the same size as a pointer
# endif # endif
# if SIZEOF_SHORT_INT==4 # if SIZEOF_SHORT_INT==4
/* */ typedef short int Short; /* */ typedef short int Short;
/* */ typedef unsigned short int UShort; /* */ typedef unsigned short int UShort;
@ -192,13 +209,16 @@ error Yap requires integer types of the same size as a pointer
/* */ typedef short int UShort; /* */ typedef short int UShort;
# else # else
error Yap requires integer types half the size of a pointer error Yap requires integer types half the size of a pointer
# endif # endif
#else #else
error Yap requires pointers of size 4 or 8 error Yap requires pointers of size 4 or 8
#endif #endif
/* */ typedef double Float;
/* */ typedef double Float;
#if SIZEOF_INT<SIZEOF_INT_P #if SIZEOF_INT<SIZEOF_INT_P
#define SHORT_INTS 1 #define SHORT_INTS 1
@ -207,7 +227,7 @@ error Yap requires pointers of size 4 or 8
#endif #endif
#if DEBUG #if DEBUG
extern char Option[20]; extern char Option[20];
#endif #endif
/* #define FORCE_SECOND_QUADRANT 1 */ /* #define FORCE_SECOND_QUADRANT 1 */
@ -224,8 +244,10 @@ extern char Option[20];
#define MMAP_ADDR 0x40000000 #define MMAP_ADDR 0x40000000
#elif mips #elif mips
#define MMAP_ADDR 0x02000000 #define MMAP_ADDR 0x02000000
#elif __APPLE__
#define MMAP_ADDR 0x01000000
#else #else
#define MMAP_ADDR 0x10010000 #define MMAP_ADDR 0x10000000
#endif #endif
#elif __svr4__ #elif __svr4__
#define MMAP_ADDR 0x02000000 #define MMAP_ADDR 0x02000000
@ -267,7 +289,7 @@ typedef CELL SFLAGS;
typedef BITS16 SFLAGS; typedef BITS16 SFLAGS;
#endif #endif
typedef char *ADDR; typedef char *ADDR;
typedef CELL OFFSET; typedef CELL OFFSET;
typedef unsigned char *CODEADDR; typedef unsigned char *CODEADDR;
@ -362,7 +384,7 @@ typedef CELL Term;
#define siglongjmp(Env, Arg) longjmp(Env, Arg) #define siglongjmp(Env, Arg) longjmp(Env, Arg)
#endif #endif
extern sigjmp_buf RestartEnv; /* used to restart after an abort */ extern sigjmp_buf RestartEnv; /* used to restart after an abort */
/* Support for arrays */ /* Support for arrays */
#include "arrays.h" #include "arrays.h"
@ -370,8 +392,7 @@ extern sigjmp_buf RestartEnv; /* used to restart after an abort */
/************ variables concerned with Error Handling *************/ /************ variables concerned with Error Handling *************/
/* Types of Errors */ /* Types of Errors */
typedef enum typedef enum {
{
NO_ERROR, NO_ERROR,
FATAL_ERROR, FATAL_ERROR,
INTERNAL_ERROR, INTERNAL_ERROR,
@ -407,6 +428,7 @@ typedef enum
EXISTENCE_ERROR_STREAM, EXISTENCE_ERROR_STREAM,
INSTANTIATION_ERROR, INSTANTIATION_ERROR,
PERMISSION_ERROR_ACCESS_PRIVATE_PROCEDURE, PERMISSION_ERROR_ACCESS_PRIVATE_PROCEDURE,
PERMISSION_ERROR_NEW_ALIAS_FOR_STREAM,
PERMISSION_ERROR_CREATE_ARRAY, PERMISSION_ERROR_CREATE_ARRAY,
PERMISSION_ERROR_CREATE_OPERATOR, PERMISSION_ERROR_CREATE_OPERATOR,
PERMISSION_ERROR_INPUT_BINARY_STREAM, PERMISSION_ERROR_INPUT_BINARY_STREAM,
@ -445,15 +467,13 @@ typedef enum
TYPE_ERROR_UBYTE, TYPE_ERROR_UBYTE,
TYPE_ERROR_VARIABLE, TYPE_ERROR_VARIABLE,
UNKNOWN_ERROR UNKNOWN_ERROR
} } yap_error_number;
yap_error_number;
extern char *ErrorMessage; /* used to pass error messages */ extern char *ErrorMessage; /* used to pass error messages */
extern Term Error_Term; /* used to pass error terms */ extern Term Error_Term; /* used to pass error terms */
extern yap_error_number Error_TYPE; /* used to pass the error */ extern yap_error_number Error_TYPE; /* used to pass the error */
typedef enum typedef enum {
{
YAP_INT_BOUNDED_FLAG = 0, YAP_INT_BOUNDED_FLAG = 0,
MAX_ARITY_FLAG = 1, MAX_ARITY_FLAG = 1,
INTEGER_ROUNDING_FLAG = 2, INTEGER_ROUNDING_FLAG = 2,
@ -470,8 +490,7 @@ typedef enum
WRITE_QUOTED_STRING_FLAG = 13, WRITE_QUOTED_STRING_FLAG = 13,
ALLOW_ASSERTING_STATIC_FLAG = 14, ALLOW_ASSERTING_STATIC_FLAG = 14,
HALT_AFTER_CONSULT_FLAG = 15 HALT_AFTER_CONSULT_FLAG = 15
} } yap_flags;
yap_flags;
#define STRING_AS_CHARS 0 #define STRING_AS_CHARS 0
#define STRING_AS_ATOM 2 #define STRING_AS_ATOM 2
@ -481,6 +500,7 @@ yap_flags;
#define CPROLOG_CHARACTER_ESCAPES 0 #define CPROLOG_CHARACTER_ESCAPES 0
#define ISO_CHARACTER_ESCAPES 1 #define ISO_CHARACTER_ESCAPES 1
#define SICSTUS_CHARACTER_ESCAPES 2
#define NUMBER_OF_YAP_FLAGS HALT_AFTER_CONSULT_FLAG+1 #define NUMBER_OF_YAP_FLAGS HALT_AFTER_CONSULT_FLAG+1
@ -498,46 +518,46 @@ yap_flags;
/***********************************************************************/ /***********************************************************************/
/* /*
absrectype Term = Int + Float + Atom + Pair + Appl + Ref + Var absrectype Term = Int + Float + Atom + Pair + Appl + Ref + Var
with AbsAppl(t) : *CELL -> Term with AbsAppl(t) : *CELL -> Term
and RepAppl(t) : Term -> *CELL and RepAppl(t) : Term -> *CELL
and AbsPair(t) : *CELL -> Term and AbsPair(t) : *CELL -> Term
and RepPair(t) : Term -> *CELL and RepPair(t) : Term -> *CELL
and IsIntTerm(t) = ... and IsIntTerm(t) = ...
and IsAtomTerm(t) = ... and IsAtomTerm(t) = ...
and IsVarTerm(t) = ... and IsVarTerm(t) = ...
and IsPairTerm(t) = ... and IsPairTerm(t) = ...
and IsApplTerm(t) = ... and IsApplTerm(t) = ...
and IsFloatTerm(t) = ... and IsFloatTerm(t) = ...
and IsRefTerm(t) = ... and IsRefTerm(t) = ...
and IsNonVarTerm(t) = ! IsVar(t) and IsNonVarTerm(t) = ! IsVar(t)
and IsNumterm(t) = IsIntTerm(t) || IsFloatTerm(t) and IsNumterm(t) = IsIntTerm(t) || IsFloatTerm(t)
and IsAtomicTerm(t) = IsNumTerm(t) || IsAtomTerm(t) and IsAtomicTerm(t) = IsNumTerm(t) || IsAtomTerm(t)
and IsPrimitiveTerm(t) = IsAtomicTerm(t) || IsRefTerm(t) and IsPrimitiveTerm(t) = IsAtomicTerm(t) || IsRefTerm(t)
and MkIntTerm(n) = ... and MkIntTerm(n) = ...
and MkFloatTerm(f) = ... and MkFloatTerm(f) = ...
and MkAtomTerm(a) = ... and MkAtomTerm(a) = ...
and MkVarTerm(r) = ... and MkVarTerm(r) = ...
and MkApplTerm(f,n,args) = ... and MkApplTerm(f,n,args) = ...
and MkPairTerm(hd,tl) = ... and MkPairTerm(hd,tl) = ...
and MkRefTerm(R) = ... and MkRefTerm(R) = ...
and PtrOfTerm(t) : Term -> CELL * = ... and PtrOfTerm(t) : Term -> CELL * = ...
and IntOfTerm(t) : Term -> int = ... and IntOfTerm(t) : Term -> int = ...
and FloatOfTerm(t) : Term -> flt = ... and FloatOfTerm(t) : Term -> flt = ...
and AtomOfTerm(t) : Term -> Atom = ... and AtomOfTerm(t) : Term -> Atom = ...
and VarOfTerm(t) : Term -> *Term = .... and VarOfTerm(t) : Term -> *Term = ....
and HeadOfTerm(t) : Term -> Term = ... and HeadOfTerm(t) : Term -> Term = ...
and TailOfTerm(t) : Term -> Term = ... and TailOfTerm(t) : Term -> Term = ...
and FunctorOfTerm(t) : Term -> Functor = ... and FunctorOfTerm(t) : Term -> Functor = ...
and ArgOfTerm(i,t) : Term -> Term= ... and ArgOfTerm(i,t) : Term -> Term= ...
and RefOfTerm(t) : Term -> DBRef = ... and RefOfTerm(t) : Term -> DBRef = ...
*/ */
/* /*
YAP can use several different tag schemes, according to the kind of YAP can use several different tag schemes, according to the kind of
@ -587,7 +607,7 @@ yap_flags;
#define RBIT 0x40000000 #define RBIT 0x40000000
#if IN_SECOND_QUADRANT #if IN_SECOND_QUADRANT
#define INVERT_RBIT 1 /* RBIT is 1 by default */ #define INVERT_RBIT 1 /* RBIT is 1 by default */
#endif #endif
#else #else
@ -595,7 +615,7 @@ yap_flags;
#if defined(SBA) && defined(__linux__) #if defined(SBA) && defined(__linux__)
#define MBIT /* 0x20000000 */ MKTAG(0x1,0) /* mark bit */ #define MBIT /* 0x20000000 */ MKTAG(0x1,0) /* mark bit */
#else #else
#define RBIT /* 0x20000000 */ MKTAG(0x1,0) /* relocation chain bit */ #define RBIT /* 0x20000000 */ MKTAG(0x1,0) /* relocation chain bit */
#define MBIT /* 0x40000000 */ MKTAG(0x2,0) /* mark bit */ #define MBIT /* 0x40000000 */ MKTAG(0x2,0) /* mark bit */
#endif #endif
#endif #endif
@ -604,140 +624,127 @@ yap_flags;
/* applies to unbound variables */ /* applies to unbound variables */
inline EXTERN Term *VarOfTerm (Term t); inline EXTERN Term * VarOfTerm(Term t);
inline EXTERN Term * inline EXTERN Term * VarOfTerm(Term t)
VarOfTerm (Term t)
{ {
return (Term *) (t); return (Term *) (t);
} }
#if SBA #if SBA
inline EXTERN Term MkVarTerm (void); inline EXTERN Term MkVarTerm(void);
inline EXTERN Term inline EXTERN Term MkVarTerm()
MkVarTerm ()
{ {
return (Term) ((*H = 0, H++)); return (Term) ((*H = 0, H++));
} }
inline EXTERN int IsUnboundVar (Term); inline EXTERN int IsUnboundVar(Term);
inline EXTERN int inline EXTERN int IsUnboundVar(Term t)
IsUnboundVar (Term t)
{ {
return (int) (t == 0); return (int) (t == 0);
} }
#else #else
inline EXTERN Term MkVarTerm (void); inline EXTERN Term MkVarTerm(void);
inline EXTERN Term inline EXTERN Term MkVarTerm()
MkVarTerm ()
{ {
return (Term) ((*H = (CELL) H, H++)); return (Term) ((*H = (CELL) H, H++));
} }
inline EXTERN int IsUnboundVar (Term); inline EXTERN int IsUnboundVar(Term);
inline EXTERN int inline EXTERN int IsUnboundVar(Term t)
IsUnboundVar (Term t)
{ {
return (int) (*VarOfTerm (t) == (t)); return (int) (*VarOfTerm(t) == (t));
} }
#endif #endif
inline EXTERN CELL *PtrOfTerm (Term); inline EXTERN CELL * PtrOfTerm(Term);
inline EXTERN CELL * inline EXTERN CELL * PtrOfTerm(Term t)
PtrOfTerm (Term t)
{ {
return (CELL *) (*(CELL *) (t)); return (CELL *) (*(CELL *)(t));
} }
inline EXTERN Functor FunctorOfTerm (Term); inline EXTERN Functor FunctorOfTerm(Term);
inline EXTERN Functor inline EXTERN Functor FunctorOfTerm(Term t)
FunctorOfTerm (Term t)
{ {
return (Functor) (*RepAppl (t)); return (Functor) (*RepAppl(t));
} }
#if IN_SECOND_QUADRANT #if IN_SECOND_QUADRANT
inline EXTERN Term MkAtomTerm (Atom); inline EXTERN Term MkAtomTerm(Atom);
inline EXTERN Term inline EXTERN Term MkAtomTerm(Atom a)
MkAtomTerm (Atom a)
{ {
return (Term) (TAGGEDA (AtomTag, (CELL *) (a) - (CELL *) HEAP_INIT_BASE)); return (Term) (TAGGEDA(AtomTag, (CELL *)(a)-(CELL *)HEAP_INIT_BASE));
} }
inline EXTERN Atom AtomOfTerm (Term t); inline EXTERN Atom AtomOfTerm(Term t);
inline EXTERN Atom inline EXTERN Atom AtomOfTerm(Term t)
AtomOfTerm (Term t)
{ {
return (Atom) ((CELL *) HEAP_INIT_BASE + NonTagPart (t)); return (Atom) ((CELL *)HEAP_INIT_BASE+NonTagPart(t));
} }
#else #else
inline EXTERN Term MkAtomTerm (Atom); inline EXTERN Term MkAtomTerm(Atom);
inline EXTERN Term inline EXTERN Term MkAtomTerm(Atom a)
MkAtomTerm (Atom a)
{ {
return (Term) (TAGGEDA (AtomTag, (a))); return (Term) (TAGGEDA(AtomTag, (a)));
} }
inline EXTERN Atom AtomOfTerm (Term t); inline EXTERN Atom AtomOfTerm(Term t);
inline EXTERN Atom inline EXTERN Atom AtomOfTerm(Term t)
AtomOfTerm (Term t)
{ {
return (Atom) (NonTagPart (t)); return (Atom) (NonTagPart(t));
} }
#endif #endif
inline EXTERN int IsAtomTerm (Term); inline EXTERN int IsAtomTerm(Term);
inline EXTERN int inline EXTERN int IsAtomTerm(Term t)
IsAtomTerm (Term t)
{ {
return (int) (CHKTAG ((t), AtomTag)); return (int) (CHKTAG((t), AtomTag));
} }
inline EXTERN Term MkIntTerm (Int); inline EXTERN Term MkIntTerm(Int);
inline EXTERN Term inline EXTERN Term MkIntTerm(Int n)
MkIntTerm (Int n)
{ {
return (Term) (TAGGED (NumberTag, (n))); return (Term) (TAGGED(NumberTag, (n)));
} }
@ -746,22 +753,20 @@ MkIntTerm (Int n)
overflow problems are possible overflow problems are possible
*/ */
inline EXTERN Term MkIntConstant (Int); inline EXTERN Term MkIntConstant(Int);
inline EXTERN Term inline EXTERN Term MkIntConstant(Int n)
MkIntConstant (Int n)
{ {
return (Term) (NONTAGGED (NumberTag, (n))); return (Term) (NONTAGGED(NumberTag, (n)));
} }
inline EXTERN int IsIntTerm (Term); inline EXTERN int IsIntTerm(Term);
inline EXTERN int inline EXTERN int IsIntTerm(Term t)
IsIntTerm (Term t)
{ {
return (int) (CHKTAG ((t), NumberTag)); return (int) (CHKTAG((t), NumberTag));
} }
@ -775,8 +780,8 @@ IsIntTerm (Term t)
#ifdef TAGS_FAST_OPS #ifdef TAGS_FAST_OPS
#define IntInBnd(X) (Unsigned( ( (Int)(X) >> (32-7) ) + 1) <= 1) #define IntInBnd(X) (Unsigned( ( (Int)(X) >> (32-7) ) + 1) <= 1)
#else #else
#define IntInBnd(X) ( (X) < (Int)MAX_ABS_INT && \ #define IntInBnd(X) ( (X) < MAX_ABS_INT && \
(X) > -(Int)MAX_ABS_INT-1 ) (X) > -MAX_ABS_INT-1L )
#endif #endif
#endif #endif
#ifdef C_PROLOG #ifdef C_PROLOG
@ -788,10 +793,11 @@ IsIntTerm (Term t)
/************* variables related to memory allocation *******************/ /************* variables related to memory allocation *******************/
/* must be before TermExt.h */ /* must be before TermExt.h */
extern ADDR HeapBase, extern ADDR HeapBase,
LocalBase, LocalBase,
GlobalBase, GlobalBase,
TrailBase, TrailTop, ForeignCodeBase, ForeignCodeTop, ForeignCodeMax; TrailBase, TrailTop,
ForeignCodeBase, ForeignCodeTop, ForeignCodeMax;
/* /*
@ -809,32 +815,29 @@ extern ADDR HeapBase,
#define IsAccessFunc(func) ((func) == FunctorAccess) #define IsAccessFunc(func) ((func) == FunctorAccess)
inline EXTERN Term MkIntegerTerm (Int); inline EXTERN Term MkIntegerTerm(Int);
inline EXTERN Term inline EXTERN Term MkIntegerTerm(Int n)
MkIntegerTerm (Int n)
{ {
return (Term) (IntInBnd (n) ? MkIntTerm (n) : MkLongIntTerm (n)); return (Term) (IntInBnd(n) ? MkIntTerm(n) : MkLongIntTerm(n));
} }
inline EXTERN int IsIntegerTerm (Term); inline EXTERN int IsIntegerTerm(Term);
inline EXTERN int inline EXTERN int IsIntegerTerm(Term t)
IsIntegerTerm (Term t)
{ {
return (int) (IsIntTerm (t) || IsLongIntTerm (t)); return (int) (IsIntTerm(t) || IsLongIntTerm(t));
} }
inline EXTERN Int IntegerOfTerm (Term); inline EXTERN Int IntegerOfTerm(Term);
inline EXTERN Int inline EXTERN Int IntegerOfTerm(Term t)
IntegerOfTerm (Term t)
{ {
return (Int) (IsIntTerm (t) ? IntOfTerm (t) : LongIntOfTerm (t)); return (Int) (IsIntTerm(t) ? IntOfTerm(t) : LongIntOfTerm(t));
} }
@ -851,63 +854,57 @@ IntegerOfTerm (Term t)
/*************** High level macros to access arguments ******************/ /*************** High level macros to access arguments ******************/
inline EXTERN Term ArgOfTerm (int i, Term t); inline EXTERN Term ArgOfTerm(int i, Term t);
inline EXTERN Term inline EXTERN Term ArgOfTerm(int i, Term t)
ArgOfTerm (int i, Term t)
{ {
return (Term) (Derefa (RepAppl (t) + (i))); return (Term) (Derefa(RepAppl(t) + (i)));
} }
inline EXTERN Term HeadOfTerm (Term); inline EXTERN Term HeadOfTerm(Term);
inline EXTERN Term inline EXTERN Term HeadOfTerm(Term t)
HeadOfTerm (Term t)
{ {
return (Term) (Derefa (RepPair (t))); return (Term) (Derefa(RepPair(t)));
} }
inline EXTERN Term TailOfTerm (Term); inline EXTERN Term TailOfTerm(Term);
inline EXTERN Term inline EXTERN Term TailOfTerm(Term t)
TailOfTerm (Term t)
{ {
return (Term) (Derefa (RepPair (t) + 1)); return (Term) (Derefa(RepPair(t) + 1));
} }
inline EXTERN Term ArgOfTermCell (int i, Term t); inline EXTERN Term ArgOfTermCell(int i, Term t);
inline EXTERN Term inline EXTERN Term ArgOfTermCell(int i, Term t)
ArgOfTermCell (int i, Term t)
{ {
return (Term) ((CELL) (RepAppl (t) + (i))); return (Term) ((CELL)(RepAppl(t) + (i)));
} }
inline EXTERN Term HeadOfTermCell (Term); inline EXTERN Term HeadOfTermCell(Term);
inline EXTERN Term inline EXTERN Term HeadOfTermCell(Term t)
HeadOfTermCell (Term t)
{ {
return (Term) ((CELL) (RepPair (t))); return (Term) ((CELL)(RepPair(t)));
} }
inline EXTERN Term TailOfTermCell (Term); inline EXTERN Term TailOfTermCell(Term);
inline EXTERN Term inline EXTERN Term TailOfTermCell(Term t)
TailOfTermCell (Term t)
{ {
return (Term) ((CELL) (RepPair (t) + 1)); return (Term) ((CELL)(RepPair(t) + 1));
} }
@ -916,7 +913,7 @@ TailOfTermCell (Term t)
#define MaxHash 1001 #define MaxHash 1001
/************ variables concerned with save and restore *************/ /************ variables concerned with save and restore *************/
extern int splfild; extern int splfild;
#define FAIL_RESTORE 0 #define FAIL_RESTORE 0
#define DO_EVERYTHING 1 #define DO_EVERYTHING 1
@ -927,24 +924,22 @@ extern int splfild;
/******************** using Emacs mode ********************************/ /******************** using Emacs mode ********************************/
extern int emacs_mode; extern int emacs_mode;
#endif #endif
/************ variable concerned with version number *****************/ /************ variable concerned with version number *****************/
extern char version_number[]; extern char version_number[];
/* consult stack management */ /* consult stack management */
typedef union CONSULT_OBJ typedef union CONSULT_OBJ {
{
char *filename; char *filename;
int mode; int mode;
Prop p; Prop p;
union CONSULT_OBJ *c; union CONSULT_OBJ *c;
} } consult_obj;
consult_obj;
/********* common instructions codes*************************/ /********* common instructions codes*************************/
@ -953,35 +948,35 @@ consult_obj;
#if USE_THREADED_CODE #if USE_THREADED_CODE
/************ reverse lookup of instructions *****************/ /************ reverse lookup of instructions *****************/
typedef struct opcode_tab_entry typedef struct opcode_tab_entry {
{
OPCODE opc; OPCODE opc;
op_numbers opnum; op_numbers opnum;
} } opentry;
opentry;
#endif #endif
/******************* controlling the compiler ****************************/ /******************* controlling the compiler ****************************/
extern int optimizer_on; extern int optimizer_on;
/******************* the line for the current parse **********************/ /******************* the line for the current parse **********************/
extern int StartLine; extern int StartLine;
extern int StartCh; extern int StartCh;
extern int CurFileNo; extern int CurFileNo;
/********************* how to write a Prolog term ***********************/ /********************* how to write a Prolog term ***********************/
/********* Prolog may be in several modes *******************************/ /********* Prolog may be in several modes *******************************/
#define BootMode 1 /* if booting or restoring */ typedef enum {
#define UserMode 2 /* Normal mode */ BootMode = 1, /* if booting or restoring */
#define CritMode 4 /* If we are meddling with the heap */ UserMode = 2, /* Normal mode */
#define FullLMode 8 /* to access the hidden atoms chain */ CritMode = 4, /* If we are meddling with the heap */
#define AbortMode 16 /* expecting to abort */ AbortMode = 8, /* expecting to abort */
#define InterruptMode 32 /* under an interrupt */ InterruptMode = 16 /* under an interrupt */
} prolog_exec_mode;
extern int PrologMode; extern prolog_exec_mode PrologMode;
extern int CritLocks;
#if SIZEOF_INT_P==4 #if SIZEOF_INT_P==4
#if defined(YAPOR) || defined(TABLING) #if defined(YAPOR) || defined(TABLING)
@ -1011,8 +1006,8 @@ extern int PrologMode;
/************** Access to yap initial arguments ***************************/ /************** Access to yap initial arguments ***************************/
extern char **yap_args; extern char **yap_args;
extern int yap_argc; extern int yap_argc;
#ifdef YAPOR #ifdef YAPOR
#define YAPEnterCriticalSection() \ #define YAPEnterCriticalSection() \
@ -1022,17 +1017,46 @@ extern int yap_argc;
GLOBAL_LOCKS_who_locked_heap = worker_id; \ GLOBAL_LOCKS_who_locked_heap = worker_id; \
} \ } \
PrologMode |= CritMode; \ PrologMode |= CritMode; \
CritLocks++; \
} }
#define YAPLeaveCriticalSection() \ #define YAPLeaveCriticalSection() \
{ \ { \
if ((PrologMode ^= CritMode) & AbortMode) Abort((char *)NIL); \ CritLocks--; \
GLOBAL_LOCKS_who_locked_heap = MAX_WORKERS; \ if (!CritLocks) { \
UNLOCK(GLOBAL_LOCKS_heap_access); \ PrologMode &= ~CritMode; \
if (PrologMode & InterruptMode) { \
PrologMode &= ~InterruptMode; \
ProcessSIGINT(); \
} \
if (PrologMode & AbortMode) { \
PrologMode &= ~AbortMode; \
Abort(""); \
} \
GLOBAL_LOCKS_who_locked_heap = MAX_WORKERS; \
UNLOCK(GLOBAL_LOCKS_heap_access); \
} \
} }
#else #else
#define YAPEnterCriticalSection() PrologMode |= CritMode; #define YAPEnterCriticalSection() \
#define YAPLeaveCriticalSection() \ { \
if((PrologMode ^= CritMode) & AbortMode) Abort((char *)NIL); PrologMode |= CritMode; \
CritLocks++; \
}
#define YAPLeaveCriticalSection() \
{ \
CritLocks--; \
if (!CritLocks) { \
PrologMode &= ~CritMode; \
if (PrologMode & InterruptMode) { \
PrologMode &= ~InterruptMode; \
ProcessSIGINT(); \
} \
if (PrologMode & AbortMode) { \
PrologMode &= ~AbortMode; \
Abort(""); \
} \
} \
}
#endif /* YAPOR */ #endif /* YAPOR */
/* when we are calling the InitStaff procedures */ /* when we are calling the InitStaff procedures */
@ -1041,31 +1065,29 @@ extern int yap_argc;
/********* whether we should try to compile array references ******************/ /********* whether we should try to compile array references ******************/
extern int compile_arrays; extern int compile_arrays;
/********* mutable variables ******************/ /********* mutable variables ******************/
/* I assume that the size of this structure is a multiple of the size /* I assume that the size of this structure is a multiple of the size
of CELL!!! */ of CELL!!! */
typedef struct TIMED_MAVAR typedef struct TIMED_MAVAR{
{
CELL value; CELL value;
CELL clock; CELL clock;
} } timed_var;
timed_var;
/********* while debugging you may need some info ***********************/ /********* while debugging you may need some info ***********************/
#if DEBUG #if DEBUG
extern int output_msg; extern int output_msg;
#endif #endif
#if EMACS #if EMACS
extern char emacs_tmp[], emacs_tmp2[]; extern char emacs_tmp[], emacs_tmp2[];
#endif #endif
#if HAVE_SIGNAL #if HAVE_SIGNAL
extern int snoozing; extern int snoozing;
#endif #endif
#if defined(YAPOR) || defined(TABLING) #if defined(YAPOR) || defined(TABLING)
@ -1077,3 +1099,4 @@ extern int snoozing;
#if SBA #if SBA
#include "sbaunify.h" #include "sbaunify.h"
#endif #endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -16,6 +16,8 @@
<h2>Yap-4.3.19:</h2> <h2>Yap-4.3.19:</h2>
<ul> <ul>
<li>FIXED: fflush(NULL) broken in some machines (Stasinos).</li>
<li>FIXED: don't flush input streams (Stasinos).</li>
<li>FIXED: new statistics/0.</li> <li>FIXED: new statistics/0.</li>
<li>FIXED: use 15 bits of precision for floats, instead of the <li>FIXED: use 15 bits of precision for floats, instead of the
default 6..</li> default 6..</li>

View File

@ -15,7 +15,7 @@ splat
cd include cd include
splat splat
/bin/cp config.h config.h.mine /bin/cp config.h config.h.mine
/bin/cp ../../linux/*.h . /bin/cp ../../../bins/cyg/*.h .
/bin/mv config.h.mine config.h /bin/mv config.h.mine config.h
cd ../../console cd ../../console
splat splat
@ -45,7 +45,7 @@ cd ../CHR
splat splat
cd ../.. cd ../..
if test "$1" = "--small"; then if test "$1" = "--small"; then
tar cvzf "$version".tar.gz "$version"/{INSTALL,README*,changes*,config*,install-sh,Makefile.in,.depend.in,distribute,C,H,VC,console,docs,include,library,m4,misc,pl,LGPL/*.pl,LGPL/pillow/[C-Z]*,LGPL/pillow/*.pl,LGPL/pillow/doc/*info*,build-distr,OPTYap,CLPQR,CHR} tar cvzf "$version".tar.gz "$version"/{INSTALL,README*,changes*,config*,install-sh,Makefile.in,.depend.in,distribute,C,H,VC,console,docs,include,library,m4,misc,pl,LGPL/README,LGPL/CVS,LGPL/pillow/[C-Z]*,LGPL/pillow/*.pl,LGPL/pillow/doc/*info*,build-distr,OPTYap,CLPQR,CHR}
else else
tar cvzf "$version".tar.gz "$version"/{INSTALL,README*,changes*,config*,install-sh,Makefile.in,.depend.in,distribute,C,H,VC,console,docs,include,library,m4,misc,pl,LGPL,build-distr,OPTYap,CLPQR,CHR} tar cvzf "$version".tar.gz "$version"/{INSTALL,README*,changes*,config*,install-sh,Makefile.in,.depend.in,distribute,C,H,VC,console,docs,include,library,m4,misc,pl,LGPL,build-distr,OPTYap,CLPQR,CHR}
fi fi

View File

@ -188,9 +188,9 @@ print_message(help,M) :-
'$output_error_message'(existence_error(source_sink,F), W) :- '$output_error_message'(existence_error(source_sink,F), W) :-
format(user_error,"[ EXISTENCE ERROR- ~w could not find file ~w ]~n", format(user_error,"[ EXISTENCE ERROR- ~w could not find file ~w ]~n",
[W,F]). [W,F]).
'$output_error_message'(existence_error(stream,_), Where) :- '$output_error_message'(existence_error(stream,Stream), Where) :-
format(user_error,"[ EXISTENCE ERROR- ~w: not an open stream ]~n", format(user_error,"[ EXISTENCE ERROR- ~w: ~w not an open stream ]~n",
[Where]). [Where,Stream]).
'$output_error_message'(evaluation_error(int_overflow), Where) :- '$output_error_message'(evaluation_error(int_overflow), Where) :-
format(user_error,"[ INTEGER OVERFLOW ERROR- ~w ]~n", format(user_error,"[ INTEGER OVERFLOW ERROR- ~w ]~n",
[Where]). [Where]).

View File

@ -33,7 +33,7 @@ not(G) :- not(G).
(:- G) :- '$execute'(G), !. (:- G) :- '$execute'(G), !.
'$$!'(CP) :- '$cut_by'(CP). '$$!'(CP) :- '$cut_by'(CP).
:- '$set_value'($doindex,true). :- '$set_value'('$doindex',true).
:- ['errors.yap', :- ['errors.yap',
'utils.yap', 'utils.yap',