From 7657082a388fbba3b89356b6cdaaf0f75da88a1a Mon Sep 17 00:00:00 2001 From: Andrey Date: Sat, 15 Aug 2026 15:26:15 +0000 Subject: [PATCH 1/6] JS: make `string.inspect` print numbers like `1.0e200` correctly. See https://github.com/gleam-lang/gleam/commit/6d6824f799b44a5fca1dcb926c45aa3f4fca8fbc --- src/gleam_stdlib.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gleam_stdlib.mjs b/src/gleam_stdlib.mjs index bcce4773..3fc3d893 100644 --- a/src/gleam_stdlib.mjs +++ b/src/gleam_stdlib.mjs @@ -718,7 +718,7 @@ class Inspector { if (v === null) return "//js(null)"; if (v === undefined) return "Nil"; if (t === "string") return this.#string(v); - if (t === "bigint" || Number.isInteger(v)) return v.toString(); + if (t === "bigint" || Number.isSafeInteger(v)) return v.toString(); if (t === "number") return float_to_string(v); if (v instanceof UtfCodepoint) return this.#utfCodepoint(v); if (v instanceof BitArray) return this.#bit_array(v); From d3077ac428cab29e165d16a25244b932215c773e Mon Sep 17 00:00:00 2001 From: Andrey Date: Sat, 15 Aug 2026 15:49:42 +0000 Subject: [PATCH 2/6] add tests for `string.inspect`ing of some floats --- test/gleam/string_test.gleam | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/gleam/string_test.gleam b/test/gleam/string_test.gleam index ec4c0880..cf7bd53a 100644 --- a/test/gleam/string_test.gleam +++ b/test/gleam/string_test.gleam @@ -1262,6 +1262,14 @@ pub fn inspect_451_test() { assert string.inspect(<<255, 2, 0>>) == "<<255, 2, 0>>" } +pub fn inspect_456_test() { + assert string.inspect(1.0e300) == "1.0e300" +} + +pub fn inspect_461_test() { + assert string.inspect(1.0e-300) == "1.0e-300" +} + pub fn inspect_charlist_test() { let list = [ 70, 97, 105, 108, 101, 100, 32, 116, 111, 32, 108, 111, 97, 100, 32, 78, 73, From 09e847487235e3122150e3e7b12ddea11a943fe4 Mon Sep 17 00:00:00 2001 From: Andrey Date: Sat, 15 Aug 2026 15:57:17 +0000 Subject: [PATCH 3/6] add changelog entry for `string.inspect`ing of some floats --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ea75a74..79dcb2da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## Unreleased + +- Fixed a bug where `string.inspect` on the JavaScript target would incorrectly + print numbers like `1.0e300`. + ## v1.0.5 - 2026-08-06 - Fixed a bug where `bit_array.pad_to_bytes` could crash. From 867ef9447a1813439431880f49510e11b201501b Mon Sep 17 00:00:00 2001 From: Andrey Date: Sat, 15 Aug 2026 15:32:43 +0000 Subject: [PATCH 4/6] JS: make `string.inspect` print NaN and Infinity correctly See https://github.com/gleam-lang/gleam/commit/bce93dbfa7a0cf014e02c5f69ee5f23822a89f65 and https://github.com/gleam-lang/gleam/commit/6b45966535dc4a89b089a0f7a6206802883a7e00 --- src/gleam_stdlib.mjs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/gleam_stdlib.mjs b/src/gleam_stdlib.mjs index 3fc3d893..d7dabbcd 100644 --- a/src/gleam_stdlib.mjs +++ b/src/gleam_stdlib.mjs @@ -702,8 +702,11 @@ export function float_to_string(float) { const index = string.indexOf("e"); if (index >= 0) { return string.slice(0, index) + ".0" + string.slice(index); - } else { + } else if (globalThis.Number.isInteger(float)) { return string + ".0"; + } else { + // For NaN and Infinity we return it as JS representation. + return "//js(" + string + ")"; } } } From 2cfbd8659ed488805a4d162a3f41b604d61ad00a Mon Sep 17 00:00:00 2001 From: Andrey Date: Sat, 15 Aug 2026 15:46:33 +0000 Subject: [PATCH 5/6] add tests for `string.inspect`ing of NaN and Infinity --- test/gleam/string_test.gleam | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/gleam/string_test.gleam b/test/gleam/string_test.gleam index cf7bd53a..a5b18e4d 100644 --- a/test/gleam/string_test.gleam +++ b/test/gleam/string_test.gleam @@ -1325,6 +1325,19 @@ pub fn target_inspect_bit_array_test() { assert string.inspect(<<"abc":utf8>>) == "<<97, 98, 99>>" } +@target(javascript) +pub fn target_inspect_nan_test() { + let infinity = 1.0e300 *. 1.0e300 + let nan = infinity /. infinity + assert string.inspect(nan) == "//js(NaN)" +} + +@target(javascript) +pub fn target_inspect_infinity_test() { + let infinity = 1.0e300 *. 1.0e300 + assert string.inspect(infinity) == "//js(Infinity)" +} + @target(erlang) @external(erlang, "erlang", "self") fn create_erlang_pid() -> String From 4e326d3b39dbe1a90140d647e6ff3667d4d41f70 Mon Sep 17 00:00:00 2001 From: Andrey Date: Sat, 15 Aug 2026 15:59:46 +0000 Subject: [PATCH 6/6] add changelog entry for `string.inspect`ing of NaN and Infinity --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79dcb2da..215aa198 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ - Fixed a bug where `string.inspect` on the JavaScript target would incorrectly print numbers like `1.0e300`. +- Fixed a bug where `stting.inspect` on the JavaScript target would incorrectly + print NaN and Infinity. ## v1.0.5 - 2026-08-06