* proc.c: check the argument at composition, expect a Proc,
  Method, or callable object.  [ruby-core:90591] [Bug #15428]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66769 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2019-01-10 06:01:32 +00:00
Родитель 671ef4e9e3
Коммит 33a75edd3c
3 изменённых файлов: 37 добавлений и 8 удалений

37
proc.c
Просмотреть файл

@ -3063,6 +3063,21 @@ compose(VALUE dummy, VALUE args, int argc, VALUE *argv, VALUE passed_proc)
return rb_funcallv(f, idCall, 1, &fargs);
}
static VALUE
to_callable(VALUE f)
{
VALUE mesg;
if (rb_obj_is_proc(f)) return f;
if (rb_obj_is_method(f)) return f;
if (rb_obj_respond_to(f, idCall, TRUE)) return f;
mesg = rb_fstring_lit("callable object is expected");
rb_exc_raise(rb_exc_new_str(rb_eTypeError, mesg));
}
static VALUE rb_proc_compose_to_left(VALUE self, VALUE g);
static VALUE rb_proc_compose_to_right(VALUE self, VALUE g);
/*
* call-seq:
* prc << g -> a_proc
@ -3077,6 +3092,12 @@ compose(VALUE dummy, VALUE args, int argc, VALUE *argv, VALUE passed_proc)
*/
static VALUE
proc_compose_to_left(VALUE self, VALUE g)
{
return rb_proc_compose_to_left(self, to_callable(g));
}
static VALUE
rb_proc_compose_to_left(VALUE self, VALUE g)
{
VALUE proc, args, procs[2];
rb_proc_t *procp;
@ -3110,6 +3131,12 @@ proc_compose_to_left(VALUE self, VALUE g)
*/
static VALUE
proc_compose_to_right(VALUE self, VALUE g)
{
return rb_proc_compose_to_right(self, to_callable(g));
}
static VALUE
rb_proc_compose_to_right(VALUE self, VALUE g)
{
VALUE proc, args, procs[2];
rb_proc_t *procp;
@ -3148,8 +3175,9 @@ proc_compose_to_right(VALUE self, VALUE g)
static VALUE
rb_method_compose_to_left(VALUE self, VALUE g)
{
VALUE proc = method_to_proc(self);
return proc_compose_to_left(proc, g);
g = to_callable(g);
self = method_to_proc(self);
return proc_compose_to_left(self, g);
}
/*
@ -3171,8 +3199,9 @@ rb_method_compose_to_left(VALUE self, VALUE g)
static VALUE
rb_method_compose_to_right(VALUE self, VALUE g)
{
VALUE proc = method_to_proc(self);
return proc_compose_to_right(proc, g);
g = to_callable(g);
self = method_to_proc(self);
return proc_compose_to_right(self, g);
}
/*

Просмотреть файл

@ -1088,10 +1088,10 @@ class TestMethod < Test::Unit::TestCase
}
f = c.new.method(:f)
assert_raise(NoMethodError) {
assert_raise(TypeError) {
(f << 5).call(2)
}
assert_raise(NoMethodError) {
assert_raise(TypeError) {
(f >> 5).call(2)
}
end

Просмотреть файл

@ -1474,10 +1474,10 @@ class TestProc < Test::Unit::TestCase
def test_compose_with_noncallable
f = proc {|x| x * 2}
assert_raise(NoMethodError) {
assert_raise(TypeError) {
(f << 5).call(2)
}
assert_raise(NoMethodError) {
assert_raise(TypeError) {
(f >> 5).call(2)
}
end