diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-10-23 02:25:58 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-10-23 02:25:58 +0000 |
commit | d0eea30a62b3486eb7754fc41d1d6a5b3f83a41d (patch) | |
tree | 6403eacd13fcd581c6c60a9484512f7e8639f34e | |
parent | 211ed1b20e96af015e0676bed88f21590f4f515a (diff) | |
download | ruby-d0eea30a62b3486eb7754fc41d1d6a5b3f83a41d.tar.gz |
io.c: no restriction
* io.c (io_write_m): remove argc restriction upto IOV_MAX-1.
[Feature #9323]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60370 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | io.c | 55 | ||||
-rw-r--r-- | test/ruby/test_io.rb | 20 |
2 files changed, 16 insertions, 59 deletions
@@ -1593,10 +1593,6 @@ io_fwritev(int argc, VALUE *argv, rb_io_t *fptr) VALUE v1, v2, str, tmp, *tmp_array; struct iovec *iov; - if (iovcnt > IOV_MAX) { - rb_raise(rb_eArgError, "too many items (IOV_MAX: %d)", IOV_MAX); - } - iov = ALLOCV_N(struct iovec, v1, iovcnt); tmp_array = ALLOCV_N(VALUE, v2, argc); @@ -1625,13 +1621,15 @@ io_fwritev(int argc, VALUE *argv, rb_io_t *fptr) return n; } +#endif /* HAVE_WRITEV */ static VALUE io_writev(int argc, VALUE *argv, VALUE io) { rb_io_t *fptr; long n; - VALUE tmp; + VALUE tmp, total = INT2FIX(0); + int i, cnt = 1; io = GetWriteIO(io); tmp = rb_io_check_io(io); @@ -1644,48 +1642,20 @@ io_writev(int argc, VALUE *argv, VALUE io) GetOpenFile(io, fptr); rb_io_check_writable(fptr); - n = io_fwritev(argc, argv, fptr); - if (n == -1L) rb_sys_fail_path(fptr->pathv); - - return LONG2FIX(n); -} + for (i = 0; i < argc; i += cnt) { +#ifdef HAVE_WRITEV + if ((cnt = argc - i) >= IOV_MAX) cnt = IOV_MAX-1; + n = io_fwritev(cnt, &argv[i], fptr); #else -static VALUE -io_writev(int argc, VALUE *argv, VALUE io) -{ - rb_io_t *fptr; - long n; - VALUE str, tmp, total = INT2FIX(0); - int nosync; - int i; - - io = GetWriteIO(io); - tmp = rb_io_check_io(io); - if (NIL_P(tmp)) { - /* port is not IO, call write method for it. */ - return rb_funcallv(io, id_write, argc, argv); - } - io = tmp; - - GetOpenFile(io, fptr); - rb_io_check_writable(fptr); - - for (i = 0; i < argc; i++) { /* sync at last item */ - if (i == argc-1) - nosync = 0; - else - nosync = 1; - - str = argv[i]; - n = io_fwrite(str, fptr, nosync); + n = io_fwrite(argv[i], fptr, (i < argc-1)); +#endif if (n == -1L) rb_sys_fail_path(fptr->pathv); total = rb_fix_plus_fix(LONG2FIX(n), total); } return total; } -#endif /* HAVE_WRITEV */ /* * call-seq: @@ -1708,13 +1678,6 @@ io_writev(int argc, VALUE *argv, VALUE io) static VALUE io_write_m(int argc, VALUE *argv, VALUE io) { -#ifdef HAVE_WRITEV - rb_check_arity(argc, 1, IOV_MAX-1); -#else - /* in many environments, IOV_MAX is 1024 */ - rb_check_arity(argc, 1, 1023); -#endif - if (argc > 1) { return io_writev(argc, argv, io); } diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb index 7920c60262..122e63da3a 100644 --- a/test/ruby/test_io.rb +++ b/test/ruby/test_io.rb @@ -1226,19 +1226,13 @@ class TestIO < Test::Unit::TestCase end def test_write_with_many_arguments - pipe(proc do |w| - w.write(*(["a"] * 1023)) - w.close - end, proc do |r| - assert_equal("a" * 1023, r.read) - end) - end - - def test_write_with_too_many_arguments - with_pipe do |r, w| - assert_raise(ArgumentError) do - w.write(*(["a"] * 1024)) - end + [1023, 1024].each do |n| + pipe(proc do |w| + w.write(*(["a"] * n)) + w.close + end, proc do |r| + assert_equal("a" * n, r.read) + end) end end |