Skip to content

Commit

Permalink
Changes post #4917: forcibly clear _numberString when new number to…
Browse files Browse the repository at this point in the history
…ken set (#1400)
  • Loading branch information
pjfanning authored Feb 5, 2025
1 parent dae16ea commit 7e3c408
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 0 deletions.
3 changes: 3 additions & 0 deletions src/main/java/com/fasterxml/jackson/core/base/ParserBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -597,6 +597,7 @@ protected final JsonToken resetInt(boolean negative, int intLen)
_fractLength = 0;
_expLength = 0;
_numTypesValid = NR_UNKNOWN; // to force decoding
_numberString = null;
return JsonToken.VALUE_NUMBER_INT;
}

Expand All @@ -611,6 +612,7 @@ protected final JsonToken resetFloat(boolean negative, int intLen, int fractLen,
_fractLength = fractLen;
_expLength = expLen;
_numTypesValid = NR_UNKNOWN; // to force decoding
_numberString = null;
return JsonToken.VALUE_NUMBER_FLOAT;
}

Expand All @@ -621,6 +623,7 @@ protected final JsonToken resetAsNaN(String valueStr, double value)
_numberDouble = value;
_numTypesValid = NR_DOUBLE;
_numberIsNaN = true;
_numberString = null;
return JsonToken.VALUE_NUMBER_FLOAT;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package com.fasterxml.jackson.core.read;

import com.fasterxml.jackson.core.JUnit5TestBase;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.core.TokenStreamFactory;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

class NumberParsing1397Test extends JUnit5TestBase
{
private TokenStreamFactory JSON_F = newStreamFactory();

final String radiusValue = "179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
final String INPUT_JSON = a2q("{ 'results': [ { " +
"'radius': " + radiusValue + ", " +
"'type': 'center', " +
"'center': { " +
"'x': -11.0, " +
"'y': -2.0 } } ] }");

// [jackson-core#1397]
@Test
public void issue1397() throws Exception
{
for (int mode : ALL_MODES) {
testIssue(JSON_F, mode, INPUT_JSON, true);
testIssue(JSON_F, mode, INPUT_JSON, false);
}
}

private void testIssue(final TokenStreamFactory jsonF,
final int mode,
final String json,
final boolean checkFirstNumValues) throws Exception
{
// checkFirstNumValues=false reproduces the issue in https://github.com/FasterXML/jackson-core/issues/1397
try (JsonParser p = createParser(jsonF, mode, json)) {
assertToken(JsonToken.START_OBJECT, p.nextToken());
assertToken(JsonToken.FIELD_NAME, p.nextToken());
assertEquals("results", p.currentName());
assertToken(JsonToken.START_ARRAY, p.nextToken());
assertToken(JsonToken.START_OBJECT, p.nextToken());
assertToken(JsonToken.FIELD_NAME, p.nextToken());
assertEquals("radius", p.currentName());
assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken());
assertEquals(JsonParser.NumberType.BIG_INTEGER, p.getNumberType());
assertEquals(radiusValue, p.getNumberValueDeferred());
assertToken(JsonToken.FIELD_NAME, p.nextToken());
assertEquals("type", p.currentName());
assertToken(JsonToken.VALUE_STRING, p.nextToken());
assertEquals("center", p.getText());
assertToken(JsonToken.FIELD_NAME, p.nextToken());
assertEquals("center", p.currentName());
assertToken(JsonToken.START_OBJECT, p.nextToken());
assertToken(JsonToken.FIELD_NAME, p.nextToken());
assertEquals("x", p.currentName());
assertToken(JsonToken.VALUE_NUMBER_FLOAT, p.nextToken());
if (checkFirstNumValues) {
assertEquals(JsonParser.NumberType.DOUBLE, p.getNumberType());
assertEquals(Double.valueOf(-11.0d), p.getNumberValueDeferred());
}
assertEquals(Double.valueOf(-11.0d), p.getDoubleValue());
assertToken(JsonToken.FIELD_NAME, p.nextToken());
assertEquals("y", p.currentName());
assertToken(JsonToken.VALUE_NUMBER_FLOAT, p.nextToken());
assertEquals(JsonParser.NumberType.DOUBLE, p.getNumberType());
assertEquals(Double.valueOf(-2.0d), p.getNumberValueDeferred());
assertEquals(Double.valueOf(-2.0d), p.getDoubleValue());
assertToken(JsonToken.END_OBJECT, p.nextToken());
assertToken(JsonToken.END_OBJECT, p.nextToken());
assertToken(JsonToken.END_ARRAY, p.nextToken());
assertToken(JsonToken.END_OBJECT, p.nextToken());
}
}
}

0 comments on commit 7e3c408

Please sign in to comment.