1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

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

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57508 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
normal 2017-02-02 18:59:40 +00:00
parent c0837cb73a
commit 0db6b623a6

93
io.c
View file

@ -1419,40 +1419,13 @@ do_writeconv(VALUE str, rb_io_t *fptr, int *converted)
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 nosync)
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, VALUE io)
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)
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);
}