diff --git a/src/obj.js b/src/obj.js index 2f7488a76..cb29f4c3c 100644 --- a/src/obj.js +++ b/src/obj.js @@ -22,6 +22,17 @@ var Cmd = (function CmdClosure() { Cmd.prototype = { }; + + var cmdCache = {}; + + Cmd.get = function(cmd) { + if (cmdCache[cmd]) { + return cmdCache[cmd]; + } else { + return cmdCache[cmd] = new Cmd(cmd); + } + } + return Cmd; })(); diff --git a/src/parser.js b/src/parser.js index 695438379..e50b12b9b 100644 --- a/src/parser.js +++ b/src/parser.js @@ -157,7 +157,7 @@ var Parser = (function ParserClosure() { imageStream = this.filter(imageStream, dict, length); imageStream.parameters = dict; - this.buf2 = new Cmd('EI'); + this.buf2 = Cmd.get('EI'); this.shift(); return imageStream; @@ -496,14 +496,14 @@ var Lexer = (function LexerClosure() { // array punctuation case '[': case ']': - return new Cmd(ch); + return Cmd.get(ch); // hex string or dict punctuation case '<': ch = stream.lookChar(); if (ch == '<') { // dict punctuation stream.skip(); - return new Cmd('<<'); + return Cmd.get('<<'); } return this.getHexString(ch); // dict punctuation @@ -511,11 +511,11 @@ var Lexer = (function LexerClosure() { ch = stream.lookChar(); if (ch == '>') { stream.skip(); - return new Cmd('>>'); + return Cmd.get('>>'); } case '{': case '}': - return new Cmd(ch); + return Cmd.get(ch); // fall through case ')': error('Illegal character: ' + ch); @@ -538,7 +538,7 @@ var Lexer = (function LexerClosure() { return false; if (str == 'null') return null; - return new Cmd(str); + return Cmd.get(str); }, skipToNextLine: function lexerSkipToNextLine() { var stream = this.stream;