Skip to content

Commit 33e7c50

Browse files
committed
Stop using GetVpValueWithPrec in rb_float_convert_to_BigDecimal
1 parent 28d3836 commit 33e7c50

File tree

1 file changed

+15
-1
lines changed

1 file changed

+15
-1
lines changed

ext/bigdecimal/bigdecimal.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2806,10 +2806,13 @@ rb_inum_convert_to_BigDecimal(VALUE val, RB_UNUSED_VAR(size_t digs), int raise_e
28062806
}
28072807
}
28082808

2809+
static VALUE rb_rational_convert_to_BigDecimal(VALUE val, size_t digs, int raise_exception);
2810+
28092811
static VALUE
28102812
rb_float_convert_to_BigDecimal(VALUE val, size_t digs, int raise_exception)
28112813
{
28122814
double d = RFLOAT_VALUE(val);
2815+
28132816
if (!isfinite(d)) {
28142817
Real *vp = VpCreateRbObject(1, NULL, true); /* vp->obj is allocated */
28152818
VpDtoV(vp, d);
@@ -2829,7 +2832,18 @@ rb_float_convert_to_BigDecimal(VALUE val, size_t digs, int raise_exception)
28292832
rb_raise(rb_eArgError, "precision too large.");
28302833
}
28312834

2832-
Real *vp = GetVpValueWithPrec(val, digs, 1);
2835+
if (d != 0.0) {
2836+
val = rb_funcall(val, id_to_r, 0);
2837+
return rb_rational_convert_to_BigDecimal(val, digs, raise_exception);
2838+
}
2839+
2840+
Real *vp;
2841+
if (1/d < 0.0) {
2842+
vp = VpCreateRbObject(digs, "-0", true);
2843+
}
2844+
else {
2845+
vp = VpCreateRbObject(digs, "0", true);
2846+
}
28332847
return check_exception(vp->obj);
28342848
}
28352849

0 commit comments

Comments
 (0)