]> gitweb.factorcode.org Git - factor.git/blob - vm/tenured_space.hpp
xmode.marker: caching match group regexps for performance
[factor.git] / vm / tenured_space.hpp
1 namespace factor {
2
3 struct tenured_space : free_list_allocator<object> {
4   object_start_map starts;
5
6   tenured_space(cell size, cell start)
7       : free_list_allocator<object>(size, start), starts(size, start) {}
8
9   object* allot(cell size) {
10     object* obj = free_list_allocator<object>::allot(size);
11     if (obj) {
12       starts.record_object_start_offset(obj);
13       return obj;
14     }
15     return NULL;
16   }
17
18   cell next_allocated_object_after(cell scan) {
19     while (scan != this->end && ((object*)scan)->free_p()) {
20       free_heap_block* free_block = (free_heap_block*)scan;
21       scan = (cell)free_block + free_block->size();
22     }
23     return scan == this->end ? 0 : scan;
24   }
25
26   cell first_object() {
27     return next_allocated_object_after(this->start);
28   }
29
30   cell next_object_after(cell scan) {
31     cell size = ((object*)scan)->size();
32     return next_allocated_object_after(scan + size);
33   }
34
35   void sweep() {
36     free_list_allocator<object>::sweep();
37     starts.update_for_sweep(&this->state);
38   }
39 };
40
41 }