From 081866a184932cec784c221ce55914ec3a9a8bec Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Thu, 19 Jun 2014 20:52:39 -0700 Subject: [PATCH] Use null instead of [] for ops with no args. This reduces peak RSS on one test file from ~600 to ~560 MiB. --- src/core/evaluator.js | 37 ++++++++++++++++++++++++------------- test/unit/evaluator_spec.js | 4 ++-- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/core/evaluator.js b/src/core/evaluator.js index 29e42e2ad..917b25b2a 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -653,7 +653,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { var name = args[0].name; if (imageCache.key === name) { operatorList.addOp(imageCache.fn, imageCache.args); - args = []; + args = null; continue; } @@ -677,7 +677,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { } else if (type.name === 'Image') { self.buildPaintImageXObject(resources, xobj, false, operatorList, name, imageCache); - args = []; + args = null; continue; } else if (type.name === 'PS') { // PostScript XObjects are unused when viewing documents. @@ -703,12 +703,12 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { var cacheKey = args[0].cacheKey; if (cacheKey && imageCache.key === cacheKey) { operatorList.addOp(imageCache.fn, imageCache.args); - args = []; + args = null; continue; } self.buildPaintImageXObject(resources, args[0], true, operatorList, cacheKey, imageCache); - args = []; + args = null; continue; case OPS.showText: args[0] = self.handleText(args[0], stateManager.state); @@ -2099,7 +2099,9 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() { }, read: function EvaluatorPreprocessor_read(operation) { - var args = []; + // We use an array to represent args, except we use |null| to represent + // no args because it's more compact than an empty array. + var args = null; while (true) { var obj = this.parser.getObj(); if (isEOF(obj)) { @@ -2108,6 +2110,9 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() { if (!isCmd(obj)) { // argument if (obj !== null) { + if (!args) { + args = []; + } args.push((obj instanceof Dict ? obj.getAll() : obj)); assert(args.length <= 33, 'Too many arguments'); } @@ -2127,28 +2132,34 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() { if (!opSpec.variableArgs) { // Some post script commands can be nested, e.g. /F2 /GS2 gs 5.711 Tf - if (args.length !== numArgs) { + var argsLength = args !== null ? args.length : 0; + if (argsLength !== numArgs) { var nonProcessedArgs = this.nonProcessedArgs; - while (args.length > numArgs) { + while (argsLength > numArgs) { nonProcessedArgs.push(args.shift()); + argsLength--; } - while (args.length < numArgs && nonProcessedArgs.length !== 0) { + while (argsLength < numArgs && nonProcessedArgs.length !== 0) { + if (!args) { + args = []; + } args.unshift(nonProcessedArgs.pop()); + argsLength++; } } - if (args.length < numArgs) { + if (argsLength < numArgs) { // If we receive too few args, it's not possible to possible // to execute the command, so skip the command info('Command ' + fn + ': because expected ' + - numArgs + ' args, but received ' + args.length + + numArgs + ' args, but received ' + argsLength + ' args; skipping'); - args = []; + args = null; continue; } - } else if (args.length > numArgs) { + } else if (argsLength > numArgs) { info('Command ' + fn + ': expected [0,' + numArgs + - '] args, but received ' + args.length + ' args'); + '] args, but received ' + argsLength + ' args'); } // TODO figure out how to type-check vararg functions diff --git a/test/unit/evaluator_spec.js b/test/unit/evaluator_spec.js index 26c04c78b..813eed88d 100644 --- a/test/unit/evaluator_spec.js +++ b/test/unit/evaluator_spec.js @@ -57,7 +57,7 @@ describe('evaluator', function() { expect(!!result.fnArray && !!result.argsArray).toEqual(true); expect(result.fnArray.length).toEqual(1); expect(result.fnArray[0]).toEqual(OPS.fill); - expect(result.argsArray[0].length).toEqual(0); + expect(result.argsArray[0]).toEqual(null); }); }); @@ -154,7 +154,7 @@ describe('evaluator', function() { expect(result.argsArray[0][0]).toEqual(true); expect(result.argsArray[1].length).toEqual(1); expect(result.argsArray[1][0]).toEqual(false); - expect(result.argsArray[2].length).toEqual(0); + expect(result.argsArray[2]).toEqual(null); }); }); });