Merge branch 'master' of github.com:FasterXML/jackson-core
diff --git a/release-notes/VERSION b/release-notes/VERSION
index 03f7c83..b17c717 100644
--- a/release-notes/VERSION
+++ b/release-notes/VERSION
@@ -10,18 +10,22 @@
=== History: ===
------------------------------------------------------------------------
-2.4.2 (xx-Aug-2014)
+2.4.4 (xx-xxx-2014)
-#146: Error while parsing negative floats at the end of the input buffer
- (reported by rjmac@github)
+#157: ArrayIndexOutOfBoundsException: 200 on numbers with more than 200 digits.
+ (reported by Lars P, larsp@github)
-2.4.1.1 (09-Jul-2014)
+2.4.3 (02-Oct-2014)
-NOTE: this is a "micro-release", which does NOT contain all versions of
-components but only individual components with critical fix(es).
+#152: Exception for property names longer than 256k
+ (reported by CrendKing@github)
+
+2.4.2 (13-Aug-2014)
#145: NPE at BytesToNameCanonicalizer
(reported by Shay B)
+#146: Error while parsing negative floats at the end of the input buffer
+ (reported by rjmac@github)
2.4.1 (16-Jun-2014)
diff --git a/src/main/java/com/fasterxml/jackson/core/base/GeneratorBase.java b/src/main/java/com/fasterxml/jackson/core/base/GeneratorBase.java
index f249133..aa4dbd3 100644
--- a/src/main/java/com/fasterxml/jackson/core/base/GeneratorBase.java
+++ b/src/main/java/com/fasterxml/jackson/core/base/GeneratorBase.java
@@ -65,10 +65,21 @@
protected GeneratorBase(int features, ObjectCodec codec) {
super();
_features = features;
+ _objectCodec = codec;
DupDetector dups = Feature.STRICT_DUPLICATE_DETECTION.enabledIn(features)
? DupDetector.rootDetector(this) : null;
_writeContext = JsonWriteContext.createRootContext(dups);
+ _cfgNumbersAsStrings = Feature.WRITE_NUMBERS_AS_STRINGS.enabledIn(features);
+ }
+
+ /**
+ * @since 2.5
+ */
+ protected GeneratorBase(int features, ObjectCodec codec, JsonWriteContext ctxt) {
+ super();
+ _features = features;
_objectCodec = codec;
+ _writeContext = ctxt;
_cfgNumbersAsStrings = Feature.WRITE_NUMBERS_AS_STRINGS.enabledIn(features);
}
diff --git a/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java b/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java
index 24cb714..b903eda 100644
--- a/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java
+++ b/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java
@@ -1189,17 +1189,17 @@
protected JsonToken _parsePosNumber(int c) throws IOException
{
char[] outBuf = _textBuffer.emptyAndGetCurrentSegment();
- int outPtr = 0;
// One special case: if first char is 0, must not be followed by a digit
if (c == INT_0) {
c = _verifyNoLeadingZeroes();
}
// Ok: we can first just add digit we saw first:
- outBuf[outPtr++] = (char) c;
+ outBuf[0] = (char) c;
int intLen = 1;
+ int outPtr = 1;
// And then figure out how far we can read without further checks
// for either input or output
- int end = _inputPtr + outBuf.length;
+ int end = _inputPtr + outBuf.length - 1; // 1 == outPtr
if (end > _inputEnd) {
end = _inputEnd;
}
@@ -1256,7 +1256,7 @@
// And then figure out how far we can read without further checks
// for either input or output
- int end = _inputPtr + outBuf.length;
+ int end = _inputPtr + outBuf.length - outPtr;
if (end > _inputEnd) {
end = _inputEnd;
}
diff --git a/src/test/java/com/fasterxml/jackson/core/json/TestNumericValues.java b/src/test/java/com/fasterxml/jackson/core/json/TestNumericValues.java
index 13df658..b4b33cb 100644
--- a/src/test/java/com/fasterxml/jackson/core/json/TestNumericValues.java
+++ b/src/test/java/com/fasterxml/jackson/core/json/TestNumericValues.java
@@ -422,14 +422,65 @@
}
}
+ // [jackson-core#157]
+ public void testLongNumbers() throws Exception
+ {
+ StringBuilder sb = new StringBuilder(9000);
+ for (int i = 0; i < 9000; ++i) {
+ sb.append('9');
+ }
+ String NUM = sb.toString();
+ // force use of new factory, just in case (might still recycle same buffers tho?)
+ JsonFactory f = new JsonFactory();
+ _testLongNumbers(f, NUM, false);
+ _testLongNumbers(f, NUM, true);
+ }
+
+ private void _testLongNumbers(JsonFactory f, String num, boolean useStream) throws Exception
+ {
+ final String doc = "[ "+num+" ]";
+ JsonParser jp = useStream
+ ? f.createParser(doc.getBytes("UTF-8"))
+ : f.createParser(doc);
+ assertToken(JsonToken.START_ARRAY, jp.nextToken());
+ assertToken(JsonToken.VALUE_NUMBER_INT, jp.nextToken());
+ assertEquals(num, jp.getText());
+ assertToken(JsonToken.END_ARRAY, jp.nextToken());
+ }
+
+ // and alternate take on for #157 (with negative num)
+ public void testLongNumbers2() throws Exception
+ {
+ StringBuilder input = new StringBuilder();
+ // test this with negative
+ input.append('-');
+ for (int i = 0; i < 2100; i++) {
+ input.append(1);
+ }
+ final String DOC = input.toString();
+ JsonFactory f = new JsonFactory();
+ _testIssue160LongNumbers(f, DOC, false);
+ _testIssue160LongNumbers(f, DOC, true);
+ }
+
+ private void _testIssue160LongNumbers(JsonFactory f, String doc, boolean useStream) throws Exception
+ {
+ JsonParser jp = useStream
+ ? FACTORY.createParser(doc.getBytes("UTF-8"))
+ : FACTORY.createParser(doc);
+ assertToken(JsonToken.VALUE_NUMBER_INT, jp.nextToken());
+ BigInteger v = jp.getBigIntegerValue();
+ assertNull(jp.nextToken());
+ assertEquals(doc, v.toString());
+ }
+
/*
/**********************************************************
/* Tests for invalid access
/**********************************************************
*/
- public void testInvalidBooleanAccess()
- throws Exception
+ public void testInvalidBooleanAccess() throws Exception
{
JsonParser jp = FACTORY.createParser("[ \"abc\" ]");
assertToken(JsonToken.START_ARRAY, jp.nextToken());