aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--spec/ruby/core/array/flatten_spec.rb24
-rw-r--r--vm_eval.c4
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
diff --git a/vm_eval.c b/vm_eval.c
index 309e553f14..2375e2f34b 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -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);