Skip to content

Commit 4792a91

Browse files
committed
Optimize the conversion from small Bignum
1 parent 75db4da commit 4792a91

File tree

1 file changed

+26
-2
lines changed

1 file changed

+26
-2
lines changed

ext/bigdecimal/bigdecimal.c

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2763,8 +2763,32 @@ rb_int64_convert_to_BigDecimal(int64_t ival, size_t digs, int raise_exception)
27632763
static VALUE
27642764
rb_big_convert_to_BigDecimal(VALUE val, RB_UNUSED_VAR(size_t digs), int raise_exception)
27652765
{
2766-
Real *vp = GetVpValue(val, 1);
2767-
return check_exception(vp->obj);
2766+
assert(RB_TYPE_P(val, T_BIGNUM));
2767+
2768+
size_t size = rb_absint_size(val, NULL);
2769+
int sign = rb_big_cmp(val, INT2FIX(0));
2770+
if (size <= sizeof(long)) {
2771+
if (sign < 0) {
2772+
return rb_int64_convert_to_BigDecimal(NUM2LONG(val), digs, raise_exception);
2773+
}
2774+
else {
2775+
return rb_uint64_convert_to_BigDecimal(NUM2ULONG(val), digs, raise_exception);
2776+
}
2777+
}
2778+
#if defined(SIZEOF_LONG_LONG) && SIZEOF_LONG < SIZEOF_LONG_LONG
2779+
else if (size <= sizeof(LONG_LONG)) {
2780+
if (sign < 0) {
2781+
return rb_int64_convert_to_BigDecimal(NUM2LL(val), digs, raise_exception);
2782+
}
2783+
else {
2784+
return rb_uint64_convert_to_BigDecimal(NUM2ULL(val), digs, raise_exception);
2785+
}
2786+
}
2787+
#endif
2788+
else {
2789+
Real *vp = GetVpValue(val, 1);
2790+
return check_exception(vp->obj);
2791+
}
27682792
}
27692793

27702794
static VALUE

0 commit comments

Comments
 (0)