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