Переглянути джерело

transformers as visitor: fixed runtime errors

sanex3339 8 роки тому
батько
коміт
87b7c12fae
3 змінених файлів з 78 додано та 65 видалено
  1. 51 28
      dist/index.js
  2. 21 37
      src/Obfuscator.ts
  3. 6 0
      src/enums/VisitorDirection.ts

+ 51 - 28
dist/index.js

@@ -2473,13 +2473,13 @@ exports.ObfuscationResult = ObfuscationResult;
 "use strict";
 
 
-var _toConsumableArray2 = __webpack_require__(24);
+var _getIterator2 = __webpack_require__(21);
 
-var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
+var _getIterator3 = _interopRequireDefault(_getIterator2);
 
-var _map = __webpack_require__(11);
+var _toConsumableArray2 = __webpack_require__(24);
 
-var _map2 = _interopRequireDefault(_map);
+var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
 
 var _classCallCheck2 = __webpack_require__(0);
 
@@ -2497,14 +2497,13 @@ var ServiceIdentifiers_1 = __webpack_require__(4);
 var estraverse = __webpack_require__(17);
 var NodeTransformers_1 = __webpack_require__(40);
 var ObfuscationEvents_1 = __webpack_require__(22);
+var VisitorDirection_1 = __webpack_require__(151);
 var Node_1 = __webpack_require__(12);
 var NodeUtils_1 = __webpack_require__(8);
 var Obfuscator = Obfuscator_1 = function () {
     function Obfuscator(stackTraceAnalyzer, obfuscationEventEmitter, customNodeGroupStorage, nodeTransformersFactory, options) {
         (0, _classCallCheck3.default)(this, Obfuscator);
 
-        this.cachedEnterVisitors = new _map2.default();
-        this.cachedLeaveVisitors = new _map2.default();
         this.stackTraceAnalyzer = stackTraceAnalyzer;
         this.obfuscationEventEmitter = obfuscationEventEmitter;
         this.customNodeGroupStorage = customNodeGroupStorage;
@@ -2530,9 +2529,7 @@ var Obfuscator = Obfuscator_1 = function () {
             if (this.options.controlFlowFlattening) {
                 astTree = this.transformAstTree(astTree, Obfuscator_1.controlFlowTransformersList);
             }
-            console.time();
             astTree = this.transformAstTree(astTree, [].concat((0, _toConsumableArray3.default)(Obfuscator_1.convertingTransformersList), (0, _toConsumableArray3.default)(Obfuscator_1.obfuscatingTransformersList)));
-            console.timeEnd();
             this.obfuscationEventEmitter.emit(ObfuscationEvents_1.ObfuscationEvents.AfterObfuscation, astTree, stackTraceData);
             return astTree;
         }
@@ -2552,10 +2549,10 @@ var Obfuscator = Obfuscator_1 = function () {
         value: function mergeTransformerVisitors(visitors) {
             var enterVisitor = this.getVisitorForDirection(visitors.filter(function (visitor) {
                 return visitor.enter !== undefined;
-            }), 'enter', this.cachedEnterVisitors);
+            }), VisitorDirection_1.VisitorDirection.enter);
             var leaveVisitor = this.getVisitorForDirection(visitors.filter(function (visitor) {
                 return visitor.leave !== undefined;
-            }), 'leave', this.cachedLeaveVisitors);
+            }), VisitorDirection_1.VisitorDirection.leave);
             return {
                 enter: enterVisitor,
                 leave: leaveVisitor
@@ -2563,31 +2560,43 @@ var Obfuscator = Obfuscator_1 = function () {
         }
     }, {
         key: "getVisitorForDirection",
-        value: function getVisitorForDirection(visitors, direction, cache) {
-            var _this3 = this;
-
+        value: function getVisitorForDirection(visitors, direction) {
             if (!visitors.length) {
                 return null;
             }
             return function (node, parentNode) {
-                if (cache.has(node.type)) {
-                    var cachedVisitorsForNode = cache.get(node.type);
-                    if (!cachedVisitorsForNode.length) {
-                        return;
+                var _iteratorNormalCompletion = true;
+                var _didIteratorError = false;
+                var _iteratorError = undefined;
+
+                try {
+                    for (var _iterator = (0, _getIterator3.default)(visitors), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+                        var visitor = _step.value;
+
+                        var visitorResult = visitor[direction](node, parentNode);
+                        if (!visitorResult) {
+                            continue;
+                        }
+                        if (visitorResult === estraverse.VisitorOption.Break || visitorResult === estraverse.VisitorOption.Remove || visitorResult === estraverse.VisitorOption.Skip) {
+                            return visitorResult;
+                        }
+                        node = visitorResult;
                     }
-                    cachedVisitorsForNode.forEach(function (visitor) {
-                        node = visitor[direction].call(_this3, node, parentNode);
-                    });
-                } else {
-                    var visitorsForNode = visitors.filter(function (visitor) {
-                        var result = visitor[direction].call(_this3, node, parentNode);
-                        if (result) {
-                            node = result;
+                } catch (err) {
+                    _didIteratorError = true;
+                    _iteratorError = err;
+                } finally {
+                    try {
+                        if (!_iteratorNormalCompletion && _iterator.return) {
+                            _iterator.return();
                         }
-                        return result;
-                    });
-                    cache.set(node.type, visitorsForNode);
+                    } finally {
+                        if (_didIteratorError) {
+                            throw _iteratorError;
+                        }
+                    }
                 }
+
                 return node;
             };
         }
@@ -8350,6 +8359,20 @@ module.exports = require("reflect-metadata");
 var JavaScriptObfuscator_1 = __webpack_require__(25);
 module.exports = JavaScriptObfuscator_1.JavaScriptObfuscator;
 
+/***/ }),
+/* 150 */,
+/* 151 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var Utils_1 = __webpack_require__(14);
+exports.VisitorDirection = Utils_1.Utils.strEnumify({
+    enter: 'enter',
+    leave: 'leave'
+});
+
 /***/ })
 /******/ ]);
 //# sourceMappingURL=index.js.map

+ 21 - 37
src/Obfuscator.ts

@@ -5,6 +5,7 @@ import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
 import { TNodeTransformersFactory } from './types/container/TNodeTransformersFactory';
+import { TVisitorDirection } from './types/TVisitorDirection';
 
 import { ICustomNodeGroup } from './interfaces/custom-nodes/ICustomNodeGroup';
 import { IObfuscationEventEmitter } from './interfaces/event-emitters/IObfuscationEventEmitter';
@@ -16,6 +17,7 @@ import { IStorage } from './interfaces/storages/IStorage';
 
 import { NodeTransformers } from './enums/container/NodeTransformers';
 import { ObfuscationEvents } from './enums/ObfuscationEvents';
+import { VisitorDirection } from './enums/VisitorDirection';
 
 import { Node } from './node/Node';
 import { NodeUtils } from './node/NodeUtils';
@@ -52,16 +54,6 @@ export class Obfuscator implements IObfuscator {
         NodeTransformers.VariableDeclarationTransformer
     ];
 
-    /**
-     * @type {Map<string, estraverse.Visitor[]>}
-     */
-    private readonly cachedEnterVisitors: Map<string, estraverse.Visitor[]> = new Map();
-
-    /**
-     * @type {Map<string, estraverse.Visitor[]>}
-     */
-    private readonly cachedLeaveVisitors: Map<string, estraverse.Visitor[]> = new Map();
-
     /**
      * @type {IStorage<ICustomNodeGroup>}
      */
@@ -144,7 +136,6 @@ export class Obfuscator implements IObfuscator {
         }
 
         // second pass: nodes obfuscation
-        console.time();
         astTree = this.transformAstTree(
             astTree,
             [
@@ -152,7 +143,6 @@ export class Obfuscator implements IObfuscator {
                 ...Obfuscator.obfuscatingTransformersList
             ]
         );
-        console.timeEnd();
 
         this.obfuscationEventEmitter.emit(ObfuscationEvents.AfterObfuscation, astTree, stackTraceData);
 
@@ -185,13 +175,11 @@ export class Obfuscator implements IObfuscator {
     private mergeTransformerVisitors (visitors: estraverse.Visitor[]): estraverse.Visitor {
         const enterVisitor: any = this.getVisitorForDirection(
             visitors.filter((visitor: estraverse.Visitor) => visitor.enter !== undefined),
-            'enter',
-            this.cachedEnterVisitors
+            VisitorDirection.enter
         );
         const leaveVisitor: any = this.getVisitorForDirection(
             visitors.filter((visitor: estraverse.Visitor) => visitor.leave !== undefined),
-            'leave',
-            this.cachedLeaveVisitors
+            VisitorDirection.leave
         );
 
         return {
@@ -203,37 +191,33 @@ export class Obfuscator implements IObfuscator {
     /**
      * @param visitors
      * @param direction
-     * @param cache
-     * @return {estraverse.Visitor}
+     * @return {estraverse.Visitor | null}
      */
-    private getVisitorForDirection (visitors: estraverse.Visitor[], direction: string, cache: Map<string, estraverse.Visitor[]>): estraverse.Visitor | null {
+    private getVisitorForDirection (
+        visitors: estraverse.Visitor[],
+        direction: TVisitorDirection
+    ): estraverse.Visitor | null {
         if (!visitors.length) {
             return null;
         }
 
         return (node: ESTree.Node, parentNode: ESTree.Node) => {
-            if (cache.has(node.type)) {
-                const cachedVisitorsForNode: estraverse.Visitor[] = <estraverse.Visitor[]>cache.get(node.type);
+            for (const visitor of visitors) {
+                const visitorResult: estraverse.VisitorOption | ESTree.Node | void = visitor[direction]!(node, parentNode);
 
-                if (!cachedVisitorsForNode.length) {
-                    return;
+                if (!visitorResult) {
+                    continue;
                 }
 
-                cachedVisitorsForNode.forEach((visitor: any) => {
-                    node = visitor[direction].call(this, node, parentNode);
-                });
-            } else {
-                const visitorsForNode: estraverse.Visitor[] = visitors.filter((visitor: any) => {
-                    const result: ESTree.Node = visitor[direction].call(this, node, parentNode);
-
-                    if (result) {
-                        node = result;
-                    }
-
-                    return result;
-                });
+                if (
+                    visitorResult === estraverse.VisitorOption.Break ||
+                    visitorResult === estraverse.VisitorOption.Remove ||
+                    visitorResult === estraverse.VisitorOption.Skip
+                ) {
+                    return visitorResult;
+                }
 
-                cache.set(node.type, visitorsForNode);
+                node = <ESTree.Node>visitorResult;
             }
 
             return node;

+ 6 - 0
src/enums/VisitorDirection.ts

@@ -0,0 +1,6 @@
+import { Utils } from '../utils/Utils';
+
+export const VisitorDirection: any = Utils.strEnumify({
+    enter: 'enter',
+    leave: 'leave'
+});