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());