From fdb7c218daa2e372f20215fe67c022f991a02761 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote <nnethercote@mozilla.com> Date: Thu, 27 Feb 2014 20:41:03 -0800 Subject: [PATCH] Use a cache to minimize the number of Name objects. --- src/core/crypto.js | 2 +- src/core/evaluator.js | 6 +++--- src/core/image.js | 2 +- src/core/obj.js | 12 ++++++++---- src/core/parser.js | 2 +- test/unit/crypto_spec.js | 4 ++-- test/unit/obj_spec.js | 2 +- test/unit/util_spec.js | 2 +- 8 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/core/crypto.js b/src/core/crypto.js index 11f4902f1..6b22a3549 100644 --- a/src/core/crypto.js +++ b/src/core/crypto.js @@ -548,7 +548,7 @@ var CipherTransformFactory = (function CipherTransformFactoryClosure() { return userPassword; } - var identityName = new Name('Identity'); + var identityName = Name.get('Identity'); function CipherTransformFactory(dict, fileId, password) { var filter = dict.get('Filter'); diff --git a/src/core/evaluator.js b/src/core/evaluator.js index caca65d85..bca64d871 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -1102,7 +1102,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { // FontDescriptor is only required for Type3 fonts when the document // is a tagged pdf. Create a barbebones one to get by. descriptor = new Dict(); - descriptor.set('FontName', new Name(type.name)); + descriptor.set('FontName', Name.get(type.name)); } else { // Before PDF 1.5 if the font was one of the base 14 fonts, having a // FontDescriptor was not required. @@ -1150,10 +1150,10 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { var baseFont = dict.get('BaseFont'); // Some bad pdf's have a string as the font name. if (isString(fontName)) { - fontName = new Name(fontName); + fontName = Name.get(fontName); } if (isString(baseFont)) { - baseFont = new Name(baseFont); + baseFont = Name.get(baseFont); } if (type.name !== 'Type3') { diff --git a/src/core/image.js b/src/core/image.js index 1adad5e29..e7d2b69a0 100644 --- a/src/core/image.js +++ b/src/core/image.js @@ -88,7 +88,7 @@ var PDFImage = (function PDFImageClosure() { var colorSpace = dict.get('ColorSpace', 'CS'); if (!colorSpace) { warn('JPX images (which don"t require color spaces'); - colorSpace = new Name('DeviceRGB'); + colorSpace = Name.get('DeviceRGB'); } this.colorSpace = ColorSpace.parse(colorSpace, xref, res); this.numComps = this.colorSpace.numComps; diff --git a/src/core/obj.js b/src/core/obj.js index d93bcf572..c63a88fea 100644 --- a/src/core/obj.js +++ b/src/core/obj.js @@ -30,6 +30,13 @@ var Name = (function NameClosure() { Name.prototype = {}; + var nameCache = {}; + + Name.get = function Name_get(name) { + var nameValue = nameCache[name]; + return nameValue ? nameValue : (nameCache[name] = new Name(name)); + }; + return Name; })(); @@ -44,10 +51,7 @@ var Cmd = (function CmdClosure() { Cmd.get = function Cmd_get(cmd) { var cmdValue = cmdCache[cmd]; - if (cmdValue) - return cmdValue; - - return cmdCache[cmd] = new Cmd(cmd); + return cmdValue ? cmdValue : (cmdCache[cmd] = new Cmd(cmd)); }; return Cmd; diff --git a/src/core/parser.js b/src/core/parser.js index 32968d206..9fc20ded0 100644 --- a/src/core/parser.js +++ b/src/core/parser.js @@ -586,7 +586,7 @@ var Lexer = (function LexerClosure() { error('Warning: name token is longer than allowed by the spec: ' + strBuf.length); } - return new Name(strBuf.join('')); + return Name.get(strBuf.join('')); }, getHexString: function Lexer_getHexString() { var strBuf = this.strBuf; diff --git a/test/unit/crypto_spec.js b/test/unit/crypto_spec.js index 5e345c995..5e5e0131e 100644 --- a/test/unit/crypto_spec.js +++ b/test/unit/crypto_spec.js @@ -198,7 +198,7 @@ describe('CipherTransformFactory', function() { }; var map1 = { - Filter: new Name('Standard'), + Filter: Name.get('Standard'), V: 2, Length: 128, O: unescape('%80%C3%04%96%91o%20sl%3A%E6%1B%13T%91%F2%0DV%12%E3%FF%5E%BB%' + @@ -211,7 +211,7 @@ describe('CipherTransformFactory', function() { var fileID1 = unescape('%F6%C6%AF%17%F3rR%8DRM%9A%80%D1%EF%DF%18'); var map2 = { - Filter: new Name('Standard'), + Filter: Name.get('Standard'), V: 4, Length: 128, O: unescape('sF%14v.y5%27%DB%97%0A5%22%B3%E1%D4%AD%BD%9B%3C%B4%A5%89u%15%' + diff --git a/test/unit/obj_spec.js b/test/unit/obj_spec.js index 063c3f311..9de6a8388 100644 --- a/test/unit/obj_spec.js +++ b/test/unit/obj_spec.js @@ -10,7 +10,7 @@ describe('obj', function() { describe('Name', function() { it('should retain the given name', function() { var givenName = 'Font'; - var name = new Name(givenName); + var name = Name.get(givenName); expect(name.name).toEqual(givenName); }); }); diff --git a/test/unit/util_spec.js b/test/unit/util_spec.js index 788b35440..9647cde77 100644 --- a/test/unit/util_spec.js +++ b/test/unit/util_spec.js @@ -72,7 +72,7 @@ describe('util', function() { it('handles dictionaries with type check', function() { var dict = new Dict(); - dict.set('Type', new Name('Page')); + dict.set('Type', Name.get('Page')); expect(isDict(dict, 'Page')).toEqual(true); }); });