1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

[ruby/date] Fix cannot load complex into simple error when loading marshal dump (Fixes #20)

This problem exists because Marshal.load calls Date.allocate, which
uses a SimpleDateData.  There doesn't seem to be any support for
taking an existing Date instance and converting it from SimpleDateData
to ComplexDateData.  Work around this issue by making Date.allocate
use a ComplexDateData.  This causes problems in Date#initialize,
so remove the Date#initialize method (keeping the date_initialize
function, used internally for Date.civil). Alias Date.new to
Date.civil, since they do the same thing.

https://github.com/ruby/date/commit/6bb8d8fa0f
This commit is contained in:
Jeremy Evans 2020-06-11 11:40:45 -07:00 committed by Nobuyoshi Nakada
parent d1af2345c9
commit ad156f7e2c
No known key found for this signature in database
GPG key ID: 7CD2805BFA3770C6
2 changed files with 9 additions and 2 deletions

View file

@ -9318,7 +9318,7 @@ Init_date_core(void)
*/
rb_define_const(cDate, "GREGORIAN", DBL2NUM(GREGORIAN));
rb_define_alloc_func(cDate, d_lite_s_alloc_simple);
rb_define_alloc_func(cDate, d_lite_s_alloc_complex);
#ifndef NDEBUG
rb_define_private_method(CLASS_OF(cDate), "_valid_jd?",
@ -9368,6 +9368,7 @@ Init_date_core(void)
rb_define_singleton_method(cDate, "jd", date_s_jd, -1);
rb_define_singleton_method(cDate, "ordinal", date_s_ordinal, -1);
rb_define_singleton_method(cDate, "civil", date_s_civil, -1);
rb_define_singleton_method(cDate, "new", date_s_civil, -1);
rb_define_singleton_method(cDate, "commercial", date_s_commercial, -1);
#ifndef NDEBUG
@ -9395,7 +9396,6 @@ Init_date_core(void)
rb_define_singleton_method(cDate, "_jisx0301", date_s__jisx0301, 1);
rb_define_singleton_method(cDate, "jisx0301", date_s_jisx0301, -1);
rb_define_method(cDate, "initialize", date_initialize, -1);
rb_define_method(cDate, "initialize_copy", d_lite_initialize_copy, 1);
#ifndef NDEBUG

View file

@ -39,6 +39,13 @@ class TestDateMarshal < Test::Unit::TestCase
assert(d.frozen?)
expected_error = defined?(FrozenError) ? FrozenError : RuntimeError
assert_raise(expected_error){d.marshal_load(a)}
d = Date.new + 1/2r + 2304/65437r/86400
m = Marshal.dump(d)
d2 = Marshal.load(m)
assert_equal(d, d2)
assert_equal(d.start, d2.start)
assert_instance_of(String, d2.to_s)
end
def test_memsize