@@ -201,61 +201,58 @@ cannot_be_coerced_into_BigDecimal(VALUE exc_class, VALUE v)
201
201
static inline VALUE BigDecimal_div2 (VALUE , VALUE , VALUE );
202
202
static VALUE rb_float_convert_to_BigDecimal (VALUE val , size_t digs , int raise_exception );
203
203
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 );
204
205
205
206
static Real *
206
207
GetVpValueWithPrec (VALUE v , long prec , int must )
207
208
{
208
209
const size_t digs = prec < 0 ? SIZE_MAX : (size_t )prec ;
209
- Real * pv ;
210
210
211
211
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 ;
217
215
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 ;
223
219
224
220
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 ;
233
225
234
226
case T_FIXNUM : {
235
227
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 ;
238
231
}
239
232
240
233
#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
+ }
245
239
#endif /* ENABLE_NUMERIC_STRING */
246
240
247
241
case T_BIGNUM : {
248
242
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 );
251
244
RB_GC_GUARD (bg );
252
- return pv ;
245
+ break ;
253
246
}
254
247
255
248
default :
256
249
goto SomeOneMayDoIt ;
257
250
}
258
251
252
+ Real * vp ;
253
+ TypedData_Get_Struct (v , Real , & BigDecimal_data_type , vp );
254
+ return vp ;
255
+
259
256
SomeOneMayDoIt :
260
257
if (must ) {
261
258
cannot_be_coerced_into_BigDecimal (rb_eTypeError , v );
0 commit comments