From 164d7a6e15534e7462c87ac78a971a88bc4b7758 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote 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() {