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:
parent
c0837cb73a
commit
0db6b623a6
1 changed files with 20 additions and 73 deletions
93
io.c
93
io.c
|
@ -1419,40 +1419,13 @@ do_writeconv(VALUE str, rb_io_t *fptr, int *converted)
|
||||||
return str;
|
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
|
static long
|
||||||
io_fwrite(VALUE str, rb_io_t *fptr, int nosync)
|
io_fwrite(VALUE str, rb_io_t *fptr, int nosync)
|
||||||
{
|
{
|
||||||
int converted = 0;
|
int converted = 0;
|
||||||
struct fwrite_arg fa;
|
VALUE tmp;
|
||||||
|
long n, len;
|
||||||
|
const char *ptr;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if (fptr->mode & FMODE_TTY) {
|
if (fptr->mode & FMODE_TTY) {
|
||||||
long len = rb_w32_write_console(str, fptr->fd);
|
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)
|
if (converted)
|
||||||
OBJ_FREEZE(str);
|
OBJ_FREEZE(str);
|
||||||
|
|
||||||
fa.orig = str;
|
tmp = rb_str_tmp_frozen_acquire(str);
|
||||||
fa.tmp = rb_str_tmp_frozen_acquire(str);
|
RSTRING_GETMEM(tmp, ptr, len);
|
||||||
fa.fptr = fptr;
|
n = io_binwrite(tmp, ptr, len, fptr, nosync);
|
||||||
fa.nosync = nosync;
|
rb_str_tmp_frozen_release(str, tmp);
|
||||||
|
|
||||||
return (long)rb_ensure(fwrite_do, (VALUE)&fa, fwrite_end, (VALUE)&fa);
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t
|
ssize_t
|
||||||
|
@ -4745,34 +4718,6 @@ rb_io_sysseek(int argc, VALUE *argv, VALUE io)
|
||||||
return OFFT2NUM(pos);
|
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:
|
* call-seq:
|
||||||
* ios.syswrite(string) -> integer
|
* ios.syswrite(string) -> integer
|
||||||
|
@ -4789,25 +4734,27 @@ swrite_end(VALUE arg)
|
||||||
static VALUE
|
static VALUE
|
||||||
rb_io_syswrite(VALUE io, VALUE str)
|
rb_io_syswrite(VALUE io, VALUE str)
|
||||||
{
|
{
|
||||||
struct swrite_arg sa;
|
VALUE tmp;
|
||||||
long n;
|
rb_io_t *fptr;
|
||||||
|
long n, len;
|
||||||
|
const char *ptr;
|
||||||
|
|
||||||
if (!RB_TYPE_P(str, T_STRING))
|
if (!RB_TYPE_P(str, T_STRING))
|
||||||
str = rb_obj_as_string(str);
|
str = rb_obj_as_string(str);
|
||||||
|
|
||||||
io = GetWriteIO(io);
|
io = GetWriteIO(io);
|
||||||
GetOpenFile(io, sa.fptr);
|
GetOpenFile(io, fptr);
|
||||||
rb_io_check_writable(sa.fptr);
|
rb_io_check_writable(fptr);
|
||||||
|
|
||||||
if (sa.fptr->wbuf.len) {
|
if (fptr->wbuf.len) {
|
||||||
rb_warn("syswrite for buffered IO");
|
rb_warn("syswrite for buffered IO");
|
||||||
}
|
}
|
||||||
|
|
||||||
sa.orig = str;
|
tmp = rb_str_tmp_frozen_acquire(str);
|
||||||
sa.tmp = rb_str_tmp_frozen_acquire(str);
|
RSTRING_GETMEM(tmp, ptr, len);
|
||||||
n = (long)rb_ensure(swrite_do, (VALUE)&sa, swrite_end, (VALUE)&sa);
|
n = rb_write_internal(fptr->fd, ptr, len);
|
||||||
|
if (n == -1) rb_sys_fail_path(fptr->pathv);
|
||||||
if (n == -1) rb_sys_fail_path(sa.fptr->pathv);
|
rb_str_tmp_frozen_release(str, tmp);
|
||||||
|
|
||||||
return LONG2FIX(n);
|
return LONG2FIX(n);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue