void factor_vm::store_external_address(instruction_operand op) { code_block *compiled = op.compiled; array *parameters = (to_boolean(compiled->parameters) ? untag<array>(compiled->parameters) : NULL); cell index = op.index; switch(op.rel_type()) { case RT_DLSYM: op.store_value(compute_dlsym_address(parameters,index)); break; case RT_THIS: op.store_value((cell)compiled->entry_point()); break; case RT_MEGAMORPHIC_CACHE_HITS: op.store_value((cell)&dispatch_stats.megamorphic_cache_hits); break; case RT_VM: op.store_value(compute_vm_address(array_nth(parameters,index))); break; case RT_CARDS_OFFSET: op.store_value(cards_offset); break; case RT_DECKS_OFFSET: op.store_value(decks_offset); break; #ifdef WINDOWS case RT_EXCEPTION_HANDLER: op.store_value((cell)&factor::exception_handler); break; #endif #ifdef FACTOR_PPC case RT_DLSYM_TOC: op.store_value(compute_dlsym_toc_address(parameters,index)); break; #endif case RT_INLINE_CACHE_MISS: op.store_value((cell)&factor::inline_cache_miss); break; case RT_SAFEPOINT: op.store_value((cell)code->safepoint_page); break; default: critical_error("Bad rel type in store_external_address()",op.rel_type()); break; } }
void factor_vm::store_external_address(instruction_operand op) { code_block *compiled = op.parent_code_block(); array *parameters = (to_boolean(compiled->parameters) ? untag<array>(compiled->parameters) : NULL); cell index = op.parameter_index(); switch(op.rel_type()) { case RT_PRIMITIVE: op.store_value(compute_primitive_address(array_nth(parameters,index))); break; case RT_DLSYM: op.store_value(compute_dlsym_address(parameters,index)); break; case RT_THIS: op.store_value((cell)compiled->xt()); break; case RT_CONTEXT: op.store_value(compute_context_address()); break; case RT_MEGAMORPHIC_CACHE_HITS: op.store_value((cell)&dispatch_stats.megamorphic_cache_hits); break; case RT_VM: op.store_value(compute_vm_address(array_nth(parameters,index))); break; case RT_CARDS_OFFSET: op.store_value(cards_offset); break; case RT_DECKS_OFFSET: op.store_value(decks_offset); break; default: critical_error("Bad rel type",op.rel_type()); break; } }