* time.c: use more polymorphic operations.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@27121 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
akr 2010-03-30 13:25:57 +00:00
Родитель 91616a00ba
Коммит 39146c6b6b
2 изменённых файлов: 21 добавлений и 24 удалений

Просмотреть файл

@ -1,3 +1,7 @@
Tue Mar 30 22:24:19 2010 Tanaka Akira <akr@fsij.org>
* time.c: use more polymorphic operations.
Tue Mar 30 22:12:38 2010 Kazuhiro NISHIYAMA <zn@mbf.nifty.com> Tue Mar 30 22:12:38 2010 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
* NEWS: add URI.decode and URI.encode to Obsoleted methods, * NEWS: add URI.decode and URI.encode to Obsoleted methods,

41
time.c
Просмотреть файл

@ -85,7 +85,7 @@ static ID id_eq, id_ne, id_quo, id_div, id_cmp, id_lshift;
#endif #endif
#if WIDEVALUE_IS_WIDER #if WIDEVALUE_IS_WIDER
static wideval_t static inline wideval_t
wint2wv(wideint_t wi) wint2wv(wideint_t wi)
{ {
if (FIXWVABLE(wi)) if (FIXWVABLE(wi))
@ -323,10 +323,7 @@ wadd(wideval_t wx, wideval_t wy)
#if WIDEVALUE_IS_WIDER #if WIDEVALUE_IS_WIDER
if (FIXWV_P(wx) && FIXWV_P(wy)) { if (FIXWV_P(wx) && FIXWV_P(wy)) {
wideint_t r = FIXWV2WINT(wx) + FIXWV2WINT(wy); wideint_t r = FIXWV2WINT(wx) + FIXWV2WINT(wy);
if (FIXWVABLE(r)) { return WINT2WV(r);
return WINT2FIXWV(r);
}
return v2w(INT64toNUM(r));
} }
else else
#endif #endif
@ -342,14 +339,10 @@ wsub(wideval_t wx, wideval_t wy)
#if WIDEVALUE_IS_WIDER #if WIDEVALUE_IS_WIDER
if (FIXWV_P(wx) && FIXWV_P(wy)) { if (FIXWV_P(wx) && FIXWV_P(wy)) {
wideint_t r = FIXWV2WINT(wx) - FIXWV2WINT(wy); wideint_t r = FIXWV2WINT(wx) - FIXWV2WINT(wy);
if (FIXWVABLE(r)) { return WINT2WV(r);
return WINT2FIXWV(r);
}
return v2w(INT64toNUM(r));
} }
else else
#endif #endif
x = w2v(wx); x = w2v(wx);
if (TYPE(x) == T_BIGNUM) return v2w(rb_big_minus(x, w2v(wy))); if (TYPE(x) == T_BIGNUM) return v2w(rb_big_minus(x, w2v(wy)));
return v2w(rb_funcall(x, '-', 1, w2v(wy))); return v2w(rb_funcall(x, '-', 1, w2v(wy)));
@ -366,8 +359,8 @@ wmul(wideval_t wx, wideval_t wy)
if (a == 0) return wx; if (a == 0) return wx;
b = FIXWV2WINT(wy); b = FIXWV2WINT(wy);
c = a * b; c = a * b;
if (c / a == b && FIXWVABLE(c)) { if (c / a == b) {
return WINT2FIXWV(c); return WINT2WV(c);
} }
} }
#endif #endif
@ -424,7 +417,7 @@ wquo(wideval_t wx, wideval_t wy)
} }
#define wmulquo(x,y,z) ((WIDEVAL_GET(y) == WIDEVAL_GET(z)) ? (x) : wquo(wmul((x),(y)),(z))) #define wmulquo(x,y,z) ((WIDEVAL_GET(y) == WIDEVAL_GET(z)) ? (x) : wquo(wmul((x),(y)),(z)))
#define wmulquoll(x,y,z) (((y) == (z)) ? (x) : wquo(wmul((x),v2w(LONG2FIX(y))),v2w(LONG2FIX(z)))) #define wmulquoll(x,y,z) (((y) == (z)) ? (x) : wquo(wmul((x),WINT2WV(y)),WINT2WV(z)))
static void static void
wdivmodv(wideval_t wn, wideval_t wd, wideval_t *wq, wideval_t *wr) wdivmodv(wideval_t wn, wideval_t wd, wideval_t *wq, wideval_t *wr)
@ -611,7 +604,7 @@ static void
split_second(wideval_t timew, VALUE *timev_p, VALUE *subsecx_p) split_second(wideval_t timew, VALUE *timev_p, VALUE *subsecx_p)
{ {
wideval_t q, r; wideval_t q, r;
wdivmodv(timew, v2w(INT2FIX(TIME_SCALE)), &q, &r); wdivmodv(timew, WINT2FIXWV(TIME_SCALE), &q, &r);
*timev_p = w2v(q); *timev_p = w2v(q);
*subsecx_p = w2v(r); *subsecx_p = w2v(r);
} }
@ -756,7 +749,7 @@ timegmw_noleapsecond(struct vtm *vtm)
vdays = LONG2NUM(days_in400); vdays = LONG2NUM(days_in400);
vdays = add(vdays, mul(q400, INT2FIX(97))); vdays = add(vdays, mul(q400, INT2FIX(97)));
vdays = add(vdays, mul(year1900, INT2FIX(365))); vdays = add(vdays, mul(year1900, INT2FIX(365)));
wret = wadd(rb_time_magnify(v2w(ret)), wmul(rb_time_magnify(v2w(vdays)), v2w(INT2FIX(86400)))); wret = wadd(rb_time_magnify(v2w(ret)), wmul(rb_time_magnify(v2w(vdays)), WINT2FIXWV(86400)));
wret = wadd(wret, v2w(vtm->subsecx)); wret = wadd(wret, v2w(vtm->subsecx));
return wret; return wret;
@ -1097,7 +1090,7 @@ gmtimew(wideval_t timew, struct vtm *result)
VALUE subsecx; VALUE subsecx;
VALUE timev; VALUE timev;
if (wlt(timew, v2w(INT2FIX(0)))) { if (wlt(timew, WINT2FIXWV(0))) {
gmtimew_noleapsecond(timew, result); gmtimew_noleapsecond(timew, result);
return result; return result;
} }
@ -1342,7 +1335,7 @@ timelocalw(struct vtm *vtm)
n = vtmcmp(vtm, &vtm1); n = vtmcmp(vtm, &vtm1);
if (n == 0) { if (n == 0) {
timew1 = wsub(timew1, rb_time_magnify(v2w(INT2FIX(12*3600)))); timew1 = wsub(timew1, rb_time_magnify(WINT2FIXWV(12*3600)));
if (!localtimew(timew1, &vtm1)) if (!localtimew(timew1, &vtm1))
rb_raise(rb_eArgError, "localtimew error"); rb_raise(rb_eArgError, "localtimew error");
n = 1; n = 1;
@ -1351,12 +1344,12 @@ timelocalw(struct vtm *vtm)
if (n < 0) { if (n < 0) {
timew2 = timew1; timew2 = timew1;
vtm2 = vtm1; vtm2 = vtm1;
timew1 = wsub(timew1, rb_time_magnify(v2w(INT2FIX(24*3600)))); timew1 = wsub(timew1, rb_time_magnify(WINT2FIXWV(24*3600)));
if (!localtimew(timew1, &vtm1)) if (!localtimew(timew1, &vtm1))
rb_raise(rb_eArgError, "localtimew error"); rb_raise(rb_eArgError, "localtimew error");
} }
else { else {
timew2 = wadd(timew1, rb_time_magnify(v2w(INT2FIX(24*3600)))); timew2 = wadd(timew1, rb_time_magnify(WINT2FIXWV(24*3600)));
if (!localtimew(timew2, &vtm2)) if (!localtimew(timew2, &vtm2))
rb_raise(rb_eArgError, "localtimew error"); rb_raise(rb_eArgError, "localtimew error");
} }
@ -1564,7 +1557,7 @@ time_s_alloc(VALUE klass)
obj = TypedData_Make_Struct(klass, struct time_object, &time_data_type, tobj); obj = TypedData_Make_Struct(klass, struct time_object, &time_data_type, tobj);
tobj->tm_got=0; tobj->tm_got=0;
tobj->timew = v2w(INT2FIX(0)); tobj->timew = WINT2FIXWV(0);
return obj; return obj;
} }
@ -1618,7 +1611,7 @@ time_init_0(VALUE time)
time_modify(time); time_modify(time);
GetTimeval(time, tobj); GetTimeval(time, tobj);
tobj->tm_got=0; tobj->tm_got=0;
tobj->timew = v2w(INT2FIX(0)); tobj->timew = WINT2FIXWV(0);
#ifdef HAVE_CLOCK_GETTIME #ifdef HAVE_CLOCK_GETTIME
if (clock_gettime(CLOCK_REALTIME, &ts) == -1) { if (clock_gettime(CLOCK_REALTIME, &ts) == -1) {
rb_sys_fail("clock_gettime"); rb_sys_fail("clock_gettime");
@ -1859,7 +1852,7 @@ time_init_1(int argc, VALUE *argv, VALUE time)
time_modify(time); time_modify(time);
GetTimeval(time, tobj); GetTimeval(time, tobj);
tobj->tm_got=0; tobj->tm_got=0;
tobj->timew = v2w(INT2FIX(0)); tobj->timew = WINT2FIXWV(0);
if (!NIL_P(vtm.utc_offset)) { if (!NIL_P(vtm.utc_offset)) {
VALUE off = vtm.utc_offset; VALUE off = vtm.utc_offset;
@ -3434,7 +3427,7 @@ rb_time_succ(VALUE time)
rb_warn("Time#succ is obsolete; use time + 1"); rb_warn("Time#succ is obsolete; use time + 1");
GetTimeval(time, tobj); GetTimeval(time, tobj);
time = time_new_timew(rb_cTime, wadd(tobj->timew, v2w(INT2FIX(TIME_SCALE)))); time = time_new_timew(rb_cTime, wadd(tobj->timew, WINT2FIXWV(TIME_SCALE)));
GetTimeval(time, tobj2); GetTimeval(time, tobj2);
TIME_COPY_GMT(tobj2, tobj); TIME_COPY_GMT(tobj2, tobj);
return time; return time;
@ -4285,7 +4278,7 @@ time_mload(VALUE time, VALUE str)
sec = p; sec = p;
usec = s; usec = s;
nsec = usec * 1000; nsec = usec * 1000;
timew = wadd(TIMET2WIDEVAL(sec), wmulquoll(v2w(LONG2FIX(usec)), TIME_SCALE, 1000000)); timew = wadd(TIMET2WIDEVAL(sec), wmulquoll(WINT2FIXWV(usec), TIME_SCALE, 1000000));
} }
else { else {
p &= ~(1UL<<31); p &= ~(1UL<<31);