Sha256: 271365fbc0606f06378062d13547ba90b257f7f86227d3c89b4e70eca1e0d43f
Contents?: true
Size: 1.52 KB
Versions: 1
Compression:
Stored size: 1.52 KB
Contents
#include <ruby.h> #include <ruby/debug.h> VALUE bx_mBindex; static VALUE current_bindings_callback(const rb_debug_inspector_t *context, void *data) { VALUE locations = rb_debug_inspector_backtrace_locations(context); VALUE binding, bindings = rb_ary_new(); long i, length = RARRAY_LEN(locations); for (i = 0; i < length; i++) { binding = rb_debug_inspector_frame_binding_get(context, i); if (!NIL_P(binding)) { rb_ary_push(bindings, binding); } } return bindings; } VALUE current_bindings(void) { return rb_debug_inspector_open(current_bindings_callback, NULL); } static void set_exception_bindings_callback(VALUE tpval, void *data) { rb_trace_arg_t *trace_arg = rb_tracearg_from_tracepoint(tpval); VALUE exception = rb_tracearg_raised_exception(trace_arg); rb_iv_set(exception, "bindings", current_bindings()); } void set_exception_bindings_on_raise(void) { VALUE tpval = rb_tracepoint_new(0, RUBY_EVENT_RAISE, set_exception_bindings_callback, 0); rb_tracepoint_enable(tpval); } static VALUE bx_current_bindings(VALUE self) { return current_bindings(); } static VALUE bx_exc_bindings(VALUE self) { VALUE bindings; bindings = rb_iv_get(self, "bindings"); if (NIL_P(bindings)) { bindings = rb_ary_new(); } return bindings; } void Init_cruby(void) { bx_mBindex = rb_define_module("Bindex"); rb_define_singleton_method(bx_mBindex, "current_bindings", bx_current_bindings, 0); rb_define_method(rb_eException, "bindings", bx_exc_bindings, 0); set_exception_bindings_on_raise(); }
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
bindex-0.3.0 | ext/bindex/cruby.c |