anchor.diff:      assert(start < chunkEnd);
       int length = chunkEnd - start;
       var buffer = new _NumberBuffer(length);
  -    copyCharsToList(start, chunkEnd, buffer.list);
  +    copyCharsToList(start, chunkEnd, buffer.list, 0);
       buffer.length = length;
       return buffer;
     }
  
positive.code:   int finishChunkNumber(int state, int start, int end, _NumberBuffer buffer) {
      if (state == NUM_ZERO) {
        listener.handleNumber(0);
        return;
      }
      if (end > start) {
        addNumberChunk(buffer, start, end, 0);
  
negative.code:     // Break this block when the end of the number literal is reached.
      // At that time, position points to the next character, and isDouble
      // is set if the literal contains a decimal point or an exponential.
      if (char == MINUS) {
        sign = -1;
        position++;
        if (position == length) return beginChunkNumber(NUM_SIGN, start);
        char = getChar(position);
      }
      int digit = char ^ CHAR_0;
      if (digit > 9) {
        if (sign < 0) {
          fail(position, "Missing expected digit");
        } else {
          // If it doesn't even start out as a numeral.
          fail(position, "Unexpected character");
        }
      }
      if (digit == 0) {
        position++;
        if (position == length) return beginChunkNumber(NUM_ZERO, start);
        char = getChar(position);
        digit = char ^ CHAR_0;
        // If starting with zero, next character must not be digit.
        if (digit <= 9) fail(position);
      } else {
        do {
          intValue = 10 * intValue + digit;
          position++;
          if (position == length) return beginChunkNumber(NUM_DIGIT, start);
          char = getChar(position);
          digit = char ^ CHAR_0;
        } while (digit <= 9);
      }
      if (char == DECIMALPOINT) {
        isDouble = true;
        doubleValue = intValue.toDouble();
        intValue = 0;
        position++;
        if (position == length) return beginChunkNumber(NUM_DOT, start);
        char = getChar(position);
        digit = char ^ CHAR_0;
        if (digit > 9) fail(position);
        do {
          doubleValue = 10.0 * doubleValue + digit;
          intValue -= 1;
          position++;
          if (position == length) return beginChunkNumber(NUM_DOT_DIGIT, start);
          char = getChar(position);
          digit = char ^ CHAR_0;
        } while (digit <= 9);
      }
      if ((char | 0x20) == CHAR_e) {
        if (!isDouble) {
          doubleValue = intValue.toDouble();
          intValue = 0;
          isDouble = true;
        }
        position++;
        if (position == length) return beginChunkNumber(NUM_E, start);
        char = getChar(position);
        int expSign = 1;
        int exponent = 0;
        if (char == PLUS || char == MINUS) {
          expSign = 0x2C - char;  // -1 for MINUS, +1 for PLUS
          position++;
          if (position == length) return beginChunkNumber(NUM_E_SIGN, start);
          char = getChar(position);
        }
        digit = char ^ CHAR_0;
        if (digit > 9) {
          fail(position, "Missing expected digit");
        }
        do {
          exponent = 10 * exponent + digit;
          position++;
          if (position == length) return beginChunkNumber(NUM_E_DIGIT, start);
          char = getChar(position);
          digit = char ^ CHAR_0;
        } while (digit <= 9);
        intValue += expSign * exponent;
      }
      if (!isDouble) {
        listener.handleNumber(sign * intValue);
  