From 7a86e956787e3f57a0e3ce7afe7b008d891ba2ba Mon Sep 17 00:00:00 2001 From: Maciej Rzasa Date: Tue, 4 Feb 2025 09:00:22 +0100 Subject: [PATCH 1/2] Cast divmod quotient to int --- ext/bigdecimal/bigdecimal.c | 4 ++-- test/bigdecimal/test_bigdecimal.rb | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c index a707295e..1831cd9a 100644 --- a/ext/bigdecimal/bigdecimal.c +++ b/ext/bigdecimal/bigdecimal.c @@ -2172,8 +2172,8 @@ BigDecimal_divmod(VALUE self, VALUE r) Real *div = NULL, *mod = NULL; if (BigDecimal_DoDivmod(self, r, &div, &mod)) { - SAVE(div); SAVE(mod); - return rb_assoc_new(VpCheckGetValue(div), VpCheckGetValue(mod)); + SAVE(div); SAVE(mod); + return rb_assoc_new(BigDecimal_to_i(VpCheckGetValue(div)), VpCheckGetValue(mod)); } return DoSomeOne(self,r,rb_intern("divmod")); } diff --git a/test/bigdecimal/test_bigdecimal.rb b/test/bigdecimal/test_bigdecimal.rb index dbc00e56..81a747b2 100644 --- a/test/bigdecimal/test_bigdecimal.rb +++ b/test/bigdecimal/test_bigdecimal.rb @@ -1052,6 +1052,10 @@ def test_divmod assert_equal([0, 0], BigDecimal("0").divmod(2)) + quotient, reminder = BigDecimal("10").divmod(3) + assert_kind_of(Integer, quotient) + assert_kind_of(BigDecimal, reminder) + BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false) assert_raise(ZeroDivisionError){BigDecimal("0").divmod(0)} end From b8db4ad68bc7f00e7d81e4e81b753e42f518febf Mon Sep 17 00:00:00 2001 From: Maciej Rzasa Date: Tue, 4 Feb 2025 23:06:21 +0100 Subject: [PATCH 2/2] fixup! Cast divmod quotient to int --- ext/bigdecimal/bigdecimal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c index 1831cd9a..38dbba68 100644 --- a/ext/bigdecimal/bigdecimal.c +++ b/ext/bigdecimal/bigdecimal.c @@ -2172,7 +2172,7 @@ BigDecimal_divmod(VALUE self, VALUE r) Real *div = NULL, *mod = NULL; if (BigDecimal_DoDivmod(self, r, &div, &mod)) { - SAVE(div); SAVE(mod); + SAVE(div); SAVE(mod); return rb_assoc_new(BigDecimal_to_i(VpCheckGetValue(div)), VpCheckGetValue(mod)); } return DoSomeOne(self,r,rb_intern("divmod"));