Avoid creating intermediate strings in the PostScriptLexer

This commit is contained in:
Jonas Jenwald 2014-07-19 14:04:33 +02:00
parent 1e52c770d9
commit 4960af3a4c

View File

@ -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);
}