* 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>
|
||||
|
||||
* bignum.c (rb_absint_singlebit_p): New function.
|
||||
|
51
time.c
51
time.c
@ -296,48 +296,25 @@ w2v(wideval_t w)
|
||||
}
|
||||
|
||||
#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
|
||||
v2w_bignum(VALUE v)
|
||||
{
|
||||
long len = RBIGNUM_LEN(v);
|
||||
BDIGIT *ds;
|
||||
wideval_t w;
|
||||
VALUE maxbit;
|
||||
ds = RBIGNUM_DIGITS(v);
|
||||
w = WIDEVAL_WRAP(v);
|
||||
maxbit = rb_big_abs_find_maxbit(v);
|
||||
if (NIL_P(maxbit))
|
||||
int sign;
|
||||
uwideint_t u;
|
||||
wideint_t i;
|
||||
rb_integer_pack(v, &sign, NULL, &u, 1, sizeof(i), 0,
|
||||
INTEGER_PACK_LSWORD_FIRST|INTEGER_PACK_NATIVE_BYTE_ORDER);
|
||||
if (sign == 0)
|
||||
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;
|
||||
i = 0;
|
||||
while (len)
|
||||
i = (i << sizeof(BDIGIT)*CHAR_BIT) | ds[--len];
|
||||
if (RBIGNUM_NEGATIVE_P(v)) {
|
||||
i = -i;
|
||||
}
|
||||
w = WINT2FIXWV(i);
|
||||
else if (sign == -1) {
|
||||
if (u <= -FIXWV_MIN)
|
||||
return WINT2FIXWV(-(wideint_t)u);
|
||||
}
|
||||
return w;
|
||||
else if (sign == +1) {
|
||||
if (u <= FIXWV_MAX)
|
||||
return WINT2FIXWV((wideint_t)u);
|
||||
}
|
||||
return WIDEVAL_WRAP(v);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user