Skip to content

Commit

Permalink
* marshal.c (w_object): TYPE_USERDEF assigns id for ivars first.
Browse files Browse the repository at this point in the history
  [ruby-dev:34159] by nagachika.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15949 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
akr committed Apr 10, 2008
1 parent 1d63f4e commit 7132a4f
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 15 deletions.
5 changes: 5 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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]
Expand Down
33 changes: 18 additions & 15 deletions marshal.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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)) {
Expand Down
5 changes: 5 additions & 0 deletions test/ruby/marshaltestlib.rb
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,11 @@ def test_time_ivar
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
Expand Down

0 comments on commit 7132a4f

Please sign in to comment.