6 object_start_map::object_start_map(cell size_, cell start_) :
7 size(size_), start(start_)
9 object_start_offsets = new card[addr_to_card(size_)];
10 object_start_offsets_end = object_start_offsets + addr_to_card(size_);
13 object_start_map::~object_start_map()
15 delete[] object_start_offsets;
18 cell object_start_map::first_object_in_card(cell card_index)
20 return object_start_offsets[card_index];
23 cell object_start_map::find_object_containing_card(cell card_index)
31 while(first_object_in_card(card_index) == card_starts_inside_object)
34 /* First card should start with an object */
35 assert(card_index > 0);
40 return start + (card_index << card_bits) + first_object_in_card(card_index);
44 /* we need to remember the first object allocated in the card */
45 void object_start_map::record_object_start_offset(object *obj)
47 cell idx = addr_to_card((cell)obj - start);
48 card obj_start = ((cell)obj & addr_card_mask);
49 object_start_offsets[idx] = std::min(object_start_offsets[idx],obj_start);
52 void object_start_map::clear_object_start_offsets()
54 memset(object_start_offsets,card_starts_inside_object,addr_to_card(size));