ruby-changes:16423
From: shyouhei <ko1@a...>
Date: Wed, 23 Jun 2010 22:16:46 +0900 (JST)
Subject: [ruby-changes:16423] Ruby:r28406 (ruby_1_8_7): merge revision(s) 25230:25229:
shyouhei 2010-06-23 22:16:28 +0900 (Wed, 23 Jun 2010) New Revision: 28406 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=28406 Log: merge revision(s) 25230:25229: Modified files: branches/ruby_1_8_7/ChangeLog branches/ruby_1_8_7/marshal.c branches/ruby_1_8_7/test/ruby/test_marshal.rb branches/ruby_1_8_7/version.h Index: ruby_1_8_7/ChangeLog =================================================================== --- ruby_1_8_7/ChangeLog (revision 28405) +++ ruby_1_8_7/ChangeLog (revision 28406) @@ -1,3 +1,8 @@ +Wed Jun 23 21:54:17 2010 URABE Shyouhei <shyouhei@r...> + + * marshal.c, test/ruby/test_marshal.rb: Revert r25230. This test + is troublesome. + Mon Jun 21 18:12:15 2010 NAKAMURA Usaku <usa@r...> * ext/openssl/extconf.rb: check some functions added at OpenSSL 1.0.0. Index: ruby_1_8_7/version.h =================================================================== --- ruby_1_8_7/version.h (revision 28405) +++ ruby_1_8_7/version.h (revision 28406) @@ -1,15 +1,15 @@ #define RUBY_VERSION "1.8.7" -#define RUBY_RELEASE_DATE "2010-06-21" +#define RUBY_RELEASE_DATE "2010-06-23" #define RUBY_VERSION_CODE 187 -#define RUBY_RELEASE_CODE 20100621 -#define RUBY_PATCHLEVEL 297 +#define RUBY_RELEASE_CODE 20100623 +#define RUBY_PATCHLEVEL 298 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 8 #define RUBY_VERSION_TEENY 7 #define RUBY_RELEASE_YEAR 2010 #define RUBY_RELEASE_MONTH 6 -#define RUBY_RELEASE_DAY 21 +#define RUBY_RELEASE_DAY 23 #ifdef RUBY_EXTERN RUBY_EXTERN const char ruby_version[]; Index: ruby_1_8_7/marshal.c =================================================================== --- ruby_1_8_7/marshal.c (revision 28405) +++ ruby_1_8_7/marshal.c (revision 28406) @@ -85,10 +85,12 @@ static ID s_getc, s_read, s_write, s_binmode; struct dump_arg { + VALUE obj; VALUE str, dest; st_table *symbols; st_table *data; int taint; + VALUE wrapper; }; struct dump_call_arg { @@ -102,32 +104,22 @@ struct dump_arg *arg; ID sym; { - if (!arg->symbols) { + if (!DATA_PTR(arg->wrapper)) { rb_raise(rb_eRuntimeError, "Marshal.dump reentered at %s", rb_id2name(sym)); } } -static void clear_dump_arg _((struct dump_arg *arg)); - static void mark_dump_arg(ptr) void *ptr; { struct dump_arg *p = ptr; - if (!p->symbols) + if (!ptr) return; rb_mark_set(p->data); } -static void -free_dump_arg(ptr) - void *ptr; -{ - clear_dump_arg(ptr); - xfree(ptr); -} - static VALUE class2path(klass) VALUE klass; @@ -707,17 +699,32 @@ } } -static void -clear_dump_arg(arg) +static VALUE +dump(arg) + struct dump_call_arg *arg; +{ + w_object(arg->obj, arg->arg, arg->limit); + if (arg->arg->dest) { + rb_io_write(arg->arg->dest, arg->arg->str); + rb_str_resize(arg->arg->str, 0); + } + return 0; +} + +static VALUE +dump_ensure(arg) struct dump_arg *arg; { - if (!arg->symbols) return; + if (!DATA_PTR(arg->wrapper)) return 0; st_free_table(arg->symbols); - arg->symbols = 0; st_free_table(arg->data); + DATA_PTR(arg->wrapper) = 0; + arg->wrapper = 0; if (arg->taint) { OBJ_TAINT(arg->str); } + + return 0; } /* @@ -753,8 +760,8 @@ { VALUE obj, port, a1, a2; int limit = -1; - struct dump_arg *arg; - VALUE wrapper; + struct dump_arg arg; + struct dump_call_arg c_arg; port = Qnil; rb_scan_args(argc, argv, "12", &obj, &a1, &a2); @@ -768,40 +775,37 @@ else if (NIL_P(a1)) goto type_error; else port = a1; } - wrapper = Data_Make_Struct(rb_cData, struct dump_arg, mark_dump_arg, free_dump_arg, arg); - arg->dest = 0; - arg->symbols = st_init_numtable(); - arg->data = st_init_numtable(); - arg->taint = Qfalse; - arg->str = rb_str_buf_new(0); - RBASIC(arg->str)->klass = 0; + arg.dest = 0; + arg.symbols = st_init_numtable(); + arg.data = st_init_numtable(); + arg.taint = Qfalse; + arg.str = rb_str_buf_new(0); + RBASIC(arg.str)->klass = 0; + arg.wrapper = Data_Wrap_Struct(rb_cData, mark_dump_arg, 0, &arg); if (!NIL_P(port)) { if (!rb_respond_to(port, s_write)) { type_error: rb_raise(rb_eTypeError, "instance of IO needed"); } - arg->dest = port; + arg.dest = port; if (rb_respond_to(port, s_binmode)) { rb_funcall2(port, s_binmode, 0, 0); - check_dump_arg(arg, s_binmode); + check_dump_arg(&arg, s_binmode); } } else { - port = arg->str; + port = arg.str; } - w_byte(MARSHAL_MAJOR, arg); - w_byte(MARSHAL_MINOR, arg); + c_arg.obj = obj; + c_arg.arg = &arg; + c_arg.limit = limit; - w_object(obj, arg, limit); - if (arg->dest) { - rb_io_write(arg->dest, arg->str); - rb_str_resize(arg->str, 0); - } + w_byte(MARSHAL_MAJOR, &arg); + w_byte(MARSHAL_MINOR, &arg); - RBASIC(arg->str)->klass = rb_cString; - clear_dump_arg(arg); - RB_GC_GUARD(wrapper); + rb_ensure(dump, (VALUE)&c_arg, dump_ensure, (VALUE)&arg); + RBASIC(arg.str)->klass = rb_cString; return port; } @@ -813,6 +817,7 @@ st_table *data; VALUE proc; int taint; + VALUE wrapper; }; static void @@ -820,31 +825,22 @@ struct load_arg *arg; ID sym; { - if (!arg->symbols) { + if (!DATA_PTR(arg->wrapper)) { rb_raise(rb_eRuntimeError, "Marshal.load reentered at %s", rb_id2name(sym)); } } -static void clear_load_arg _((struct load_arg *arg)); - static void mark_load_arg(ptr) void *ptr; { struct load_arg *p = ptr; - if (!p->symbols) + if (!ptr) return; rb_mark_tbl(p->data); } -static void -free_load_arg(void *ptr) -{ - clear_load_arg(ptr); - xfree(ptr); -} - static VALUE r_object _((struct load_arg *arg)); static int @@ -1419,14 +1415,23 @@ return r_object0(arg, arg->proc, 0, Qnil); } -static void -clear_load_arg(arg) +static VALUE +load(arg) struct load_arg *arg; { - if (!arg->symbols) return; + return r_object(arg); +} + +static VALUE +load_ensure(arg) + struct load_arg *arg; +{ + if (!DATA_PTR(arg->wrapper)) return 0; st_free_table(arg->symbols); - arg->symbols = 0; st_free_table(arg->data); + DATA_PTR(arg->wrapper) = 0; + arg->wrapper = 0; + return 0; } /* @@ -1447,8 +1452,8 @@ { VALUE port, proc; int major, minor, taint = Qfalse; - VALUE v, wrapper; - struct load_arg *arg; + VALUE v; + struct load_arg arg; rb_scan_args(argc, argv, "11", &port, &proc); v = rb_check_string_type(port); @@ -1465,18 +1470,17 @@ else { rb_raise(rb_eTypeError, "instance of IO needed"); } - wrapper = Data_Make_Struct(rb_cData, struct load_arg, mark_load_arg, free_load_arg, arg); - arg->src = port; - arg->offset = 0; - arg->symbols = st_init_numtable(); - arg->data = st_init_numtable(); - arg->proc = 0; - arg->taint = taint; + arg.src = port; + arg.offset = 0; + arg.symbols = st_init_numtable(); + arg.data = st_init_numtable(); + arg.proc = 0; + arg.wrapper = Data_Wrap_Struct(rb_cData, mark_load_arg, 0, &arg); + arg.taint = taint; - major = r_byte(arg); - minor = r_byte(arg); + major = r_byte(&arg); + minor = r_byte(&arg); if (major != MARSHAL_MAJOR || minor > MARSHAL_MINOR) { - clear_load_arg(arg); rb_raise(rb_eTypeError, "incompatible marshal file format (can't be read)\n\ \tformat version %d.%d required; %d.%d given", MARSHAL_MAJOR, MARSHAL_MINOR, major, minor); @@ -1487,10 +1491,8 @@ MARSHAL_MAJOR, MARSHAL_MINOR, major, minor); } - if (!NIL_P(proc)) arg->proc = proc; - v = r_object(arg); - clear_load_arg(arg); - RB_GC_GUARD(wrapper); + if (!NIL_P(proc)) arg.proc = proc; + v = rb_ensure(load, (VALUE)&arg, load_ensure, (VALUE)&arg); return v; } Index: ruby_1_8_7/test/ruby/test_marshal.rb =================================================================== --- ruby_1_8_7/test/ruby/test_marshal.rb (revision 28405) +++ ruby_1_8_7/test/ruby/test_marshal.rb (revision 28406) @@ -72,34 +72,6 @@ assert_equal("marshal data too short", e.message) end - class DumpTest - def marshal_dump - loop { Thread.pass } - end - end - - class LoadTest - def marshal_dump - nil - end - def marshal_load(obj) - loop { Thread.pass } - end - end - - def test_context_switch - o = DumpTest.new - Thread.new { Marshal.dump(o) } - GC.start - assert(true, '[ruby-dev:39425]') - - o = LoadTest.new - m = Marshal.dump(o) - Thread.new { Marshal.load(m) } - GC.start - assert(true, '[ruby-dev:39425]') - end - def test_taint x = Object.new x.taint -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/