[ruby/bigdecimal] Optimize the conversion from small Bignum
https://github.com/ruby/bigdecimal/commit/4792a917d8
This commit is contained in:
parent
31854403b3
commit
f289f8ae3a
@ -2763,8 +2763,32 @@ rb_int64_convert_to_BigDecimal(int64_t ival, size_t digs, int raise_exception)
|
|||||||
static VALUE
|
static VALUE
|
||||||
rb_big_convert_to_BigDecimal(VALUE val, RB_UNUSED_VAR(size_t digs), int raise_exception)
|
rb_big_convert_to_BigDecimal(VALUE val, RB_UNUSED_VAR(size_t digs), int raise_exception)
|
||||||
{
|
{
|
||||||
Real *vp = GetVpValue(val, 1);
|
assert(RB_TYPE_P(val, T_BIGNUM));
|
||||||
return check_exception(vp->obj);
|
|
||||||
|
size_t size = rb_absint_size(val, NULL);
|
||||||
|
int sign = rb_big_cmp(val, INT2FIX(0));
|
||||||
|
if (size <= sizeof(long)) {
|
||||||
|
if (sign < 0) {
|
||||||
|
return rb_int64_convert_to_BigDecimal(NUM2LONG(val), digs, raise_exception);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return rb_uint64_convert_to_BigDecimal(NUM2ULONG(val), digs, raise_exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#if defined(SIZEOF_LONG_LONG) && SIZEOF_LONG < SIZEOF_LONG_LONG
|
||||||
|
else if (size <= sizeof(LONG_LONG)) {
|
||||||
|
if (sign < 0) {
|
||||||
|
return rb_int64_convert_to_BigDecimal(NUM2LL(val), digs, raise_exception);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return rb_uint64_convert_to_BigDecimal(NUM2ULL(val), digs, raise_exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else {
|
||||||
|
Real *vp = GetVpValue(val, 1);
|
||||||
|
return check_exception(vp->obj);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
|
Loading…
x
Reference in New Issue
Block a user