[前][次][番号順一覧][スレッド一覧]

ruby-changes:48255

From: nobu <ko1@a...>
Date: Mon, 23 Oct 2017 11:26:04 +0900 (JST)
Subject: [ruby-changes:48255] nobu:r60370 (trunk): io.c: no restriction

nobu	2017-10-23 11:25:58 +0900 (Mon, 23 Oct 2017)

  New Revision: 60370

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=60370

  Log:
    io.c: no restriction
    
    * io.c (io_write_m): remove argc restriction upto IOV_MAX-1.
      [Feature #9323]

  Modified files:
    trunk/io.c
    trunk/test/ruby/test_io.rb
Index: test/ruby/test_io.rb
===================================================================
--- test/ruby/test_io.rb	(revision 60369)
+++ test/ruby/test_io.rb	(revision 60370)
@@ -1226,19 +1226,13 @@ class TestIO < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_io.rb#L1226
   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
 
Index: io.c
===================================================================
--- io.c	(revision 60369)
+++ io.c	(revision 60370)
@@ -1593,10 +1593,6 @@ io_fwritev(int argc, VALUE *argv, rb_io_ https://github.com/ruby/ruby/blob/trunk/io.c#L1593
     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_ https://github.com/ruby/ruby/blob/trunk/io.c#L1621
 
     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 i https://github.com/ruby/ruby/blob/trunk/io.c#L1642
     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 i https://github.com/ruby/ruby/blob/trunk/io.c#L1678
 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);
     }

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]