diff --git a/vm/code_blocks.cpp b/vm/code_blocks.cpp index af992de545..53f7834183 100644 --- a/vm/code_blocks.cpp +++ b/vm/code_blocks.cpp @@ -259,34 +259,34 @@ cell factor_vm::lookup_external_address(relocation_type rel_type, } } -void factor_vm::store_external_address(instruction_operand op) { - +cell factor_vm::compute_external_address(instruction_operand op) { code_block* compiled = op.compiled; array* parameters = to_boolean(compiled->parameters) ? untag(compiled->parameters) : NULL; - cell index = op.index; + cell idx = op.index; relocation_type rel_type = op.rel_type(); - cell ext_addr = lookup_external_address(rel_type, - compiled, - parameters, - index); + cell ext_addr = lookup_external_address(rel_type, compiled, parameters, idx); if (ext_addr == (cell)-1) { ostringstream ss; print_obj(ss, compiled->owner); ss << ": "; cell arg; if (rel_type == RT_DLSYM || rel_type == RT_DLSYM_TOC) { - ss << "Bad symbol specifier in store_external_address"; - arg = array_nth(parameters, index); + ss << "Bad symbol specifier in compute_external_address"; + arg = array_nth(parameters, idx); } else { - ss << "Bad rel type in store_external_address"; + ss << "Bad rel type in compute_external_address"; arg = rel_type; } critical_error(ss.str().c_str(), arg); } - op.store_value(ext_addr); + return ext_addr; +} + +void factor_vm::store_external_address(instruction_operand op) { + op.store_value(compute_external_address(op)); } cell factor_vm::compute_here_address(cell arg, cell offset, diff --git a/vm/vm.hpp b/vm/vm.hpp index ba1218608c..645a7557c1 100644 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -559,6 +559,8 @@ struct factor_vm { cell compute_entry_point_pic_address(word* w, cell tagged_quot); cell compute_entry_point_pic_address(cell w_); cell compute_entry_point_pic_tail_address(cell w_); + cell compute_external_address(instruction_operand op); + cell code_block_owner(code_block* compiled); void update_word_references(code_block* compiled, bool reset_inline_caches); void undefined_symbol();