diff --git a/basis/bootstrap/compiler/compiler.factor b/basis/bootstrap/compiler/compiler.factor index 3b7848251b..2d0613a7f5 100644 --- a/basis/bootstrap/compiler/compiler.factor +++ b/basis/bootstrap/compiler/compiler.factor @@ -76,7 +76,7 @@ gc "." write flush { - + 2/ < <= > >= shift + + * 2/ < <= > >= shift } compile-unoptimized "." write flush diff --git a/vm/alien.cpp b/vm/alien.cpp index 48fda5d752..b15ffee2c9 100755 --- a/vm/alien.cpp +++ b/vm/alien.cpp @@ -102,11 +102,11 @@ void *factor_vm::alien_pointer() /* define words to read/write values at an alien address */ #define DEFINE_ALIEN_ACCESSOR(name,type,from,to) \ - PRIMITIVE(alien_##name) \ + VM_C_API void primitive_alien_##name(factor_vm *parent) \ { \ parent->ctx->push(from(*(type*)(parent->alien_pointer()),parent)); \ } \ - PRIMITIVE(set_alien_##name) \ + VM_C_API void primitive_set_alien_##name(factor_vm *parent) \ { \ type *ptr = (type *)parent->alien_pointer(); \ type value = (type)to(parent->ctx->pop(),parent); \ diff --git a/vm/primitives.cpp b/vm/primitives.cpp index bc0dfb0230..2159e1d081 100644 --- a/vm/primitives.cpp +++ b/vm/primitives.cpp @@ -3,135 +3,135 @@ namespace factor { -#define PRIMITIVE_FORWARD(name) extern "C" void primitive_##name(factor_vm *parent) \ +#define PRIMITIVE(name) VM_C_API void primitive_##name(factor_vm *parent) \ { \ parent->primitive_##name(); \ } -PRIMITIVE_FORWARD(alien_address) -PRIMITIVE_FORWARD(all_instances) -PRIMITIVE_FORWARD(array) -PRIMITIVE_FORWARD(array_to_quotation) -PRIMITIVE_FORWARD(become) -PRIMITIVE_FORWARD(bignum_add) -PRIMITIVE_FORWARD(bignum_and) -PRIMITIVE_FORWARD(bignum_bitp) -PRIMITIVE_FORWARD(bignum_divint) -PRIMITIVE_FORWARD(bignum_divmod) -PRIMITIVE_FORWARD(bignum_eq) -PRIMITIVE_FORWARD(bignum_greater) -PRIMITIVE_FORWARD(bignum_greatereq) -PRIMITIVE_FORWARD(bignum_less) -PRIMITIVE_FORWARD(bignum_lesseq) -PRIMITIVE_FORWARD(bignum_log2) -PRIMITIVE_FORWARD(bignum_mod) -PRIMITIVE_FORWARD(bignum_multiply) -PRIMITIVE_FORWARD(bignum_not) -PRIMITIVE_FORWARD(bignum_or) -PRIMITIVE_FORWARD(bignum_shift) -PRIMITIVE_FORWARD(bignum_subtract) -PRIMITIVE_FORWARD(bignum_to_fixnum) -PRIMITIVE_FORWARD(bignum_to_float) -PRIMITIVE_FORWARD(bignum_xor) -PRIMITIVE_FORWARD(bits_double) -PRIMITIVE_FORWARD(bits_float) -PRIMITIVE_FORWARD(byte_array) -PRIMITIVE_FORWARD(byte_array_to_bignum) -PRIMITIVE_FORWARD(call_clear) -PRIMITIVE_FORWARD(callback) -PRIMITIVE_FORWARD(callstack) -PRIMITIVE_FORWARD(callstack_to_array) -PRIMITIVE_FORWARD(check_datastack) -PRIMITIVE_FORWARD(clone) -PRIMITIVE_FORWARD(code_room) -PRIMITIVE_FORWARD(compact_gc) -PRIMITIVE_FORWARD(compute_identity_hashcode) -PRIMITIVE_FORWARD(data_room) -PRIMITIVE_FORWARD(datastack) -PRIMITIVE_FORWARD(die) -PRIMITIVE_FORWARD(disable_gc_events) -PRIMITIVE_FORWARD(dispatch_stats) -PRIMITIVE_FORWARD(displaced_alien) -PRIMITIVE_FORWARD(dlclose) -PRIMITIVE_FORWARD(dll_validp) -PRIMITIVE_FORWARD(dlopen) -PRIMITIVE_FORWARD(dlsym) -PRIMITIVE_FORWARD(double_bits) -PRIMITIVE_FORWARD(enable_gc_events) -PRIMITIVE_FORWARD(existsp) -PRIMITIVE_FORWARD(exit) -PRIMITIVE_FORWARD(fclose) -PRIMITIVE_FORWARD(fflush) -PRIMITIVE_FORWARD(fgetc) -PRIMITIVE_FORWARD(fixnum_divint) -PRIMITIVE_FORWARD(fixnum_divmod) -PRIMITIVE_FORWARD(fixnum_shift) -PRIMITIVE_FORWARD(fixnum_to_bignum) -PRIMITIVE_FORWARD(fixnum_to_float) -PRIMITIVE_FORWARD(float_add) -PRIMITIVE_FORWARD(float_bits) -PRIMITIVE_FORWARD(float_divfloat) -PRIMITIVE_FORWARD(float_eq) -PRIMITIVE_FORWARD(float_greater) -PRIMITIVE_FORWARD(float_greatereq) -PRIMITIVE_FORWARD(float_less) -PRIMITIVE_FORWARD(float_lesseq) -PRIMITIVE_FORWARD(float_mod) -PRIMITIVE_FORWARD(float_multiply) -PRIMITIVE_FORWARD(float_subtract) -PRIMITIVE_FORWARD(float_to_bignum) -PRIMITIVE_FORWARD(float_to_fixnum) -PRIMITIVE_FORWARD(float_to_str) -PRIMITIVE_FORWARD(fopen) -PRIMITIVE_FORWARD(fputc) -PRIMITIVE_FORWARD(fread) -PRIMITIVE_FORWARD(fseek) -PRIMITIVE_FORWARD(ftell) -PRIMITIVE_FORWARD(full_gc) -PRIMITIVE_FORWARD(fwrite) -PRIMITIVE_FORWARD(identity_hashcode) -PRIMITIVE_FORWARD(innermost_stack_frame_executing) -PRIMITIVE_FORWARD(innermost_stack_frame_scan) -PRIMITIVE_FORWARD(jit_compile) -PRIMITIVE_FORWARD(load_locals) -PRIMITIVE_FORWARD(lookup_method) -PRIMITIVE_FORWARD(mega_cache_miss) -PRIMITIVE_FORWARD(minor_gc) -PRIMITIVE_FORWARD(modify_code_heap) -PRIMITIVE_FORWARD(nano_count) -PRIMITIVE_FORWARD(optimized_p) -PRIMITIVE_FORWARD(profiling) -PRIMITIVE_FORWARD(quot_compiled_p) -PRIMITIVE_FORWARD(quotation_code) -PRIMITIVE_FORWARD(reset_dispatch_stats) -PRIMITIVE_FORWARD(resize_array) -PRIMITIVE_FORWARD(resize_byte_array) -PRIMITIVE_FORWARD(resize_string) -PRIMITIVE_FORWARD(retainstack) -PRIMITIVE_FORWARD(save_image) -PRIMITIVE_FORWARD(save_image_and_exit) -PRIMITIVE_FORWARD(set_datastack) -PRIMITIVE_FORWARD(set_innermost_stack_frame_quot) -PRIMITIVE_FORWARD(set_retainstack) -PRIMITIVE_FORWARD(set_slot) -PRIMITIVE_FORWARD(set_special_object) -PRIMITIVE_FORWARD(set_string_nth_fast) -PRIMITIVE_FORWARD(set_string_nth_slow) -PRIMITIVE_FORWARD(size) -PRIMITIVE_FORWARD(sleep) -PRIMITIVE_FORWARD(special_object) -PRIMITIVE_FORWARD(str_to_float) -PRIMITIVE_FORWARD(string) -PRIMITIVE_FORWARD(string_nth) -PRIMITIVE_FORWARD(strip_stack_traces) -PRIMITIVE_FORWARD(system_micros) -PRIMITIVE_FORWARD(tuple) -PRIMITIVE_FORWARD(tuple_boa) -PRIMITIVE_FORWARD(unimplemented) -PRIMITIVE_FORWARD(uninitialized_byte_array) -PRIMITIVE_FORWARD(vm_ptr) -PRIMITIVE_FORWARD(word) -PRIMITIVE_FORWARD(word_code) -PRIMITIVE_FORWARD(wrapper) +PRIMITIVE(alien_address) +PRIMITIVE(all_instances) +PRIMITIVE(array) +PRIMITIVE(array_to_quotation) +PRIMITIVE(become) +PRIMITIVE(bignum_add) +PRIMITIVE(bignum_and) +PRIMITIVE(bignum_bitp) +PRIMITIVE(bignum_divint) +PRIMITIVE(bignum_divmod) +PRIMITIVE(bignum_eq) +PRIMITIVE(bignum_greater) +PRIMITIVE(bignum_greatereq) +PRIMITIVE(bignum_less) +PRIMITIVE(bignum_lesseq) +PRIMITIVE(bignum_log2) +PRIMITIVE(bignum_mod) +PRIMITIVE(bignum_multiply) +PRIMITIVE(bignum_not) +PRIMITIVE(bignum_or) +PRIMITIVE(bignum_shift) +PRIMITIVE(bignum_subtract) +PRIMITIVE(bignum_to_fixnum) +PRIMITIVE(bignum_to_float) +PRIMITIVE(bignum_xor) +PRIMITIVE(bits_double) +PRIMITIVE(bits_float) +PRIMITIVE(byte_array) +PRIMITIVE(byte_array_to_bignum) +PRIMITIVE(call_clear) +PRIMITIVE(callback) +PRIMITIVE(callstack) +PRIMITIVE(callstack_to_array) +PRIMITIVE(check_datastack) +PRIMITIVE(clone) +PRIMITIVE(code_room) +PRIMITIVE(compact_gc) +PRIMITIVE(compute_identity_hashcode) +PRIMITIVE(data_room) +PRIMITIVE(datastack) +PRIMITIVE(die) +PRIMITIVE(disable_gc_events) +PRIMITIVE(dispatch_stats) +PRIMITIVE(displaced_alien) +PRIMITIVE(dlclose) +PRIMITIVE(dll_validp) +PRIMITIVE(dlopen) +PRIMITIVE(dlsym) +PRIMITIVE(double_bits) +PRIMITIVE(enable_gc_events) +PRIMITIVE(existsp) +PRIMITIVE(exit) +PRIMITIVE(fclose) +PRIMITIVE(fflush) +PRIMITIVE(fgetc) +PRIMITIVE(fixnum_divint) +PRIMITIVE(fixnum_divmod) +PRIMITIVE(fixnum_shift) +PRIMITIVE(fixnum_to_bignum) +PRIMITIVE(fixnum_to_float) +PRIMITIVE(float_add) +PRIMITIVE(float_bits) +PRIMITIVE(float_divfloat) +PRIMITIVE(float_eq) +PRIMITIVE(float_greater) +PRIMITIVE(float_greatereq) +PRIMITIVE(float_less) +PRIMITIVE(float_lesseq) +PRIMITIVE(float_mod) +PRIMITIVE(float_multiply) +PRIMITIVE(float_subtract) +PRIMITIVE(float_to_bignum) +PRIMITIVE(float_to_fixnum) +PRIMITIVE(float_to_str) +PRIMITIVE(fopen) +PRIMITIVE(fputc) +PRIMITIVE(fread) +PRIMITIVE(fseek) +PRIMITIVE(ftell) +PRIMITIVE(full_gc) +PRIMITIVE(fwrite) +PRIMITIVE(identity_hashcode) +PRIMITIVE(innermost_stack_frame_executing) +PRIMITIVE(innermost_stack_frame_scan) +PRIMITIVE(jit_compile) +PRIMITIVE(load_locals) +PRIMITIVE(lookup_method) +PRIMITIVE(mega_cache_miss) +PRIMITIVE(minor_gc) +PRIMITIVE(modify_code_heap) +PRIMITIVE(nano_count) +PRIMITIVE(optimized_p) +PRIMITIVE(profiling) +PRIMITIVE(quot_compiled_p) +PRIMITIVE(quotation_code) +PRIMITIVE(reset_dispatch_stats) +PRIMITIVE(resize_array) +PRIMITIVE(resize_byte_array) +PRIMITIVE(resize_string) +PRIMITIVE(retainstack) +PRIMITIVE(save_image) +PRIMITIVE(save_image_and_exit) +PRIMITIVE(set_datastack) +PRIMITIVE(set_innermost_stack_frame_quot) +PRIMITIVE(set_retainstack) +PRIMITIVE(set_slot) +PRIMITIVE(set_special_object) +PRIMITIVE(set_string_nth_fast) +PRIMITIVE(set_string_nth_slow) +PRIMITIVE(size) +PRIMITIVE(sleep) +PRIMITIVE(special_object) +PRIMITIVE(str_to_float) +PRIMITIVE(string) +PRIMITIVE(string_nth) +PRIMITIVE(strip_stack_traces) +PRIMITIVE(system_micros) +PRIMITIVE(tuple) +PRIMITIVE(tuple_boa) +PRIMITIVE(unimplemented) +PRIMITIVE(uninitialized_byte_array) +PRIMITIVE(vm_ptr) +PRIMITIVE(word) +PRIMITIVE(word_code) +PRIMITIVE(wrapper) } diff --git a/vm/primitives.hpp b/vm/primitives.hpp index 6a916b2089..c1dd0e30dc 100644 --- a/vm/primitives.hpp +++ b/vm/primitives.hpp @@ -1,34 +1,162 @@ namespace factor { -#define PRIMITIVE(name) extern "C" void primitive_##name(factor_vm *parent) +#define DECLARE_PRIMITIVE(name) VM_C_API void primitive_##name(factor_vm *parent); -/* These are generated with macros in alien.cpp */ -PRIMITIVE(alien_signed_cell); -PRIMITIVE(set_alien_signed_cell); -PRIMITIVE(alien_unsigned_cell); -PRIMITIVE(set_alien_unsigned_cell); -PRIMITIVE(alien_signed_8); -PRIMITIVE(set_alien_signed_8); -PRIMITIVE(alien_unsigned_8); -PRIMITIVE(set_alien_unsigned_8); -PRIMITIVE(alien_signed_4); -PRIMITIVE(set_alien_signed_4); -PRIMITIVE(alien_unsigned_4); -PRIMITIVE(set_alien_unsigned_4); -PRIMITIVE(alien_signed_2); -PRIMITIVE(set_alien_signed_2); -PRIMITIVE(alien_unsigned_2); -PRIMITIVE(set_alien_unsigned_2); -PRIMITIVE(alien_signed_1); -PRIMITIVE(set_alien_signed_1); -PRIMITIVE(alien_unsigned_1); -PRIMITIVE(set_alien_unsigned_1); -PRIMITIVE(alien_float); -PRIMITIVE(set_alien_float); -PRIMITIVE(alien_double); -PRIMITIVE(set_alien_double); -PRIMITIVE(alien_cell); -PRIMITIVE(set_alien_cell); +/* Generated with PRIMITIVE in primitives.cpp */ +DECLARE_PRIMITIVE(alien_address) +DECLARE_PRIMITIVE(all_instances) +DECLARE_PRIMITIVE(array) +DECLARE_PRIMITIVE(array_to_quotation) +DECLARE_PRIMITIVE(become) +DECLARE_PRIMITIVE(bignum_add) +DECLARE_PRIMITIVE(bignum_and) +DECLARE_PRIMITIVE(bignum_bitp) +DECLARE_PRIMITIVE(bignum_divint) +DECLARE_PRIMITIVE(bignum_divmod) +DECLARE_PRIMITIVE(bignum_eq) +DECLARE_PRIMITIVE(bignum_greater) +DECLARE_PRIMITIVE(bignum_greatereq) +DECLARE_PRIMITIVE(bignum_less) +DECLARE_PRIMITIVE(bignum_lesseq) +DECLARE_PRIMITIVE(bignum_log2) +DECLARE_PRIMITIVE(bignum_mod) +DECLARE_PRIMITIVE(bignum_multiply) +DECLARE_PRIMITIVE(bignum_not) +DECLARE_PRIMITIVE(bignum_or) +DECLARE_PRIMITIVE(bignum_shift) +DECLARE_PRIMITIVE(bignum_subtract) +DECLARE_PRIMITIVE(bignum_to_fixnum) +DECLARE_PRIMITIVE(bignum_to_float) +DECLARE_PRIMITIVE(bignum_xor) +DECLARE_PRIMITIVE(bits_double) +DECLARE_PRIMITIVE(bits_float) +DECLARE_PRIMITIVE(byte_array) +DECLARE_PRIMITIVE(byte_array_to_bignum) +DECLARE_PRIMITIVE(call_clear) +DECLARE_PRIMITIVE(callback) +DECLARE_PRIMITIVE(callstack) +DECLARE_PRIMITIVE(callstack_to_array) +DECLARE_PRIMITIVE(check_datastack) +DECLARE_PRIMITIVE(clone) +DECLARE_PRIMITIVE(code_room) +DECLARE_PRIMITIVE(compact_gc) +DECLARE_PRIMITIVE(compute_identity_hashcode) +DECLARE_PRIMITIVE(data_room) +DECLARE_PRIMITIVE(datastack) +DECLARE_PRIMITIVE(die) +DECLARE_PRIMITIVE(disable_gc_events) +DECLARE_PRIMITIVE(dispatch_stats) +DECLARE_PRIMITIVE(displaced_alien) +DECLARE_PRIMITIVE(dlclose) +DECLARE_PRIMITIVE(dll_validp) +DECLARE_PRIMITIVE(dlopen) +DECLARE_PRIMITIVE(dlsym) +DECLARE_PRIMITIVE(double_bits) +DECLARE_PRIMITIVE(enable_gc_events) +DECLARE_PRIMITIVE(existsp) +DECLARE_PRIMITIVE(exit) +DECLARE_PRIMITIVE(fclose) +DECLARE_PRIMITIVE(fflush) +DECLARE_PRIMITIVE(fgetc) +DECLARE_PRIMITIVE(fixnum_divint) +DECLARE_PRIMITIVE(fixnum_divmod) +DECLARE_PRIMITIVE(fixnum_shift) +DECLARE_PRIMITIVE(fixnum_to_bignum) +DECLARE_PRIMITIVE(fixnum_to_float) +DECLARE_PRIMITIVE(float_add) +DECLARE_PRIMITIVE(float_bits) +DECLARE_PRIMITIVE(float_divfloat) +DECLARE_PRIMITIVE(float_eq) +DECLARE_PRIMITIVE(float_greater) +DECLARE_PRIMITIVE(float_greatereq) +DECLARE_PRIMITIVE(float_less) +DECLARE_PRIMITIVE(float_lesseq) +DECLARE_PRIMITIVE(float_mod) +DECLARE_PRIMITIVE(float_multiply) +DECLARE_PRIMITIVE(float_subtract) +DECLARE_PRIMITIVE(float_to_bignum) +DECLARE_PRIMITIVE(float_to_fixnum) +DECLARE_PRIMITIVE(float_to_str) +DECLARE_PRIMITIVE(fopen) +DECLARE_PRIMITIVE(fputc) +DECLARE_PRIMITIVE(fread) +DECLARE_PRIMITIVE(fseek) +DECLARE_PRIMITIVE(ftell) +DECLARE_PRIMITIVE(full_gc) +DECLARE_PRIMITIVE(fwrite) +DECLARE_PRIMITIVE(identity_hashcode) +DECLARE_PRIMITIVE(innermost_stack_frame_executing) +DECLARE_PRIMITIVE(innermost_stack_frame_scan) +DECLARE_PRIMITIVE(jit_compile) +DECLARE_PRIMITIVE(load_locals) +DECLARE_PRIMITIVE(lookup_method) +DECLARE_PRIMITIVE(mega_cache_miss) +DECLARE_PRIMITIVE(minor_gc) +DECLARE_PRIMITIVE(modify_code_heap) +DECLARE_PRIMITIVE(nano_count) +DECLARE_PRIMITIVE(optimized_p) +DECLARE_PRIMITIVE(profiling) +DECLARE_PRIMITIVE(quot_compiled_p) +DECLARE_PRIMITIVE(quotation_code) +DECLARE_PRIMITIVE(reset_dispatch_stats) +DECLARE_PRIMITIVE(resize_array) +DECLARE_PRIMITIVE(resize_byte_array) +DECLARE_PRIMITIVE(resize_string) +DECLARE_PRIMITIVE(retainstack) +DECLARE_PRIMITIVE(save_image) +DECLARE_PRIMITIVE(save_image_and_exit) +DECLARE_PRIMITIVE(set_datastack) +DECLARE_PRIMITIVE(set_innermost_stack_frame_quot) +DECLARE_PRIMITIVE(set_retainstack) +DECLARE_PRIMITIVE(set_slot) +DECLARE_PRIMITIVE(set_special_object) +DECLARE_PRIMITIVE(set_string_nth_fast) +DECLARE_PRIMITIVE(set_string_nth_slow) +DECLARE_PRIMITIVE(size) +DECLARE_PRIMITIVE(sleep) +DECLARE_PRIMITIVE(special_object) +DECLARE_PRIMITIVE(str_to_float) +DECLARE_PRIMITIVE(string) +DECLARE_PRIMITIVE(string_nth) +DECLARE_PRIMITIVE(strip_stack_traces) +DECLARE_PRIMITIVE(system_micros) +DECLARE_PRIMITIVE(tuple) +DECLARE_PRIMITIVE(tuple_boa) +DECLARE_PRIMITIVE(unimplemented) +DECLARE_PRIMITIVE(uninitialized_byte_array) +DECLARE_PRIMITIVE(vm_ptr) +DECLARE_PRIMITIVE(word) +DECLARE_PRIMITIVE(word_code) +DECLARE_PRIMITIVE(wrapper) + +/* These are generated with macros in alien.cpp, and not with PRIMIIVE in +primitives.cpp */ +DECLARE_PRIMITIVE(alien_signed_cell) +DECLARE_PRIMITIVE(set_alien_signed_cell) +DECLARE_PRIMITIVE(alien_unsigned_cell) +DECLARE_PRIMITIVE(set_alien_unsigned_cell) +DECLARE_PRIMITIVE(alien_signed_8) +DECLARE_PRIMITIVE(set_alien_signed_8) +DECLARE_PRIMITIVE(alien_unsigned_8) +DECLARE_PRIMITIVE(set_alien_unsigned_8) +DECLARE_PRIMITIVE(alien_signed_4) +DECLARE_PRIMITIVE(set_alien_signed_4) +DECLARE_PRIMITIVE(alien_unsigned_4) +DECLARE_PRIMITIVE(set_alien_unsigned_4) +DECLARE_PRIMITIVE(alien_signed_2) +DECLARE_PRIMITIVE(set_alien_signed_2) +DECLARE_PRIMITIVE(alien_unsigned_2) +DECLARE_PRIMITIVE(set_alien_unsigned_2) +DECLARE_PRIMITIVE(alien_signed_1) +DECLARE_PRIMITIVE(set_alien_signed_1) +DECLARE_PRIMITIVE(alien_unsigned_1) +DECLARE_PRIMITIVE(set_alien_unsigned_1) +DECLARE_PRIMITIVE(alien_float) +DECLARE_PRIMITIVE(set_alien_float) +DECLARE_PRIMITIVE(alien_double) +DECLARE_PRIMITIVE(set_alien_double) +DECLARE_PRIMITIVE(alien_cell) +DECLARE_PRIMITIVE(set_alien_cell) } diff --git a/vm/quotations.cpp b/vm/quotations.cpp index 305c2fdc6f..faa770c512 100755 --- a/vm/quotations.cpp +++ b/vm/quotations.cpp @@ -349,7 +349,12 @@ fixnum factor_vm::quot_code_offset_to_scan(cell quot_, cell offset) cell factor_vm::lazy_jit_compile(cell quot_) { data_root quot(quot_,this); - jit_compile_quot(quot.value(),true); + + assert(!quot_compiled_p(quot.untagged())); + + code_block *compiled = jit_compile_quot(quot.value(),quot.value(),true); + set_quot_entry_point(quot.untagged(),compiled); + return quot.value(); } diff --git a/vm/words.cpp b/vm/words.cpp index 6cbc8376de..31041a6a19 100644 --- a/vm/words.cpp +++ b/vm/words.cpp @@ -9,6 +9,11 @@ void factor_vm::jit_compile_word(cell word_, cell def_, bool relocating) data_root word(word_,this); data_root def(def_,this); + /* Refuse to compile this word more than once, because quot_compiled_p() + depends on the identity of its code block */ + if(word->code && word.value() == special_objects[LAZY_JIT_COMPILE_WORD]) + return; + code_block *compiled = jit_compile_quot(word.value(),def.value(),relocating); word->code = compiled;