1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

merge revision(s) 85b5d4c8bf: [Backport #17509]

Revert "[Bug #11213] let defined?(super) call respond_to_missing?"

	This reverts commit fac2498e02 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(-)
This commit is contained in:
NARUSE, Yui 2021-02-01 19:16:54 +09:00
parent 5501e1038e
commit 147453ad1e
5 changed files with 11 additions and 42 deletions

View file

@ -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 */

View file

@ -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

View file

@ -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

View file

@ -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;
}
}

View file

@ -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;
}