[前][次][番号順一覧][スレッド一覧]

ruby-changes:70477

From: Kenta <ko1@a...>
Date: Fri, 24 Dec 2021 02:30:05 +0900 (JST)
Subject: [ruby-changes:70477] 8ee8ac6423 (master): [ruby/bigdecimal] Fix trailing zeros handling in rb_uint64_convert_to_BigDecimal

https://git.ruby-lang.org/ruby.git/commit/?id=8ee8ac6423

From 8ee8ac64239626a9adea4e02ba3f0c4be4895e36 Mon Sep 17 00:00:00 2001
From: Kenta Murata <mrkn@m...>
Date: Thu, 18 Nov 2021 10:59:12 +0900
Subject: [ruby/bigdecimal] Fix trailing zeros handling in
 rb_uint64_convert_to_BigDecimal

Fix GH-192

https://github.com/ruby/bigdecimal/commit/eebc98b85a
---
 ext/bigdecimal/bigdecimal.c | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c
index 8a107386a4a..7cec33b7c94 100644
--- a/ext/bigdecimal/bigdecimal.c
+++ b/ext/bigdecimal/bigdecimal.c
@@ -2862,21 +2862,29 @@ rb_uint64_convert_to_BigDecimal(uint64_t uval, RB_UNUSED_VAR(size_t digs), int r https://github.com/ruby/ruby/blob/trunk/ext/bigdecimal/bigdecimal.c#L2862
     }
     else {
         DECDIG buf[BIGDECIMAL_INT64_MAX_LENGTH] = {0,};
-        size_t exp = 0, ntz = 0;
-        for (; uval > 0; ++exp) {
-            DECDIG r = uval % BASE;
-            if (r == 0) ++ntz;
-            buf[BIGDECIMAL_INT64_MAX_LENGTH - exp - 1] = r;
+        DECDIG r = uval % BASE;
+        size_t len = 0, ntz = 0;
+        if (r == 0) {
+            // Count and skip trailing zeros
+            for (; r == 0 && uval > 0; ++ntz) {
+                uval /= BASE;
+                r = uval % BASE;
+            }
+        }
+        for (; uval > 0; ++len) {
+            // Store digits
+            buf[BIGDECIMAL_INT64_MAX_LENGTH - len - 1] = r;
             uval /= BASE;
+            r = uval % BASE;
         }
 
-        const size_t len = exp - ntz;
+        const size_t exp = len + ntz;
         vp = VpAllocReal(len);
         vp->MaxPrec = len;
         vp->Prec = len;
         vp->exponent = exp;
         VpSetSign(vp, 1);
-        MEMCPY(vp->frac, buf + BIGDECIMAL_INT64_MAX_LENGTH - exp, DECDIG, len);
+        MEMCPY(vp->frac, buf + BIGDECIMAL_INT64_MAX_LENGTH - len, DECDIG, len);
     }
 
     return BigDecimal_wrap_struct(obj, vp);
-- 
cgit v1.2.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]