From 164d7a6e15534e7462c87ac78a971a88bc4b7758 Mon Sep 17 00:00:00 2001
From: Nicholas Nethercote <nnethercote@mozilla.com>
Date: Tue, 28 Jan 2014 20:45:23 -0800
Subject: [PATCH] Don't create a string when lexing all-digit integers.

---
 src/core/parser.js | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/src/core/parser.js b/src/core/parser.js
index 3dcbb931f..28e081630 100644
--- a/src/core/parser.js
+++ b/src/core/parser.js
@@ -396,6 +396,7 @@ var Lexer = (function LexerClosure() {
     getNumber: function Lexer_getNumber() {
       var floating = false;
       var ch = this.currentChar;
+      var allDigits = ch >= 0x30 && ch <= 0x39;
       var strBuf = this.strBuf;
       strBuf.length = 0;
       strBuf.push(String.fromCharCode(ch));
@@ -405,20 +406,33 @@ var Lexer = (function LexerClosure() {
         } else if (ch === 0x2E && !floating) { // '.'
           strBuf.push('.');
           floating = true;
+          allDigits = false;
         } else if (ch === 0x2D) { // '-'
           // ignore minus signs in the middle of numbers to match
           // Adobe's behavior
           warn('Badly formated number');
+          allDigits = false;
         } else if (ch === 0x45 || ch === 0x65) { // 'E', 'e'
           floating = true;
+          allDigits = false;
         } else {
           // the last character doesn't belong to us
           break;
         }
       }
-      var value = parseFloat(strBuf.join(''));
-      if (isNaN(value))
-        error('Invalid floating point number: ' + value);
+      var value;
+      if (allDigits) {
+        value = 0;
+        var charCodeOfZero = 48;    // '0'
+        for (var i = 0, ii = strBuf.length; i < ii; i++) {
+          value = value * 10 + (strBuf[i].charCodeAt(0) - charCodeOfZero);
+        }
+      } else {
+        value = parseFloat(strBuf.join(''));
+        if (isNaN(value)) {
+          error('Invalid floating point number: ' + value);
+        }
+      }
       return value;
     },
     getString: function Lexer_getString() {