Browse Source

control flow flattening improvements WIP

sanex3339 8 năm trước cách đây
mục cha
commit
006c01768c

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 320 - 374
dist/index.js


+ 2 - 2
package.json

@@ -46,9 +46,9 @@
     "@types/mkdirp": "0.3.29",
     "@types/mocha": "2.2.33",
     "@types/node": "6.0.51",
-    "@types/sinon": "1.16.32",
+    "@types/sinon": "1.16.33",
     "@types/string-template": "^1.0.2",
-    "awesome-typescript-loader": "^3.0.0-beta.13",
+    "awesome-typescript-loader": "^3.0.0-beta.10",
     "babel-cli": "6.18.0",
     "babel-loader": "6.2.9",
     "babel-preset-es2015": "6.18.0",

+ 2 - 1
src/declarations/ESTree.d.ts

@@ -4,8 +4,9 @@ import * as ESTree from 'estree';
 
 declare module 'estree' {
     interface BaseNode {
-        parentNode?: ESTree.Node;
+        controlFlowId?: string;
         obfuscated?: boolean;
+        parentNode?: ESTree.Node;
         skipByControlFlow?: boolean;
     }
 

+ 32 - 4
src/node-transformers/node-control-flow-transformers/FunctionControlFlowTransformer.ts

@@ -31,6 +31,11 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer {
         [NodeType.BinaryExpression, NodeControlFlowReplacers.BinaryExpressionControlFlowReplacer]
     ]);
 
+    /**
+     * @type {Map<string, IStorage<ICustomNode>>}
+     */
+    private cachedControlFlowStorages: Map <string, IStorage<ICustomNode>> = new Map <string, IStorage<ICustomNode>> ();
+
     /**
      * @type {TControlFlowReplacerFactory}
      */
@@ -104,15 +109,38 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer {
             return;
         }
 
+        const hostNode: ESTree.Node = NodeUtils.getBlockScopeOfNode(
+            functionNode.body,
+            111
+        );
+        const controlFlowNodeId: string = RandomGeneratorUtils.getRandomString(8);
+
+        if (!hostNode.controlFlowId) {
+            hostNode.controlFlowId = controlFlowNodeId;
+            this.cachedControlFlowStorages.set(controlFlowNodeId, controlFlowStorage);
+        } else {
+            hostNode.body.shift();
+
+            if (!this.cachedControlFlowStorages.has(hostNode.controlFlowId)) {
+               throw new Error(`No \`controlFlowStorage\` was found in cached \`controlFlowStorage\`'s with id ${hostNode.controlFlowId}`);
+            }
+
+            const hostControlFlowStorage: IStorage<ICustomNode> = <IStorage<ICustomNode>>this.cachedControlFlowStorages
+                .get(hostNode.controlFlowId);
+
+            hostControlFlowStorage.getStorage().forEach((customNode: ICustomNode, key: string) => {
+                controlFlowStorage.set(key, customNode);
+            });
+
+            this.cachedControlFlowStorages.set(hostNode.controlFlowId, controlFlowStorage);
+        }
+
         const controlFlowStorageCustomNode: ICustomNode = this.customNodeFactory(CustomNodes.ControlFlowStorageNode);
 
         controlFlowStorageCustomNode.initialize(controlFlowStorage, controlFlowStorageCustomNodeName);
 
         NodeAppender.prependNode(
-            NodeUtils.getBlockScopeOfNode(
-                functionNode.body,
-                RandomGeneratorUtils.getRandomInteger(0, 5)
-            ),
+            hostNode,
             controlFlowStorageCustomNode.getNode()
         );
     }

+ 13 - 0
test/dev/dev.ts

@@ -14,12 +14,25 @@ if (!(<any>global)._babelPolyfill) {
                 function foo () {
                     return function () {
                         var sum = 1 + 2;
+                        
+                         function foo () {
+                            return function () {
+                                var sum = 1 - 2;
+                                
+                                 function foo () {
+                                    return function () {
+                                        var sum = 1 * 2;
+                                    }
+                                 }
+                            }
+                         }
                     }
                 }
             })();
         `,
         {
             ...NO_CUSTOM_NODES_PRESET,
+            compact: false,
             controlFlowFlattening: true,
             disableConsoleOutput: false
         }

+ 1 - 3
webpack.config.js

@@ -2,8 +2,7 @@
 
 var fs = require("fs"),
     nodeExternals = require('webpack-node-externals'),
-    webpack = require('webpack'),
-    CheckerPlugin = require('awesome-typescript-loader').CheckerPlugin;
+    webpack = require('webpack');
 
 function getLicenseText () {
     return "/*\nCopyright (C) 2016 Timofey Kachalov <[email protected]>\n\n" +
@@ -33,7 +32,6 @@ module.exports = {
         extensions: ['.ts']
     },
     plugins: [
-        new CheckerPlugin(),
         new webpack.BannerPlugin(
             {
                 banner: getLicenseText() + '\n\nrequire("source-map-support").install();\n',

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác