static VALUE collect_caller_bindings(rb_thread_t *th) { struct collect_caller_bindings_data data; VALUE result; int i; data.ary = rb_ary_new(); backtrace_each(th, collect_caller_bindings_init, collect_caller_bindings_iseq, collect_caller_bindings_cfunc, &data); result = rb_ary_reverse(data.ary); /* bindings should be created from top of frame */ for (i=0; i<RARRAY_LEN(result); i++) { VALUE entry = rb_ary_entry(result, i); VALUE cfp_val = rb_ary_entry(entry, CALLER_BINDING_BINDING); if (!NIL_P(cfp_val)) { rb_control_frame_t *cfp = GC_GUARDED_PTR_REF(cfp_val); rb_ary_store(entry, CALLER_BINDING_BINDING, rb_binding_new_with_cfp(th, cfp)); } } return result; }
VALUE rb_tracearg_binding(rb_trace_arg_t *trace_arg) { rb_control_frame_t *cfp; cfp = rb_vm_get_binding_creatable_next_cfp(trace_arg->th, trace_arg->cfp); if (cfp) { return rb_binding_new_with_cfp(trace_arg->th, cfp); } else { return Qnil; } }