/** * Walks the chain of objects accessible from the specified CallFrame. */ void GarbageCollector::verify_call_frame(CallFrame* top_call_frame, AddressDisplacement* offset) { CallFrame* call_frame = top_call_frame; while(call_frame) { call_frame = displace(call_frame, offset); if(call_frame->constant_scope_) { call_frame->constant_scope_->validate(); } if(call_frame->compiled_code) { call_frame->compiled_code->validate(); } if(call_frame->compiled_code) { native_int stack_size = call_frame->compiled_code->stack_size()->to_native(); for(native_int i = 0; i < stack_size; i++) { Object* obj = call_frame->stk[i]; obj->validate(); } } VariableScope* scope = call_frame->top_scope_; if(call_frame->multiple_scopes_p() && scope && !scope->nil_p()) { scope->validate(); } if(BlockEnvironment* env = call_frame->block_env()) { env->validate(); } Arguments* args = displace(call_frame->arguments, offset); if(!call_frame->inline_method_p() && args) { args->recv()->validate(); args->block()->validate(); Object** ary = displace(args->arguments(), offset); for(uint32_t i = 0; i < args->total(); i++) { ary[i]->validate(); } } if(call_frame->scope && call_frame->compiled_code) { verify_variable_scope(call_frame, displace(call_frame->scope, offset)); } call_frame = call_frame->previous; } }
void GarbageCollector::walk_call_frame(CallFrame* top_call_frame) { CallFrame* call_frame = top_call_frame; while(call_frame) { if(call_frame->custom_static_scope_p() && call_frame->static_scope_ && call_frame->static_scope_->reference_p()) { call_frame->static_scope_ = (StaticScope*)mark_object(call_frame->static_scope_); } if(call_frame->cm && call_frame->cm->reference_p()) { call_frame->cm = (CompiledMethod*)mark_object(call_frame->cm); } if(call_frame->cm && call_frame->stk) { native_int stack_size = call_frame->cm->stack_size()->to_native(); for(native_int i = 0; i < stack_size; i++) { Object* obj = call_frame->stk[i]; if(obj && obj->reference_p()) { call_frame->stk[i] = mark_object(obj); } } } if(call_frame->multiple_scopes_p() && call_frame->top_scope_) { call_frame->top_scope_ = (VariableScope*)mark_object(call_frame->top_scope_); } if(Dispatch* msg = call_frame->dispatch()) { msg->module = (Module*)mark_object(msg->module); msg->method = (Executable*)mark_object(msg->method); } if(BlockEnvironment* env = call_frame->block_env()) { call_frame->set_block_env((BlockEnvironment*)mark_object(env)); } Arguments* args = call_frame->arguments; if(!call_frame->inline_method_p() && args) { args->set_recv(mark_object(args->recv())); args->set_block(mark_object(args->block())); if(Tuple* tup = args->argument_container()) { args->update_argument_container((Tuple*)mark_object(tup)); } else { Object** ary = args->arguments(); for(uint32_t i = 0; i < args->total(); i++) { ary[i] = mark_object(ary[i]); } } } #ifdef ENABLE_LLVM if(jit::RuntimeDataHolder* jd = call_frame->jit_data()) { jd->set_mark(); ObjectMark mark(this); jd->mark_all(0, mark); } if(jit::RuntimeData* rd = call_frame->runtime_data()) { rd->method_ = (CompiledMethod*)mark_object(rd->method()); rd->name_ = (Symbol*)mark_object(rd->name()); rd->module_ = (Module*)mark_object(rd->module()); } #endif saw_variable_scope(call_frame, call_frame->scope); call_frame = static_cast<CallFrame*>(call_frame->previous); } }
/** * Walks the chain of objects accessible from the specified CallFrame. */ void GarbageCollector::walk_call_frame(CallFrame* top_call_frame, AddressDisplacement* offset) { CallFrame* call_frame = top_call_frame; while(call_frame) { call_frame = displace(call_frame, offset); if(call_frame->constant_scope_ && call_frame->constant_scope_->reference_p()) { call_frame->constant_scope_ = (ConstantScope*)mark_object(call_frame->constant_scope_); } if(call_frame->compiled_code && call_frame->compiled_code->reference_p()) { call_frame->compiled_code = (CompiledCode*)mark_object(call_frame->compiled_code); } if(call_frame->compiled_code) { native_int stack_size = call_frame->compiled_code->stack_size()->to_native(); for(native_int i = 0; i < stack_size; i++) { Object* obj = call_frame->stk[i]; if(obj && obj->reference_p()) { call_frame->stk[i] = mark_object(obj); } } } if(call_frame->multiple_scopes_p() && call_frame->top_scope_) { call_frame->top_scope_ = (VariableScope*)mark_object(call_frame->top_scope_); } if(BlockEnvironment* env = call_frame->block_env()) { call_frame->set_block_env((BlockEnvironment*)mark_object(env)); } Arguments* args = displace(call_frame->arguments, offset); if(!call_frame->inline_method_p() && args) { args->set_recv(mark_object(args->recv())); args->set_block(mark_object(args->block())); if(Tuple* tup = args->argument_container()) { args->update_argument_container((Tuple*)mark_object(tup)); } else { Object** ary = displace(args->arguments(), offset); for(uint32_t i = 0; i < args->total(); i++) { ary[i] = mark_object(ary[i]); } } } if(NativeMethodFrame* nmf = call_frame->native_method_frame()) { nmf->handles().gc_scan(this); } #ifdef ENABLE_LLVM if(jit::RuntimeDataHolder* jd = call_frame->jit_data()) { jd->set_mark(); ObjectMark mark(this); jd->mark_all(0, mark); } if(jit::RuntimeData* rd = call_frame->runtime_data()) { rd->method_ = (CompiledCode*)mark_object(rd->method()); rd->name_ = (Symbol*)mark_object(rd->name()); rd->module_ = (Module*)mark_object(rd->module()); } #endif if(call_frame->scope && call_frame->compiled_code) { saw_variable_scope(call_frame, displace(call_frame->scope, offset)); } call_frame = call_frame->previous; } }