From 3d2cf0d9bf1e62d1fb51751b73f85e81634e6277 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Mon, 3 Apr 2023 08:55:48 +0900 Subject: [PATCH] mruby-bigint/bigint.c: fix int64/uint64 conversion The functions were totally wrong in digit order and sign treatment. We didn't notice since they are only called from mruby-time in the m64-i32 configuration. --- mrbgems/mruby-bigint/core/bigint.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/mrbgems/mruby-bigint/core/bigint.c b/mrbgems/mruby-bigint/core/bigint.c index f895ed826..915c4a089 100644 --- a/mrbgems/mruby-bigint/core/bigint.c +++ b/mrbgems/mruby-bigint/core/bigint.c @@ -1186,12 +1186,14 @@ mrb_bint_as_int64(mrb_state *mrb, mrb_value x) out_of_range: mrb_raise(mrb, E_RANGE_ERROR, "integer out of range"); } - for (size_t i=0; ip[i]; + if (i==0) break; } if (u > INT64_MAX) goto out_of_range; - return -(int64_t)u; + if (m->sn < 0) return -(int64_t)u; + return (int64_t)u; } #endif @@ -1206,9 +1208,10 @@ mrb_bint_as_uint64(mrb_state *mrb, mrb_value x) if (m->sn < 0 || len*sizeof(mp_limb) > sizeof(uint64_t)) { mrb_raise(mrb, E_RANGE_ERROR, "integer out of range"); } - for (size_t i=0; ip[i]; + if (i==0) break; } return u; }