From 12fac9cadfd76b73f04763bebf4346d37d55a25f Mon Sep 17 00:00:00 2001 From: Amjad Masad Date: Tue, 15 Dec 2015 19:52:10 -0800 Subject: [PATCH 1/2] Inference recursion bug --- .../plugins/inference-recursion/exec.js | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 packages/babel-core/test/fixtures/plugins/inference-recursion/exec.js diff --git a/packages/babel-core/test/fixtures/plugins/inference-recursion/exec.js b/packages/babel-core/test/fixtures/plugins/inference-recursion/exec.js new file mode 100644 index 0000000000..f643ac27d0 --- /dev/null +++ b/packages/babel-core/test/fixtures/plugins/inference-recursion/exec.js @@ -0,0 +1,57 @@ +var code = (function() { + var kind; + function readObj() { + expect('{'); + if (!skip('}')) { + do { + expect('String'); + expect(':'); + readVal(); + } while (skip(',')); + expect('}'); + } + } + + function expect(str) { + if (kind === str) { + return lex(); + } + throw syntaxError('Expected ' + str + ' but got ' + string.slice(start, end) + '.'); + } + + function readArr() { + expect('['); + if (!skip(']')) { + do { + readVal(); + } while (skip(',')); + expect(']'); + } + } + + function readVal() { + switch (kind) { + case '[': + return readArr(); + case '{': + return readObj(); + case 'String': + return lex(); + default: + return expect('Value'); + } + } +}).toString().split('\n').slice(1, -1).join('\n'); + +transform(code, { + plugins: function (b) { + var t = b.types; + return { + visitor: { + BinaryExpression: function(path) { + path.get("left").baseTypeStrictlyMatches(path.get("right")); + } + } + } + } +}); From a8a58aaa0717d3c9cf08e8c520be9fed7cf880d9 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Thu, 17 Dec 2015 14:44:18 +0000 Subject: [PATCH 2/2] Fix infinite recursion bug --- packages/babel-traverse/src/path/introspection.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/babel-traverse/src/path/introspection.js b/packages/babel-traverse/src/path/introspection.js index 8b70dd1d54..720e738e86 100644 --- a/packages/babel-traverse/src/path/introspection.js +++ b/packages/babel-traverse/src/path/introspection.js @@ -235,7 +235,9 @@ export function _guessExecutionStatusRelativeTo(target) { let targetFuncParent = target.scope.getFunctionParent(); let selfFuncParent = this.scope.getFunctionParent(); - if (targetFuncParent !== selfFuncParent) { + // here we check the `node` equality as sometimes we may have different paths for the + // same node due to path thrashing + if (targetFuncParent.node !== selfFuncParent.node) { let status = this._guessExecutionStatusRelativeToDifferentFunctions(targetFuncParent); if (status) { return status;