4 template<typename Visitor> struct code_block_visitor {
8 explicit code_block_visitor(factor_vm *parent_, Visitor visitor_) :
9 parent(parent_), visitor(visitor_) {}
11 void visit_object_code_block(object *obj);
12 void visit_embedded_code_pointers(code_block *compiled);
13 void visit_context_code_blocks();
14 void visit_callback_code_blocks();
17 template<typename Visitor>
18 struct call_frame_code_block_visitor {
22 explicit call_frame_code_block_visitor(factor_vm *parent_, Visitor visitor_) :
23 parent(parent_), visitor(visitor_) {}
25 void operator()(stack_frame *frame)
27 cell offset = (cell)FRAME_RETURN_ADDRESS(frame,parent) - (cell)frame->xt;
29 code_block *new_block = visitor(parent->frame_code(frame));
30 frame->xt = new_block->xt();
32 FRAME_RETURN_ADDRESS(frame,parent) = (void *)((cell)frame->xt + offset);
36 template<typename Visitor>
37 void code_block_visitor<Visitor>::visit_object_code_block(object *obj)
43 word *w = (word *)obj;
45 w->code = visitor(w->code);
47 w->profiling = visitor(w->profiling);
49 parent->update_word_xt(w);
54 quotation *q = (quotation *)obj;
56 parent->set_quot_xt(q,visitor(q->code));
61 callstack *stack = (callstack *)obj;
62 call_frame_code_block_visitor<Visitor> call_frame_visitor(parent,visitor);
63 parent->iterate_callstack_object(stack,call_frame_visitor);
69 template<typename Visitor>
70 struct embedded_code_pointers_visitor {
73 explicit embedded_code_pointers_visitor(Visitor visitor_) : visitor(visitor_) {}
75 void operator()(relocation_entry rel, cell index, code_block *compiled)
77 relocation_type type = rel.rel_type();
78 if(type == RT_XT || type == RT_XT_PIC || type == RT_XT_PIC_TAIL)
80 instruction_operand op(rel.rel_class(),rel.rel_offset() + (cell)compiled->xt());
81 op.store_code_block(visitor(op.load_code_block()));
86 template<typename Visitor>
87 void code_block_visitor<Visitor>::visit_embedded_code_pointers(code_block *compiled)
89 if(!parent->code->needs_fixup_p(compiled))
91 embedded_code_pointers_visitor<Visitor> visitor(this->visitor);
92 parent->iterate_relocations(compiled,visitor);
96 template<typename Visitor>
97 void code_block_visitor<Visitor>::visit_context_code_blocks()
99 call_frame_code_block_visitor<Visitor> call_frame_visitor(parent,visitor);
100 parent->iterate_active_frames(call_frame_visitor);
103 template<typename Visitor>
104 struct callback_code_block_visitor {
105 callback_heap *callbacks;
108 explicit callback_code_block_visitor(callback_heap *callbacks_, Visitor visitor_) :
109 callbacks(callbacks_), visitor(visitor_) {}
111 void operator()(callback *stub)
113 stub->compiled = visitor(stub->compiled);
114 callbacks->update(stub);
118 template<typename Visitor>
119 void code_block_visitor<Visitor>::visit_callback_code_blocks()
121 callback_code_block_visitor<Visitor> callback_visitor(parent->callbacks,visitor);
122 parent->callbacks->iterate(callback_visitor);