Преглед на файлове

Merge pull request #646 from javascript-obfuscator/fixed-comments-transformer-performance-regression

Fixed performance regression of `Initializing` stage after `1.2.0`
Timofey Kachalov преди 4 години
родител
ревизия
68ff894016

+ 4 - 0
CHANGELOG.md

@@ -1,5 +1,9 @@
 Change Log
 
+v1.2.2
+---
+* Fixed performance regression of `Initializing` stage after `1.2.0`
+
 v1.2.1
 ---
 * Support of old browsers when `selfDefending` is enabled. https://github.com/javascript-obfuscator/javascript-obfuscator/issues/615

Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
dist/index.browser.js


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
dist/index.cli.js


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
dist/index.js


+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "javascript-obfuscator",
-  "version": "1.2.1",
+  "version": "1.2.2",
   "description": "JavaScript obfuscator",
   "keywords": [
     "obfuscator",

+ 38 - 11
src/node-transformers/initializing-transformers/CommentsTransformer.ts

@@ -11,6 +11,7 @@ import { IVisitor } from '../../interfaces/node-transformers/IVisitor';
 import { NodeTransformationStage } from '../../enums/node-transformers/NodeTransformationStage';
 
 import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
+import { ConditionalCommentObfuscatingGuard } from '../preparing-transformers/obfuscating-guards/ConditionalCommentObfuscatingGuard';
 import { NodeGuards } from '../../node/NodeGuards';
 
 @injectable()
@@ -32,8 +33,6 @@ export class CommentsTransformer extends AbstractNodeTransformer {
         @inject(ServiceIdentifiers.IOptions) options: IOptions
     ) {
         super(randomGenerator, options);
-
-        this.filterComment = this.filterComment.bind(this);
     }
 
     /**
@@ -55,7 +54,7 @@ export class CommentsTransformer extends AbstractNodeTransformer {
                 return {
                     leave: (node: ESTree.Node): ESTree.Node | undefined => {
                         if (NodeGuards.isProgramNode(node)) {
-                            return this.filterComments(node);
+                            return this.filterCommentsOnFinalizingTraverse(node);
                         }
                     }
                 };
@@ -69,6 +68,8 @@ export class CommentsTransformer extends AbstractNodeTransformer {
      * Moves comments to their nodes
      */
     public transformNode (rootNode: ESTree.Program): ESTree.Node {
+        rootNode = this.filterCommentsOnPrimaryTraverse(rootNode);
+
         if (!rootNode.comments || !rootNode.comments.length) {
             return rootNode;
         }
@@ -113,22 +114,43 @@ export class CommentsTransformer extends AbstractNodeTransformer {
         return rootNode;
     }
 
+    /**
+     * Removes all comments from node except comments that contain
+     * preserved words or `javascript-obfuscator` words
+     *
+     * @param {ESTree.Program} rootNode
+     * @returns {ESTree.Program}
+     */
+    private filterCommentsOnPrimaryTraverse (rootNode: ESTree.Program): ESTree.Program {
+        rootNode.comments = rootNode.comments?.filter((comment: ESTree.Comment) =>
+            this.filterComment(comment, true)
+        );
+
+        return rootNode;
+    }
+
     /**
      * Removes all comments from node except comments that contain preserved words
      *
-     * @param {Node} rootNode
-     * @returns {NodeGuards}
+     * @param {ESTree.Program} rootNode
+     * @returns {ESTree.Program}
      */
-    public filterComments (rootNode: ESTree.Program): ESTree.Node {
-        estraverse.traverse(rootNode, {
-            enter: (node: ESTree.Node): void => {
+    private filterCommentsOnFinalizingTraverse (rootNode: ESTree.Program): ESTree.Program {
+        estraverse.replace(rootNode, {
+            enter: (node: ESTree.Node): ESTree.Node => {
                 if (node.leadingComments) {
-                    node.leadingComments = node.leadingComments?.filter(this.filterComment);
+                    node.leadingComments = node.leadingComments?.filter((comment: ESTree.Comment) =>
+                        this.filterComment(comment, false)
+                    );
                 }
 
                 if (node.trailingComments) {
-                    node.trailingComments = node.trailingComments?.filter(this.filterComment);
+                    node.trailingComments = node.trailingComments?.filter((comment: ESTree.Comment) =>
+                        this.filterComment(comment, false)
+                    );
                 }
+
+                return node;
             }
         });
 
@@ -137,9 +159,14 @@ export class CommentsTransformer extends AbstractNodeTransformer {
 
     /**
      * @param {ESTree.Comment} comment
+     * @param {boolean} keepConditionalComment
      * @returns {boolean}
      */
-    private filterComment (comment: ESTree.Comment): boolean {
+    private filterComment (comment: ESTree.Comment, keepConditionalComment: boolean): boolean {
+        if (keepConditionalComment && ConditionalCommentObfuscatingGuard.isConditionalComment(comment)) {
+            return true;
+        }
+
         return CommentsTransformer.preservedWords
             .some((preservedWord: string) => comment.value.includes(preservedWord));
     }

+ 9 - 0
src/node-transformers/preparing-transformers/obfuscating-guards/ConditionalCommentObfuscatingGuard.ts

@@ -23,6 +23,15 @@ export class ConditionalCommentObfuscatingGuard implements IObfuscatingGuard {
      */
     private obfuscationAllowed: boolean = true;
 
+    /**
+     * @param {Comment} comment
+     * @returns {boolean}
+     */
+    public static isConditionalComment (comment: ESTree.Comment): boolean {
+        return ConditionalCommentObfuscatingGuard.obfuscationEnableCommentRegExp.test(comment.value) ||
+            ConditionalCommentObfuscatingGuard.obfuscationDisableCommentRegExp.test(comment.value);
+    }
+
     /**
      * @returns {boolean}
      * @param node

Някои файлове не бяха показани, защото твърде много файлове са промени