Iroh icon indicating copy to clipboard operation
Iroh copied to clipboard

Speed up patch phase

Open maierfelix opened this issue 8 years ago • 2 comments
trafficstars

Currently the patch phase is splitted into 8 parts, means we re-walk the whole AST 8 times from scratch. Consider writing an own AST walker to better keep track about scopes and to prevent colliding between patch states.

maierfelix avatar Aug 10 '17 09:08 maierfelix

Or maybe using different AST library? estraverse could be more flexible. Estraverse visitor has just enter and exit methods: https://github.com/estools/estraverse so you could catch every AST node in one function and making something like this:


const stages = [STAGE1, STAGE2, STAGE....... 

estraverse.traverse(ast, {
    enter: function (node, parent) {
         stages.forEach(stage => {
                 // run each stage
                stage[node.type] &&  stage[node.type](node)
         });
    },
    leave: function (node, parent) {
       // similar code
    }
});

So you could pass all eight stages in one AST pass :)

hex13 avatar Aug 16 '17 18:08 hex13

The main problem here is not acorn's walker itself, but the colliding patch states. Due to the recursive nature of JS walkers, insertions like adding temporary variables into a scope breaks upper loops (e.g. FunctionExpression.body) and acorn's walker. So I just splitted everything to get it working, it's stable but pretty inefficient. I think looking into Babel's sauce could be helpful.

Edit: I dont think this is a problem with acorn's walker only - inserting new nodes into the raw AST could possibly break other walkers too if they don't expect it.

maierfelix avatar Aug 17 '17 11:08 maierfelix