diff --git a/vm/code_blocks.cpp b/vm/code_blocks.cpp index d4f0f0a2f4..7251c1e569 100755 --- a/vm/code_blocks.cpp +++ b/vm/code_blocks.cpp @@ -210,6 +210,50 @@ void factor_vm::check_code_address(cell address) #endif } +void factor_vm::store_external_relocation(instruction_operand op) +{ + code_block *compiled = op.parent_code_block(); + array *literals = (to_boolean(compiled->literals) ? untag(compiled->literals) : NULL); + cell index = op.parameter_index(); + + switch(op.rel_type()) + { + case RT_PRIMITIVE: + op.store_value(parent->compute_primitive_relocation(array_nth(literals,index))); + break; + case RT_DLSYM: + op.store_value(parent->compute_dlsym_relocation(literals,index)); + break; + case RT_HERE: + op.store_value(parent->compute_here_relocation(array_nth(literals,index),op.rel_offset(),compiled)); + break; + case RT_THIS: + op.store_value((cell)compiled->xt()); + break; + case RT_CONTEXT: + op.store_value(parent->compute_context_relocation()); + break; + case RT_UNTAGGED: + op.store_value(untag_fixnum(array_nth(literals,index))); + break; + case RT_MEGAMORPHIC_CACHE_HITS: + op.store_value((cell)&parent->dispatch_stats.megamorphic_cache_hits); + break; + case RT_VM: + op.store_value(parent->compute_vm_relocation(array_nth(literals,index))); + break; + case RT_CARDS_OFFSET: + op.store_value(parent->cards_offset); + break; + case RT_DECKS_OFFSET: + op.store_value(parent->decks_offset); + break; + default: + critical_error("Bad rel type",op.rel_type()); + break; + } +} + struct relocate_code_block_relocation_visitor { factor_vm *parent; @@ -223,12 +267,6 @@ struct relocate_code_block_relocation_visitor { switch(op.rel_type()) { - case RT_PRIMITIVE: - op.store_value(parent->compute_primitive_relocation(array_nth(literals,index))); - break; - case RT_DLSYM: - op.store_value(parent->compute_dlsym_relocation(literals,index)); - break; case RT_IMMEDIATE: op.store_value(array_nth(literals,index)); break; @@ -241,32 +279,8 @@ struct relocate_code_block_relocation_visitor { case RT_XT_PIC_TAIL: op.store_value(parent->compute_xt_pic_tail_relocation(array_nth(literals,index))); break; - case RT_HERE: - op.store_value(parent->compute_here_relocation(array_nth(literals,index),op.rel_offset(),compiled)); - break; - case RT_THIS: - op.store_value((cell)compiled->xt()); - break; - case RT_CONTEXT: - op.store_value(parent->compute_context_relocation()); - break; - case RT_UNTAGGED: - op.store_value(untag_fixnum(array_nth(literals,index))); - break; - case RT_MEGAMORPHIC_CACHE_HITS: - op.store_value((cell)&parent->dispatch_stats.megamorphic_cache_hits); - break; - case RT_VM: - op.store_value(parent->compute_vm_relocation(array_nth(literals,index))); - break; - case RT_CARDS_OFFSET: - op.store_value(parent->cards_offset); - break; - case RT_DECKS_OFFSET: - op.store_value(parent->decks_offset); - break; default: - critical_error("Bad rel type",op.rel_type()); + parent->store_external_relocation(op); break; } } diff --git a/vm/image.cpp b/vm/image.cpp index 8c283863ae..7eac55b5a3 100755 --- a/vm/image.cpp +++ b/vm/image.cpp @@ -193,38 +193,8 @@ struct code_block_fixup_relocation_visitor { case RT_XT_PIC_TAIL: op.store_code_block(code_visitor(op.load_code_block(old_offset))); break; - case RT_PRIMITIVE: - op.store_value(parent->compute_primitive_relocation(array_nth(literals,index))); - break; - case RT_DLSYM: - op.store_value(parent->compute_dlsym_relocation(literals,index)); - break; - case RT_HERE: - op.store_value(parent->compute_here_relocation(array_nth(literals,index),op.rel_offset(),compiled)); - break; - case RT_THIS: - op.store_value((cell)compiled->xt()); - break; - case RT_CONTEXT: - op.store_value(parent->compute_context_relocation()); - break; - case RT_UNTAGGED: - op.store_value(untag_fixnum(array_nth(literals,index))); - break; - case RT_MEGAMORPHIC_CACHE_HITS: - op.store_value((cell)&parent->dispatch_stats.megamorphic_cache_hits); - break; - case RT_VM: - op.store_value(parent->compute_vm_relocation(array_nth(literals,index))); - break; - case RT_CARDS_OFFSET: - op.store_value(parent->cards_offset); - break; - case RT_DECKS_OFFSET: - op.store_value(parent->decks_offset); - break; default: - critical_error("Bad rel type",op.rel_type()); + parent->store_external_relocation(op); break; } } diff --git a/vm/vm.hpp b/vm/vm.hpp index 57d098b650..1aafca5a05 100755 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -516,6 +516,7 @@ struct factor_vm cell code_block_owner(code_block *compiled); void update_word_references(code_block *compiled); void check_code_address(cell address); + void store_external_relocation(instruction_operand op); void relocate_code_block(code_block *compiled); void fixup_labels(array *labels, code_block *compiled); code_block *allot_code_block(cell size, code_block_type type);