summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-07-01 17:24:02 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-07-01 17:24:02 +0000
commit43ba2c01e746992e9658000e4df7bb025bfb6b01 (patch)
tree0b5f080c1f4c47e63a53b0996a2b14d6fd419ef6
parent02c391a1c90ceb05f5243d1aececc299a2080f76 (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--ChangeLog5
-rw-r--r--NEWS1
-rw-r--r--proc.c18
-rw-r--r--test/ruby/test_proc.rb10
4 files changed, 34 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 2b81d99b73..3ab54e179e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Jul 2 02:23:52 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * 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 <nobu@ruby-lang.org>
* proc.c (bind_local_variables): update env from envval for each
diff --git a/NEWS b/NEWS
index 3a6dd0dd69..693648ac1c 100644
--- a/NEWS
+++ b/NEWS
@@ -18,6 +18,7 @@ with all sufficient information, see the ChangeLog file.
* Binding
* New methods:
* Binding#local_variables
+ * Binding#receiver
* Enumerable
* New methods:
diff --git a/proc.c b/proc.c
index 1c37acb3d3..f81483c7b1 100644
--- a/proc.c
+++ b/proc.c
@@ -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