authorgravatar for 14938807+xackus@users.noreply.github.comxackus <14938807+xackus@users.noreply.github.com> 2019-12-09 22:29:45+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-12-10 10:30:41-05:00
logc27d06596bf1b92d668fa6e28edadf153bc9a818
tree4346e90b7abd158209a707e673eec94f24e1a73b
parent3388c777fae8b76d1e325b71813361083244ce5d

fix integers parsed as floats


1 files changed, 22 insertions(+), 3 deletions(-)

lib/std/json.zig+22-3
...@@ -387,14 +387,17 @@ pub const StreamingParser = struct {...@@ -387,14 +387,17 @@ pub const StreamingParser = struct {
387 token.* = Token.initMarker(Token.Id.ArrayBegin);387 token.* = Token.initMarker(Token.Id.ArrayBegin);
388 },388 },
389 '-' => {389 '-' => {
390 p.number_is_integer = true;
390 p.state = State.Number;391 p.state = State.Number;
391 p.count = 0;392 p.count = 0;
392 },393 },
393 '0' => {394 '0' => {
395 p.number_is_integer = true;
394 p.state = State.NumberMaybeDotOrExponent;396 p.state = State.NumberMaybeDotOrExponent;
395 p.count = 0;397 p.count = 0;
396 },398 },
397 '1'...'9' => {399 '1'...'9' => {
400 p.number_is_integer = true;
398 p.state = State.NumberMaybeDigitOrDotOrExponent;401 p.state = State.NumberMaybeDigitOrDotOrExponent;
399 p.count = 0;402 p.count = 0;
400 },403 },
...@@ -453,14 +456,17 @@ pub const StreamingParser = struct {...@@ -453,14 +456,17 @@ pub const StreamingParser = struct {
453 token.* = Token.initMarker(Token.Id.ArrayBegin);456 token.* = Token.initMarker(Token.Id.ArrayBegin);
454 },457 },
455 '-' => {458 '-' => {
459 p.number_is_integer = true;
456 p.state = State.Number;460 p.state = State.Number;
457 p.count = 0;461 p.count = 0;
458 },462 },
459 '0' => {463 '0' => {
464 p.number_is_integer = true;
460 p.state = State.NumberMaybeDotOrExponent;465 p.state = State.NumberMaybeDotOrExponent;
461 p.count = 0;466 p.count = 0;
462 },467 },
463 '1'...'9' => {468 '1'...'9' => {
469 p.number_is_integer = true;
464 p.state = State.NumberMaybeDigitOrDotOrExponent;470 p.state = State.NumberMaybeDigitOrDotOrExponent;
465 p.count = 0;471 p.count = 0;
466 },472 },
...@@ -1374,8 +1380,21 @@ test "write json then parse it" {...@@ -1374,8 +1380,21 @@ test "write json then parse it" {
1374 testing.expect(mem.eql(u8, tree.root.Object.get("str").?.value.String, "hello"));1380 testing.expect(mem.eql(u8, tree.root.Object.get("str").?.value.String, "hello"));
1375}1381}
13761382
1377test "parsing empty string gives appropriate error" {1383fn test_parse(json_str: []const u8) !Value {
1378 var p = Parser.init(debug.global_allocator, false);1384 var p = Parser.init(debug.global_allocator, false);
1379 defer p.deinit();1385 return (try p.parse(json_str)).root;
1380 testing.expectError(error.UnexpectedEndOfJson, p.parse(""));1386}
1387
1388test "parsing empty string gives appropriate error" {
1389 testing.expectError(error.UnexpectedEndOfJson, test_parse(""));
1390}
1391
1392test "integer after float has proper type" {
1393 const json = try test_parse(
1394 \\{
1395 \\ "float": 3.14,
1396 \\ "ints": [1, 2, 3]
1397 \\}
1398 );
1399 std.testing.expect(json.Object.getValue("ints").?.Array.at(0) == .Integer);
1381}1400}