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 --- marshal.c | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) (limited to 'marshal.c') 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)) { -- cgit v1.2.3