diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-07-01 17:24:02 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-07-01 17:24:02 +0000 |
commit | 43ba2c01e746992e9658000e4df7bb025bfb6b01 (patch) | |
tree | 0b5f080c1f4c47e63a53b0996a2b14d6fd419ef6 | |
parent | 02c391a1c90ceb05f5243d1aececc299a2080f76 (diff) |
proc.c: Binding#receiver
* proc.c (bind_receiver): new method to return the bound receiver
of the binding object. [ruby-dev:47613] [Feature #8779]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46646 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | proc.c | 18 | ||||
-rw-r--r-- | test/ruby/test_proc.rb | 10 |
4 files changed, 34 insertions, 0 deletions
@@ -1,3 +1,8 @@ +Wed Jul 2 02:23:52 2014 Nobuyoshi Nakada <[email protected]> + + * proc.c (bind_receiver): new method to return the bound receiver + of the binding object. [ruby-dev:47613] [Feature #8779] + Wed Jul 2 02:14:37 2014 Nobuyoshi Nakada <[email protected]> * proc.c (bind_local_variables): update env from envval for each @@ -18,6 +18,7 @@ with all sufficient information, see the ChangeLog file. * Binding * New methods: * Binding#local_variables + * Binding#receiver * Enumerable * New methods: @@ -609,6 +609,23 @@ bind_local_variable_defined_p(VALUE bindval, VALUE sym) return get_local_variable_ptr(bind->env, lid) ? Qtrue : Qfalse; } +/* + * call-seq: + * binding.receiver -> object + * + * Returns the bound receiver of the binding object. + */ +static VALUE +bind_receiver(VALUE bindval) +{ + const rb_binding_t *bind; + const rb_env_t *env; + + GetBindingPtr(bindval, bind); + GetEnvPtr(bind->env, env); + return env->block.self; +} + static VALUE proc_new(VALUE klass, int is_lambda) { @@ -2859,6 +2876,7 @@ Init_Binding(void) rb_define_method(rb_cBinding, "local_variable_get", bind_local_variable_get, 1); rb_define_method(rb_cBinding, "local_variable_set", bind_local_variable_set, 2); rb_define_method(rb_cBinding, "local_variable_defined?", bind_local_variable_defined_p, 1); + rb_define_method(rb_cBinding, "receiver", bind_receiver, 0); rb_define_global_function("binding", rb_f_binding, 0); } diff --git a/test/ruby/test_proc.rb b/test/ruby/test_proc.rb index 5a22afee85..91279d9d75 100644 --- a/test/ruby/test_proc.rb +++ b/test/ruby/test_proc.rb @@ -1299,4 +1299,14 @@ class TestProc < Test::Unit::TestCase assert_equal(true, b.local_variable_defined?(:a)) assert_equal(false, b.local_variable_defined?(:b)) end + + def test_binding_receiver + feature8779 = '[ruby-dev:47613] [Feature #8779]' + + assert_same(self, binding.receiver, feature8779) + + obj = Object.new + def obj.b; binding; end + assert_same(obj, obj.b.receiver, feature8779) + end end |