diff --git a/lib7/std/math/bigint.c3 b/lib7/std/math/bigint.c3 index 768a1f033..ba3267a86 100644 --- a/lib7/std/math/bigint.c3 +++ b/lib7/std/math/bigint.c3 @@ -44,16 +44,15 @@ fn BigInt* BigInt.init(&self, int128 value) fn BigInt* BigInt.init_with_u128(&self, uint128 value) { self.data[..] = 0; - int128 tmp = value; + uint128 tmp = value; uint len = 0; - while (tmp != 0 && len < MAX_LEN) + while (tmp != 0) { self.data[len] = (uint)(tmp & 0xFFFFFFFF); tmp >>= 32; len++; } - self.len = len; - assert(value == 0 || tmp == 0 || !self.is_negative()); + assert(!self.is_negative()); self.len = max(len, 1); return self; } @@ -64,11 +63,18 @@ fn BigInt* BigInt.init_with_u128(&self, uint128 value) fn BigInt* BigInt.init_with_array(&self, uint[] values) { self.data[..] = 0; + + if (values.len == 0) + { + self.len = 1; + return self; + } + self.len = values.len; foreach_r(i, val : values) { - values[values.len - 1 - i] = val; + self.data[values.len - 1 - i] = val; } while (self.len > 1 && self.data[self.len - 1] == 0) { diff --git a/test/unit7/stdlib/math/bigint.c3 b/test/unit7/stdlib/math/bigint.c3 index 41b21f718..aa0893446 100644 --- a/test/unit7/stdlib/math/bigint.c3 +++ b/test/unit7/stdlib/math/bigint.c3 @@ -1,5 +1,19 @@ module std::math::bigint @test; +fn void test_init_with_u128() +{ + BigInt bi @noinit; + assert(!bi.init_with_u128(uint128.max).is_negative()); +} + +fn void init_with_array() +{ + BigInt bi @noinit; + assert(bi.init_with_array({}).equals(ZERO)); + assert(bi.init_with_array({0, 0, 0, 1}).equals(bigint::from_int(1))); + assert("100000000" == bi.init_with_array({1, 0}).to_string_with_radix(16, allocator::temp())); +} + fn void test_parse16() { BigInt bi @noinit;