- visit_context_code_blocks()
- visit_callback_code_blocks() */
-template<typename Visitor> struct code_block_visitor {
+template<typename Fixup> struct code_block_visitor {
factor_vm *parent;
- Visitor visitor;
+ Fixup fixup;
- explicit code_block_visitor(factor_vm *parent_, Visitor visitor_) :
- parent(parent_), visitor(visitor_) {}
+ explicit code_block_visitor(factor_vm *parent_, Fixup fixup_) :
+ parent(parent_), fixup(fixup_) {}
code_block *visit_code_block(code_block *compiled);
void visit_object_code_block(object *obj);
void visit_uninitialized_code_blocks();
};
-template<typename Visitor>
-code_block *code_block_visitor<Visitor>::visit_code_block(code_block *compiled)
+template<typename Fixup>
+code_block *code_block_visitor<Fixup>::visit_code_block(code_block *compiled)
{
- return visitor(compiled);
+ return fixup.fixup_code(compiled);
}
-template<typename Visitor>
+template<typename Fixup>
struct call_frame_code_block_visitor {
factor_vm *parent;
- Visitor visitor;
+ Fixup fixup;
- explicit call_frame_code_block_visitor(factor_vm *parent_, Visitor visitor_) :
- parent(parent_), visitor(visitor_) {}
+ explicit call_frame_code_block_visitor(factor_vm *parent_, Fixup fixup_) :
+ parent(parent_), fixup(fixup_) {}
void operator()(stack_frame *frame)
{
- cell offset = (cell)FRAME_RETURN_ADDRESS(frame,parent) - (cell)frame->entry_point;
+ code_block *old_block = parent->frame_code(frame);
+ cell offset = (char *)FRAME_RETURN_ADDRESS(frame,parent) - (char *)old_block;
- code_block *new_block = visitor(parent->frame_code(frame));
+ const code_block *new_block = fixup.fixup_code(old_block);
frame->entry_point = new_block->entry_point();
- FRAME_RETURN_ADDRESS(frame,parent) = (void *)((cell)frame->entry_point + offset);
+ FRAME_RETURN_ADDRESS(frame,parent) = (char *)new_block + offset;
}
};
-template<typename Visitor>
-void code_block_visitor<Visitor>::visit_object_code_block(object *obj)
+template<typename Fixup>
+void code_block_visitor<Fixup>::visit_object_code_block(object *obj)
{
switch(obj->type())
{
{
word *w = (word *)obj;
if(w->code)
- w->code = visitor(w->code);
+ w->code = visit_code_block(w->code);
if(w->profiling)
- w->profiling = visitor(w->profiling);
+ w->profiling = visit_code_block(w->profiling);
parent->update_word_entry_point(w);
break;
{
quotation *q = (quotation *)obj;
if(q->code)
- parent->set_quot_entry_point(q,visitor(q->code));
+ parent->set_quot_entry_point(q,visit_code_block(q->code));
break;
}
case CALLSTACK_TYPE:
{
callstack *stack = (callstack *)obj;
- call_frame_code_block_visitor<Visitor> call_frame_visitor(parent,visitor);
+ call_frame_code_block_visitor<Fixup> call_frame_visitor(parent,fixup);
parent->iterate_callstack_object(stack,call_frame_visitor);
break;
}
}
}
-template<typename Visitor>
+template<typename Fixup>
struct embedded_code_pointers_visitor {
- Visitor visitor;
+ Fixup fixup;
- explicit embedded_code_pointers_visitor(Visitor visitor_) : visitor(visitor_) {}
+ explicit embedded_code_pointers_visitor(Fixup fixup_) : fixup(fixup_) {}
void operator()(instruction_operand op)
{
if(type == RT_ENTRY_POINT
|| type == RT_ENTRY_POINT_PIC
|| type == RT_ENTRY_POINT_PIC_TAIL)
- op.store_code_block(visitor(op.load_code_block()));
+ op.store_code_block(fixup.fixup_code(op.load_code_block()));
}
};
-template<typename Visitor>
-void code_block_visitor<Visitor>::visit_embedded_code_pointers(code_block *compiled)
+template<typename Fixup>
+void code_block_visitor<Fixup>::visit_embedded_code_pointers(code_block *compiled)
{
if(!parent->code->uninitialized_p(compiled))
{
- embedded_code_pointers_visitor<Visitor> visitor(this->visitor);
- compiled->each_instruction_operand(visitor);
+ embedded_code_pointers_visitor<Fixup> operand_visitor(fixup);
+ compiled->each_instruction_operand(operand_visitor);
}
}
-template<typename Visitor>
-void code_block_visitor<Visitor>::visit_context_code_blocks()
+template<typename Fixup>
+void code_block_visitor<Fixup>::visit_context_code_blocks()
{
- call_frame_code_block_visitor<Visitor> call_frame_visitor(parent,visitor);
+ call_frame_code_block_visitor<Fixup> call_frame_visitor(parent,fixup);
parent->iterate_active_callstacks(call_frame_visitor);
}
-template<typename Visitor>
-void code_block_visitor<Visitor>::visit_uninitialized_code_blocks()
+template<typename Fixup>
+void code_block_visitor<Fixup>::visit_uninitialized_code_blocks()
{
std::map<code_block *, cell> *uninitialized_blocks = &parent->code->uninitialized_blocks;
std::map<code_block *, cell>::const_iterator iter = uninitialized_blocks->begin();
for(; iter != end; iter++)
{
new_uninitialized_blocks.insert(std::make_pair(
- visitor(iter->first),
+ fixup.fixup_code(iter->first),
iter->second));
}