1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

[ruby/bigdecimal] Fix exception message raised in Kernel.BigDecimal

d163f170a4
ff8eeeb064
This commit is contained in:
Kenta Murata 2021-01-12 22:56:54 +09:00
parent 79d236a9f1
commit 6670de82c2
No known key found for this signature in database
GPG key ID: CEFE8AFB6081B062
2 changed files with 33 additions and 12 deletions

View file

@ -201,7 +201,7 @@ cannot_be_coerced_into_BigDecimal(VALUE exc_class, VALUE v)
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_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 VALUE rb_cstr_convert_to_BigDecimal(const char *c_str, size_t digs, int raise_exception);
static Real*
GetVpValueWithPrec(VALUE v, long prec, int must)
@ -2860,10 +2860,15 @@ rb_convert_to_BigDecimal(VALUE val, size_t digs, int raise_exception)
case Qnil:
case Qtrue:
case Qfalse:
if (!raise_exception)
return Qnil;
rb_raise(rb_eTypeError,
"can't convert %"PRIsVALUE" into BigDecimal", val);
if (raise_exception) {
const char *cname = NIL_P(val) ? "nil" :
val == Qtrue ? "true" :
val == Qfalse ? "false" :
NULL;
rb_raise(rb_eTypeError,
"can't convert %s into BigDecimal", cname);
}
return Qnil;
default:
break;
@ -2902,15 +2907,19 @@ rb_convert_to_BigDecimal(VALUE val, size_t digs, int raise_exception)
else if (RB_TYPE_P(val, T_STRING)) {
return rb_str_convert_to_BigDecimal(val, digs, raise_exception);
}
/* TODO: chheck to_d */
/* TODO: chheck to_int */
if (!raise_exception) {
VALUE str = rb_check_convert_type(val, T_STRING, "String", "to_str");
if (NIL_P(str))
return Qnil;
val = str;
VALUE str = rb_check_convert_type(val, T_STRING, "String", "to_str");
if (!RB_TYPE_P(str, T_STRING)) {
if (raise_exception) {
rb_raise(rb_eTypeError,
"can't convert %"PRIsVALUE" into BigDecimal", rb_obj_class(val));
}
return Qnil;
}
return rb_str_convert_to_BigDecimal(val, digs, raise_exception);
return rb_str_convert_to_BigDecimal(str, digs, raise_exception);
}
/* call-seq:

View file

@ -228,9 +228,18 @@ class TestBigDecimal < Test::Unit::TestCase
# assert_nothing_raised(RangeError) {
# assert_equal(nil, BigDecimal(1i, exception: false))
# }
assert_raise(TypeError) {
assert_raise_with_message(TypeError, "can't convert nil into BigDecimal") {
BigDecimal(nil, exception: true)
}
assert_raise_with_message(TypeError, "can't convert true into BigDecimal") {
BigDecimal(true, exception: true)
}
assert_raise_with_message(TypeError, "can't convert false into BigDecimal") {
BigDecimal(false, exception: true)
}
assert_raise_with_message(TypeError, "can't convert Object into BigDecimal") {
BigDecimal(Object.new, exception: true)
}
assert_nothing_raised(TypeError) {
assert_equal(nil, BigDecimal(nil, exception: false))
}
@ -240,6 +249,9 @@ class TestBigDecimal < Test::Unit::TestCase
assert_nothing_raised(TypeError) {
assert_equal(nil, BigDecimal(Object.new, exception: false))
}
assert_nothing_raised(TypeError) {
assert_equal(nil, BigDecimal(Object.new, exception: false))
}
# TODO: support to_d
# assert_nothing_raised(TypeError) {
# o = Object.new