]> gitweb.factorcode.org Git - factor.git/blob - vm/object_start_map.cpp
Merge branch 'master' into new_gc
[factor.git] / vm / object_start_map.cpp
1 #include "master.hpp"
2
3 namespace factor
4 {
5
6 object_start_map::object_start_map(cell size_, cell start_) :
7         size(size_), start(start_)
8 {
9         object_start_offsets = new card[addr_to_card(size_)];
10         object_start_offsets_end = object_start_offsets + addr_to_card(size_);
11 }
12
13 object_start_map::~object_start_map()
14 {
15         delete[] object_start_offsets;
16 }
17
18 cell object_start_map::first_object_in_card(cell card_index)
19 {
20         return object_start_offsets[card_index];
21 }
22
23 cell object_start_map::find_object_containing_card(cell card_index)
24 {
25         if(card_index == 0)
26                 return start;
27         else
28         {
29                 card_index--;
30
31                 while(first_object_in_card(card_index) == card_starts_inside_object)
32                 {
33 #ifdef FACTOR_DEBUG
34                         /* First card should start with an object */
35                         assert(card_index > 0);
36 #endif
37                         card_index--;
38                 }
39
40                 return start + (card_index << card_bits) + first_object_in_card(card_index);
41         }
42 }
43
44 /* we need to remember the first object allocated in the card */
45 void object_start_map::record_object_start_offset(object *obj)
46 {
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);
50 }
51
52 void object_start_map::clear_object_start_offsets()
53 {
54         memset(object_start_offsets,card_starts_inside_object,addr_to_card(size));
55 }
56
57 }