word *factor_vm::allot_word(cell name_, cell vocab_, cell hashcode_) { data_root<object> vocab(vocab_,this); data_root<object> name(name_,this); data_root<word> new_word(allot<word>(sizeof(word)),this); new_word->hashcode = hashcode_; new_word->vocabulary = vocab.value(); new_word->name = name.value(); new_word->def = special_objects[OBJ_UNDEFINED]; new_word->props = false_object; new_word->counter = tag_fixnum(0); new_word->pic_def = false_object; new_word->pic_tail_def = false_object; new_word->subprimitive = false_object; new_word->profiling = NULL; new_word->code = NULL; jit_compile_word(new_word.value(),new_word->def,true); if(counting_profiler_p) { code_block *profiling_block = compile_profiling_stub(new_word.value()); new_word->profiling = profiling_block; initialize_code_block(new_word->profiling); } update_word_entry_point(new_word.untagged()); return new_word.untagged(); }
/* Allocates memory */ void update_word_xt(F_WORD *word) { /* If we just enabled the profiler, reset call count */ if(profiling_p) { if(!word->profiling) { REGISTER_UNTAGGED(word); F_COMPILED *profiling = compile_profiling_stub(word); UNREGISTER_UNTAGGED(word); word->profiling = profiling; } word->xt = (XT)(word->profiling + 1); } else word->xt = (XT)(word->code + 1); }