Location* Location::create(STATE, NativeMethodFrame* nmf) { NativeMethod* nm = try_as<NativeMethod>(nmf->get_object(nmf->method())); if(!nm) return 0; Location* loc = state->new_object<Location>(G(location)); if(Module* mod = try_as<Module>(nmf->get_object(nmf->module()))) { loc->method_module(state, mod); } loc->receiver(state, nmf->get_object(nmf->receiver())); loc->method(state, nm); loc->ip(state, Fixnum::from(-1)); loc->flags(state, Fixnum::from(2)); loc->name(state, nm->name()); return loc; }
Location* Location::create(STATE, CallFrame* call_frame, bool include_variables) { if(NativeMethodFrame* nmf = call_frame->native_method_frame()) { return create(state, nmf); } Location* loc = state->new_object_dirty<Location>(G(location)); loc->method_module(state, call_frame->module()); loc->receiver(state, call_frame->self()); loc->method(state, call_frame->compiled_code); loc->ip(state, Fixnum::from(call_frame->ip())); loc->flags(state, Fixnum::from(0)); if(call_frame->is_block_p(state)) { loc->name(state, call_frame->top_scope(state)->method()->name()); loc->set_is_block(state); } else { loc->name(state, call_frame->name()); } MachineCode* mcode = call_frame->compiled_code->machine_code(); if(mcode && mcode->jitted_p()) { loc->set_is_jit(state); } if(include_variables) { // Use promote_scope because it can figure out of the generated // VariableScope should be isolated by default (true atm for JITd // frames) loc->variables(state, call_frame->promote_scope(state)); } else { loc->variables(state, nil<VariableScope>()); } loc->constant_scope(state, call_frame->constant_scope()); return loc; }
Location* Location::create(STATE, CallFrame* call_frame, bool include_variables) { if(NativeMethodFrame* nmf = call_frame->native_method_frame()) { return create(state, nmf); } Location* loc = state->new_object<Location>(G(location)); loc->method_module(state, call_frame->module()); loc->receiver(state, call_frame->self()); loc->method(state, call_frame->cm); loc->ip(state, Fixnum::from(call_frame->ip())); loc->flags(state, Fixnum::from(0)); if(call_frame->is_block_p(state)) { loc->name(state, call_frame->top_scope(state)->method()->name()); loc->set_is_block(state); } else { loc->name(state, call_frame->name()); } VMMethod* vmm = call_frame->cm->backend_method(); if(vmm && vmm->jitted()) { loc->set_is_jit(state); } if(include_variables) { // Use promote_scope because it can figure out of the generated // VariableScope should be isolated by default (true atm for JITd // frames) loc->variables(state, call_frame->promote_scope(state)); } loc->static_scope(state, call_frame->static_scope()); return loc; }