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()
parent
eb840dcf41
commit
066d2836ca
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue