From: Erik Charlebois Date: Sun, 12 May 2013 02:17:38 +0000 (-0400) Subject: VM: Refactor objects* to Factor style X-Git-Tag: 0.97~1274 X-Git-Url: https://gitweb.factorcode.org/gitweb.cgi?p=factor.git;a=commitdiff_plain;h=228d813a7d917c049b0a7ed9b3caf7371d04a27b VM: Refactor objects* to Factor style --- diff --git a/vm/objects.cpp b/vm/objects.cpp index 7c5b7bbfc4..b03f39563c 100644 --- a/vm/objects.cpp +++ b/vm/objects.cpp @@ -1,187 +1,167 @@ #include "master.hpp" -namespace factor -{ +namespace factor { -void factor_vm::primitive_special_object() -{ - fixnum n = untag_fixnum(ctx->peek()); - ctx->replace(special_objects[n]); +void factor_vm::primitive_special_object() { + fixnum n = untag_fixnum(ctx->peek()); + ctx->replace(special_objects[n]); } -void factor_vm::primitive_set_special_object() -{ - fixnum n = untag_fixnum(ctx->pop()); - cell value = ctx->pop(); - special_objects[n] = value; +void factor_vm::primitive_set_special_object() { + fixnum n = untag_fixnum(ctx->pop()); + cell value = ctx->pop(); + special_objects[n] = value; } -void factor_vm::primitive_identity_hashcode() -{ - cell tagged = ctx->peek(); - object *obj = untag(tagged); - ctx->replace(tag_fixnum(obj->hashcode())); +void factor_vm::primitive_identity_hashcode() { + cell tagged = ctx->peek(); + object* obj = untag(tagged); + ctx->replace(tag_fixnum(obj->hashcode())); } -void factor_vm::compute_identity_hashcode(object *obj) -{ - object_counter++; - if(object_counter == 0) object_counter++; - obj->set_hashcode((cell)obj ^ object_counter); +void factor_vm::compute_identity_hashcode(object* obj) { + object_counter++; + if (object_counter == 0) + object_counter++; + obj->set_hashcode((cell) obj ^ object_counter); } -void factor_vm::primitive_compute_identity_hashcode() -{ - object *obj = untag(ctx->pop()); - compute_identity_hashcode(obj); +void factor_vm::primitive_compute_identity_hashcode() { + object* obj = untag(ctx->pop()); + compute_identity_hashcode(obj); } -void factor_vm::primitive_set_slot() -{ - fixnum slot = untag_fixnum(ctx->pop()); - object *obj = untag(ctx->pop()); - cell value = ctx->pop(); +void factor_vm::primitive_set_slot() { + fixnum slot = untag_fixnum(ctx->pop()); + object* obj = untag(ctx->pop()); + cell value = ctx->pop(); - cell *slot_ptr = &obj->slots()[slot]; - *slot_ptr = value; - write_barrier(slot_ptr); + cell* slot_ptr = &obj->slots()[slot]; + *slot_ptr = value; + write_barrier(slot_ptr); } /* Allocates memory */ -cell factor_vm::clone_object(cell obj_) -{ - data_root obj(obj_,this); - - if(immediate_p(obj.value())) - return obj.value(); - else - { - cell size = object_size(obj.value()); - object *new_obj = allot_object(obj.type(),size); - memcpy(new_obj,obj.untagged(),size); - new_obj->set_hashcode(0); - return tag_dynamic(new_obj); - } +cell factor_vm::clone_object(cell obj_) { + data_root obj(obj_, this); + + if (immediate_p(obj.value())) + return obj.value(); + else { + cell size = object_size(obj.value()); + object* new_obj = allot_object(obj.type(), size); + memcpy(new_obj, obj.untagged(), size); + new_obj->set_hashcode(0); + return tag_dynamic(new_obj); + } } /* Allocates memory */ -void factor_vm::primitive_clone() -{ - ctx->replace(clone_object(ctx->peek())); -} +void factor_vm::primitive_clone() { ctx->replace(clone_object(ctx->peek())); } /* Size of the object pointed to by a tagged pointer */ -cell factor_vm::object_size(cell tagged) -{ - if(immediate_p(tagged)) - return 0; - else - return untag(tagged)->size(); +cell factor_vm::object_size(cell tagged) { + if (immediate_p(tagged)) + return 0; + else + return untag(tagged)->size(); } /* Allocates memory */ -void factor_vm::primitive_size() -{ - ctx->push(from_unsigned_cell(object_size(ctx->pop()))); +void factor_vm::primitive_size() { + ctx->push(from_unsigned_cell(object_size(ctx->pop()))); } struct slot_become_fixup : no_fixup { - std::map *become_map; - - explicit slot_become_fixup(std::map *become_map_) : - become_map(become_map_) {} - - object *fixup_data(object *old) - { - std::map::const_iterator iter = become_map->find(old); - if(iter != become_map->end()) - return iter->second; - else - return old; - } + std::map* become_map; + + explicit slot_become_fixup(std::map* become_map_) + : become_map(become_map_) {} + + object* fixup_data(object* old) { + std::map::const_iterator iter = become_map->find(old); + if (iter != become_map->end()) + return iter->second; + else + return old; + } }; struct object_become_visitor { - slot_visitor *workhorse; + slot_visitor* workhorse; - explicit object_become_visitor(slot_visitor *workhorse_) : - workhorse(workhorse_) {} + explicit object_become_visitor(slot_visitor* workhorse_) + : workhorse(workhorse_) {} - void operator()(object *obj) - { - workhorse->visit_slots(obj); - } + void operator()(object* obj) { workhorse->visit_slots(obj); } }; struct code_block_become_visitor { - slot_visitor *workhorse; + slot_visitor* workhorse; - explicit code_block_become_visitor(slot_visitor *workhorse_) : - workhorse(workhorse_) {} + explicit code_block_become_visitor( + slot_visitor* workhorse_) + : workhorse(workhorse_) {} - void operator()(code_block *compiled, cell size) - { - workhorse->visit_code_block_objects(compiled); - workhorse->visit_embedded_literals(compiled); - } + void operator()(code_block* compiled, cell size) { + workhorse->visit_code_block_objects(compiled); + workhorse->visit_embedded_literals(compiled); + } }; struct code_block_write_barrier_visitor { - code_heap *code; + code_heap* code; - explicit code_block_write_barrier_visitor(code_heap *code_) : - code(code_) {} + explicit code_block_write_barrier_visitor(code_heap* code_) : code(code_) {} - void operator()(code_block *compiled, cell size) - { - code->write_barrier(compiled); - } + void operator()(code_block* compiled, cell size) { + code->write_barrier(compiled); + } }; /* classes.tuple uses this to reshape tuples; tools.deploy.shaker uses this to coalesce equal but distinct quotations and wrappers. */ -void factor_vm::primitive_become() -{ - array *new_objects = untag_check(ctx->pop()); - array *old_objects = untag_check(ctx->pop()); - - cell capacity = array_capacity(new_objects); - if(capacity != array_capacity(old_objects)) - critical_error("bad parameters to become",0); - - /* Build the forwarding map */ - std::map become_map; - - for(cell i = 0; i < capacity; i++) - { - tagged old_obj(array_nth(old_objects,i)); - tagged new_obj(array_nth(new_objects,i)); - - if(old_obj != new_obj) - become_map[old_obj.untagged()] = new_obj.untagged(); - } - - /* Update all references to old objects to point to new objects */ - { - slot_visitor workhorse(this,slot_become_fixup(&become_map)); - workhorse.visit_roots(); - workhorse.visit_contexts(); - - object_become_visitor object_visitor(&workhorse); - each_object(object_visitor); - - code_block_become_visitor code_block_visitor(&workhorse); - each_code_block(code_block_visitor); - } - - /* Since we may have introduced old->new references, need to revisit - all objects and code blocks on a minor GC. */ - data->mark_all_cards(); - - { - code_block_write_barrier_visitor code_block_visitor(code); - each_code_block(code_block_visitor); - } +void factor_vm::primitive_become() { + array* new_objects = untag_check(ctx->pop()); + array* old_objects = untag_check(ctx->pop()); + + cell capacity = array_capacity(new_objects); + if (capacity != array_capacity(old_objects)) + critical_error("bad parameters to become", 0); + + /* Build the forwarding map */ + std::map become_map; + + for (cell i = 0; i < capacity; i++) { + tagged old_obj(array_nth(old_objects, i)); + tagged new_obj(array_nth(new_objects, i)); + + if (old_obj != new_obj) + become_map[old_obj.untagged()] = new_obj.untagged(); + } + + /* Update all references to old objects to point to new objects */ + { + slot_visitor workhorse(this, + slot_become_fixup(&become_map)); + workhorse.visit_roots(); + workhorse.visit_contexts(); + + object_become_visitor object_visitor(&workhorse); + each_object(object_visitor); + + code_block_become_visitor code_block_visitor(&workhorse); + each_code_block(code_block_visitor); + } + + /* Since we may have introduced old->new references, need to revisit + all objects and code blocks on a minor GC. */ + data->mark_all_cards(); + + { + code_block_write_barrier_visitor code_block_visitor(code); + each_code_block(code_block_visitor); + } } } diff --git a/vm/objects.hpp b/vm/objects.hpp index e773e9b62d..b792763f1f 100644 --- a/vm/objects.hpp +++ b/vm/objects.hpp @@ -1,5 +1,4 @@ -namespace factor -{ +namespace factor { // Special object count and identifiers must be kept in sync with: // core/kernel/kernel.factor @@ -8,130 +7,127 @@ namespace factor static const cell special_object_count = 80; enum special_object { - OBJ_WALKER_HOOK = 3, /* non-local exit hook, used by library only */ - OBJ_CALLCC_1, /* used to pass the value in callcc1 */ - - ERROR_HANDLER_QUOT = 5, /* quotation called when VM throws an error */ - OBJ_ERROR, /* a marker consed onto kernel errors */ - - OBJ_CELL_SIZE = 7, /* sizeof(cell) */ - OBJ_CPU, /* CPU architecture */ - OBJ_OS, /* operating system name */ - - OBJ_ARGS = 10, /* command line arguments */ - OBJ_STDIN, /* stdin FILE* handle */ - OBJ_STDOUT, /* stdout FILE* handle */ - - OBJ_IMAGE = 13, /* image path name */ - OBJ_EXECUTABLE, /* runtime executable path name */ - - OBJ_EMBEDDED = 15, /* are we embedded in another app? */ - OBJ_EVAL_CALLBACK, /* used when Factor is embedded in a C app */ - OBJ_YIELD_CALLBACK, /* used when Factor is embedded in a C app */ - OBJ_SLEEP_CALLBACK, /* used when Factor is embedded in a C app */ - - OBJ_STARTUP_QUOT = 20, /* startup quotation */ - OBJ_GLOBAL, /* global namespace */ - OBJ_SHUTDOWN_QUOT, /* shutdown quotation */ - - /* Quotation compilation in quotations.c */ - JIT_PROLOG = 23, - JIT_PRIMITIVE_WORD, - JIT_PRIMITIVE, - JIT_WORD_JUMP, - JIT_WORD_CALL, - JIT_IF_WORD, - JIT_IF, - JIT_SAFEPOINT, - JIT_EPILOG, - JIT_RETURN, - JIT_PROFILING, - JIT_PUSH_IMMEDIATE, - JIT_DIP_WORD, - JIT_DIP, - JIT_2DIP_WORD, - JIT_2DIP, - JIT_3DIP_WORD, - JIT_3DIP, - JIT_EXECUTE, - JIT_DECLARE_WORD, - - /* External entry points */ - C_TO_FACTOR_WORD = 43, - LAZY_JIT_COMPILE_WORD, - UNWIND_NATIVE_FRAMES_WORD, - GET_FPU_STATE_WORD, - SET_FPU_STATE_WORD, - SIGNAL_HANDLER_WORD, - LEAF_SIGNAL_HANDLER_WORD, - FFI_SIGNAL_HANDLER_WORD, - FFI_LEAF_SIGNAL_HANDLER_WORD, - - /* Incremented on every modify-code-heap call; invalidates call( inline - caching */ - REDEFINITION_COUNTER = 52, - - /* Callback stub generation in callbacks.c */ - CALLBACK_STUB = 53, - - /* Polymorphic inline cache generation in inline_cache.c */ - PIC_LOAD = 54, - PIC_TAG, - PIC_TUPLE, - PIC_CHECK_TAG, - PIC_CHECK_TUPLE, - PIC_HIT, - PIC_MISS_WORD, - PIC_MISS_TAIL_WORD, - - /* Megamorphic cache generation in dispatch.c */ - MEGA_LOOKUP = 62, - MEGA_LOOKUP_WORD, - MEGA_MISS_WORD, - - OBJ_UNDEFINED = 65, /* default quotation for undefined words */ - - OBJ_STDERR = 66, /* stderr FILE* handle */ - - OBJ_STAGE2 = 67, /* have we bootstrapped? */ - - OBJ_CURRENT_THREAD = 68, - - OBJ_THREADS = 69, - OBJ_RUN_QUEUE = 70, - OBJ_SLEEP_QUEUE = 71, - - OBJ_VM_COMPILER = 72, /* version string of the compiler we were built with */ - - OBJ_WAITING_CALLBACKS = 73, - - OBJ_SIGNAL_PIPE = 74, /* file descriptor for pipe used to communicate signals - only used on unix */ + OBJ_WALKER_HOOK = 3, /* non-local exit hook, used by library only */ + OBJ_CALLCC_1, /* used to pass the value in callcc1 */ + + ERROR_HANDLER_QUOT = 5, /* quotation called when VM throws an error */ + OBJ_ERROR, /* a marker consed onto kernel errors */ + + OBJ_CELL_SIZE = 7, /* sizeof(cell) */ + OBJ_CPU, /* CPU architecture */ + OBJ_OS, /* operating system name */ + + OBJ_ARGS = 10, /* command line arguments */ + OBJ_STDIN, /* stdin FILE* handle */ + OBJ_STDOUT, /* stdout FILE* handle */ + + OBJ_IMAGE = 13, /* image path name */ + OBJ_EXECUTABLE, /* runtime executable path name */ + + OBJ_EMBEDDED = 15, /* are we embedded in another app? */ + OBJ_EVAL_CALLBACK, /* used when Factor is embedded in a C app */ + OBJ_YIELD_CALLBACK, /* used when Factor is embedded in a C app */ + OBJ_SLEEP_CALLBACK, /* used when Factor is embedded in a C app */ + + OBJ_STARTUP_QUOT = 20, /* startup quotation */ + OBJ_GLOBAL, /* global namespace */ + OBJ_SHUTDOWN_QUOT, /* shutdown quotation */ + + /* Quotation compilation in quotations.c */ + JIT_PROLOG = 23, + JIT_PRIMITIVE_WORD, + JIT_PRIMITIVE, + JIT_WORD_JUMP, + JIT_WORD_CALL, + JIT_IF_WORD, + JIT_IF, + JIT_SAFEPOINT, + JIT_EPILOG, + JIT_RETURN, + JIT_PROFILING, + JIT_PUSH_IMMEDIATE, + JIT_DIP_WORD, + JIT_DIP, + JIT_2DIP_WORD, + JIT_2DIP, + JIT_3DIP_WORD, + JIT_3DIP, + JIT_EXECUTE, + JIT_DECLARE_WORD, + + /* External entry points */ + C_TO_FACTOR_WORD = 43, + LAZY_JIT_COMPILE_WORD, + UNWIND_NATIVE_FRAMES_WORD, + GET_FPU_STATE_WORD, + SET_FPU_STATE_WORD, + SIGNAL_HANDLER_WORD, + LEAF_SIGNAL_HANDLER_WORD, + FFI_SIGNAL_HANDLER_WORD, + FFI_LEAF_SIGNAL_HANDLER_WORD, + + /* Incremented on every modify-code-heap call; invalidates call( inline + caching */ + REDEFINITION_COUNTER = 52, + + /* Callback stub generation in callbacks.c */ + CALLBACK_STUB = 53, + + /* Polymorphic inline cache generation in inline_cache.c */ + PIC_LOAD = 54, + PIC_TAG, + PIC_TUPLE, + PIC_CHECK_TAG, + PIC_CHECK_TUPLE, + PIC_HIT, + PIC_MISS_WORD, + PIC_MISS_TAIL_WORD, + + /* Megamorphic cache generation in dispatch.c */ + MEGA_LOOKUP = 62, + MEGA_LOOKUP_WORD, + MEGA_MISS_WORD, + + OBJ_UNDEFINED = 65, /* default quotation for undefined words */ + + OBJ_STDERR = 66, /* stderr FILE* handle */ + + OBJ_STAGE2 = 67, /* have we bootstrapped? */ + + OBJ_CURRENT_THREAD = 68, + + OBJ_THREADS = 69, + OBJ_RUN_QUEUE = 70, + OBJ_SLEEP_QUEUE = 71, + + OBJ_VM_COMPILER = 72, /* version string of the compiler we were built with */ + + OBJ_WAITING_CALLBACKS = 73, + + OBJ_SIGNAL_PIPE = 74, /* file descriptor for pipe used to communicate signals + only used on unix */ }; /* save-image-and-exit discards special objects that are filled in on startup -anyway, to reduce image size */ + anyway, to reduce image size */ #define OBJ_FIRST_SAVE OBJ_STARTUP_QUOT #define OBJ_LAST_SAVE OBJ_STAGE2 -inline static bool save_special_p(cell i) -{ - return (i >= OBJ_FIRST_SAVE && i <= OBJ_LAST_SAVE); +inline static bool save_special_p(cell i) { + return (i >= OBJ_FIRST_SAVE && i <= OBJ_LAST_SAVE); } -template void object::each_slot(Iterator &iter) -{ - cell scan = (cell)this; - cell payload_start = binary_payload_start(); - cell end = scan + payload_start; +template void object::each_slot(Iterator& iter) { + cell scan = (cell) this; + cell payload_start = binary_payload_start(); + cell end = scan + payload_start; - scan += sizeof(cell); + scan += sizeof(cell); - while(scan < end) - { - iter((cell *)scan); - scan += sizeof(cell); - } + while (scan < end) { + iter((cell*)scan); + scan += sizeof(cell); + } } }