Skip to content

Commit 7e3c408

Browse files
authored
Changes post #4917: forcibly clear _numberString when new number token set (#1400)
1 parent dae16ea commit 7e3c408

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed

src/main/java/com/fasterxml/jackson/core/base/ParserBase.java

+3
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,7 @@ protected final JsonToken resetInt(boolean negative, int intLen)
597597
_fractLength = 0;
598598
_expLength = 0;
599599
_numTypesValid = NR_UNKNOWN; // to force decoding
600+
_numberString = null;
600601
return JsonToken.VALUE_NUMBER_INT;
601602
}
602603

@@ -611,6 +612,7 @@ protected final JsonToken resetFloat(boolean negative, int intLen, int fractLen,
611612
_fractLength = fractLen;
612613
_expLength = expLen;
613614
_numTypesValid = NR_UNKNOWN; // to force decoding
615+
_numberString = null;
614616
return JsonToken.VALUE_NUMBER_FLOAT;
615617
}
616618

@@ -621,6 +623,7 @@ protected final JsonToken resetAsNaN(String valueStr, double value)
621623
_numberDouble = value;
622624
_numTypesValid = NR_DOUBLE;
623625
_numberIsNaN = true;
626+
_numberString = null;
624627
return JsonToken.VALUE_NUMBER_FLOAT;
625628
}
626629

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package com.fasterxml.jackson.core.read;
2+
3+
import com.fasterxml.jackson.core.JUnit5TestBase;
4+
import com.fasterxml.jackson.core.JsonParser;
5+
import com.fasterxml.jackson.core.JsonToken;
6+
import com.fasterxml.jackson.core.TokenStreamFactory;
7+
import org.junit.jupiter.api.Test;
8+
9+
import static org.junit.jupiter.api.Assertions.assertEquals;
10+
11+
class NumberParsing1397Test extends JUnit5TestBase
12+
{
13+
private TokenStreamFactory JSON_F = newStreamFactory();
14+
15+
final String radiusValue = "179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
16+
final String INPUT_JSON = a2q("{ 'results': [ { " +
17+
"'radius': " + radiusValue + ", " +
18+
"'type': 'center', " +
19+
"'center': { " +
20+
"'x': -11.0, " +
21+
"'y': -2.0 } } ] }");
22+
23+
// [jackson-core#1397]
24+
@Test
25+
public void issue1397() throws Exception
26+
{
27+
for (int mode : ALL_MODES) {
28+
testIssue(JSON_F, mode, INPUT_JSON, true);
29+
testIssue(JSON_F, mode, INPUT_JSON, false);
30+
}
31+
}
32+
33+
private void testIssue(final TokenStreamFactory jsonF,
34+
final int mode,
35+
final String json,
36+
final boolean checkFirstNumValues) throws Exception
37+
{
38+
// checkFirstNumValues=false reproduces the issue in https://github.com/FasterXML/jackson-core/issues/1397
39+
try (JsonParser p = createParser(jsonF, mode, json)) {
40+
assertToken(JsonToken.START_OBJECT, p.nextToken());
41+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
42+
assertEquals("results", p.currentName());
43+
assertToken(JsonToken.START_ARRAY, p.nextToken());
44+
assertToken(JsonToken.START_OBJECT, p.nextToken());
45+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
46+
assertEquals("radius", p.currentName());
47+
assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken());
48+
assertEquals(JsonParser.NumberType.BIG_INTEGER, p.getNumberType());
49+
assertEquals(radiusValue, p.getNumberValueDeferred());
50+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
51+
assertEquals("type", p.currentName());
52+
assertToken(JsonToken.VALUE_STRING, p.nextToken());
53+
assertEquals("center", p.getText());
54+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
55+
assertEquals("center", p.currentName());
56+
assertToken(JsonToken.START_OBJECT, p.nextToken());
57+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
58+
assertEquals("x", p.currentName());
59+
assertToken(JsonToken.VALUE_NUMBER_FLOAT, p.nextToken());
60+
if (checkFirstNumValues) {
61+
assertEquals(JsonParser.NumberType.DOUBLE, p.getNumberType());
62+
assertEquals(Double.valueOf(-11.0d), p.getNumberValueDeferred());
63+
}
64+
assertEquals(Double.valueOf(-11.0d), p.getDoubleValue());
65+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
66+
assertEquals("y", p.currentName());
67+
assertToken(JsonToken.VALUE_NUMBER_FLOAT, p.nextToken());
68+
assertEquals(JsonParser.NumberType.DOUBLE, p.getNumberType());
69+
assertEquals(Double.valueOf(-2.0d), p.getNumberValueDeferred());
70+
assertEquals(Double.valueOf(-2.0d), p.getDoubleValue());
71+
assertToken(JsonToken.END_OBJECT, p.nextToken());
72+
assertToken(JsonToken.END_OBJECT, p.nextToken());
73+
assertToken(JsonToken.END_ARRAY, p.nextToken());
74+
assertToken(JsonToken.END_OBJECT, p.nextToken());
75+
}
76+
}
77+
}

0 commit comments

Comments
 (0)