4 template<typename Visitor> struct call_frame_code_block_visitor {
7 explicit call_frame_code_block_visitor(Visitor visitor_) : visitor(visitor_) {}
9 void operator()(stack_frame *frame)
11 cell offset = (cell)FRAME_RETURN_ADDRESS(frame,parent) - (cell)frame->xt;
13 code_block *new_block = visitor.visit_code_block(parent->frame_code(frame));
14 frame->xt = new_block->xt();
16 FRAME_RETURN_ADDRESS(frame,parent) = (void *)((cell)frame->xt + offset);
20 template<typename Visitor> void factor_vm::visit_object_code_block(object *obj, Visitor visitor)
22 switch(obj->h.hi_tag())
26 word *w = (word *)obj;
28 w->code = visitor.visit_code_block(w->code);
30 w->code = visitor.visit_code_block(w->profiling);
37 quotation *q = (quotation *)obj;
39 set_quot_xt(visitor.visit_code_block(q->code));
44 callstack *stack = (callstack *)obj;
45 call_frame_code_block_visitor<Visitor> call_frame_visitor(visitor);
46 iterate_callstack_object(stack,call_frame_visitor);
52 template<typename Visitor> void factor_vm::visit_context_code_blocks(Visitor visitor)
54 callstack *stack = (callstack *)obj;
55 call_frame_code_block_visitor<Visitor> call_frame_visitor(visitor);
56 iterate_active_frames(call_frame_visitor);
59 template<typename Visitor> struct callback_code_block_visitor {
60 callback_heap *callbacks;
63 explicit callback_code_block_visitor(callback_heap *callbacks_, Visitor visitor_) :
64 callbacks(callbacks_), visitor(visitor_) {}
66 void operator()(callback *stub)
68 stub->compiled = visitor.visit_code_block(stub->compiled);
69 callbacks->update(stub);
73 template<typename Visitor> void factor_vm::visit_callback_code_blocks(Visitor visitor)
75 callback_code_block_visitor callback_visitor(callbacks,visitor);
76 callbacks->iterate(callback_visitor);