/* Sun-$Revision: 23.4 $ */ /* Copyright 1992-9 Sun Microsystems, Inc. and Stanford University. See the LICENSE file for license information. */ # pragma interface const int32 card_shift = 7; // wired in to scavenge_contents const int32 card_size = 1 << card_shift; const int32 card_size_in_oops = card_size / oopSize; const int32 byte_map_grain = 8 * BytesPerWord; // private and wired-in class rSet: public CHeapObj { friend class oldSpace; friend class oldGeneration; private: char* low_boundary; // duplicate of old_gen var so byte_for can be inlined char* high_boundary; char byte_map[1]; // size is a lie // friend void oldSpace::switch_pointers_by_card(oop, oop); char* byte_for(void *p) { return &byte_map[int32((char*)p - low_boundary) >> card_shift]; } oop* oop_for(char* p) { return (oop*)(low_boundary + (p - byte_map << card_shift)); } friend oop* card_for(oop* p) { return (oop*)(int32(p) & ~(card_size - 1)); } inline char* byte_map_end(); friend char* next_zero_byte(char*, char *); public: int byte_map_size() { return (high_boundary - low_boundary) / card_size; } rSet(); void* operator new(size_t size); inline void clear(); char* byte_map_base() { return byte_for(NULL); } void record_store(void* p) { *byte_for(p) = 0; } void record_multistores(oop* start, oop* end); // next one is here because of include file orderings void record_multistores(void* start, void* endArg) {record_multistores ((oop*)start, (oop*)endArg); } bool scavenge_contents(oop* , oop* ); bool verify(bool postScavenge); private: void fixup(char *start, char *end); void clear(char *start, char *end); rSet(rSet *old, char *start, char *end); };