Get modify-code-heap working if stack traces are stripped (but then it won't update existing code blocks), and rename code_heap::code_heap_free() to code_heap::free()

db4
Slava Pestov 2009-12-02 05:27:48 -06:00
parent eb840dcf41
commit 066d2836ca
4 changed files with 11 additions and 13 deletions

View File

@ -62,12 +62,7 @@ cell factor_vm::code_block_owner(code_block *compiled)
return word_wrapper->object; return word_wrapper->object;
} }
else else
{
#ifdef FACTOR_DEBUG
assert(owner.type_p(WORD_TYPE));
#endif
return compiled->owner; return compiled->owner;
}
} }
struct update_word_references_relocation_visitor { struct update_word_references_relocation_visitor {
@ -82,19 +77,22 @@ struct update_word_references_relocation_visitor {
case RT_XT: case RT_XT:
{ {
code_block *compiled = op.load_code_block(); code_block *compiled = op.load_code_block();
op.store_value(parent->compute_xt_address(compiled->owner)); cell owner = compiled->owner;
if(to_boolean(owner)) op.store_value(parent->compute_xt_address(owner));
break; break;
} }
case RT_XT_PIC: case RT_XT_PIC:
{ {
code_block *compiled = op.load_code_block(); code_block *compiled = op.load_code_block();
op.store_value(parent->compute_xt_pic_address(parent->code_block_owner(compiled))); cell owner = parent->code_block_owner(compiled);
if(to_boolean(owner)) op.store_value(parent->compute_xt_pic_address(owner));
break; break;
} }
case RT_XT_PIC_TAIL: case RT_XT_PIC_TAIL:
{ {
code_block *compiled = op.load_code_block(); code_block *compiled = op.load_code_block();
op.store_value(parent->compute_xt_pic_tail_address(parent->code_block_owner(compiled))); cell owner = parent->code_block_owner(compiled);
if(to_boolean(owner)) op.store_value(parent->compute_xt_pic_tail_address(owner));
break; break;
} }
default: default:
@ -119,7 +117,7 @@ void factor_vm::update_word_references(code_block *compiled)
the code heap with dead PICs that will be freed on the next the code heap with dead PICs that will be freed on the next
GC, we add them to the free list immediately. */ GC, we add them to the free list immediately. */
else if(compiled->pic_p()) else if(compiled->pic_p())
code->code_heap_free(compiled); code->free(compiled);
else else
{ {
update_word_references_relocation_visitor visitor(this); update_word_references_relocation_visitor visitor(this);

View File

@ -51,11 +51,11 @@ void code_heap::clear_mark_bits()
allocator->state.clear_mark_bits(); allocator->state.clear_mark_bits();
} }
void code_heap::code_heap_free(code_block *compiled) void code_heap::free(code_block *compiled)
{ {
assert(!uninitialized_p(compiled));
points_to_nursery.erase(compiled); points_to_nursery.erase(compiled);
points_to_aging.erase(compiled); points_to_aging.erase(compiled);
uninitialized_blocks.erase(compiled);
allocator->free(compiled); allocator->free(compiled);
} }

View File

@ -27,7 +27,7 @@ struct code_heap {
bool marked_p(code_block *compiled); bool marked_p(code_block *compiled);
void set_marked_p(code_block *compiled); void set_marked_p(code_block *compiled);
void clear_mark_bits(); void clear_mark_bits();
void code_heap_free(code_block *compiled); void free(code_block *compiled);
void flush_icache(); void flush_icache();
}; };

View File

@ -18,7 +18,7 @@ void factor_vm::deallocate_inline_cache(cell return_address)
/* Free the old PIC since we know its unreachable */ /* Free the old PIC since we know its unreachable */
if(old_block->pic_p()) if(old_block->pic_p())
code->code_heap_free(old_block); code->free(old_block);
} }
/* Figure out what kind of type check the PIC needs based on the methods /* Figure out what kind of type check the PIC needs based on the methods