]> gitweb.factorcode.org Git - factor.git/blob - vm/tenured_space.hpp
Merge branch 'new_gc' of git://factorcode.org/git/factor into new_gc
[factor.git] / vm / tenured_space.hpp
1 namespace factor
2 {
3
4 struct tenured_space : free_list_allocator<object> {
5         object_start_map starts;
6         std::vector<object *> mark_stack;
7
8         explicit tenured_space(cell size, cell start) :
9                 free_list_allocator<object>(size,start), starts(size,start) {}
10
11         object *allot(cell size)
12         {
13                 object *obj = free_list_allocator<object>::allot(size);
14                 if(obj)
15                 {
16                         starts.record_object_start_offset(obj);
17                         return obj;
18                 }
19                 else
20                         return NULL;
21         }
22
23         object *first_allocated_block_after(object *block)
24         {
25                 while(block != this->last_block() && block->free_p())
26                 {
27                         free_heap_block *free_block = (free_heap_block *)block;
28                         block = (object *)((cell)free_block + free_block->size());
29                 }
30
31                 if(block == this->last_block())
32                         return NULL;
33                 else
34                         return block;
35         }
36
37         cell first_object()
38         {
39                 return (cell)first_allocated_block_after(this->first_block());
40         }
41
42         cell next_object_after(cell scan)
43         {
44                 cell size = ((object *)scan)->size();
45                 object *next = (object *)(scan + size);
46                 return (cell)first_allocated_block_after(next);
47         }
48
49         void clear_mark_bits()
50         {
51                 state.clear_mark_bits();
52         }
53
54         void clear_mark_stack()
55         {
56                 mark_stack.clear();
57         }
58
59         bool marked_p(object *obj)
60         {
61                 return this->state.marked_p(obj);
62         }
63
64         void mark_and_push(object *obj)
65         {
66                 this->state.set_marked_p(obj);
67                 this->mark_stack.push_back(obj);
68         }
69 };
70
71 }