#include "master.hpp" namespace factor { void factor_vm::init_counting_profiler() { counting_profiler_p = false; } /* Allocates memory */ code_block *factor_vm::compile_counting_profiler_stub(cell word_) { data_root word(word_,this); jit jit(code_block_counting_profiler,word.value(),this); jit.emit_with_literal(special_objects[JIT_PROFILING],word.value()); return jit.to_code_block(); } /* Allocates memory */ void factor_vm::set_counting_profiler(bool counting_profiler) { if(counting_profiler == counting_profiler_p) return; /* Push everything to tenured space so that we can heap scan and allocate counting_profiler blocks if necessary */ primitive_full_gc(); data_root words(find_all_words(),this); counting_profiler_p = counting_profiler; cell length = array_capacity(words.untagged()); for(cell i = 0; i < length; i++) { tagged word(array_nth(words.untagged(),i)); /* Note: can't do w->counting_profiler = ... since LHS evaluates before RHS, and if RHS does a GC, we will have an invalid pointer on the LHS */ if(counting_profiler) { if(!word->counting_profiler) { code_block *counting_profiler_block = compile_counting_profiler_stub(word.value()); word->counting_profiler = counting_profiler_block; } word->counter = tag_fixnum(0); } update_word_entry_point(word.untagged()); } update_code_heap_words(false); } void factor_vm::primitive_counting_profiler() { set_counting_profiler(to_boolean(ctx->pop())); } }