Skip to content

Commit 381ddf5

Browse files
committed
Use rb_cstr_convert_to_BigDecimal in GetVpValueWithPrec
1 parent ac230a9 commit 381ddf5

File tree

1 file changed

+25
-28
lines changed

1 file changed

+25
-28
lines changed

ext/bigdecimal/bigdecimal.c

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -201,61 +201,58 @@ cannot_be_coerced_into_BigDecimal(VALUE exc_class, VALUE v)
201201
static inline VALUE BigDecimal_div2(VALUE, VALUE, VALUE);
202202
static VALUE rb_float_convert_to_BigDecimal(VALUE val, size_t digs, int raise_exception);
203203
static VALUE rb_rational_convert_to_BigDecimal(VALUE val, size_t digs, int raise_exception);
204+
static VALUE rb_cstr_convert_to_BigDecimal(const char *cstr, size_t digs, int raise_exception);
204205

205206
static Real*
206207
GetVpValueWithPrec(VALUE v, long prec, int must)
207208
{
208209
const size_t digs = prec < 0 ? SIZE_MAX : (size_t)prec;
209-
Real *pv;
210210

211211
switch(TYPE(v)) {
212-
case T_FLOAT: {
213-
VALUE obj = rb_float_convert_to_BigDecimal(v, digs, must);
214-
TypedData_Get_Struct(obj, Real, &BigDecimal_data_type, pv);
215-
return pv;
216-
}
212+
case T_FLOAT:
213+
v = rb_float_convert_to_BigDecimal(v, digs, must);
214+
break;
217215

218-
case T_RATIONAL: {
219-
VALUE obj = rb_rational_convert_to_BigDecimal(v, digs, must);
220-
TypedData_Get_Struct(obj, Real, &BigDecimal_data_type, pv);
221-
return pv;
222-
}
216+
case T_RATIONAL:
217+
v = rb_rational_convert_to_BigDecimal(v, digs, must);
218+
break;
223219

224220
case T_DATA:
225-
if (is_kind_of_BigDecimal(v)) {
226-
pv = DATA_PTR(v);
227-
return pv;
228-
}
229-
else {
230-
goto SomeOneMayDoIt;
231-
}
232-
break;
221+
if (!is_kind_of_BigDecimal(v)) {
222+
goto SomeOneMayDoIt;
223+
}
224+
break;
233225

234226
case T_FIXNUM: {
235227
char szD[128];
236-
sprintf(szD, "%ld", FIX2LONG(v));
237-
return VpCreateRbObject(VpBaseFig() * 2 + 1, szD, true);
228+
sprintf(szD, "%ld", FIX2LONG(v));
229+
v = rb_cstr_convert_to_BigDecimal(szD, VpBaseFig() * 2 + 1, must);
230+
break;
238231
}
239232

240233
#ifdef ENABLE_NUMERIC_STRING
241-
case T_STRING:
242-
StringValueCStr(v);
243-
return VpCreateRbObject(RSTRING_LEN(v) + VpBaseFig() + 1,
244-
RSTRING_PTR(v), true);
234+
case T_STRING: {
235+
const char *c_str = StringValueCStr(v);
236+
v = rb_cstr_convert_to_BigDecimal(c_str, RSTRING_LEN(v) + VpBaseFig() + 1, must);
237+
break;
238+
}
245239
#endif /* ENABLE_NUMERIC_STRING */
246240

247241
case T_BIGNUM: {
248242
VALUE bg = rb_big2str(v, 10);
249-
pv = VpCreateRbObject(strlen(RSTRING_PTR(bg)) + VpBaseFig() + 1,
250-
RSTRING_PTR(bg), true);
243+
v = rb_cstr_convert_to_BigDecimal(RSTRING_PTR(bg), RSTRING_LEN(bg) + VpBaseFig() + 1, must);
251244
RB_GC_GUARD(bg);
252-
return pv;
245+
break;
253246
}
254247

255248
default:
256249
goto SomeOneMayDoIt;
257250
}
258251

252+
Real *vp;
253+
TypedData_Get_Struct(v, Real, &BigDecimal_data_type, vp);
254+
return vp;
255+
259256
SomeOneMayDoIt:
260257
if (must) {
261258
cannot_be_coerced_into_BigDecimal(rb_eTypeError, v);

0 commit comments

Comments
 (0)