summaryrefslogtreecommitdiff
path: root/marshal.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-04-10 08:41:46 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-04-10 08:41:46 +0000
commit7132a4f9798eada290b3bd22184ca7e43c551ccf (patch)
treef3a7a3af4d74d868654deea51d5bed572a01c7e8 /marshal.c
parent1d63f4eead83814d0881ad75373c64ade01d139f (diff)
* 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
Diffstat (limited to 'marshal.c')
-rw-r--r--marshal.c33
1 files changed, 18 insertions, 15 deletions
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)) {