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

ruby-changes:45435

From: normal <ko1@a...>
Date: Fri, 3 Feb 2017 03:59:44 +0900 (JST)
Subject: [ruby-changes:45435] normal:r57508 (trunk): io.c: remove rb_ensure usage for rb_str_tmp_frozen_* calls

normal	2017-02-03 03:59:40 +0900 (Fri, 03 Feb 2017)

  New Revision: 57508

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

  Log:
    io.c: remove rb_ensure usage for rb_str_tmp_frozen_* calls
    
    Using rb_ensure pessimizes the common case and makes the code
    more difficult to read and follow.  If we hit an exceptions
    during write, just let the GC handle cleanup as the exception
    is already bad for garbage.
    
    * io.c (io_fwrite): call rb_str_tmp_frozen{acquire,release} directly
      (rb_io_syswrite): ditto
      (fwrite_do, fwrite_end, swrite_do, swrite_end): remove

  Modified files:
    trunk/io.c
Index: io.c
===================================================================
--- io.c	(revision 57507)
+++ io.c	(revision 57508)
@@ -1419,40 +1419,13 @@ do_writeconv(VALUE str, rb_io_t *fptr, i https://github.com/ruby/ruby/blob/trunk/io.c#L1419
     return str;
 }
 
-struct fwrite_arg {
-    VALUE orig;
-    VALUE tmp;
-    rb_io_t *fptr;
-    int nosync;
-};
-
-static VALUE
-fwrite_do(VALUE arg)
-{
-    struct fwrite_arg *fa = (struct fwrite_arg *)arg;
-    const char *ptr;
-    long len;
-
-    RSTRING_GETMEM(fa->tmp, ptr, len);
-
-    return (VALUE)io_binwrite(fa->tmp, ptr, len, fa->fptr, fa->nosync);
-}
-
-static VALUE
-fwrite_end(VALUE arg)
-{
-    struct fwrite_arg *fa = (struct fwrite_arg *)arg;
-
-    rb_str_tmp_frozen_release(fa->orig, fa->tmp);
-
-    return Qfalse;
-}
-
 static long
 io_fwrite(VALUE str, rb_io_t *fptr, int nosync)
 {
     int converted = 0;
-    struct fwrite_arg fa;
+    VALUE tmp;
+    long n, len;
+    const char *ptr;
 #ifdef _WIN32
     if (fptr->mode & FMODE_TTY) {
 	long len = rb_w32_write_console(str, fptr->fd);
@@ -1463,12 +1436,12 @@ io_fwrite(VALUE str, rb_io_t *fptr, int https://github.com/ruby/ruby/blob/trunk/io.c#L1436
     if (converted)
 	OBJ_FREEZE(str);
 
-    fa.orig = str;
-    fa.tmp = rb_str_tmp_frozen_acquire(str);
-    fa.fptr = fptr;
-    fa.nosync = nosync;
+    tmp = rb_str_tmp_frozen_acquire(str);
+    RSTRING_GETMEM(tmp, ptr, len);
+    n = io_binwrite(tmp, ptr, len, fptr, nosync);
+    rb_str_tmp_frozen_release(str, tmp);
 
-    return (long)rb_ensure(fwrite_do, (VALUE)&fa, fwrite_end, (VALUE)&fa);
+    return n;
 }
 
 ssize_t
@@ -4745,34 +4718,6 @@ rb_io_sysseek(int argc, VALUE *argv, VAL https://github.com/ruby/ruby/blob/trunk/io.c#L4718
     return OFFT2NUM(pos);
 }
 
-struct swrite_arg {
-    VALUE orig;
-    VALUE tmp;
-    rb_io_t *fptr;
-};
-
-static VALUE
-swrite_do(VALUE arg)
-{
-    struct swrite_arg *sa = (struct swrite_arg *)arg;
-    const char *ptr;
-    long len;
-
-    RSTRING_GETMEM(sa->tmp, ptr, len);
-
-    return (VALUE)rb_write_internal(sa->fptr->fd, ptr, len);
-}
-
-static VALUE
-swrite_end(VALUE arg)
-{
-    struct swrite_arg *sa = (struct swrite_arg *)arg;
-
-    rb_str_tmp_frozen_release(sa->orig, sa->tmp);
-
-    return Qfalse;
-}
-
 /*
  *  call-seq:
  *     ios.syswrite(string)   -> integer
@@ -4789,25 +4734,27 @@ swrite_end(VALUE arg) https://github.com/ruby/ruby/blob/trunk/io.c#L4734
 static VALUE
 rb_io_syswrite(VALUE io, VALUE str)
 {
-    struct swrite_arg sa;
-    long n;
+    VALUE tmp;
+    rb_io_t *fptr;
+    long n, len;
+    const char *ptr;
 
     if (!RB_TYPE_P(str, T_STRING))
 	str = rb_obj_as_string(str);
 
     io = GetWriteIO(io);
-    GetOpenFile(io, sa.fptr);
-    rb_io_check_writable(sa.fptr);
+    GetOpenFile(io, fptr);
+    rb_io_check_writable(fptr);
 
-    if (sa.fptr->wbuf.len) {
+    if (fptr->wbuf.len) {
 	rb_warn("syswrite for buffered IO");
     }
 
-    sa.orig = str;
-    sa.tmp = rb_str_tmp_frozen_acquire(str);
-    n = (long)rb_ensure(swrite_do, (VALUE)&sa, swrite_end, (VALUE)&sa);
-
-    if (n == -1) rb_sys_fail_path(sa.fptr->pathv);
+    tmp = rb_str_tmp_frozen_acquire(str);
+    RSTRING_GETMEM(tmp, ptr, len);
+    n = rb_write_internal(fptr->fd, ptr, len);
+    if (n == -1) rb_sys_fail_path(fptr->pathv);
+    rb_str_tmp_frozen_release(str, tmp);
 
     return LONG2FIX(n);
 }

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

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