flags support

This commit is contained in:
Vítor Santos Costa 2015-06-19 00:50:41 +01:00
parent e2fc835cfd
commit 17049ce8ec
1 changed files with 145 additions and 26 deletions

171
H/Yatom.h
View File

@ -1,4 +1,4 @@
/*************************************************************************
/*************************************************************************
* *
* YAP Prolog %W% %G%
* *
@ -200,6 +200,7 @@ IsFunctorProperty (int flags)
ff fb blackboard property
ff fc value property
ff fd global property
ff fe flag property
ff ff op property
*/
@ -418,6 +419,24 @@ IsModProperty (int flags)
return (PropFlags) ((flags == ModProperty));
}
/* Flags on module. Most of these flags are copied to the read context
in pl-read.c.
*/
#define M_SYSTEM (0x0001) /* system module */
#define M_CHARESCAPE (0x0002) /* module */
#define DBLQ_CHARS (0x0004) /* "ab" --> ['a', 'b'] */
#define DBLQ_ATOM (0x0008) /* "ab" --> 'ab' */
#define DBLQ_STRING (0x0010) /* "ab" --> "ab" */
#define DBLQ_MASK (DBLQ_CHARS|DBLQ_ATOM|DBLQ_STRING|DBLQ_CODES)
#define UNKNOWN_FAIL (0x0020) /* module */
#define UNKNOWN_WARNING (0x0040) /* module */
#define UNKNOWN_ERROR (0x0080) /* module */
#define UNKNOWN_MASK (UNKNOWN_ERROR|UNKNOWN_WARNING|UNKNOWN_FAIL)
#define DBLQ_CODES (0x0008) /* "ab" --> [0'a, 0'b] */
Term Yap_getUnknownModule(ModEntry *m);
void Yap_setModuleFlags(ModEntry *n, ModEntry *o);
/* operator property entry structure */
typedef struct operator_entry
{
@ -630,16 +649,6 @@ AbsValProp (ValEntry * p)
#define ValProperty ((PropFlags)0xfffc)
INLINE_ONLY inline EXTERN PropFlags IsValProperty (int);
INLINE_ONLY inline EXTERN PropFlags
IsValProperty (int flags)
{
return (PropFlags) ((flags == ValProperty));
}
typedef uint64_t pred_flags_t;
/* predicate property entry structure */
/* AsmPreds are things like var, nonvar, atom ...which are implemented
@ -651,6 +660,9 @@ IsValProperty (int flags)
don't forget to also add in qly.h
*/
typedef uint64_t pred_flags_t;
#define DiscontiguousPredFlag ((pred_flags_t)0x1000000000) /* predicates whose clauses may be all-over the place.. */
#define SysExportPredFlag ((pred_flags_t)0x800000000)
/* reuse export list to prolog module. */
@ -786,6 +798,7 @@ INLINE_ONLY inline EXTERN PredEntry *RepPredProp (Prop p);
INLINE_ONLY inline EXTERN PredEntry *
RepPredProp (Prop p)
{
return (PredEntry *) (p);
}
@ -796,6 +809,7 @@ INLINE_ONLY inline EXTERN Prop AbsPredProp (PredEntry * p);
INLINE_ONLY inline EXTERN Prop
AbsPredProp (PredEntry * p)
{
return (Prop) (p);
}
@ -1391,20 +1405,6 @@ typedef struct array_entry
/* second case is for static arrays */
/* first, the valid types */
typedef enum
{
array_of_ints,
array_of_chars,
array_of_uchars,
array_of_doubles,
array_of_ptrs,
array_of_atoms,
array_of_dbrefs,
array_of_nb_terms,
array_of_terms
} static_array_types;
typedef struct {
Term tlive;
Term tstore;
@ -1552,7 +1552,7 @@ typedef struct blob_atom_entry
{
Prop NextOfPE; /* used to chain properties */
PropFlags KindOfPE; /* kind of property */
struct PL_blob_t *blob_t; /* type of blob */
struct YAP_blob_t *blob_type; /* type of blob */
} BlobPropEntry;
#if USE_OFFSETS_IN_PROPS
@ -1619,6 +1619,84 @@ IsBlob (Atom at)
IsBlobProperty(RepBlobProp(RepAtom(at)->PropsOfAE)->KindOfPE);
}
INLINE_ONLY inline EXTERN PropFlags IsValProperty (int);
INLINE_ONLY inline EXTERN PropFlags
IsValProperty (int flags)
{
return (PropFlags) ((flags == ValProperty));
}
/* flag property entry structure */
typedef bool (*flag_func)(Term);
typedef struct
{
Prop NextOfPE; /* used to chain properties */
PropFlags KindOfPE; /* kind of property */
#if defined(YAPOR) || defined(THREADS)
rwlock_t VRWLock; /* a read-write lock to protect the entry */
#endif
int FlagOfVE; /* (atomic) value associated with the atom */
bool global, atomic, rw;
flag_func type, helper;
} FlagEntry;
#if USE_OFFSETS_IN_PROPS
INLINE_ONLY inline EXTERN FlagEntry *RepFlagProp (Prop p);
INLINE_ONLY inline EXTERN FlagEntry *
RepFlagProp (Prop p)
{
return (FlagEntry *) (AtomBase + Unsigned (p));
}
INLINE_ONLY inline EXTERN Prop AbsFlagProp (FlagEntry * p);
INLINE_ONLY inline EXTERN Prop
AbsValProp (FlagEntry * p)
{
return (Prop) (Addr (p) - AtomBase);
}
#else
INLINE_ONLY inline EXTERN FlagEntry *RepFlagProp (Prop p);
INLINE_ONLY inline EXTERN FlagEntry *
RepFlagProp (Prop p)
{
return (FlagEntry *) (p);
}
INLINE_ONLY inline EXTERN Prop AbsFlagProp (FlagEntry * p);
INLINE_ONLY inline EXTERN Prop
AbsFlagProp (FlagEntry * p)
{
return (Prop) (p);
}
#endif
#define FlagProperty ((PropFlags)0xfffc)
INLINE_ONLY inline EXTERN PropFlags IsFlagProperty (int);
INLINE_ONLY inline EXTERN PropFlags
IsFlagProperty (int flags)
{
return (PropFlags) ((flags == FlagProperty));
}
/* Proto types */
@ -1649,6 +1727,11 @@ Prop Yap_GetAPropHavingLock(AtomEntry *, PropFlags);
#define PredHashInitialSize ((UInt)1039)
#define PredHashIncrement ((UInt)7919)
/*************************************************************************************************
flag support
*************************************************************************************************/
#include "YapFlags.h"
INLINE_ONLY EXTERN inline UInt PRED_HASH(FunctorEntry *, Term, UInt);
INLINE_ONLY EXTERN inline UInt
@ -1897,5 +1980,41 @@ AddPropToAtom(AtomEntry *ae, PropEntry *p)
}
}
// auxiliary functions
INLINE_ONLY inline EXTERN const char *AtomName (Atom at);
/**
* AtomName: get a string with the name of an Atom. Assumes 8 bit representation.
*
* @param at the atom
*
* @return a ponter to an immutable sequence of characters.
*/
INLINE_ONLY inline EXTERN const char *
AtomName (Atom at)
{
return RepAtom(at) -> StrOfAE;
}
INLINE_ONLY inline EXTERN const char *AtomTermName (Term t);
/**
* AtomTermName: get a string with the name of a term storing an Atom. Assumes 8 bit representation.
*
* @param t the atom term
*
* @return a ponter to an immutable sequence of characters.
*
* @note: this routine does not support wide chars.
*/
INLINE_ONLY inline EXTERN const char*
AtomTermName (Term t)
{
return RepAtom(AtomOfTerm(t)) -> StrOfAE;
}
#endif