Project

General

Profile

Feature #4529

date_core と long 型

Added by naruse (Yui NARUSE) over 8 years ago. Updated over 8 years ago.

Status:
Rejected
Priority:
Normal
Target version:
-
[ruby-dev:43355]

Description

=begin
おそらく既にご存じの通り、最近 date_core も含めて ext 中の shorten-64-to-32 を直しています。
それに際して date_core をいじっていて気づいたのですが、ユリウス日や年を long で保持したり int で保持したりしています。

int と long が混在していると、long から int へのキャスト時にオーバーフローが起こりえますし、
そもそも long は

  • 環境によってサイズが違う (int も 理屈の上では違うはずだが、CRuby では 32bit しか確認してない)
  • long は mswin64 でだけポインタとサイズが違うので、Unix な人には気づきづらいバグの温床になる というような懸念があるので、特に理由が無いのであれば、int にするか、int64_t にするかした方がよいかと思います。 (CRuby は C90 だが、int64_t を configure で定義している)

例えば int に統一する場合のパッチは以下の通りです

=end

History

Updated by naruse (Yui NARUSE) over 8 years ago

=begin

diff --git a/ext/date/date_core.c b/ext/date/date_core.c
index c20079b..75c20d3 100644
--- a/ext/date/date_core.c
+++ b/ext/date/date_core.c
@@ -59,7 +59,7 @@ union DateData
} r;
struct {
unsigned flags;

  • long jd; /* as utc */
  • int jd; /* as utc / double sg; / decoded as utc=local */ int year; @@ -80,9 +80,9 @@ union DateTimeData } r; struct { unsigned flags;
  • long jd; /* as utc */
  • int jd; /* as utc / int df; / as utc, in secs */
  • long sf; /* in nano secs */
  • int sf; /* in nano secs / int of; / in secs / double sg; / decoded as local */ @@ -185,10 +185,10 @@ static VALUE cDate, cDateTime; static VALUE rzero, rhalf, day_in_nanoseconds;

static int valid_civil_p(int y, int m, int d, double sg,

  • int *rm, int *rd, long *rjd, int *ns);
  • int *rm, int *rd, int *rjd, int *ns);

static int
-find_fdoy(int y, double sg, long *rjd, int *ns)
+find_fdoy(int y, double sg, int *rjd, int *ns)
{
int d, rm, rd;

@@ -199,7 +199,7 @@ find_fdoy(int y, double sg, long *rjd, int *ns)
}

static int
-find_ldoy(int y, double sg, long *rjd, int *ns)
+find_ldoy(int y, double sg, int *rjd, int *ns)
{
int i, rm, rd;

@@ -211,7 +211,7 @@ find_ldoy(int y, double sg, long *rjd, int *ns)

#ifndef NDEBUG
static int
-find_fdom(int y, int m, double sg, long *rjd, int *ns)
+find_fdom(int y, int m, double sg, int *rjd, int *ns)
{
int d, rm, rd;

@@ -223,7 +223,7 @@ find_fdom(int y, int m, double sg, long *rjd, int *ns)
#endif

static int
-find_ldom(int y, int m, double sg, long *rjd, int *ns)
+find_ldom(int y, int m, double sg, int *rjd, int *ns)
{
int i, rm, rd;

@@ -234,7 +234,7 @@ find_ldom(int y, int m, double sg, long *rjd, int *ns)
}

static void
-civil_to_jd(int y, int m, int d, double sg, long *rjd, int *ns)
+civil_to_jd(int y, int m, int d, double sg, int *rjd, int *ns)
{
double a, b, jd;

@@ -254,11 +254,11 @@ civil_to_jd(int y, int m, int d, double sg, long *rjd, int *ns)
else
*ns = 1;

  • *rjd = (long)jd;
  • *rjd = jd; }

static void
-jd_to_civil(long jd, double sg, int *ry, int *rm, int *rdom)
+jd_to_civil(int jd, double sg, int *ry, int *rm, int *rdom)
{
double x, a, b, c, d, e, y, m, dom;

@@ -288,7 +288,7 @@ jd_to_civil(long jd, double sg, int *ry, int *rm, int *rdom)
}

static void
-ordinal_to_jd(int y, int d, double sg, long *rjd, int *ns)
+ordinal_to_jd(int y, int d, double sg, int *rjd, int *ns)
{
int ns2;

@@ -298,20 +298,20 @@ ordinal_to_jd(int y, int d, double sg, long *rjd, int *ns)
}

static void
-jd_to_ordinal(long jd, double sg, int *ry, int *rd)
+jd_to_ordinal(int jd, double sg, int *ry, int *rd)
{
int rm2, rd2, ns;

  • long rjd;
  • int rjd;

    jd_to_civil(jd, sg, ry, &rm2, &rd2);
    find_fdoy(*ry, sg, &rjd, &ns);

  • *rd = (int)(jd - rjd) + 1;

  • *rd = jd - rjd + 1;
    }

static void
-commercial_to_jd(int y, int w, int d, double sg, long *rjd, int *ns)
+commercial_to_jd(int y, int w, int d, double sg, int *rjd, int *ns)
{

  • long rjd2;
  • int rjd2;
    int ns2;

    find_fdoy(y, sg, &rjd2, &ns2);
    @@ -324,10 +324,10 @@ commercial_to_jd(int y, int w, int d, double sg, long *rjd, int *ns)
    }

static void
-jd_to_commercial(long jd, double sg, int *ry, int *rw, int *rd)
+jd_to_commercial(int jd, double sg, int *ry, int *rw, int *rd)
{
int ry2, rm2, rd2, a, ns2;

  • long rjd2;
  • int rjd2;

    jd_to_civil(jd - 3, sg, &ry2, &rm2, &rd2);
    a = ry2;
    @@ -346,9 +346,9 @@ jd_to_commercial(long jd, double sg, int *ry, int *rw, int *rd)

#ifndef NDEBUG
static void
-weeknum_to_jd(int y, int w, int d, int f, double sg, long *rjd, int *ns)
+weeknum_to_jd(int y, int w, int d, int f, double sg, int *rjd, int *ns)
{

  • long rjd2;
  • int rjd2;
    int ns2;

    find_fdoy(y, sg, &rjd2, &ns2);
    @@ -359,10 +359,10 @@ weeknum_to_jd(int y, int w, int d, int f, double sg, long *rjd, int *ns)
    #endif

static void
-jd_to_weeknum(long jd, int f, double sg, int *ry, int *rw, int *rd)
+jd_to_weeknum(int jd, int f, double sg, int *ry, int *rw, int *rd)
{
int rm, rd2, ns;

  • long rjd, j;
  • int rjd, j;

    jd_to_civil(jd, sg, ry, &rm, &rd2);
    find_fdoy(*ry, sg, &rjd, &ns);
    @@ -374,9 +374,9 @@ jd_to_weeknum(long jd, int f, double sg, int *ry, int *rw, int *rd)

#ifndef NDEBUG
static void
-nth_kday_to_jd(int y, int m, int n, int k, double sg, long *rjd, int *ns)
+nth_kday_to_jd(int y, int m, int n, int k, double sg, int *rjd, int *ns)
{

  • long rjd2;
  • int rjd2;
    int ns2;

    if (n > 0) {
    @@ -393,13 +393,13 @@ nth_kday_to_jd(int y, int m, int n, int k, double sg, long *rjd, int *ns)
    #endif

#ifndef NDEBUG
-inline static int jd_to_wday(long jd);
+inline static int jd_to_wday(int jd);

static void
-jd_to_nth_kday(long jd, double sg, int *ry, int *rm, int *rn, int *rk)
+jd_to_nth_kday(int jd, double sg, int *ry, int *rm, int *rn, int *rk)
{
int rd, ns2;

  • long rjd;
  • int rjd;

    jd_to_civil(jd, sg, ry, rm, &rd);
    find_fdom(*ry, *rm, sg, &rjd, &ns2);
    @@ -410,12 +410,12 @@ jd_to_nth_kday(long jd, double sg, int *ry, int *rm, int *rn, int *rk)

static int
valid_ordinal_p(int y, int d, double sg,

  • int *rd, long *rjd, int *ns)
  •  int *rd, int *rjd, int *ns)
    

    {
    int ry2, rd2;

    if (d < 0) {

  • long rjd2;

  • int rjd2;
    int ns2;

    if (!find_ldoy(y, sg, &rjd2, &ns2))
    @@ -469,7 +469,7 @@ valid_gregorian_p(int y, int m, int d, int *rm, int *rd)

static int
valid_civil_p(int y, int m, int d, double sg,

  • int *rm, int *rd, long *rjd, int *ns)
  • int *rm, int *rd, int *rjd, int *ns) { int ry;

@@ -492,14 +492,14 @@ valid_civil_p(int y, int m, int d, double sg,

static int
valid_commercial_p(int y, int w, int d, double sg,

  • int *rw, int *rd, long *rjd, int *ns)
  •     int *rw, int *rd, int *rjd, int *ns)
    

    {
    int ns2, ry2, rw2, rd2;

    if (d < 0)
    d += 8;
    if (w < 0) {

  • long rjd2;

  • int rjd2;

    commercial_to_jd(y + 1, 1, 1, sg, &rjd2, &ns2);
    jd_to_commercial(rjd2 + w * 7, sg, &ry2, &rw2, &rd2);
    @@ -554,8 +554,8 @@ df_utc_to_local(int df, int of)
    return df;
    }

-inline static long
-jd_local_to_utc(long jd, int df, int of)
+inline static int
+jd_local_to_utc(int jd, int df, int of)
{
df -= of;
if (df < 0)
@@ -565,8 +565,8 @@ jd_local_to_utc(long jd, int df, int of)
return jd;
}

-inline static long
-jd_utc_to_local(long jd, int df, int of)
+inline static int
+jd_utc_to_local(int jd, int df, int of)
{
df += of;
if (df < 0)
@@ -583,7 +583,7 @@ time_to_df(int h, int min, int s)
}

inline static int
-jd_to_wday(long jd)
+jd_to_wday(int jd)
{
return (int)MOD(jd + 1, 7);
}
@@ -651,7 +651,7 @@ inline static void
get_d_jd(union DateData *x)
{
if (!have_jd_p(x)) {

  • long jd;
  • int jd;
    int ns;

    assert(have_civil_p(x));
    @@ -711,7 +711,7 @@ inline static void
    get_dt_jd(union DateTimeData *x)
    {
    if (!have_jd_p(x)) {

  • long jd;

  • int jd;
    int ns;

    assert(have_civil_p(x));
    @@ -730,7 +730,7 @@ inline static void
    get_dt_civil(union DateTimeData *x)
    {
    if (!have_civil_p(x)) {

  • long jd;

  • int jd;
    int y, m, d;

    assert(have_jd_p(x));
    @@ -745,7 +745,7 @@ get_dt_civil(union DateTimeData *x)
    }
    }

-inline static long
+inline static int
local_jd(union DateTimeData *x)
{
assert(have_jd_p(x));
@@ -835,7 +835,7 @@ date_s_valid_civil_p(int argc, VALUE *argv, VALUE klass)
return Qtrue;
}
else {

  • long jd;
  • int jd;
    int ns;

    if (!valid_civil_p(y, m, d, sg, &rm, &rd, &jd, &ns))
    @@ -876,7 +876,7 @@ date_s_valid_ordinal_p(int argc, VALUE *argv, VALUE klass)
    }

    {

  • long jd;

  • int jd;
    int ns;

    if (!valid_ordinal_p(y, d, sg, &rd, &jd, &ns))
    @@ -921,7 +921,7 @@ date_s_valid_commercial_p(int argc, VALUE *argv, VALUE klass)
    }

    {

  • long jd;

  • int jd;
    int ns;

    if (!valid_commercial_p(y, w, d, sg, &rw, &rd, &jd, &ns))
    @@ -960,7 +960,7 @@ d_right_s_new_internal(VALUE klass, VALUE ajd, VALUE of, VALUE sg,
    }

inline static VALUE
-d_lite_s_new_internal(VALUE klass, long jd, double sg,
+d_lite_s_new_internal(VALUE klass, int jd, double sg,
int y, int m, int d, unsigned flags)
{
union DateData *dat;
@@ -979,7 +979,7 @@ d_lite_s_new_internal(VALUE klass, long jd, double sg,
}

static VALUE
-d_lite_s_new_internal_wo_civil(VALUE klass, long jd, double sg,
+d_lite_s_new_internal_wo_civil(VALUE klass, int jd, double sg,
unsigned flags)
{
return d_lite_s_new_internal(klass, jd, sg, 0, 0, 0, flags);
@@ -1012,7 +1012,7 @@ static VALUE
d_lite_s_new_l_bang(int argc, VALUE *argv, VALUE klass)
{
VALUE vjd, vsg;

  • long jd;
  • int jd;
    double sg;

    rb_scan_args(argc, argv, "02", &vjd, &vsg);
    @@ -1022,7 +1022,7 @@ d_lite_s_new_l_bang(int argc, VALUE *argv, VALUE klass)
    else {
    if (!FIXNUM_P(vjd))
    rb_raise(rb_eArgError, "cannot create");

  • jd = NUM2LONG(vjd);

  • jd = NUM2INT(vjd);
    if (!LIGHTABLE_JD(jd))
    rb_raise(rb_eArgError, "cannot create");
    }
    @@ -1062,7 +1062,7 @@ static VALUE
    date_s_jd(int argc, VALUE *argv, VALUE klass)
    {
    VALUE vjd, vsg;

  • long jd;

  • int jd;
    double sg;

    rb_scan_args(argc, argv, "02", &vjd, &vsg);
    @@ -1076,7 +1076,7 @@ date_s_jd(int argc, VALUE *argv, VALUE klass)
    sg = ITALY;

    if (argc >= 1) {

  • jd = NUM2LONG(vjd);

  • jd = NUM2INT(vjd);
    if (!LIGHTABLE_JD(jd))
    return cforwardv("jd_r");
    }
    @@ -1136,7 +1136,7 @@ date_s_ordinal(int argc, VALUE *argv, VALUE klass)
    }

    {

  • long jd;

  • int jd;
    int ns;

    if (!valid_ordinal_p(y, d, sg, &rd, &jd, &ns))
    @@ -1212,7 +1212,7 @@ date_s_civil(int argc, VALUE *argv, VALUE klass)
    LIGHT_MODE | HAVE_CIVIL);
    }
    else {

  • long jd;

  • int jd;
    int ns;

    if (!valid_civil_p(y, m, d, sg, &rm, &rd, &jd, &ns))
    @@ -1281,7 +1281,7 @@ date_s_commercial(int argc, VALUE *argv, VALUE klass)
    }

    {

  • long jd;

  • int jd;
    int ns;

    if (!valid_commercial_p(y, w, d, sg, &rw, &rd, &jd, &ns))
    @@ -1321,7 +1321,7 @@ date_s_today(int argc, VALUE *argv, VALUE klass)
    double sg;
    time_t t;
    struct tm tm;

  • long y;

  • int y;
    int m, d;

    rb_scan_args(argc, argv, "01", &vsg);
    @@ -1343,15 +1343,15 @@ date_s_today(int argc, VALUE *argv, VALUE klass)
    rb_raise(rb_eArgError, "cannot create");

    if (isinf(sg) && sg < 0)

  • return d_lite_s_new_internal(klass, 0, sg, (int)y, m, d,

  • return d_lite_s_new_internal(klass, 0, sg, y, m, d,
    LIGHT_MODE | HAVE_CIVIL);
    else {

  • long jd;

  • int jd;
    int ns;

  • civil_to_jd((int)y, m, d, sg, &jd, &ns);

  • civil_to_jd(y, m, d, sg, &jd, &ns);

  • return d_lite_s_new_internal(klass, jd, sg, (int)y, m, d,

  • return d_lite_s_new_internal(klass, jd, sg, y, m, d,
    LIGHT_MODE | HAVE_JD | HAVE_CIVIL);
    }
    }
    @@ -1388,7 +1388,7 @@ d_lite_amjd(VALUE self)
    return iforward0("amjd_r");
    {
    get_d_jd(dat);

  • return rb_rational_new1(LONG2NUM(dat->l.jd - 2400001L));

  • return rb_rational_new1(INT2NUM(dat->l.jd - 2400001));
    }
    }

@@ -1424,7 +1424,7 @@ d_lite_mjd(VALUE self)
return iforward0("mjd_r");
{
get_d_jd(dat);

  • return LONG2NUM(dat->l.jd - 2400001L);
  • return INT2NUM(dat->l.jd - 2400001); } }

@@ -1442,7 +1442,7 @@ d_lite_ld(VALUE self)
return iforward0("ld_r");
{
get_d_jd(dat);

  • return LONG2NUM(dat->l.jd - 2299160L);
  • return INT2NUM(dat->l.jd - 2299160); } }

@@ -1920,11 +1920,11 @@ d_lite_plus(VALUE self, VALUE other)
switch (TYPE(other)) {
case T_FIXNUM:
{

  • long jd;
  •  int jd;
    
    get_d_jd(dat);
    
  •  jd = dat->l.jd + FIX2LONG(other);
    
  •  jd = dat->l.jd + FIX2INT(other);
    
    if (LIGHTABLE_JD(jd) && jd >= dat->l.sg)
    return d_lite_s_new_internal(CLASS_OF(self),
    

    @@ -1936,7 +1936,7 @@ d_lite_plus(VALUE self, VALUE other)
    case T_FLOAT:
    {
    double d = NUM2DBL(other);

  •  long l = round(d);
    
  •  int l = round(d);
    if (l == d && LIGHTABLE_JD(l))
    return d_lite_plus(self, INT2FIX(l));
    

    }
    @@ -1952,7 +1952,7 @@ minus_dd(VALUE self, VALUE other)

    if (light_mode_p(adat) &&
    light_mode_p(bdat)) {

  • long d, sf;

  • int d, sf;
    int df;
    VALUE r;

@@ -1980,7 +1980,7 @@ minus_dd(VALUE self, VALUE other)
df += 1;
sf -= SECOND_IN_NANOSECONDS;
}

  • r = rb_rational_new1(LONG2NUM(d));
  • r = rb_rational_new1(INT2NUM(d));
    if (df)
    r = f_add(r, rb_rational_new2(INT2FIX(df),
    INT2FIX(DAY_IN_SECONDS)));
    @@ -2017,13 +2017,13 @@ d_lite_minus(VALUE self, VALUE other)

    if (light_mode_p(adat) &&
    light_mode_p(bdat)) {

  •  long d;
    
  •  int d;
    
    get_d_jd(adat);
    get_d_jd(bdat);
    
    d = adat->l.jd - bdat->l.jd;
    
  •  return rb_rational_new1(LONG2NUM(d));
    
  •  return rb_rational_new1(INT2NUM(d));
    

    }
    }

@@ -2397,7 +2397,7 @@ d_lite_set_vtm_and_timev(VALUE self, struct vtm *vtm, VALUE *timev)
get_d_jd(dat);
get_d_civil(dat);

  • vtm->year = LONG2NUM(dat->l.year);
  • vtm->year = INT2NUM(dat->l.year); vtm->mon = dat->l.mon; vtm->mday = dat->l.mday; vtm->hour = 0; @@ -2423,7 +2423,7 @@ date_strftime_internal(int argc, VALUE *argv, VALUE self, { VALUE vfmt; const char *fmt;
  • long len;
  • int len; char buffer[SMALLBUF], *buf = buffer; struct vtm vtm; VALUE timev; @@ -2501,7 +2501,7 @@ d_lite_marshal_dump(VALUE self) a = rb_ary_new3(3, dat->r.ajd, dat->r.of, dat->r.sg); else { get_d_jd(dat);
  • a = rb_assoc_new(LONG2NUM(dat->l.jd), DBL2NUM(dat->l.sg));
  • a = rb_assoc_new(INT2NUM(dat->l.jd), DBL2NUM(dat->l.sg));
    }

    if (FL_TEST(self, FL_EXIVAR)) {
    @@ -2535,7 +2535,7 @@ d_lite_marshal_load(VALUE self, VALUE a)
    dat->r.flags = 0;
    break;
    case 2:

  • dat->l.jd = NUM2LONG(RARRAY_PTR(a)[0]);

  • dat->l.jd = NUM2INT(RARRAY_PTR(a)[0]);
    dat->l.sg = NUM2DBL(RARRAY_PTR(a)[1]);
    dat->l.year = 0;
    dat->l.mon = 0;
    @@ -2567,8 +2567,8 @@ d_right_cache(VALUE self)
    /* datetime light */

inline static VALUE
-dt_lite_s_new_internal(VALUE klass, long jd, int df,

  • long sf, int of, double sg, +dt_lite_s_new_internal(VALUE klass, int jd, int df,
  • int sf, int of, double sg, int y, int m, int d, int h, int min, int s, unsigned flags) @@ -2595,8 +2595,8 @@ dt_lite_s_new_internal(VALUE klass, long jd, int df, }

static VALUE
-dt_lite_s_new_internal_wo_civil(VALUE klass, long jd, int df,

  • long sf, int of, double sg, +dt_lite_s_new_internal_wo_civil(VALUE klass, int jd, int df,
  • int sf, int of, double sg, unsigned flags) { return dt_lite_s_new_internal(klass, jd, df, sf, of, sg, @@ -2613,7 +2613,7 @@ static VALUE dt_lite_s_new_l_bang(int argc, VALUE *argv, VALUE klass) { VALUE vjd, vdf, vsf, vof, vsg;
  • long jd;
  • int jd;

    rb_scan_args(argc, argv, "05", &vjd, &vdf, &vsf, &vof, &vsg);

@@ -2633,7 +2633,7 @@ dt_lite_s_new_l_bang(int argc, VALUE *argv, VALUE klass)
!FIXNUM_P(vsf) ||
!FIXNUM_P(vof))
rb_raise(rb_eArgError, "cannot create");

  • jd = NUM2LONG(vjd);
  • jd = NUM2INT(vjd); if (!LIGHTABLE_JD(jd)) rb_raise(rb_eArgError, "cannot create");

@@ -2674,7 +2674,7 @@ static VALUE
datetime_s_jd(int argc, VALUE *argv, VALUE klass)
{
VALUE vjd, vh, vmin, vs, vof, vsg;

  • long jd;
  • int jd; int h, min, s, rh, rmin, rs, rof; double sg;

@@ -2703,7 +2703,7 @@ datetime_s_jd(int argc, VALUE *argv, VALUE klass)
case 2:
h = NUM2INT(vh);
case 1:

  • jd = NUM2LONG(vjd);
  • jd = NUM2INT(vjd);
    if (!LIGHTABLE_JD(jd))
    return cforwardv("jd_r");
    }
    @@ -2788,7 +2788,7 @@ datetime_s_ordinal(int argc, VALUE *argv, VALUE klass)
    }

    {

  • long jd;

  • int jd;
    int ns;

    if (!valid_ordinal_p(y, d, sg, &rd, &jd, &ns))
    @@ -2890,7 +2890,7 @@ datetime_s_civil(int argc, VALUE *argv, VALUE klass)
    LIGHT_MODE | HAVE_CIVIL | HAVE_TIME);
    }
    else {

  • long jd;

  • int jd;
    int ns;

    if (!valid_civil_p(y, m, d, sg, &rm, &rd, &jd, &ns))
    @@ -2983,7 +2983,7 @@ datetime_s_commercial(int argc, VALUE *argv, VALUE klass)
    }

    {

  • long jd;

  • int jd;
    int ns;

    if (!valid_commercial_p(y, w, d, sg, &rw, &rd, &jd, &ns))
    @@ -3024,7 +3024,7 @@ datetime_s_now(int argc, VALUE *argv, VALUE klass)
    #endif
    time_t sec;
    struct tm tm;

  • long y, sf;

  • int y, sf;
    int m, d, h, min, s, of;

    rb_scan_args(argc, argv, "01", &vsg);
    @@ -3059,9 +3059,9 @@ datetime_s_now(int argc, VALUE *argv, VALUE klass)
    of = (int)-timezone;
    #endif
    #ifdef HAVE_CLOCK_GETTIME

  • sf = ts.tv_nsec;

  • sf = (int)ts.tv_nsec;
    #else

  • sf = tv.tv_usec * 1000;

  • sf = (int)tv.tv_usec * 1000;
    #endif

    if (!LIGHTABLE_YEAR(y))
    @@ -3069,20 +3069,20 @@ datetime_s_now(int argc, VALUE *argv, VALUE klass)

    if (isinf(sg) && sg < 0)
    return dt_lite_s_new_internal(klass, 0, 0, sf, of, sg,

  •                (int)y, m, d, h, min, s,
    
  •                y, m, d, h, min, s,
                  LIGHT_MODE | HAVE_CIVIL | HAVE_TIME);
    

    else {

  • long jd;

  • int jd;
    int ns;

  • civil_to_jd((int)y, m, d, sg, &jd, &ns);

  • civil_to_jd(y, m, d, sg, &jd, &ns);

    return dt_lite_s_new_internal(klass,
    jd_local_to_utc(jd,
    time_to_df(h, min, s),
    of),
    0, sf, of, sg,

  •                (int)y, m, d, h, min, s,
    
  •                y, m, d, h, min, s,
                  LIGHT_MODE | HAVE_JD |
                  HAVE_CIVIL | HAVE_TIME);
    

    }
    @@ -3133,7 +3133,7 @@ dt_lite_amjd(VALUE self)

    get_dt_jd(dat);
    get_dt_df(dat);

  • r = rb_rational_new1(LONG2NUM(dat->l.jd - 2400001L));

  • r = rb_rational_new1(INT2NUM(dat->l.jd - 2400001));
    if (dat->l.df)
    r = f_add(r, rb_rational_new2(INT2FIX(dat->l.df),
    INT2FIX(DAY_IN_SECONDS)));
    @@ -3178,7 +3178,7 @@ dt_lite_mjd(VALUE self)
    {
    get_dt_jd(dat);
    get_dt_df(dat);

  • return LONG2NUM(local_jd(dat) - 2400001L);

  • return INT2NUM(local_jd(dat) - 2400001);
    }
    }

@@ -3197,7 +3197,7 @@ dt_lite_ld(VALUE self)
{
get_dt_jd(dat);
get_dt_df(dat);

  • return LONG2NUM(local_jd(dat) - 2299160L);
  • return INT2NUM(local_jd(dat) - 2299160); } }

@@ -3706,13 +3706,13 @@ dt_lite_plus(VALUE self, VALUE other)
switch (TYPE(other)) {
case T_FIXNUM:
{

  • long jd;
  •  int jd;
    
    get_dt1(self);
    get_dt_jd(dat);
    get_dt_df(dat);
    
  •  jd = dat->l.jd + FIX2LONG(other);
    
  •  jd = dat->l.jd + FIX2INT(other);
    
    if (LIGHTABLE_JD(jd) && jd >= dat->l.sg)
    return dt_lite_s_new_internal(CLASS_OF(self),
    

    @@ -3730,7 +3730,7 @@ dt_lite_plus(VALUE self, VALUE other)
    break;
    case T_FLOAT:
    {

  •  long sf;
    
  •  int sf;
    double jd, o, tmp;
    int s, df;
    

@@ -3751,9 +3751,9 @@ dt_lite_plus(VALUE self, VALUE other)
o = modf(o, &jd);
o *= DAY_IN_SECONDS;
o = modf(o, &tmp);

  • df = (int)tmp;
  • df = tmp; o *= SECOND_IN_NANOSECONDS;
  • sf = (long)round(o);
  •  sf = round(o);
    
    if (s < 0) {
    jd = -jd;
    

    @@ -3785,7 +3785,7 @@ dt_lite_plus(VALUE self, VALUE other)

    if (LIGHTABLE_JD(jd) && jd >= dat->l.sg)
    return dt_lite_s_new_internal(CLASS_OF(self),
    
  •                    (long)jd,
    
  •                    jd,
                      df,
                      sf,
                      dat->l.of,
    

    @@ -3993,13 +3993,13 @@ dt_lite_set_vtm_and_timev(VALUE self, struct vtm *vtm, VALUE *timev)
    get_dt_civil(dat);
    get_dt_time(dat);

  • vtm->year = LONG2NUM(dat->l.year);

  • vtm->year = INT2NUM(dat->l.year);
    vtm->mon = dat->l.mon;
    vtm->mday = dat->l.mday;
    vtm->hour = dat->l.hour;
    vtm->min = dat->l.min;
    vtm->sec = dat->l.sec;

  • vtm->subsecx = LONG2NUM(dat->l.sf);

  • vtm->subsecx = INT2NUM(dat->l.sf);
    vtm->utc_offset = INT2FIX(dat->l.of);
    vtm->wday = jd_to_wday(local_jd(dat));
    vtm->yday = civil_to_yday(dat->l.year, dat->l.mon, dat->l.mday);
    @@ -4043,7 +4043,7 @@ dt_lite_marshal_dump(VALUE self)
    get_dt_jd(dat);
    get_dt_df(dat);
    a = rb_ary_new3(5,

  •      LONG2NUM(dat->l.jd), INT2FIX(dat->l.df),
    
  •      INT2NUM(dat->l.jd), INT2FIX(dat->l.df),
        INT2FIX(dat->l.sf),
        INT2FIX(dat->l.of), DBL2NUM(dat->l.sg));
    

    }
    @@ -4079,7 +4079,7 @@ dt_lite_marshal_load(VALUE self, VALUE a)
    dat->r.flags = 0;
    break;
    case 5:

  • dat->l.jd = NUM2LONG(RARRAY_PTR(a)[0]);

  • dat->l.jd = NUM2INT(RARRAY_PTR(a)[0]);
    dat->l.df = FIX2INT(RARRAY_PTR(a)[1]);
    dat->l.sf = FIX2INT(RARRAY_PTR(a)[2]);
    dat->l.of = FIX2INT(RARRAY_PTR(a)[3]);
    @@ -4116,14 +4116,14 @@ dt_right_cache(VALUE self)

#ifndef NDEBUG
static int
-test_civil(long from, long to, double sg)
+test_civil(int from, int to, double sg)
{

  • long j;
  • int j;

    fprintf(stderr, "%ld...%ld (%ld) - %.0f\n", from, to, to - from, sg);
    for (j = from; j <= to; j++) {
    int y, m, d, ns;

  • long rj;

  • int rj;

    jd_to_civil(j, sg, &y, &m, &d);
    civil_to_jd(y, m, d, sg, &rj, &ns);
    @@ -4158,14 +4158,14 @@ date_s_test_civil(VALUE klass)
    }

static int
-test_ordinal(long from, long to, double sg)
+test_ordinal(int from, int to, double sg)
{

  • long j;
  • int j;

    fprintf(stderr, "%ld...%ld (%ld) - %.0f\n", from, to, to - from, sg);
    for (j = from; j <= to; j++) {
    int y, d, ns;

  • long rj;

  • int rj;

    jd_to_ordinal(j, sg, &y, &d);
    ordinal_to_jd(y, d, sg, &rj, &ns);
    @@ -4200,14 +4200,14 @@ date_s_test_ordinal(VALUE klass)
    }

static int
-test_commercial(long from, long to, double sg)
+test_commercial(int from, int to, double sg)
{

  • long j;
  • int j;

    fprintf(stderr, "%ld...%ld (%ld) - %.0f\n", from, to, to - from, sg);
    for (j = from; j <= to; j++) {
    int y, w, d, ns;

  • long rj;

  • int rj;

    jd_to_commercial(j, sg, &y, &w, &d);
    commercial_to_jd(y, w, d, sg, &rj, &ns);
    @@ -4242,14 +4242,14 @@ date_s_test_commercial(VALUE klass)
    }

static int
-test_weeknum(long from, long to, int f, double sg)
+test_weeknum(int from, int to, int f, double sg)
{

  • long j;
  • int j;

    fprintf(stderr, "%ld...%ld (%ld) - %.0f\n", from, to, to - from, sg);
    for (j = from; j <= to; j++) {
    int y, w, d, ns;

  • long rj;

  • int rj;

    jd_to_weeknum(j, f, sg, &y, &w, &d);
    weeknum_to_jd(y, w, d, f, sg, &rj, &ns);
    @@ -4288,14 +4288,14 @@ date_s_test_weeknum(VALUE klass)

static int
-test_nth_kday(long from, long to, double sg)
+test_nth_kday(int from, int to, double sg)
{

  • long j;
  • int j;

    fprintf(stderr, "%ld...%ld (%ld) - %.0f\n", from, to, to - from, sg);
    for (j = from; j <= to; j++) {
    int y, m, n, k, ns;

  • long rj;

  • int rj;

    jd_to_nth_kday(j, sg, &y, &m, &n, &k);
    nth_kday_to_jd(y, m, n, k, sg, &rj, &ns);
    diff --git a/ext/date/date_strftime.c b/ext/date/date_strftime.c
    index 4774137..1cfa086 100644
    --- a/ext/date/date_strftime.c
    +++ b/ext/date/date_strftime.c
    @@ -175,10 +175,10 @@ date_strftime_wo_timespec(char *s, size_t maxsize, const char *format,
    char *start = s;
    const char *sp, *tp;
    auto char tbuf[100];

  • long off;

  • int off;
    ptrdiff_t i;
    int w;

  • long y;

  • int y;
    int precision, flags, colons;
    char padding;
    enum {LEFT, CHCASE, LOWER, UPPER, LOCALE_O, LOCALE_E};
    @@ -475,8 +475,8 @@ date_strftime_wo_timespec(char s, size_t maxsize, const char *format,
    case 'Y': /
    year with century */
    SKIP_MODIFIER_O;
    if (FIXNUM_P(vtm->year)) {

  •                        long y = FIX2LONG(vtm->year);
    
  •                        FMT('0', 0 <= y ? 4 : 5, "ld", y);
    
  •                        long ly = FIX2LONG(vtm->year);
    
  •                        FMT('0', 0 <= ly ? 4 : 5, "ld", ly);
                      }
                      else {
                          FMTV('0', 4, "d", vtm->year);
    

    @@ -490,7 +490,7 @@ date_strftime_wo_timespec(char *s, size_t maxsize, const char *format,
    long aoff;
    int hl, hw;

  •          off = NUM2LONG(rb_funcall(vtm->utc_offset, rb_intern("round"), 0));
    
  •          off = NUM2INT(rb_funcall(vtm->utc_offset, rb_intern("round"), 0));
    
            aoff = off;
            if (aoff < 0)
    

    @@ -699,6 +699,7 @@ date_strftime_wo_timespec(char *s, size_t maxsize, const char *format,
    */
    SKIP_MODIFIER_EO;
    {

  •                            long ly;
                              VALUE yv = vtm->year;
                              w = iso8601wknum_v(vtm);
                              if (vtm->mon == 12 && w == 1)
    

    @@ -708,8 +709,8 @@ date_strftime_wo_timespec(char *s, size_t maxsize, const char *format,

                              if (*format == 'G') {
                                      if (FIXNUM_P(yv)) {
    
  •                                            long y = FIX2LONG(yv);
    
  •                                            FMT('0', 0 <= y ? 4 : 5, "ld", y);
    
  •                                            ly = FIX2LONG(yv);
    
  •                                            FMT('0', 0 <= ly ? 4 : 5, "ld", ly);
                                      }
                                      else {
                                              FMTV('0', 4, "d", yv);
    

    @@ -717,8 +718,8 @@ date_strftime_wo_timespec(char *s, size_t maxsize, const char *format,
    }
    else {
    yv = mod(yv, INT2FIX(100));

  •                                    y = FIX2LONG(yv);
    
  •                                    FMT('0', 2, "ld", y);
    
  •                                    ly = FIX2LONG(yv);
    
  •                                    FMT('0', 2, "ld", ly);
                              }
                              continue;
                      }
    

    @@ -751,7 +752,7 @@ date_strftime_wo_timespec(char *s, size_t maxsize, const char *format,
    {
    VALUE subsec = mod(timev, INT2FIX(1));
    int ww;

  •                            long n;
    
  •                            int n;
    
                              ww = precision;
                              while (9 <= ww) {
    

    @@ -878,10 +879,10 @@ date_strftime(char *s, size_t maxsize, const char *format, const struct vtm *vtm
    #ifndef STDC
    static int
    isleap(year)
    -long year;
    +int year;
    #else
    static int
    -isleap(long year)
    +isleap(int year)
    #endif
    {
    return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
    @@ -905,7 +906,7 @@ vtm2tm_noyear(const struct vtm *vtm, struct tm *result)
    tm.tm_yday = vtm->yday-1;
    tm.tm_isdst = vtm->isdst;
    #if defined(HAVE_STRUCT_TM_TM_GMTOFF)

  • tm.tm_gmtoff = NUM2LONG(vtm->utc_offset);

  • tm.tm_gmtoff = NUM2INT(vtm->utc_offset);
    #endif
    #if defined(HAVE_TM_ZONE)
    tm.tm_zone = (char *)vtm->zone;
    =end

Updated by tadf (tadayoshi funaba) over 8 years ago

  • Status changed from Assigned to Rejected

=begin
現在はかなり制限をきつくしているので影響はないと思いますが
jd を long にしているのは無意味というわけではないと思います。
もし型が違っているところがあれば、それは間違いだと思うので直せばいいと思います。
=end

Updated by matz (Yukihiro Matsumoto) over 8 years ago

  • Status changed from Rejected to Assigned

=begin
このバグは混在していることが問題なのでrejectしてはいけないと思います。
「longなのが無意味ではない」ということは、longに揃えた方が良いという意味ですよね。
なるせさんに(longに揃える)パッチを当ててもらうようにお願いしても良いですか?
=end

Updated by tadf (tadayoshi funaba) over 8 years ago

  • Status changed from Assigned to Rejected

=begin
違います。
オーバーフローが起きる場合がある、ということは、逆にいえば、大きな年のとき
大きなユリウス日を救える場合がある、ということです。
実際そういう事で書いてありますが、今現在は制限がキツくしているので
intが32bit分あれば大丈夫になっています。
年をlongで受けているのは別に理由があったからですが、それは直せばいいとだと思います。
=end

Updated by naruse (Yui NARUSE) over 8 years ago

=begin
(2011/03/26 19:21), tadayoshi funaba wrote:

違います。
オーバーフローが起きる場合がある、ということは、逆にいえば、大きな年のとき
大きなユリウス日を救える場合がある、ということです。
実際そういう事で書いてありますが、今現在は制限がキツくしているので
intが32bit分あれば大丈夫になっています。
年をlongで受けているのは別に理由があったからですが、それは直せばいいとだと思います。

大きなユリウス日を将来的に扱えるようにしたいという話は理解できます。
で、ならば long ではなく int64_t を使った方がよいのではないかと。
long だと 32bit 環境はもちろん、LLP64 な環境 (64bit Windows) で残念なことになるので。

なお、この long を忌避したいというのは CRuby 本体にも当てはまる話で、
長期的には何とかできたらいいなと思っているのですが、派手に ABI を壊すので、
それはまた先の話に。

--
NARUSE, Yui naruse@airemix.jp
=end

Updated by naruse (Yui NARUSE) over 8 years ago

=begin
(2011/03/26 19:21), tadayoshi funaba wrote:

違います。
オーバーフローが起きる場合がある、ということは、逆にいえば、大きな年のとき
大きなユリウス日を救える場合がある、ということです。
実際そういう事で書いてありますが、今現在は制限がキツくしているので
intが32bit分あれば大丈夫になっています。
年をlongで受けているのは別に理由があったからですが、それは直せばいいとだと思います。

大きなユリウス日を将来的に扱えるようにしたいという話は理解できます。
で、ならば long ではなく int64_t を使った方がよいのではないかと。
long だと 32bit 環境はもちろん、LLP64 な環境 (64bit Windows) で残念なことになるので。

なお、この long を忌避したいというのは CRuby 本体にも当てはまる話で、
長期的には何とかできたらいいなと思っているのですが、派手に ABI を壊すので、
それはまた先の話に。

--
NARUSE, Yui naruse@airemix.jp
=end

Updated by matz (Yukihiro Matsumoto) over 8 years ago

=begin
longを採用した理由が開示していただけてないのでなんとも言えませんが、intとlongを揃えたほうが良い(かつlongは避けたほうが良い)というのは、なんらかの対応をしていただけると良いと思います。
=end

Updated by tadf (tadayoshi funaba) over 8 years ago

=begin

大きなユリウス日を将来的に扱えるようにしたいという話は理解できます。
で、ならば long ではなく int64_t を使った方がよいのではないかと。
long だと 32bit 環境はもちろん、LLP64 な環境 (64bit Windows) で残念なことになるので。

特に 64bit 欲しいわけではなく、比較的小さい値に留まる年と、大きな数にな
る可能性のあるユリウス日を考慮して、最終的に表現されうる上限が、long で
表現できるのユリウス日か、int で現わされる年の大晦日かのどちらか小さい
ほうになることを想定しているだけですね。

これがダメなら C 自体がダメだというしかないと思います。そもそもこういう
運動みたいなのは、一面的になりがちで、この間の成瀬さんの修正は、汎用的
に利用される可能性のあるマクロで型変換を強制していたりして、何を表現し
ようとしているのか全く考えられていないものだったと思います。

そういう事で疑念もありますが、間違ってるところがあれば、それは直しても
らっていいと思います。しかし、long を使うなってのはよくわかりません。
=end

Updated by tadf (tadayoshi funaba) over 8 years ago

=begin

大きなユリウス日を将来的に扱えるようにしたいという話は理解できます。
で、ならば long ではなく int64_t を使った方がよいのではないかと。
long だと 32bit 環境はもちろん、LLP64 な環境 (64bit Windows) で残念なことになるので。

特に 64bit 欲しいわけではなく、比較的小さい値に留まる年と、大きな数にな
る可能性のあるユリウス日を考慮して、最終的に表現されうる上限が、long で
表現できるのユリウス日か、int で現わされる年の大晦日かのどちらか小さい
ほうになることを想定しているだけですね。

これがダメなら C 自体がダメだというしかないと思います。そもそもこういう
運動みたいなのは、一面的になりがちで、この間の成瀬さんの修正は、汎用的
に利用される可能性のあるマクロで型変換を強制していたりして、何を表現し
ようとしているのか全く考えられていないものだったと思います。

そういう事で疑念もありますが、間違ってるところがあれば、それは直しても
らっていいと思います。しかし、long を使うなってのはよくわかりません。
=end

Updated by naruse (Yui NARUSE) over 8 years ago

=begin
(2011/03/26 21:40), Tadayoshi Funaba wrote:

大きなユリウス日を将来的に扱えるようにしたいという話は理解できます。
で、ならば long ではなく int64_t を使った方がよいのではないかと。
long だと 32bit 環境はもちろん、LLP64 な環境 (64bit Windows) で残念なことになるので。

特に 64bit 欲しいわけではなく、比較的小さい値に留まる年と、大きな数にな
る可能性のあるユリウス日を考慮して、最終的に表現されうる上限が、long で
表現できるのユリウス日か、int で現わされる年の大晦日かのどちらか小さい
ほうになることを想定しているだけですね。

ここでユリウス日を long にしているのはなぜか、という話です。

long は int より大きいわけですが、どういう時に大きいかはその環境の趣味で決まっています。
多くの Unix 系 64bit 環境では long は 64bit になりましたが、
mswin64 ではおそらくソース互換性のため 32bit のままです。
つまり、基本 32bit だけど 64bit が速い時は 64bit にしたいと言う場合には不適で、
たぶんそういう場合には intptr_t の方が意図に近いでしょう。

もっとも、そもそも Ruby よりも C で実装した方が速いのですから、
常に int64_t にした方がいいのではなかろうかとか。

これがダメなら C 自体がダメだというしかないと思います。

C 自体がダメだという主張は含意していますが、
C でもポータブルに書こうと思えば書けますからね。

そもそもこういう
運動みたいなのは、一面的になりがちで、

longは避けるべきという話は、「こういう運動」が指していると思われるwarning消し
とは別の話で、可搬性の話です。

この間の成瀬さんの修正は、汎用的
に利用される可能性のあるマクロで型変換を強制していたりして、何を表現し
ようとしているのか全く考えられていないものだったと思います。

マクロへの修正がまずいと言う指摘は仰るとおりだと思います。

そういう事で疑念もありますが、間違ってるところがあれば、それは直しても
らっていいと思います。しかし、long を使うなってのはよくわかりません。

long を使うなという点は合意頂けてないので勝手に入れないとして、
とりあえず y は int、jd と offset は long ってことでいいのでしょうか。

--
NARUSE, Yui naruse@airemix.jp
=end

Updated by naruse (Yui NARUSE) over 8 years ago

=begin
(2011/03/26 21:40), Tadayoshi Funaba wrote:

大きなユリウス日を将来的に扱えるようにしたいという話は理解できます。
で、ならば long ではなく int64_t を使った方がよいのではないかと。
long だと 32bit 環境はもちろん、LLP64 な環境 (64bit Windows) で残念なことになるので。

特に 64bit 欲しいわけではなく、比較的小さい値に留まる年と、大きな数にな
る可能性のあるユリウス日を考慮して、最終的に表現されうる上限が、long で
表現できるのユリウス日か、int で現わされる年の大晦日かのどちらか小さい
ほうになることを想定しているだけですね。

ここでユリウス日を long にしているのはなぜか、という話です。

long は int より大きいわけですが、どういう時に大きいかはその環境の趣味で決まっています。
多くの Unix 系 64bit 環境では long は 64bit になりましたが、
mswin64 ではおそらくソース互換性のため 32bit のままです。
つまり、基本 32bit だけど 64bit が速い時は 64bit にしたいと言う場合には不適で、
たぶんそういう場合には intptr_t の方が意図に近いでしょう。

もっとも、そもそも Ruby よりも C で実装した方が速いのですから、
常に int64_t にした方がいいのではなかろうかとか。

これがダメなら C 自体がダメだというしかないと思います。

C 自体がダメだという主張は含意していますが、
C でもポータブルに書こうと思えば書けますからね。

そもそもこういう
運動みたいなのは、一面的になりがちで、

longは避けるべきという話は、「こういう運動」が指していると思われるwarning消し
とは別の話で、可搬性の話です。

この間の成瀬さんの修正は、汎用的
に利用される可能性のあるマクロで型変換を強制していたりして、何を表現し
ようとしているのか全く考えられていないものだったと思います。

マクロへの修正がまずいと言う指摘は仰るとおりだと思います。

そういう事で疑念もありますが、間違ってるところがあれば、それは直しても
らっていいと思います。しかし、long を使うなってのはよくわかりません。

long を使うなという点は合意頂けてないので勝手に入れないとして、
とりあえず y は int、jd と offset は long ってことでいいのでしょうか。

--
NARUSE, Yui naruse@airemix.jp
=end

Updated by tadf (tadayoshi funaba) over 8 years ago

=begin

longは避けるべきという話は、「こういう運動」が指していると思われるwarning消し
とは別の話で、可搬性の話です。

なんで別の話をしているのか、というのが胡散臭い理由なんでしょうね。ちょっ
と前の無理な修正と考え合せるととても不審に思います。理解してもらえると
思いますが。

long を使うなという点は合意頂けてないので勝手に入れないとして、
とりあえず y は int、jd と offset は long ってことでいいのでしょうか。

とりあえず、そうしておいてもらって構わないと思います。
=end

Updated by tadf (tadayoshi funaba) over 8 years ago

=begin

longは避けるべきという話は、「こういう運動」が指していると思われるwarning消し
とは別の話で、可搬性の話です。

なんで別の話をしているのか、というのが胡散臭い理由なんでしょうね。ちょっ
と前の無理な修正と考え合せるととても不審に思います。理解してもらえると
思いますが。

long を使うなという点は合意頂けてないので勝手に入れないとして、
とりあえず y は int、jd と offset は long ってことでいいのでしょうか。

とりあえず、そうしておいてもらって構わないと思います。
=end

Also available in: Atom PDF