diff --git a/ChangeLog b/ChangeLog index 45f38f925a..5507fc0aea 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Mon Jul 2 05:35:43 2012 Tadayoshi Funaba + + * ext/date/date_core.c (d_lite_marshal_load): accepts old dump. + Mon Jul 2 03:21:53 2012 Ayumu AIZAWA * README.EXT.ja: fixed args of have_struct_member() , diff --git a/ext/date/date_core.c b/ext/date/date_core.c index 82d078a0dd..8096fd7bfb 100644 --- a/ext/date/date_core.c +++ b/ext/date/date_core.c @@ -7272,15 +7272,26 @@ d_lite_marshal_load(VALUE self, VALUE a) rb_raise(rb_eTypeError, "expected an array"); switch (RARRAY_LEN(a)) { - case 3: + case 2: /* 1.6.x */ + case 3: /* 1.8.x, 1.9.2 */ { VALUE ajd, of, sg, nth, sf; int jd, df, rof; double rsg; - ajd = RARRAY_PTR(a)[0]; - of = RARRAY_PTR(a)[1]; - sg = RARRAY_PTR(a)[2]; + + if (RARRAY_LEN(a) == 2) { + ajd = f_sub(RARRAY_PTR(a)[0], half_days_in_day); + of = INT2FIX(0); + sg = RARRAY_PTR(a)[1]; + if (!k_numeric_p(sg)) + sg = DBL2NUM(RTEST(sg) ? GREGORIAN : JULIAN); + } + else { + ajd = RARRAY_PTR(a)[0]; + of = RARRAY_PTR(a)[1]; + sg = RARRAY_PTR(a)[2]; + } old_to_new(ajd, of, sg, &nth, &jd, &df, &sf, &rof, &rsg); @@ -7336,6 +7347,16 @@ d_lite_marshal_load(VALUE self, VALUE a) return self; } +/* :nodoc: */ +static VALUE +date_s__load(VALUE klass, VALUE s) +{ + VALUE a, obj; + + a = rb_marshal_load(s); + obj = d_lite_s_alloc(klass); + return d_lite_marshal_load(obj, a); +} /* datetime */ @@ -9674,6 +9695,7 @@ Init_date_core(void) #endif rb_define_method(cDate, "marshal_dump", d_lite_marshal_dump, 0); rb_define_method(cDate, "marshal_load", d_lite_marshal_load, 1); + rb_define_singleton_method(cDate, "_load", date_s__load, 1); /* datetime */ diff --git a/test/date/test_switch_hitter.rb b/test/date/test_switch_hitter.rb index 8431d40a29..273474eb86 100644 --- a/test/date/test_switch_hitter.rb +++ b/test/date/test_switch_hitter.rb @@ -472,7 +472,39 @@ class TestSH < Test::Unit::TestCase period2_iter(+cm_period * (1 << 64) - 3, +cm_period * (1 << 64) + 3) end - def test_marshal +=begin + def test_marshal14 + s = "\x04\x03u:\x01\x04Date\x01\v\x04\x03[\x01\x02i\x03\xE8i%T" + d = Marshal.load(s) + assert_equal(Rational(4903887,2), d.ajd) + assert_equal(0, d.send(:offset)) + assert_equal(Date::GREGORIAN, d.start) + end + + def test_marshal16 + s = "\x04\x06u:\tDate\x0F\x04\x06[\ai\x03\xE8i%T" + d = Marshal.load(s) + assert_equal(Rational(4903887,2), d.ajd) + assert_equal(0, d.send(:offset)) + assert_equal(Date::GREGORIAN, d.start) + end + + def test_marshal18 + s = "\x04\bu:\tDateP\x04\b[\bo:\rRational\a:\x0F@numeratori\x03\xCF\xD3J:\x11@denominatori\ai\x00o:\x13Date::Infinity\x06:\a@di\xFA" + d = Marshal.load(s) + assert_equal(Rational(4903887,2), d.ajd) + assert_equal(0, d.send(:offset)) + assert_equal(Date::GREGORIAN, d.start) + + s = "\x04\bu:\rDateTime`\x04\b[\bo:\rRational\a:\x0F@numeratorl+\b\xC9\xB0\x81\xBD\x02\x00:\x11@denominatori\x02\xC0\x12o;\x00\a;\x06i\b;\ai\ro:\x13Date::Infinity\x06:\a@di\xFA" + d = Marshal.load(s) + assert_equal(Rational(11769327817,4800), d.ajd) + assert_equal(Rational(9,24), d.offset) + assert_equal(Date::GREGORIAN, d.start) + end +=end + + def test_marshal192 s = "\x04\bU:\tDate[\bU:\rRational[\ai\x03\xCF\xD3Ji\ai\x00o:\x13Date::Infinity\x06:\a@di\xFA" d = Marshal.load(s) assert_equal(Rational(4903887,2), d.ajd)