4 template<typename Visitor> struct call_frame_code_block_visitor {
8 explicit call_frame_code_block_visitor(factor_vm *parent_, Visitor visitor_) :
9 parent(parent_), visitor(visitor_) {}
11 void operator()(stack_frame *frame)
13 cell offset = (cell)FRAME_RETURN_ADDRESS(frame,parent) - (cell)frame->xt;
15 code_block *new_block = visitor(parent->frame_code(frame));
16 frame->xt = new_block->xt();
18 FRAME_RETURN_ADDRESS(frame,parent) = (void *)((cell)frame->xt + offset);
22 template<typename Visitor> struct callback_code_block_visitor {
23 callback_heap *callbacks;
26 explicit callback_code_block_visitor(callback_heap *callbacks_, Visitor visitor_) :
27 callbacks(callbacks_), visitor(visitor_) {}
29 void operator()(callback *stub)
31 stub->compiled = visitor(stub->compiled);
32 callbacks->update(stub);
36 template<typename Visitor> struct code_block_visitor {
40 explicit code_block_visitor(factor_vm *parent_, Visitor visitor_) :
41 parent(parent_), visitor(visitor_) {}
42 void visit_object_code_block(object *obj)
44 switch(obj->h.hi_tag())
48 word *w = (word *)obj;
50 w->code = visitor(w->code);
52 w->code = visitor(w->profiling);
54 parent->update_word_xt(w);
59 quotation *q = (quotation *)obj;
61 parent->set_quot_xt(q,visitor(q->code));
66 callstack *stack = (callstack *)obj;
67 call_frame_code_block_visitor<Visitor> call_frame_visitor(parent,visitor);
68 parent->iterate_callstack_object(stack,call_frame_visitor);
74 void visit_context_code_blocks()
76 call_frame_code_block_visitor<Visitor> call_frame_visitor(parent,visitor);
77 parent->iterate_active_frames(call_frame_visitor);
80 void visit_callback_code_blocks()
82 callback_code_block_visitor<Visitor> callback_visitor(parent->callbacks,visitor);
83 parent->callbacks->iterate(callback_visitor);