Revision: 3730 http://trac.macosforge.org/projects/ruby/changeset/3730 Author: lsansonetti@apple.com Date: 2010-03-09 20:39:52 -0800 (Tue, 09 Mar 2010) Log Message: ----------- optimized Marshal.dump in case an IO object is provided Modified Paths: -------------- MacRuby/branches/icu/marshal.c Modified: MacRuby/branches/icu/marshal.c =================================================================== --- MacRuby/branches/icu/marshal.c 2010-03-10 03:09:42 UTC (rev 3729) +++ MacRuby/branches/icu/marshal.c 2010-03-10 04:39:52 UTC (rev 3730) @@ -220,11 +220,15 @@ { VALUE buf = arg->str; rb_bstr_concat(buf, (const uint8_t *)s, n); +#if 0 // unused if (arg->dest && RSTRING_LEN(buf) >= BUFSIZ) { - if (arg->taint) OBJ_TAINT(buf); + if (arg->taint) { + OBJ_TAINT(buf); + } rb_io_write(arg->dest, 0, buf); rb_str_resize(buf, 0); } +#endif } static void @@ -896,10 +900,12 @@ dump(struct dump_call_arg *arg) { w_object(arg->obj, arg->arg, arg->limit); +#if 0 // unused if (arg->arg->dest) { rb_io_write(arg->arg->dest, 0, arg->arg->str); rb_bstr_resize(arg->arg->str, 0); } +#endif return 0; } @@ -977,16 +983,20 @@ } } arg->dest = 0; + bool got_io = false; if (!NIL_P(port)) { if (!rb_obj_respond_to(port, s_write, Qtrue)) { type_error: rb_raise(rb_eTypeError, "instance of IO needed"); } GC_WB(&arg->str, rb_bstr_new()); +#if 0 // unused GC_WB(&arg->dest, port); +#endif if (rb_obj_respond_to(port, s_binmode, Qtrue)) { rb_funcall2(port, s_binmode, 0, 0); } + got_io = true; } else { port = rb_bstr_new(); @@ -1008,6 +1018,12 @@ rb_ensure(dump, (VALUE)c_arg, dump_ensure, (VALUE)arg); + // If we got an IO object as the port, make sure to write the bytestring + // to it before leaving! + if (got_io) { + rb_io_write(port, 0, arg->str); + } + return port; } @@ -1743,6 +1759,7 @@ v = rb_check_string_type(port); if (!NIL_P(v)) { arg->taint = OBJ_TAINTED(port); /* original taintedness */ + v = rb_str_bstr(v); port = v; } else if (rb_obj_respond_to(port, s_getbyte, Qtrue)