]> gitweb.factorcode.org Git - factor.git/blob - vm/to_tenured_collector.hpp
webapps.wiki: adding search bar
[factor.git] / vm / to_tenured_collector.hpp
1 namespace factor {
2
3 struct from_tenured_refs_copier : no_fixup {
4   tenured_space* tenured;
5   std::vector<cell> *mark_stack;
6
7   from_tenured_refs_copier(tenured_space* tenured,
8                            std::vector<cell> *mark_stack)
9       : tenured(tenured), mark_stack(mark_stack) { }
10
11   object* fixup_data(object* obj) {
12     if (tenured->contains_p(obj)) {
13       return obj;
14     }
15
16     // Is there another forwarding pointer?
17     while (obj->forwarding_pointer_p()) {
18       object* dest = obj->forwarding_pointer();
19       obj = dest;
20     }
21
22     if (tenured->contains_p(obj)) {
23       return obj;
24     }
25
26     cell size = obj->size();
27     object* newpointer = tenured->allot(size);
28     if (!newpointer)
29       throw must_start_gc_again();
30
31     memcpy(newpointer, obj, size);
32     obj->forward_to(newpointer);
33
34     mark_stack->push_back((cell)newpointer);
35     return newpointer;
36   }
37 };
38
39 }