diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-12-20 08:20:02 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-12-20 08:20:02 +0000 |
commit | 40d8543fbdec5485a638a2cb1008089d106b978d (patch) | |
tree | d08f1eed70fa9ac29d79131908abeda5fd89429a /proc.c | |
parent | 1b79b5be82ac6baa5be2c4483ab44143493069d5 (diff) | |
download | ruby-40d8543fbdec5485a638a2cb1008089d106b978d.tar.gz |
* proc.c: support Proc#binding.
* sample/test.rb: add a test.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14360 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'proc.c')
-rw-r--r-- | proc.c | 35 |
1 files changed, 35 insertions, 0 deletions
@@ -1459,6 +1459,40 @@ localjump_reason(VALUE exc) return rb_iv_get(exc, "@reason"); } +/* + * call-seq: + * prc.binding => binding + * + * Returns the binding associated with <i>prc</i>. Note that + * <code>Kernel#eval</code> accepts either a <code>Proc</code> or a + * <code>Binding</code> object as its second parameter. + * + * def fred(param) + * proc {} + * end + * + * b = fred(99) + * eval("param", b.binding) #=> 99 + * eval("param", b) #=> 99 + */ +static VALUE +proc_binding(VALUE self) +{ + rb_proc_t *proc; + VALUE bindval = binding_alloc(rb_cBinding); + rb_binding_t *bind; + + GetProcPtr(self, proc); + GetBindingPtr(bindval, bind); + + if (TYPE(proc->block.iseq) == T_NODE) { + rb_raise(rb_eArgError, "Can't create Binding from C level Proc"); + } + + bind->env = proc->envval; + bind->cref_stack = proc->special_cref_stack; + return bindval; +} /* * <code>Proc</code> objects are blocks of code that have been bound to @@ -1497,6 +1531,7 @@ Init_Proc(void) rb_define_method(rb_cProc, "hash", proc_hash, 0); rb_define_method(rb_cProc, "to_s", proc_to_s, 0); rb_define_method(rb_cProc, "lambda?", proc_lambda_p, 0); + rb_define_method(rb_cProc, "binding", proc_binding, 0); /* Exceptions */ rb_eLocalJumpError = rb_define_class("LocalJumpError", rb_eStandardError); |