[ruby/bigdecimal] Use rb_cstr_convert_to_BigDecimal in GetVpValueWithPrec

https://github.com/ruby/bigdecimal/commit/381ddf5ff6
This commit is contained in:
Kenta Murata 2021-01-12 09:19:19 +09:00
parent 78d3813c74
commit 1d04faee23

View File

@ -201,61 +201,58 @@ cannot_be_coerced_into_BigDecimal(VALUE exc_class, VALUE v)
static inline VALUE BigDecimal_div2(VALUE, VALUE, VALUE); static inline VALUE BigDecimal_div2(VALUE, VALUE, VALUE);
static VALUE rb_float_convert_to_BigDecimal(VALUE val, size_t digs, int raise_exception); static VALUE rb_float_convert_to_BigDecimal(VALUE val, size_t digs, int raise_exception);
static VALUE rb_rational_convert_to_BigDecimal(VALUE val, size_t digs, int raise_exception); static VALUE rb_rational_convert_to_BigDecimal(VALUE val, size_t digs, int raise_exception);
static VALUE rb_cstr_convert_to_BigDecimal(const char *cstr, size_t digs, int raise_exception);
static Real* static Real*
GetVpValueWithPrec(VALUE v, long prec, int must) GetVpValueWithPrec(VALUE v, long prec, int must)
{ {
const size_t digs = prec < 0 ? SIZE_MAX : (size_t)prec; const size_t digs = prec < 0 ? SIZE_MAX : (size_t)prec;
Real *pv;
switch(TYPE(v)) { switch(TYPE(v)) {
case T_FLOAT: { case T_FLOAT:
VALUE obj = rb_float_convert_to_BigDecimal(v, digs, must); v = rb_float_convert_to_BigDecimal(v, digs, must);
TypedData_Get_Struct(obj, Real, &BigDecimal_data_type, pv); break;
return pv;
}
case T_RATIONAL: { case T_RATIONAL:
VALUE obj = rb_rational_convert_to_BigDecimal(v, digs, must); v = rb_rational_convert_to_BigDecimal(v, digs, must);
TypedData_Get_Struct(obj, Real, &BigDecimal_data_type, pv); break;
return pv;
}
case T_DATA: case T_DATA:
if (is_kind_of_BigDecimal(v)) { if (!is_kind_of_BigDecimal(v)) {
pv = DATA_PTR(v); goto SomeOneMayDoIt;
return pv; }
} break;
else {
goto SomeOneMayDoIt;
}
break;
case T_FIXNUM: { case T_FIXNUM: {
char szD[128]; char szD[128];
sprintf(szD, "%ld", FIX2LONG(v)); sprintf(szD, "%ld", FIX2LONG(v));
return VpCreateRbObject(VpBaseFig() * 2 + 1, szD, true); v = rb_cstr_convert_to_BigDecimal(szD, VpBaseFig() * 2 + 1, must);
break;
} }
#ifdef ENABLE_NUMERIC_STRING #ifdef ENABLE_NUMERIC_STRING
case T_STRING: case T_STRING: {
StringValueCStr(v); const char *c_str = StringValueCStr(v);
return VpCreateRbObject(RSTRING_LEN(v) + VpBaseFig() + 1, v = rb_cstr_convert_to_BigDecimal(c_str, RSTRING_LEN(v) + VpBaseFig() + 1, must);
RSTRING_PTR(v), true); break;
}
#endif /* ENABLE_NUMERIC_STRING */ #endif /* ENABLE_NUMERIC_STRING */
case T_BIGNUM: { case T_BIGNUM: {
VALUE bg = rb_big2str(v, 10); VALUE bg = rb_big2str(v, 10);
pv = VpCreateRbObject(strlen(RSTRING_PTR(bg)) + VpBaseFig() + 1, v = rb_cstr_convert_to_BigDecimal(RSTRING_PTR(bg), RSTRING_LEN(bg) + VpBaseFig() + 1, must);
RSTRING_PTR(bg), true);
RB_GC_GUARD(bg); RB_GC_GUARD(bg);
return pv; break;
} }
default: default:
goto SomeOneMayDoIt; goto SomeOneMayDoIt;
} }
Real *vp;
TypedData_Get_Struct(v, Real, &BigDecimal_data_type, vp);
return vp;
SomeOneMayDoIt: SomeOneMayDoIt:
if (must) { if (must) {
cannot_be_coerced_into_BigDecimal(rb_eTypeError, v); cannot_be_coerced_into_BigDecimal(rb_eTypeError, v);