void forward_object_xts(void) { begin_scan(); CELL obj; while((obj = next_object()) != F) { if(type_of(obj) == WORD_TYPE) { F_WORD *word = untag_object(obj); word->code = forward_xt(word->code); if(word->profiling) word->profiling = forward_xt(word->profiling); } else if(type_of(obj) == QUOTATION_TYPE) { F_QUOTATION *quot = untag_object(obj); if(quot->compiledp != F) quot->code = forward_xt(quot->code); } else if(type_of(obj) == CALLSTACK_TYPE) { F_CALLSTACK *stack = untag_object(obj); iterate_callstack_object(stack,forward_frame_xt); } } /* End the heap scan */ gc_off = false; }
void forward_frame_xt(F_STACK_FRAME *frame) { CELL offset = (CELL)FRAME_RETURN_ADDRESS(frame) - (CELL)frame_code(frame); F_COMPILED *forwarded = forward_xt(frame_code(frame)); frame->xt = (XT)(forwarded + 1); FRAME_RETURN_ADDRESS(frame) = (XT)((CELL)forwarded + offset); }
void factor_vm::forward_object_xts() { begin_scan(); cell obj; while((obj = next_object()) != F) { switch(tagged<object>(obj).type()) { case WORD_TYPE: { word *w = untag<word>(obj); if(w->code) w->code = forward_xt(w->code); if(w->profiling) w->profiling = forward_xt(w->profiling); } break; case QUOTATION_TYPE: { quotation *quot = untag<quotation>(obj); if(quot->code) quot->code = forward_xt(quot->code); } break; case CALLSTACK_TYPE: { callstack *stack = untag<callstack>(obj); xt_forwarder forwarder(this); iterate_callstack_object(stack,forwarder); } break; default: break; } } end_scan(); }