void operator()(instruction_operand op) { switch(op.rel_type()) { case RT_LITERAL: op.store_value(next_literal()); break; case RT_ENTRY_POINT: op.store_value(parent->compute_entry_point_address(next_literal())); break; case RT_ENTRY_POINT_PIC: op.store_value(parent->compute_entry_point_pic_address(next_literal())); break; case RT_ENTRY_POINT_PIC_TAIL: op.store_value(parent->compute_entry_point_pic_tail_address(next_literal())); break; case RT_HERE: op.store_value(parent->compute_here_address(next_literal(),op.rel_offset(),op.parent_code_block())); break; case RT_UNTAGGED: op.store_value(untag_fixnum(next_literal())); break; default: parent->store_external_address(op); break; } }
void operator()(instruction_operand op) { switch(op.rel_type()) { case RT_ENTRY_POINT: { code_block *compiled = op.load_code_block(); cell owner = compiled->owner; if(to_boolean(owner)) op.store_value(parent->compute_entry_point_address(owner)); break; } case RT_ENTRY_POINT_PIC: { code_block *compiled = op.load_code_block(); if(reset_inline_caches || !compiled->pic_p()) { cell owner = parent->code_block_owner(compiled); if(to_boolean(owner)) op.store_value(parent->compute_entry_point_pic_address(owner)); } break; } case RT_ENTRY_POINT_PIC_TAIL: { code_block *compiled = op.load_code_block(); if(reset_inline_caches || !compiled->pic_p()) { cell owner = parent->code_block_owner(compiled); if(to_boolean(owner)) op.store_value(parent->compute_entry_point_pic_tail_address(owner)); } break; } default: break; } }