diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | marshal.c | 33 | ||||
-rw-r--r-- | test/ruby/marshaltestlib.rb | 5 |
3 files changed, 28 insertions, 15 deletions
@@ -1,3 +1,8 @@ +Thu Apr 10 16:58:44 2008 Tanaka Akira <akr@fsij.org> + + * 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 <matz@ruby-lang.org> * lib/generator.rb: removed obsolete library. [ruby-core:16233] @@ -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 |