/* Sun-$Revision: 23.6 $ */
/* Copyright 1992-9 Sun Microsystems, Inc. and Stanford University.
See the LICENSE file for license information. */
# pragma interface
#define FOR_EACH_SLOTDESC(MAP, SLOT) \
SlotIterator _iterator(MAP); \
slotDesc *SLOT= _iterator.slot_desc(); \
for ( ; !_iterator.atEnd(); SLOT= _iterator.next())
#define FOR_EACH_SLOTDESC_N(MAP, SLOT, N) \
SlotIterator _iterator(MAP); \
slotDesc *SLOT= _iterator.slot_desc(); \
fint N; \
for (N= 0; !_iterator.atEnd(); SLOT= _iterator.next(), N++)
class SlotIterator : public ResourceObj {
private:
slotDesc *sd;
slotDesc *end;
void init(Map *m);
public:
SlotIterator(Map *m) { init(m); }
# ifdef GENERATE_ASSERTIONS
static SlotIterator *blockIterator;
static fint nActive;
~SlotIterator() {
if (CheckAssertions) {
--nActive;
if (this == blockIterator) blockIterator= NULL;
}
}
# endif
slotDesc *slot_desc() { return sd; }
slotDesc *next() {
assert(sd < end, "a step too far");
# ifdef GENERATE_ASSERTIONS
if (CheckAssertions && sd + 1 == end && this==blockIterator) blockIterator= NULL;
# endif
return ++sd; }
bool atEnd() { return sd == end; }
};
extern void slotIterator_init();
extern void slotIterator_scavenge_contents();
extern void slotIterator_gc_mark_contents();
extern void slotIterator_gc_unmark_contents();
extern void slotIterator_switch_pointers(oop from, oop to);
extern void slotIterator_verify();
extern slotDesc block_slots[];