diff --git a/ChangeLog b/ChangeLog index 5b62831f8d..78ec8324fa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Tue Mar 30 20:25:34 2004 Tanaka Akira + + * time.c (search_time_t): limit guess range by mktime if it is + availabe. + Tue Mar 30 18:19:00 2004 Nobuyoshi Nakada * eval.c (rb_eval): fix SEGV at retry in iterator's receiver. diff --git a/test/ruby/test_time.rb b/test/ruby/test_time.rb index 0be7a7da96..000fd2e1b8 100644 --- a/test/ruby/test_time.rb +++ b/test/ruby/test_time.rb @@ -23,4 +23,14 @@ class TestTime < Test::Unit::TestCase assert_equal(Time.utc(2000, 3, 21, 0, 30) \ -Time.utc(2000, 3, 21, 3, 30), -3*3600) end + + def test_negative + begin + Time.at(-1) + rescue ArgumentError + return + end + assert_equal(-1, Time.utc(1969, 12, 31, 23, 59, 59).tv_sec) + assert_equal(-2, Time.utc(1969, 12, 31, 23, 59, 58).tv_sec) + end end diff --git a/time.c b/time.c index 0e9fb2faac..8ae8c05a29 100644 --- a/time.c +++ b/time.c @@ -444,6 +444,15 @@ search_time_t(tptr, utc_p) (1UL << (8 * sizeof(time_t) - 1)) - 1 : ~(time_t)0; +#if defined(HAVE_MKTIME) + if ((guess = mktime(tptr)) != -1) { + if (guess_lo < guess - 24 * 60 * 60) + guess_lo = guess - 24 * 60 * 60; + if (guess + 24 * 60 * 60 < guess_hi) + guess_hi = guess + 24 * 60 * 60; + } +#endif + tm = (utc_p ? gmtime : localtime)(&guess_lo); if (!tm) goto error; d = tmcmp(tptr, tm);