* time.c (v2w_bignum): Simplified using rb_integer_pack.
(rb_big_abs_find_maxbit): Removed. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41178 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
747894a32d
commit
f1a6b64b1d
@ -1,3 +1,8 @@
|
|||||||
|
Sat Jun 8 21:47:33 2013 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
|
* time.c (v2w_bignum): Simplified using rb_integer_pack.
|
||||||
|
(rb_big_abs_find_maxbit): Removed.
|
||||||
|
|
||||||
Sat Jun 8 21:03:40 2013 Tanaka Akira <akr@fsij.org>
|
Sat Jun 8 21:03:40 2013 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
* bignum.c (rb_absint_singlebit_p): New function.
|
* bignum.c (rb_absint_singlebit_p): New function.
|
||||||
|
49
time.c
49
time.c
@ -296,48 +296,25 @@ w2v(wideval_t w)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if WIDEVALUE_IS_WIDER
|
#if WIDEVALUE_IS_WIDER
|
||||||
static VALUE
|
|
||||||
rb_big_abs_find_maxbit(VALUE big)
|
|
||||||
{
|
|
||||||
int num_zeros;
|
|
||||||
size_t bytesize;
|
|
||||||
VALUE res;
|
|
||||||
|
|
||||||
bytesize = rb_absint_size(big, &num_zeros);
|
|
||||||
if (bytesize == 0)
|
|
||||||
return Qnil;
|
|
||||||
|
|
||||||
res = mul(SIZET2NUM(bytesize), LONG2FIX(CHAR_BIT));
|
|
||||||
if (num_zeros)
|
|
||||||
res = sub(res, LONG2FIX(num_zeros));
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static wideval_t
|
static wideval_t
|
||||||
v2w_bignum(VALUE v)
|
v2w_bignum(VALUE v)
|
||||||
{
|
{
|
||||||
long len = RBIGNUM_LEN(v);
|
int sign;
|
||||||
BDIGIT *ds;
|
uwideint_t u;
|
||||||
wideval_t w;
|
|
||||||
VALUE maxbit;
|
|
||||||
ds = RBIGNUM_DIGITS(v);
|
|
||||||
w = WIDEVAL_WRAP(v);
|
|
||||||
maxbit = rb_big_abs_find_maxbit(v);
|
|
||||||
if (NIL_P(maxbit))
|
|
||||||
return WINT2FIXWV(0);
|
|
||||||
if (lt(maxbit, INT2FIX(sizeof(wideint_t) * CHAR_BIT - 2)) ||
|
|
||||||
(eq(maxbit, INT2FIX(sizeof(wideint_t) * CHAR_BIT - 2)) &&
|
|
||||||
RBIGNUM_NEGATIVE_P(v) && rb_absint_singlebit_p(v))) {
|
|
||||||
wideint_t i;
|
wideint_t i;
|
||||||
i = 0;
|
rb_integer_pack(v, &sign, NULL, &u, 1, sizeof(i), 0,
|
||||||
while (len)
|
INTEGER_PACK_LSWORD_FIRST|INTEGER_PACK_NATIVE_BYTE_ORDER);
|
||||||
i = (i << sizeof(BDIGIT)*CHAR_BIT) | ds[--len];
|
if (sign == 0)
|
||||||
if (RBIGNUM_NEGATIVE_P(v)) {
|
return WINT2FIXWV(0);
|
||||||
i = -i;
|
else if (sign == -1) {
|
||||||
|
if (u <= -FIXWV_MIN)
|
||||||
|
return WINT2FIXWV(-(wideint_t)u);
|
||||||
}
|
}
|
||||||
w = WINT2FIXWV(i);
|
else if (sign == +1) {
|
||||||
|
if (u <= FIXWV_MAX)
|
||||||
|
return WINT2FIXWV((wideint_t)u);
|
||||||
}
|
}
|
||||||
return w;
|
return WIDEVAL_WRAP(v);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user