diff --git a/ChangeLog b/ChangeLog index e048146bf8..c3072d09b3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sun Dec 23 11:26:43 2007 Nobuyoshi Nakada + + * string.c (sym_call): use exact argument array interface. + [ruby-core:14279] + Sun Dec 23 11:01:35 2007 Nobuyoshi Nakada * io.c (rb_io_binmode_m): removed C99ism. diff --git a/bootstraptest/test_block.rb b/bootstraptest/test_block.rb index f139c21d15..3ece21756d 100644 --- a/bootstraptest/test_block.rb +++ b/bootstraptest/test_block.rb @@ -497,3 +497,13 @@ assert_equal 'ok', %q{ result end } + +assert_equal "ok", %q{ + class Bar + def bar; :ok; end + end + def foo + yield(Bar.new) if block_given? + end + foo(&:bar) +}, '[ruby-core:14279]' diff --git a/bootstraptest/test_knownbug.rb b/bootstraptest/test_knownbug.rb index 74981190d8..b251734cae 100644 --- a/bootstraptest/test_knownbug.rb +++ b/bootstraptest/test_knownbug.rb @@ -3,13 +3,6 @@ # So all tests will cause failure. # -assert_normal_exit %q{ - def foo(&block) - yield if block - end - foo(&:bar) -}, '[ruby-core:14279]' - assert_equal 'ok', %q{ open("tmp", "w") {|f| f.write "a\u00FFb" } s = open("tmp", "r:iso-8859-1:utf-8") {|f| diff --git a/string.c b/string.c index bd71bc282e..ebfd39c9bf 100644 --- a/string.c +++ b/string.c @@ -5519,17 +5519,15 @@ sym_to_sym(VALUE sym) } static VALUE -sym_call(VALUE args, VALUE sym) +sym_call(VALUE args, VALUE sym, int argc, VALUE *argv) { VALUE obj; - if (RARRAY_LEN(args) < 1) { + if (argc < 1) { rb_raise(rb_eArgError, "no receiver given"); } - obj = RARRAY_PTR(args)[0]; - return rb_funcall3(obj, (ID)sym, - RARRAY_LEN(args) - 1, - RARRAY_PTR(args) + 1); + obj = argv[0]; + return rb_funcall3(obj, (ID)sym, argc - 1, argv + 1); } /*