summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-proc-ext/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-05-14 17:36:22 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-05-14 17:36:22 +0900
commit232ec102d6264cd5e79cf4e900a5cc946ca76a67 (patch)
treee78eb654803532bd56b566c2d6e0eaa1424957cb /mrbgems/mruby-proc-ext/src
parent625988eea1731c50d8f69f74b31a90d64f81eac9 (diff)
parent9184d254e23c14a67b5b1aa5dc5dbbbf747a9ff6 (diff)
downloadmruby-232ec102d6264cd5e79cf4e900a5cc946ca76a67.tar.gz
mruby-232ec102d6264cd5e79cf4e900a5cc946ca76a67.zip
Merge branch 'take-cheeze-dump_lv'
Diffstat (limited to 'mrbgems/mruby-proc-ext/src')
-rw-r--r--mrbgems/mruby-proc-ext/src/proc.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/mrbgems/mruby-proc-ext/src/proc.c b/mrbgems/mruby-proc-ext/src/proc.c
index b105c95d7..341001f05 100644
--- a/mrbgems/mruby-proc-ext/src/proc.c
+++ b/mrbgems/mruby-proc-ext/src/proc.c
@@ -122,6 +122,29 @@ mrb_kernel_proc(mrb_state *mrb, mrb_value self)
return blk;
}
+static mrb_value
+mrb_local_variables(mrb_state *mrb, mrb_value self)
+{
+ mrb_value ret;
+ struct RProc *proc;
+ struct mrb_irep *irep;
+ size_t i;
+
+ proc = mrb->c->ci[-1].proc;
+
+ if (MRB_PROC_CFUNC_P(proc)) {
+ return mrb_ary_new(mrb);
+ }
+
+ irep = proc->body.irep;
+ ret = mrb_ary_new_capa(mrb, irep->nlocals - 1);
+ for (i = 0; i < (irep->nlocals - 1); ++i) {
+ mrb_ary_push(mrb, ret, mrb_symbol_value(irep->lv[i].name));
+ }
+
+ return ret;
+}
+
void
mrb_mruby_proc_ext_gem_init(mrb_state* mrb)
{
@@ -133,6 +156,7 @@ mrb_mruby_proc_ext_gem_init(mrb_state* mrb)
mrb_define_class_method(mrb, mrb->kernel_module, "proc", mrb_kernel_proc, MRB_ARGS_NONE());
mrb_define_method(mrb, mrb->kernel_module, "proc", mrb_kernel_proc, MRB_ARGS_NONE());
+ mrb_define_module_function(mrb, mrb->kernel_module, "local_variables", mrb_local_variables, MRB_ARGS_NONE());
}
void