ruby-changes:9528
From: akr <ko1@a...>
Date: Fri, 26 Dec 2008 18:06:06 +0900 (JST)
Subject: [ruby-changes:9528] Ruby:r21068 (trunk): * io.c (fptr_finalize): don't allocate objects if noraise.
akr 2008-12-26 18:05:47 +0900 (Fri, 26 Dec 2008) New Revision: 21068 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=21068 Log: * io.c (fptr_finalize): don't allocate objects if noraise. (finish_writeconv): add noalloc argument to be able to avoid object allocation. (finish_writeconv_arg): introduced again. (finish_writeconv_sync): follow the above change. Modified files: trunk/ChangeLog trunk/io.c Index: ChangeLog =================================================================== --- ChangeLog (revision 21067) +++ ChangeLog (revision 21068) @@ -1,3 +1,11 @@ +Fri Dec 26 18:04:10 2008 Tanaka Akira <akr@f...> + + * io.c (fptr_finalize): don't allocate objects if noraise. + (finish_writeconv): add noalloc argument to be able to avoid + object allocation. + (finish_writeconv_arg): introduced again. + (finish_writeconv_sync): follow the above change. + Fri Dec 26 17:04:14 2008 Yuki Sonoda (Yugui) <yugui@y...> * lib/irb/input-method.rb (IRB::StdioInputMethod#initialize): Index: io.c =================================================================== --- io.c (revision 21067) +++ io.c (revision 21068) @@ -3035,11 +3035,10 @@ #define PREP_STDIO_NAME(f) (RSTRING_PTR((f)->pathv)) static VALUE -finish_writeconv(rb_io_t *fptr) +finish_writeconv(rb_io_t *fptr, int noalloc) { unsigned char *ds, *dp, *de; rb_econv_result_t res; - VALUE err; if (!fptr->wbuf) { unsigned char buf[1024]; @@ -3060,13 +3059,16 @@ } if (rb_io_wait_writable(fptr->fd)) { if (fptr->fd < 0) - return rb_exc_new3(rb_eIOError, rb_str_new_cstr("closed stream")); + return noalloc ? Qtrue : rb_exc_new3(rb_eIOError, rb_str_new_cstr("closed stream")); goto retry; } - return INT2NUM(errno); + return noalloc ? Qtrue : INT2NUM(errno); } - if (!NIL_P(err = rb_econv_make_exception(fptr->writeconv))) - return err; + if (res == econv_invalid_byte_sequence || + res == econv_incomplete_input || + res == econv_undefined_conversion) { + return noalloc ? Qtrue : rb_econv_make_exception(fptr->writeconv); + } } return Qnil; @@ -3076,24 +3078,32 @@ while (res == econv_destination_buffer_full) { if (fptr->wbuf_len == fptr->wbuf_capa) { if (io_fflush(fptr) < 0) - return INT2NUM(errno); + return noalloc ? Qtrue : INT2NUM(errno); } ds = dp = (unsigned char *)fptr->wbuf + fptr->wbuf_off + fptr->wbuf_len; de = (unsigned char *)fptr->wbuf + fptr->wbuf_capa; res = rb_econv_convert(fptr->writeconv, NULL, NULL, &dp, de, 0); fptr->wbuf_len += dp - ds; - if (!NIL_P(err = rb_econv_make_exception(fptr->writeconv))) - return err; + if (res == econv_invalid_byte_sequence || + res == econv_incomplete_input || + res == econv_undefined_conversion) { + return noalloc ? Qtrue : rb_econv_make_exception(fptr->writeconv); + } } return Qnil; } +struct finish_writeconv_arg { + rb_io_t *fptr; + int noalloc; +}; + static VALUE finish_writeconv_sync(VALUE arg) { - rb_io_t *fptr = (rb_io_t *)arg; - return finish_writeconv(fptr); + struct finish_writeconv_arg *p = (struct finish_writeconv_arg *)arg; + return finish_writeconv(p->fptr, p->noalloc); } static void @@ -3102,15 +3112,18 @@ VALUE err = Qnil; if (fptr->writeconv) { if (fptr->write_lock) { - err = rb_mutex_synchronize(fptr->write_lock, finish_writeconv_sync, (VALUE)fptr); + struct finish_writeconv_arg arg; + arg.fptr = fptr; + arg.noalloc = noraise; + err = rb_mutex_synchronize(fptr->write_lock, finish_writeconv_sync, (VALUE)&arg); } else { - err = finish_writeconv(fptr); + err = finish_writeconv(fptr, noraise); } } if (fptr->wbuf_len) { if (io_fflush(fptr) < 0 && NIL_P(err)) - err = INT2NUM(errno); + err = noraise ? Qtrue : INT2NUM(errno); } if (IS_PREP_STDIO(fptr) || fptr->fd <= 2) { goto check_err; @@ -3119,14 +3132,14 @@ /* fptr->stdio_file is deallocated anyway * even if fclose failed. */ if (fclose(fptr->stdio_file) < 0 && NIL_P(err)) - err = INT2NUM(errno); + err = noraise ? Qtrue : INT2NUM(errno); } else if (0 <= fptr->fd) { /* fptr->fd may be closed even if close fails. * POSIX doesn't specify it. * We assumes it is closed. */ if (close(fptr->fd) < 0 && NIL_P(err)) - err = INT2NUM(errno); + err = noraise ? Qtrue : INT2NUM(errno); } fptr->fd = -1; fptr->stdio_file = 0; -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/