]> gitweb.factorcode.org Git - factor.git/blob - vm/code_block_visitor.hpp
vm: factor out code that visits object slots and code heap blocks into slot_visitor...
[factor.git] / vm / code_block_visitor.hpp
1 namespace factor
2 {
3
4 template<typename Visitor> struct call_frame_code_block_visitor {
5         Visitor visitor;
6
7         explicit call_frame_code_block_visitor(Visitor visitor_) : visitor(visitor_) {}
8
9         void operator()(stack_frame *frame)
10         {
11                 cell offset = (cell)FRAME_RETURN_ADDRESS(frame,parent) - (cell)frame->xt;
12
13                 code_block *new_block = visitor.visit_code_block(parent->frame_code(frame));
14                 frame->xt = new_block->xt();
15
16                 FRAME_RETURN_ADDRESS(frame,parent) = (void *)((cell)frame->xt + offset);
17         }
18 };
19
20 template<typename Visitor> void factor_vm::visit_object_code_block(object *obj, Visitor visitor)
21 {
22         switch(obj->h.hi_tag())
23         {
24         case WORD_TYPE:
25                 {
26                         word *w = (word *)obj;
27                         if(w->code)
28                                 w->code = visitor.visit_code_block(w->code);
29                         if(w->profiling)
30                                 w->code = visitor.visit_code_block(w->profiling);
31
32                         update_word_xt(obj);
33                         break;
34                 }
35         case QUOTATION_TYPE:
36                 {
37                         quotation *q = (quotation *)obj;
38                         if(q->code)
39                                 set_quot_xt(visitor.visit_code_block(q->code));
40                         break;
41                 }
42         case CALLSTACK_TYPE:
43                 {
44                         callstack *stack = (callstack *)obj;
45                         call_frame_code_block_visitor<Visitor> call_frame_visitor(visitor);
46                         iterate_callstack_object(stack,call_frame_visitor);
47                         break;
48                 }
49         }
50 }
51
52 template<typename Visitor> void factor_vm::visit_context_code_blocks(Visitor visitor)
53 {
54         callstack *stack = (callstack *)obj;
55         call_frame_code_block_visitor<Visitor> call_frame_visitor(visitor);
56         iterate_active_frames(call_frame_visitor);
57 }
58
59 template<typename Visitor> struct callback_code_block_visitor {
60         callback_heap *callbacks;
61         Visitor visitor;
62
63         explicit callback_code_block_visitor(callback_heap *callbacks_, Visitor visitor_) :
64                 callbacks(callbacks_), visitor(visitor_) {}
65
66         void operator()(callback *stub)
67         {
68                 stub->compiled = visitor.visit_code_block(stub->compiled);
69                 callbacks->update(stub);
70         }
71 };
72
73 template<typename Visitor> void factor_vm::visit_callback_code_blocks(Visitor visitor)
74 {
75         callback_code_block_visitor callback_visitor(callbacks,visitor);
76         callbacks->iterate(callback_visitor);
77 }
78
79 }