diff options
author | Kenta Murata <mrkn@mrkn.jp> | 2021-01-12 22:56:54 +0900 |
---|---|---|
committer | Kenta Murata <mrkn@mrkn.jp> | 2021-01-13 01:27:04 +0900 |
commit | 6670de82c2d7a1449412bf6629aa01cc8ecb35e2 (patch) | |
tree | b786a42439592ec811aef850ae31fae2cef44096 | |
parent | 79d236a9f1f8ec6f1c5649852325bdf159a0a162 (diff) |
[ruby/bigdecimal] Fix exception message raised in Kernel.BigDecimal
https://github.com/ruby/bigdecimal/commit/d163f170a4
https://github.com/ruby/bigdecimal/commit/ff8eeeb064
-rw-r--r-- | ext/bigdecimal/bigdecimal.c | 31 | ||||
-rw-r--r-- | test/bigdecimal/test_bigdecimal.rb | 14 |
2 files changed, 33 insertions, 12 deletions
diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c index 4e124bdea1..8414769c69 100644 --- a/ext/bigdecimal/bigdecimal.c +++ b/ext/bigdecimal/bigdecimal.c @@ -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: diff --git a/test/bigdecimal/test_bigdecimal.rb b/test/bigdecimal/test_bigdecimal.rb index fbe0d7e98a..b15b046f4c 100644 --- a/test/bigdecimal/test_bigdecimal.rb +++ b/test/bigdecimal/test_bigdecimal.rb @@ -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 |