From 4960af3a4c7b7b49a2c852aa445c89e2528fe992 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Sat, 19 Jul 2014 14:04:33 +0200 Subject: [PATCH] Avoid creating intermediate strings in the PostScriptLexer --- src/core/ps_parser.js | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/core/ps_parser.js b/src/core/ps_parser.js index 9aa6f09b5..2ce16b94a 100644 --- a/src/core/ps_parser.js +++ b/src/core/ps_parser.js @@ -137,6 +137,8 @@ var PostScriptLexer = (function PostScriptLexerClosure() { function PostScriptLexer(stream) { this.stream = stream; this.nextChar(); + + this.strBuf = []; } PostScriptLexer.prototype = { nextChar: function PostScriptLexer_nextChar() { @@ -177,11 +179,15 @@ var PostScriptLexer = (function PostScriptLexerClosure() { return PostScriptToken.RBRACE; } // operator - var str = String.fromCharCode(ch); + var strBuf = this.strBuf; + strBuf.length = 0; + strBuf[0] = String.fromCharCode(ch); + while ((ch = this.nextChar()) >= 0 && // and 'A'-'Z', 'a'-'z' ((ch >= 0x41 && ch <= 0x5A) || (ch >= 0x61 && ch <= 0x7A))) { - str += String.fromCharCode(ch); + strBuf.push(String.fromCharCode(ch)); } + var str = strBuf.join(''); switch (str.toLowerCase()) { case 'if': return PostScriptToken.IF; @@ -193,16 +199,19 @@ var PostScriptLexer = (function PostScriptLexerClosure() { }, getNumber: function PostScriptLexer_getNumber() { var ch = this.currentChar; - var str = String.fromCharCode(ch); + var strBuf = this.strBuf; + strBuf.length = 0; + strBuf[0] = String.fromCharCode(ch); + while ((ch = this.nextChar()) >= 0) { if ((ch >= 0x30 && ch <= 0x39) || // '0'-'9' ch === 0x2D || ch === 0x2E) { // '-', '.' - str += String.fromCharCode(ch); + strBuf.push(String.fromCharCode(ch)); } else { break; } } - var value = parseFloat(str); + var value = parseFloat(strBuf.join('')); if (isNaN(value)) { error('Invalid floating point number: ' + value); }