26#define MaskAdr (~((CELL)0x7))
31#define GET_NEXT(val) ((CELL *)(IsVarTerm((val)) ? \
33 ( IsPairTerm((val)) ? \
34 Unsigned(RepPair((val))) & MaskAdr : \
35 ( IsApplTerm((val)) ? \
36 Unsigned(RepAppl((val))) & MaskAdr : \
44#define GET_NEXT(val) ((CELL *) ((val) & ~LowTagBits))
46#define GET_NEXT(val) ((CELL *) ((val) & MaskAdr))
51#define ONHEAP(ptr) (CellPtr(ptr) >= H0 && CellPtr(ptr) < HR)
58#define ONCODE(ptr) ((ptr < H0||ptr>HR)&&find_ref_in_dbtable((void*)ptr) != LOCAL_db_nil)
60#define ONCODE(ptr) (Addr(ptr) < HeapTop && Addr(ptr) >= Yap_HeapBase)
63#define GCIsPrimitiveTerm(X) ( IsAtomOrIntTerm(X))
66#define HEAP_PTR(val) (!GCIsPrimitiveTerm(val) && ONHEAP(GET_NEXT(val)))
78#define HEAP_TRAIL_ENTRY(val) ((IsVarTerm(val)) && \
79 ((H0 <= CellPtr(val) && CellPtr(val)\
81 (CellPtr(B) < CellPtr(val) && CellPtr(val) <= \
82 LCL0 && HEAP_PTR(val))))
88#define MARK_BIT MKTAG(0x2,0x0)
89#define RMARK_BIT MKTAG(0x4,0x0)
91#define MARKED_PTR(P) MARKED_PTR__(P PASS_REGS)
92#define UNMARKED_CELL(P) MARKED_PTR__(P PASS_REGS)
93#define UNMARKED_MARK(P, BP) UNMARKED_MARK__(P, BP PASS_REGS)
94#define MARK(P) MARK__(P PASS_REGS)
95#define UNMARK(P) UNMARK__(P PASS_REGS)
96#define RMARK(P) RMARK__(P PASS_REGS)
97#define RMARKED(P) RMARKED__(P PASS_REGS)
98#define UNRMARK(P) UNRMARK__(P PASS_REGS)
101MARKED_PTR__(CELL* ptr USES_REGS)
103 return (CELL)ptr & MARK_BIT;
107UNMARKED_MARK__(CELL* ptr,
char *bp USES_REGS)
118MARK__(CELL* ptr USES_REGS)
125UNMARK__(CELL* ptr USES_REGS)
133#define UNMARK_CELL(X) (X)
136RMARK__(CELL* ptr USES_REGS)
142UNRMARK__(CELL* ptr USES_REGS)
148RMARKED__(CELL* ptr USES_REGS)
150 return *ptr & RMARK_BIT;
155#define MARK_BIT ((char)1)
156#define RMARK_BIT ((char)2)
157#define XMARK_BIT ((char)4)
159#define mcell(X) LOCAL_bp[(X)-(CELL *)LOCAL_GlobalBase]
161#define MARKED_PTR(P) MARKED_PTR__(P PASS_REGS)
162#define UNMARKED_MARK(P, BP) UNMARKED_MARK__(P, BP PASS_REGS)
163#define MARK(P) MARK__(P PASS_REGS)
164#define UNMARK(P) UNMARK__(P PASS_REGS)
165#define RMARK(P) RMARK__(P PASS_REGS)
166#define RMARKED(P) RMARKED__(P PASS_REGS)
167#define UNRMARK(P) UNRMARK__(P PASS_REGS)
168#define XMARK(P) XMARK__(P PASS_REGS)
169#define XMARKED(P) XMARKED__(P PASS_REGS)
170#define UNXMARK(P) UNXMARK__(P PASS_REGS)
173MARKED_PTR__(CELL* ptr USES_REGS)
175 return mcell(ptr) & MARK_BIT;
179UNMARKED_MARK__(CELL* ptr,
char *bp USES_REGS)
181 Int pos = ptr - (CELL *)LOCAL_GlobalBase;
186 bp[pos] = t | MARK_BIT;
191MARK__(CELL* ptr USES_REGS)
193 Int pos = ptr - (CELL *)LOCAL_GlobalBase;
194 char t = LOCAL_bp[pos];
195 LOCAL_bp[pos] = t | MARK_BIT;
199UNMARK__(CELL* ptr USES_REGS)
201 mcell(ptr) = mcell(ptr) & ~MARK_BIT;
207#define UNMARK_CELL(X) (X)
210RMARK__(CELL* ptr USES_REGS)
212 mcell(ptr) = mcell(ptr) | RMARK_BIT;
216UNRMARK__(CELL* ptr USES_REGS)
218 mcell(ptr) = mcell(ptr) & ~RMARK_BIT;
222RMARKED__(CELL* ptr USES_REGS)
224 return mcell(ptr) & RMARK_BIT;
229XMARK__(CELL* ptr USES_REGS)
231 mcell(ptr) = mcell(ptr) | XMARK_BIT;
235UNXMARK__(CELL* ptr USES_REGS)
237 mcell(ptr) = mcell(ptr) & ~XMARK_BIT;
241XMARKED__(CELL* ptr USES_REGS)
243 return mcell(ptr) & XMARK_BIT;
249#ifdef TAG_LOW_BITS_32
250#define TAG(X) ((X) & LowTagBits)
253#define TAG(X) ((X) & MKTAG(0x0,0x7))
255#define TAG(X) ((X) & 0x80000003L)
259#define TAG(X) ((X) & 0x98000000L)
262#define ENVSIZE(E) EnvSize(((CELL *)E)[E_CP])
265typedef CELL *CELL_PTR;
268extern void Yap_mark_variable(CELL *);
269extern void Yap_mark_external_reference(CELL *);
270extern void Yap_inc_mark_variable(
void);
278 size_t env_size, gc_min;
282extern void PUSH_POINTER(CELL *v USES_REGS);