From 066d2836ca92373952e601a6c71c59e3437dc517 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Wed, 2 Dec 2009 05:27:48 -0600 Subject: [PATCH] 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() --- vm/code_blocks.cpp | 16 +++++++--------- vm/code_heap.cpp | 4 ++-- vm/code_heap.hpp | 2 +- vm/inline_cache.cpp | 2 +- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/vm/code_blocks.cpp b/vm/code_blocks.cpp index acbf1ccad8..7f73766714 100755 --- a/vm/code_blocks.cpp +++ b/vm/code_blocks.cpp @@ -62,12 +62,7 @@ cell factor_vm::code_block_owner(code_block *compiled) return word_wrapper->object; } else - { -#ifdef FACTOR_DEBUG - assert(owner.type_p(WORD_TYPE)); -#endif return compiled->owner; - } } struct update_word_references_relocation_visitor { @@ -82,19 +77,22 @@ struct update_word_references_relocation_visitor { case RT_XT: { 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; } case RT_XT_PIC: { 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; } case RT_XT_PIC_TAIL: { 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; } 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 GC, we add them to the free list immediately. */ else if(compiled->pic_p()) - code->code_heap_free(compiled); + code->free(compiled); else { update_word_references_relocation_visitor visitor(this); diff --git a/vm/code_heap.cpp b/vm/code_heap.cpp index e87ba5fbbf..b7aa9185e8 100755 --- a/vm/code_heap.cpp +++ b/vm/code_heap.cpp @@ -51,11 +51,11 @@ void code_heap::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_aging.erase(compiled); - uninitialized_blocks.erase(compiled); allocator->free(compiled); } diff --git a/vm/code_heap.hpp b/vm/code_heap.hpp index 69453677cf..78ffa6c76a 100755 --- a/vm/code_heap.hpp +++ b/vm/code_heap.hpp @@ -27,7 +27,7 @@ struct code_heap { bool marked_p(code_block *compiled); void set_marked_p(code_block *compiled); void clear_mark_bits(); - void code_heap_free(code_block *compiled); + void free(code_block *compiled); void flush_icache(); }; diff --git a/vm/inline_cache.cpp b/vm/inline_cache.cpp index 76b6c17225..c8be92b0a9 100755 --- a/vm/inline_cache.cpp +++ b/vm/inline_cache.cpp @@ -18,7 +18,7 @@ void factor_vm::deallocate_inline_cache(cell return_address) /* Free the old PIC since we know its unreachable */ 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