summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNARUSE, Yui <naruse@airemix.jp>2021-02-01 19:16:54 +0900
committerNARUSE, Yui <naruse@airemix.jp>2021-02-01 19:16:54 +0900
commit147453ad1e85bc94506c269e363e736675946908 (patch)
tree886002638fffb322541b4e99ce642893f9a760c2
parent5501e1038eb1f606d4b941115fcc45e6e01a0de4 (diff)
merge revision(s) 85b5d4c8bf4cdcba4f1af65f2bc0c8ac716cb795: [Backport #17509]
Revert "[Bug #11213] let defined?(super) call respond_to_missing?" This reverts commit fac2498e0299f13dffe4f09a7dd7657fb49bf643 for now, due to [Bug #17509], the breakage in the case `super` is called in `respond_to?`. --- internal/vm.h | 2 +- test/ruby/test_defined.rb | 33 --------------------------------- vm_insnhelper.c | 4 ++-- vm_method.c | 12 +++++++----- 4 files changed, 10 insertions(+), 41 deletions(-)
-rw-r--r--internal/vm.h2
-rw-r--r--test/ruby/test_defined.rb33
-rw-r--r--version.h2
-rw-r--r--vm_insnhelper.c4
-rw-r--r--vm_method.c12
5 files changed, 11 insertions, 42 deletions
diff --git a/internal/vm.h b/internal/vm.h
index d36ed3d0c8..874eb2d881 100644
--- a/internal/vm.h
+++ b/internal/vm.h
@@ -99,7 +99,7 @@ MJIT_SYMBOL_EXPORT_END
/* vm_method.c */
struct rb_execution_context_struct;
MJIT_SYMBOL_EXPORT_BEGIN
-int rb_ec_obj_respond_to(struct rb_execution_context_struct *ec, VALUE klass, VALUE obj, ID id, int priv);
+int rb_ec_obj_respond_to(struct rb_execution_context_struct *ec, VALUE obj, ID id, int priv);
MJIT_SYMBOL_EXPORT_END
/* vm_dump.c */
diff --git a/test/ruby/test_defined.rb b/test/ruby/test_defined.rb
index 87f02055ab..b22db700da 100644
--- a/test/ruby/test_defined.rb
+++ b/test/ruby/test_defined.rb
@@ -302,39 +302,6 @@ class TestDefined < Test::Unit::TestCase
assert_nil(defined?(TestDefined::Object))
end
- def test_super_with_method_missing
- c0 = EnvUtil.labeled_class("C0") do
- attr_reader :calls
-
- def initialize
- @calls = []
- end
-
- def method_missing(*args)
- @calls << [:method_missing, *args]
- end
-
- def respond_to_missing?(*args)
- @calls << [:respond_to_missing?, *args]
- true
- end
- end
-
- c1 = EnvUtil.labeled_class("C1", c0) do
- def foo
- super
- defined?(super)
- end
- end
-
- c = c1.new
- assert_not_nil(c.foo)
- assert_equal([
- [:method_missing, :foo],
- [:respond_to_missing?, :foo, true],
- ], c.calls)
- end
-
class RefinedClass
end
diff --git a/version.h b/version.h
index 2633e99ed7..3a378ca0e2 100644
--- a/version.h
+++ b/version.h
@@ -12,7 +12,7 @@
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
#define RUBY_VERSION_TEENY 0
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 1
+#define RUBY_PATCHLEVEL 2
#define RUBY_RELEASE_YEAR 2021
#define RUBY_RELEASE_MONTH 2
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 73ba44a12e..6bbb4bca9b 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -3999,7 +3999,7 @@ vm_defined(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp, rb_num_t op_
}
case DEFINED_FUNC:
klass = CLASS_OF(v);
- if (rb_ec_obj_respond_to(ec, klass, v, SYM2ID(obj), TRUE)) {
+ if (rb_ec_obj_respond_to(ec, v, SYM2ID(obj), TRUE)) {
expr_type = DEFINED_METHOD;
}
break;
@@ -4040,7 +4040,7 @@ vm_defined(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp, rb_num_t op_
VALUE klass = vm_search_normal_superclass(me->defined_class);
ID id = me->def->original_id;
- if (rb_ec_obj_respond_to(ec, klass, GET_SELF(), id, TRUE)) {
+ if (rb_method_boundp(klass, id, 0)) {
expr_type = DEFINED_ZSUPER;
}
}
diff --git a/vm_method.c b/vm_method.c
index 4e1208b4c2..2177d00b73 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -2435,8 +2435,9 @@ basic_obj_respond_to_missing(rb_execution_context_t *ec, VALUE klass, VALUE obj,
}
static inline int
-basic_obj_respond_to(rb_execution_context_t *ec, VALUE klass, VALUE obj, ID id, int pub)
+basic_obj_respond_to(rb_execution_context_t *ec, VALUE obj, ID id, int pub)
{
+ VALUE klass = CLASS_OF(obj);
VALUE ret;
switch (method_boundp(klass, id, pub|BOUND_RESPONDS)) {
@@ -2506,14 +2507,15 @@ int
rb_obj_respond_to(VALUE obj, ID id, int priv)
{
rb_execution_context_t *ec = GET_EC();
- return rb_ec_obj_respond_to(ec, CLASS_OF(obj), obj, id, priv);
+ return rb_ec_obj_respond_to(ec, obj, id, priv);
}
int
-rb_ec_obj_respond_to(rb_execution_context_t *ec, VALUE klass, VALUE obj, ID id, int priv)
+rb_ec_obj_respond_to(rb_execution_context_t *ec, VALUE obj, ID id, int priv)
{
+ VALUE klass = CLASS_OF(obj);
int ret = vm_respond_to(ec, klass, obj, id, priv);
- if (ret == -1) ret = basic_obj_respond_to(ec, klass, obj, id, !priv);
+ if (ret == -1) ret = basic_obj_respond_to(ec, obj, id, !priv);
return ret;
}
@@ -2558,7 +2560,7 @@ obj_respond_to(int argc, VALUE *argv, VALUE obj)
if (ret == Qundef) ret = Qfalse;
return ret;
}
- if (basic_obj_respond_to(ec, CLASS_OF(obj), obj, id, !RTEST(priv)))
+ if (basic_obj_respond_to(ec, obj, id, !RTEST(priv)))
return Qtrue;
return Qfalse;
}