summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-07-17 01:10:14 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-07-17 01:10:14 +0000
commit347e8c440ad0ee0a219852685f77ba07feddce5c (patch)
tree335ce653584a644bb41cd6c3463789a1c07d3bae
parent24eff272f19cd5d3c7a5930fade84bd9a040d2e5 (diff)
merge revision(s) 41077,41105: [Backport #8578]
* ext/date/date_core.c: fixed a bug [ruby-core:55295]. reported by Riley Lynch. * ext/date/date_core.c: fixed coding error [ruby-core:55337]. reported by Riley Lynch. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@42015 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog10
-rw-r--r--ext/date/date_core.c124
-rw-r--r--test/date/test_switch_hitter.rb53
-rw-r--r--version.h6
4 files changed, 137 insertions, 56 deletions
diff --git a/ChangeLog b/ChangeLog
index e5acd518a8..4ff0a4210e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+Wed Jul 17 09:59:33 2013 Tadayoshi Funaba <tadf@dotrb.org>
+
+ * ext/date/date_core.c: fixed coding error [ruby-core:55337].
+ reported by Riley Lynch.
+
+Wed Jul 17 09:59:33 2013 Tadayoshi Funaba <tadf@dotrb.org>
+
+ * ext/date/date_core.c: fixed a bug [ruby-core:55295]. reported
+ by Riley Lynch.
+
Thu Jul 11 10:07:15 2013 Kenta Murata <mrkn@mrkn.jp>
* ext/bigdecimal/bigdecimal.c (BigMath_s_exp): Fix for the cases when
diff --git a/ext/date/date_core.c b/ext/date/date_core.c
index 4048d1345d..634fe2f9d0 100644
--- a/ext/date/date_core.c
+++ b/ext/date/date_core.c
@@ -1,5 +1,5 @@
/*
- date_core.c: Coded by Tadayoshi Funaba 2010, 2011
+ date_core.c: Coded by Tadayoshi Funaba 2010-2013
*/
#include "ruby.h"
@@ -1109,6 +1109,28 @@ m_virtual_sg(union DateData *x)
return c_virtual_sg(x);
}
+#define canonicalize_jd(_nth, _jd) \
+{\
+ if (_jd < 0) {\
+ _nth = f_sub(_nth, INT2FIX(1));\
+ _jd += CM_PERIOD;\
+ }\
+ if (_jd >= CM_PERIOD) {\
+ _nth = f_add(_nth, INT2FIX(1));\
+ _jd -= CM_PERIOD;\
+ }\
+}
+
+inline static void
+canonicalize_s_jd(union DateData *x)
+{
+ int j = x->s.jd;
+ assert(have_jd_p(x));
+ canonicalize_jd(x->s.nth, x->s.jd);
+ if (x->s.jd != j)
+ x->flags &= ~HAVE_CIVIL;
+}
+
inline static void
get_s_jd(union DateData *x)
{
@@ -1194,6 +1216,16 @@ get_c_time(union DateData *x)
}
inline static void
+canonicalize_c_jd(union DateData *x)
+{
+ int j = x->c.jd;
+ assert(have_jd_p(x));
+ canonicalize_jd(x->c.nth, x->c.jd);
+ if (x->c.jd != j)
+ x->flags &= ~HAVE_CIVIL;
+}
+
+inline static void
get_c_jd(union DateData *x)
{
assert(complex_dat_p(x));
@@ -1366,6 +1398,19 @@ guess_style(VALUE y, double sg) /* -/+oo or zero */
return style;
}
+inline static void
+m_canonicalize_jd(union DateData *x)
+{
+ if (simple_dat_p(x)) {
+ get_s_jd(x);
+ canonicalize_s_jd(x);
+ }
+ else {
+ get_c_jd(x);
+ canonicalize_c_jd(x);
+ }
+}
+
inline static VALUE
m_nth(union DateData *x)
{
@@ -1972,7 +2017,7 @@ civil_to_jd(VALUE y, int m, int d, double sg,
*ry = FIX2INT(y);
else {
VALUE nth2;
- decode_year(y, ns ? -1 : +1, &nth2, ry);
+ decode_year(y, *ns ? -1 : +1, &nth2, ry);
}
}
else {
@@ -2007,7 +2052,7 @@ ordinal_to_jd(VALUE y, int d, double sg,
*ry = FIX2INT(y);
else {
VALUE nth2;
- decode_year(y, ns ? -1 : +1, &nth2, ry);
+ decode_year(y, *ns ? -1 : +1, &nth2, ry);
}
}
else {
@@ -2042,7 +2087,7 @@ commercial_to_jd(VALUE y, int w, int d, double sg,
*ry = FIX2INT(y);
else {
VALUE nth2;
- decode_year(y, ns ? -1 : +1, &nth2, ry);
+ decode_year(y, *ns ? -1 : +1, &nth2, ry);
}
}
else {
@@ -2077,7 +2122,7 @@ weeknum_to_jd(VALUE y, int w, int d, int f, double sg,
*ry = FIX2INT(y);
else {
VALUE nth2;
- decode_year(y, ns ? -1 : +1, &nth2, ry);
+ decode_year(y, *ns ? -1 : +1, &nth2, ry);
}
}
else {
@@ -2112,7 +2157,7 @@ nth_kday_to_jd(VALUE y, int m, int n, int k, double sg,
*ry = FIX2INT(y);
else {
VALUE nth2;
- decode_year(y, ns ? -1 : +1, &nth2, ry);
+ decode_year(y, *ns ? -1 : +1, &nth2, ry);
}
}
else {
@@ -2151,7 +2196,7 @@ valid_ordinal_p(VALUE y, int d, double sg,
*ry = FIX2INT(y);
else {
VALUE nth2;
- decode_year(y, ns ? -1 : +1, &nth2, ry);
+ decode_year(y, *ns ? -1 : +1, &nth2, ry);
}
}
else {
@@ -2190,7 +2235,7 @@ valid_civil_p(VALUE y, int m, int d, double sg,
*ry = FIX2INT(y);
else {
VALUE nth2;
- decode_year(y, ns ? -1 : +1, &nth2, ry);
+ decode_year(y, *ns ? -1 : +1, &nth2, ry);
}
}
else {
@@ -2226,7 +2271,7 @@ valid_commercial_p(VALUE y, int w, int d, double sg,
*ry = FIX2INT(y);
else {
VALUE nth2;
- decode_year(y, ns ? -1 : +1, &nth2, ry);
+ decode_year(y, *ns ? -1 : +1, &nth2, ry);
}
}
else {
@@ -2256,7 +2301,7 @@ valid_weeknum_p(VALUE y, int w, int d, int f, double sg,
*ry = FIX2INT(y);
else {
VALUE nth2;
- decode_year(y, ns ? -1 : +1, &nth2, ry);
+ decode_year(y, *ns ? -1 : +1, &nth2, ry);
}
}
else {
@@ -2287,7 +2332,7 @@ valid_nth_kday_p(VALUE y, int m, int n, int k, double sg,
*ry = FIX2INT(y);
else {
VALUE nth2;
- decode_year(y, ns ? -1 : +1, &nth2, ry);
+ decode_year(y, *ns ? -1 : +1, &nth2, ry);
}
}
else {
@@ -5569,15 +5614,7 @@ d_lite_plus(VALUE self, VALUE other)
jd = m_jd(dat);
else {
jd = m_jd(dat) + (int)t;
-
- if (jd < 0) {
- nth = f_sub(nth, INT2FIX(1));
- jd += CM_PERIOD;
- }
- else if (jd >= CM_PERIOD) {
- nth = f_add(nth, INT2FIX(1));
- jd -= CM_PERIOD;
- }
+ canonicalize_jd(nth, jd);
}
if (simple_dat_p(dat))
@@ -5630,14 +5667,7 @@ d_lite_plus(VALUE self, VALUE other)
jd = m_jd(dat);
else {
jd = m_jd(dat) + jd;
- if (jd < 0) {
- nth = f_sub(nth, INT2FIX(1));
- jd += CM_PERIOD;
- }
- else if (jd >= CM_PERIOD) {
- nth = f_add(nth, INT2FIX(1));
- jd -= CM_PERIOD;
- }
+ canonicalize_jd(nth, jd);
}
if (f_zero_p(nth))
@@ -5744,14 +5774,7 @@ d_lite_plus(VALUE self, VALUE other)
jd = m_jd(dat);
else {
jd = m_jd(dat) + jd;
- if (jd < 0) {
- nth = f_sub(nth, INT2FIX(1));
- jd += CM_PERIOD;
- }
- else if (jd >= CM_PERIOD) {
- nth = f_add(nth, INT2FIX(1));
- jd -= CM_PERIOD;
- }
+ canonicalize_jd(nth, jd);
}
if (f_zero_p(nth))
@@ -5854,14 +5877,7 @@ d_lite_plus(VALUE self, VALUE other)
jd = m_jd(dat);
else {
jd = m_jd(dat) + jd;
- if (jd < 0) {
- nth = f_sub(nth, INT2FIX(1));
- jd += CM_PERIOD;
- }
- else if (jd >= CM_PERIOD) {
- nth = f_add(nth, INT2FIX(1));
- jd -= CM_PERIOD;
- }
+ canonicalize_jd(nth, jd);
}
if (f_zero_p(nth))
@@ -5905,15 +5921,7 @@ minus_dd(VALUE self, VALUE other)
d = m_jd(adat) - m_jd(bdat);
df = m_df(adat) - m_df(bdat);
sf = f_sub(m_sf(adat), m_sf(bdat));
-
- if (d < 0) {
- n = f_sub(n, INT2FIX(1));
- d += CM_PERIOD;
- }
- else if (d >= CM_PERIOD) {
- n = f_add(n, INT2FIX(1));
- d -= CM_PERIOD;
- }
+ canonicalize_jd(n, d);
if (df < 0) {
d -= 1;
@@ -6299,6 +6307,8 @@ cmp_dd(VALUE self, VALUE other)
int a_jd, b_jd,
a_df, b_df;
+ m_canonicalize_jd(adat);
+ m_canonicalize_jd(bdat);
a_nth = m_nth(adat);
b_nth = m_nth(bdat);
if (f_eqeq_p(a_nth, b_nth)) {
@@ -6379,6 +6389,8 @@ d_lite_cmp(VALUE self, VALUE other)
VALUE a_nth, b_nth;
int a_jd, b_jd;
+ m_canonicalize_jd(adat);
+ m_canonicalize_jd(bdat);
a_nth = m_nth(adat);
b_nth = m_nth(bdat);
if (f_eqeq_p(a_nth, b_nth)) {
@@ -6413,6 +6425,8 @@ d_lite_cmp(VALUE self, VALUE other)
a_pd, b_pd;
#endif
+ m_canonicalize_jd(adat);
+ m_canonicalize_jd(bdat);
a_nth = m_nth(adat);
b_nth = m_nth(bdat);
if (f_eqeq_p(a_nth, b_nth)) {
@@ -6520,6 +6534,8 @@ d_lite_equal(VALUE self, VALUE other)
VALUE a_nth, b_nth;
int a_jd, b_jd;
+ m_canonicalize_jd(adat);
+ m_canonicalize_jd(bdat);
a_nth = m_nth(adat);
b_nth = m_nth(bdat);
a_jd = m_local_jd(adat);
@@ -6541,6 +6557,8 @@ d_lite_equal(VALUE self, VALUE other)
a_pd, b_pd;
#endif
+ m_canonicalize_jd(adat);
+ m_canonicalize_jd(bdat);
a_nth = m_nth(adat);
b_nth = m_nth(bdat);
if (f_eqeq_p(a_nth, b_nth)) {
diff --git a/test/date/test_switch_hitter.rb b/test/date/test_switch_hitter.rb
index 8431d40a29..be3346fd5a 100644
--- a/test/date/test_switch_hitter.rb
+++ b/test/date/test_switch_hitter.rb
@@ -472,6 +472,59 @@ class TestSH < Test::Unit::TestCase
period2_iter(+cm_period * (1 << 64) - 3, +cm_period * (1 << 64) + 3)
end
+ def test_different_alignments
+ assert_equal(0, Date.jd(0) <=> Date.civil(-4713, 11, 24, Date::GREGORIAN))
+ assert_equal(0, Date.jd(213447717) <=> Date.civil(579687, 11, 24))
+ assert_equal(0, Date.jd(-213447717) <=> Date.civil(-589113, 11, 24, Date::GREGORIAN))
+
+ assert_equal(0, Date.jd(0) <=> DateTime.civil(-4713, 11, 24, 0, 0, 0, 0, Date::GREGORIAN))
+ assert_equal(0, Date.jd(213447717) <=> DateTime.civil(579687, 11, 24))
+ assert_equal(0, Date.jd(-213447717) <=> DateTime.civil(-589113, 11, 24, 0, 0, 0, 0, Date::GREGORIAN))
+
+ assert(Date.jd(0) == Date.civil(-4713, 11, 24, Date::GREGORIAN))
+ assert(Date.jd(213447717) == Date.civil(579687, 11, 24))
+ assert(Date.jd(-213447717) == Date.civil(-589113, 11, 24, Date::GREGORIAN))
+
+ assert(Date.jd(0) == DateTime.civil(-4713, 11, 24, 0, 0, 0, 0, Date::GREGORIAN))
+ assert(Date.jd(213447717) == DateTime.civil(579687, 11, 24))
+ assert(Date.jd(-213447717) == DateTime.civil(-589113, 11, 24, 0, 0, 0, 0, Date::GREGORIAN))
+
+ assert(Date.jd(0) === Date.civil(-4713, 11, 24, Date::GREGORIAN))
+ assert(Date.jd(213447717) === Date.civil(579687, 11, 24))
+ assert(Date.jd(-213447717) === Date.civil(-589113, 11, 24, Date::GREGORIAN))
+
+ assert(Date.jd(0) === DateTime.civil(-4713, 11, 24, 12, 0, 0, 0, Date::GREGORIAN))
+ assert(Date.jd(213447717) === DateTime.civil(579687, 11, 24, 12))
+ assert(Date.jd(-213447717) === DateTime.civil(-589113, 11, 24, 12, 0, 0, 0, Date::GREGORIAN))
+
+ a = Date.jd(0)
+ b = Date.civil(-4713, 11, 24, Date::GREGORIAN)
+ assert_equal(0, a <=> b)
+
+ a = Date.civil(-4712, 1, 1, Date::JULIAN)
+ b = Date.civil(-4713, 11, 24, Date::GREGORIAN)
+ a.jd; b.jd
+ assert_equal(0, a <=> b)
+
+ a = Date.jd(0)
+ b = Date.civil(-4713, 11, 24, Date::GREGORIAN)
+ assert(a == b)
+
+ a = Date.civil(-4712, 1, 1, Date::JULIAN)
+ b = Date.civil(-4713, 11, 24, Date::GREGORIAN)
+ a.jd; b.jd
+ assert(a == b)
+
+ a = Date.jd(0)
+ b = Date.civil(-4713, 11, 24, Date::GREGORIAN)
+ assert(a === b)
+
+ a = Date.civil(-4712, 1, 1, Date::JULIAN)
+ b = Date.civil(-4713, 11, 24, Date::GREGORIAN)
+ a.jd; b.jd
+ assert(a === b)
+ end
+
def test_marshal
s = "\x04\bU:\tDate[\bU:\rRational[\ai\x03\xCF\xD3Ji\ai\x00o:\x13Date::Infinity\x06:\a@di\xFA"
d = Marshal.load(s)
diff --git a/version.h b/version.h
index 6a35f0b7e8..9ef7cae72f 100644
--- a/version.h
+++ b/version.h
@@ -1,10 +1,10 @@
#define RUBY_VERSION "1.9.3"
-#define RUBY_PATCHLEVEL 452
+#define RUBY_PATCHLEVEL 453
-#define RUBY_RELEASE_DATE "2013-07-11"
+#define RUBY_RELEASE_DATE "2013-07-17"
#define RUBY_RELEASE_YEAR 2013
#define RUBY_RELEASE_MONTH 7
-#define RUBY_RELEASE_DAY 11
+#define RUBY_RELEASE_DAY 17
#include "ruby/version.h"