[ruby/bigdecimal] Use rb_cstr_convert_to_BigDecimal in GetVpValueWithPrec
https://github.com/ruby/bigdecimal/commit/381ddf5ff6
This commit is contained in:
parent
78d3813c74
commit
1d04faee23
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user