/* Allocates memory */ cell frame_scan(stack_frame *frame) { switch(frame_type(frame)) { case QUOTATION_TYPE: { cell quot = frame_executing(frame); if(quot == F) return F; else { char *return_addr = (char *)FRAME_RETURN_ADDRESS(frame); char *quot_xt = (char *)(frame_code(frame) + 1); return tag_fixnum(quot_code_offset_to_scan( quot,(cell)(return_addr - quot_xt))); } } case WORD_TYPE: return F; default: critical_error("Bad frame type",frame_type(frame)); return F; } }
/* Allocates memory */ cell factor_vm::frame_scan(stack_frame *frame) { switch(frame_type(frame)) { case code_block_unoptimized: { tagged<object> obj(frame_executing(frame)); if(obj.type_p(WORD_TYPE)) obj = obj.as<word>()->def; if(obj.type_p(QUOTATION_TYPE)) { char *return_addr = (char *)FRAME_RETURN_ADDRESS(frame,this); char *quot_entry_point = (char *)(frame_code(frame) + 1); return tag_fixnum(quot_code_offset_to_scan( obj.value(),(cell)(return_addr - quot_entry_point))); } else return false_object; } case code_block_optimized: return false_object; default: critical_error("Bad frame type",frame_type(frame)); return false_object; } }
cell factor_vm::frame_executing_quot(stack_frame *frame) { tagged<object> executing(frame_executing(frame)); code_block *compiled = frame_code(frame); if(!compiled->optimized_p() && executing->type() == WORD_TYPE) executing = executing.as<word>()->def; return executing.value(); }
stack_frame *innermost_stack_frame_quot(callstack *callstack) { stack_frame *inner = innermost_stack_frame(callstack); tagged<quotation>(frame_executing(inner)).untag_check(); return inner; }
/* Some primitives implementing a limited form of callstack mutation. Used by the single stepper. */ void factor_vm::primitive_innermost_stack_frame_executing() { dpush(frame_executing(innermost_stack_frame(untag_check<callstack>(dpop())))); }
/* Some primitives implementing a limited form of callstack mutation. Used by the single stepper. */ inline void factorvm::vmprim_innermost_stack_frame_executing() { dpush(frame_executing(innermost_stack_frame(untag_check<callstack>(dpop())))); }