Skip to content

Commit fae1c32

Browse files
committed
Encode ±INFINITY as ±1e5000
The V8 behavior of encoding infinity as null doesn't make sense to me. Using ±1e5000 is better, because JSON.parse decodes it as INFINITY and the information is preserved. This could be a breaking change for some
1 parent 9b6718a commit fae1c32

File tree

3 files changed

+7
-12
lines changed

3 files changed

+7
-12
lines changed

test/tool/net/encodejson_test.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ assert(EncodeJson(0) == "0")
2222
assert(EncodeJson(0.0) == "0")
2323
assert(EncodeJson(3.14) == "3.14")
2424
assert(EncodeJson(0/0) == "null")
25-
assert(EncodeJson(math.huge) == "null")
25+
assert(EncodeJson(math.huge) == "1e5000")
2626
assert(EncodeJson(123.456e-789) == '0')
2727
assert(EncodeJson(9223372036854775807) == '9223372036854775807')
2828
assert(EncodeJson(-9223372036854775807 - 1) == '-9223372036854775808')

test/tool/net/jsontestsuite_okay_test.lua

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -176,30 +176,25 @@ assert(DecodeJson(' [123e-10000000] '))
176176
assert(EncodeJson(DecodeJson(' [123e-10000000] ')) == '[0]')
177177
assert(EncodeLua(DecodeJson(' [123e-10000000] ')) == '{0.}')
178178

179-
-- [jart] consistent with v8 we encode Infinity as null (wut?)
180179
-- https://github.com/nst/JSONTestSuite/tree/d64aefb55228d9584d3e5b2433f720ea8fd00c82/test_parsing/i_number_real_pos_overflow.json
181180
assert(DecodeJson(' [123123e100000] '))
182-
assert(EncodeJson(DecodeJson(' [123123e100000] ')) == '[null]')
181+
assert(EncodeJson(DecodeJson(' [123123e100000] ')) == '[1e5000]')
183182

184-
-- [jart] consistent with v8 we encode -Infinity as null (wut?)
185183
-- https://github.com/nst/JSONTestSuite/tree/d64aefb55228d9584d3e5b2433f720ea8fd00c82/test_parsing/i_number_real_neg_overflow.json
186184
assert(DecodeJson(' [-123123e100000] '))
187-
assert(EncodeJson(DecodeJson(' [-123123e100000] ')) == '[null]')
185+
assert(EncodeJson(DecodeJson(' [-123123e100000] ')) == '[-1e5000]')
188186

189-
-- [jart] consistent with v8 we encode Infinity as null (wut?)
190187
-- https://github.com/nst/JSONTestSuite/tree/d64aefb55228d9584d3e5b2433f720ea8fd00c82/test_parsing/i_number_pos_double_huge_exp.json
191188
assert(DecodeJson(' [1.5e+9999] '))
192-
assert(EncodeJson(DecodeJson(' [1.5e+9999] ')) == '[null]')
189+
assert(EncodeJson(DecodeJson(' [1.5e+9999] ')) == '[1e5000]')
193190

194-
-- [jart] consistent with v8 we encode -Infinity as null (wut?)
195191
-- https://github.com/nst/JSONTestSuite/tree/d64aefb55228d9584d3e5b2433f720ea8fd00c82/test_parsing/i_number_neg_int_huge_exp.json
196192
assert(DecodeJson(' [-1e+9999] '))
197-
assert(EncodeJson(DecodeJson(' [-1e+9999] ')) == '[null]')
193+
assert(EncodeJson(DecodeJson(' [-1e+9999] ')) == '[-1e5000]')
198194

199-
-- [jart] consistent with v8 we encode Infinity as null (wut?)
200195
-- https://github.com/nst/JSONTestSuite/tree/d64aefb55228d9584d3e5b2433f720ea8fd00c82/test_parsing/i_number_huge_exp.json
201196
assert(DecodeJson(' [0.4e00669999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999969999999006] '))
202-
assert(EncodeJson(DecodeJson(' [0.4e00669999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999969999999006] ')) == '[null]')
197+
assert(EncodeJson(DecodeJson(' [0.4e00669999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999969999999006] ')) == '[1e5000]')
203198

204199
-- [jart] consistent with v8 we encode underflow as 0
205200
-- https://github.com/nst/JSONTestSuite/tree/d64aefb55228d9584d3e5b2433f720ea8fd00c82/test_parsing/i_number_double_huge_neg_exp.json

third_party/double-conversion/wrapper.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ char* DoubleToJson(char buf[128], double x) {
3838
static const DoubleToStringConverter kDoubleToJson(
3939
DoubleToStringConverter::UNIQUE_ZERO |
4040
DoubleToStringConverter::EMIT_POSITIVE_EXPONENT_SIGN,
41-
"null", "null", 'e', -6, 21, 6, 0);
41+
"1e5000", "null", 'e', -6, 21, 6, 0);
4242
kDoubleToJson.ToShortest(x, &b);
4343
b.Finalize();
4444
if (READ32LE(buf) != READ32LE("-nul")) {

0 commit comments

Comments
 (0)