diff options
author | eregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-09-20 22:02:10 +0000 |
---|---|---|
committer | eregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-09-20 22:02:10 +0000 |
commit | 5193ad13197bdaeb7a7bdcb1e6a424f79afc927a (patch) | |
tree | fa47dd96a029a92bdd893f0aff60e930711f5195 | |
parent | 2dd35a74533e63ad2b9b8804ef62b153ac926978 (diff) | |
download | ruby-5193ad13197bdaeb7a7bdcb1e6a424f79afc927a.tar.gz |
check_funcall_missing() should call respond_to_missing?(name, priv=true)
* Improve spec rather than constrain implementation.
* Coercion ignores visibility in Ruby.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59982 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | spec/ruby/core/array/flatten_spec.rb | 24 | ||||
-rw-r--r-- | vm_eval.c | 4 |
2 files changed, 21 insertions, 7 deletions
diff --git a/spec/ruby/core/array/flatten_spec.rb b/spec/ruby/core/array/flatten_spec.rb index 554b711a55..3b20e976b6 100644 --- a/spec/ruby/core/array/flatten_spec.rb +++ b/spec/ruby/core/array/flatten_spec.rb @@ -111,18 +111,34 @@ describe "Array#flatten" do lambda { [@obj].flatten }.should raise_error(TypeError) end + ruby_version_is ""..."2.5" do + it "calls respond_to_missing?(:to_ary, false) to try coercing" do + def @obj.respond_to_missing?(*args) ScratchPad << args; false end + [@obj].flatten.should == [@obj] + ScratchPad.recorded.should == [[:to_ary, false]] + end + end + + ruby_version_is "2.5" do + it "calls respond_to_missing?(:to_ary, true) to try coercing" do + def @obj.respond_to_missing?(*args) ScratchPad << args; false end + [@obj].flatten.should == [@obj] + ScratchPad.recorded.should == [[:to_ary, true]] + end + end + it "does not call #to_ary if not defined when #respond_to_missing? returns false" do - def @obj.respond_to_missing?(*args) ScratchPad << args; false end + def @obj.respond_to_missing?(name, priv) ScratchPad << name; false end [@obj].flatten.should == [@obj] - ScratchPad.recorded.should == [[:to_ary, false]] + ScratchPad.recorded.should == [:to_ary] end it "calls #to_ary if not defined when #respond_to_missing? returns true" do - def @obj.respond_to_missing?(*args) ScratchPad << args; true end + def @obj.respond_to_missing?(name, priv) ScratchPad << name; true end lambda { [@obj].flatten }.should raise_error(NoMethodError) - ScratchPad.recorded.should == [[:to_ary, false]] + ScratchPad.recorded.should == [:to_ary] end it "calls #method_missing if defined" do @@ -315,8 +315,6 @@ check_funcall_exec(struct rescue_funcall_args *args) args->me, args->argc, args->argv); } -#define PRIV Qfalse /* TODO: for rubyspec now, should be Qtrue */ - static VALUE check_funcall_failed(struct rescue_funcall_args *args, VALUE e) { @@ -361,7 +359,7 @@ check_funcall_missing(rb_thread_t *th, VALUE klass, VALUE recv, ID mid, int argc VALUE ret = Qundef; ret = basic_obj_respond_to_missing(th, klass, recv, - ID2SYM(mid), PRIV); + ID2SYM(mid), Qtrue); if (!RTEST(ret)) return def; args.respond = respond > 0; args.respond_to_missing = (ret != Qundef); |