[Pkg-javascript-commits] [pdf.js] 141/207: Use null instead of [] for ops with no args.

David Prévot taffit at moszumanska.debian.org
Mon Jul 28 15:36:41 UTC 2014


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch master
in repository pdf.js.

commit 081866a184932cec784c221ce55914ec3a9a8bec
Author: Nicholas Nethercote <nnethercote at mozilla.com>
Date:   Thu Jun 19 20:52:39 2014 -0700

    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 29e42e2..917b25b 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 26c04c7..813eed8 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);
       });
     });
   });

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/pdf.js.git



More information about the Pkg-javascript-commits mailing list