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
This commit is contained in:
parent
2dd35a7453
commit
5193ad1319
@ -111,18 +111,34 @@ describe "Array#flatten" do
|
|||||||
lambda { [@obj].flatten }.should raise_error(TypeError)
|
lambda { [@obj].flatten }.should raise_error(TypeError)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "does not call #to_ary if not defined when #respond_to_missing? returns false" do
|
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
|
def @obj.respond_to_missing?(*args) ScratchPad << args; false end
|
||||||
|
|
||||||
[@obj].flatten.should == [@obj]
|
[@obj].flatten.should == [@obj]
|
||||||
ScratchPad.recorded.should == [[:to_ary, false]]
|
ScratchPad.recorded.should == [[:to_ary, false]]
|
||||||
end
|
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?(name, priv) ScratchPad << name; false end
|
||||||
|
|
||||||
|
[@obj].flatten.should == [@obj]
|
||||||
|
ScratchPad.recorded.should == [:to_ary]
|
||||||
|
end
|
||||||
|
|
||||||
it "calls #to_ary if not defined when #respond_to_missing? returns true" do
|
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)
|
lambda { [@obj].flatten }.should raise_error(NoMethodError)
|
||||||
ScratchPad.recorded.should == [[:to_ary, false]]
|
ScratchPad.recorded.should == [:to_ary]
|
||||||
end
|
end
|
||||||
|
|
||||||
it "calls #method_missing if defined" do
|
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);
|
args->me, args->argc, args->argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define PRIV Qfalse /* TODO: for rubyspec now, should be Qtrue */
|
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
check_funcall_failed(struct rescue_funcall_args *args, VALUE e)
|
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;
|
VALUE ret = Qundef;
|
||||||
|
|
||||||
ret = basic_obj_respond_to_missing(th, klass, recv,
|
ret = basic_obj_respond_to_missing(th, klass, recv,
|
||||||
ID2SYM(mid), PRIV);
|
ID2SYM(mid), Qtrue);
|
||||||
if (!RTEST(ret)) return def;
|
if (!RTEST(ret)) return def;
|
||||||
args.respond = respond > 0;
|
args.respond = respond > 0;
|
||||||
args.respond_to_missing = (ret != Qundef);
|
args.respond_to_missing = (ret != Qundef);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user