From 7132a4f9798eada290b3bd22184ca7e43c551ccf Mon Sep 17 00:00:00 2001 From: akr Date: Thu, 10 Apr 2008 08:41:46 +0000 Subject: * marshal.c (w_object): TYPE_USERDEF assigns id for ivars first. [ruby-dev:34159] by nagachika. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15949 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ marshal.c | 33 ++++++++++++++++++--------------- test/ruby/marshaltestlib.rb | 5 +++++ 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index ceb729712f..a139133812 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Thu Apr 10 16:58:44 2008 Tanaka Akira + + * marshal.c (w_object): TYPE_USERDEF assigns id for ivars first. + [ruby-dev:34159] by nagachika. + Thu Apr 10 15:03:47 2008 Yukihiro Matsumoto * lib/generator.rb: removed obsolete library. [ruby-core:16233] diff --git a/marshal.c b/marshal.c index 3242ac622a..bbe8ba0e27 100644 --- a/marshal.c +++ b/marshal.c @@ -574,24 +574,11 @@ w_object(VALUE obj, struct dump_arg *arg, int limit) else { if (OBJ_TAINTED(obj)) arg->taint = Qtrue; - st_add_direct(arg->data, obj, arg->data->num_entries); - - { - st_data_t compat_data; - rb_alloc_func_t allocator = rb_get_alloc_func(RBASIC(obj)->klass); - if (st_lookup(compat_allocator_tbl, - (st_data_t)allocator, - &compat_data)) { - marshal_compat_t *compat = (marshal_compat_t*)compat_data; - VALUE real_obj = obj; - obj = compat->dumper(real_obj); - st_insert(arg->compat_tbl, (st_data_t)obj, (st_data_t)real_obj); - } - } - if (rb_respond_to(obj, s_mdump)) { VALUE v; + st_add_direct(arg->data, obj, arg->data->num_entries); + v = rb_funcall(obj, s_mdump, 0, 0); w_class(TYPE_USRMARSHAL, obj, arg, Qfalse); w_object(v, arg, limit); @@ -618,9 +605,25 @@ w_object(VALUE obj, struct dump_arg *arg, int limit) else if (hasiv) { w_ivar(obj, ivtbl, &c_arg); } + st_add_direct(arg->data, obj, arg->data->num_entries); return; } + st_add_direct(arg->data, obj, arg->data->num_entries); + + { + st_data_t compat_data; + rb_alloc_func_t allocator = rb_get_alloc_func(RBASIC(obj)->klass); + if (st_lookup(compat_allocator_tbl, + (st_data_t)allocator, + &compat_data)) { + marshal_compat_t *compat = (marshal_compat_t*)compat_data; + VALUE real_obj = obj; + obj = compat->dumper(real_obj); + st_insert(arg->compat_tbl, (st_data_t)obj, (st_data_t)real_obj); + } + } + switch (BUILTIN_TYPE(obj)) { case T_CLASS: if (FL_TEST(obj, FL_SINGLETON)) { diff --git a/test/ruby/marshaltestlib.rb b/test/ruby/marshaltestlib.rb index 211bbd8796..0a70380d44 100644 --- a/test/ruby/marshaltestlib.rb +++ b/test/ruby/marshaltestlib.rb @@ -383,6 +383,11 @@ module MarshalTestLib marshal_equal(o1) {|o| o.instance_eval { @iv }} end + def test_time_in_array + t = Time.now + assert_equal([t,t], Marshal.load(Marshal.dump([t, t])), "[ruby-dev:34159]") + end + def test_true marshal_equal(true) end -- cgit v1.2.3