Skip to content

Commit

Permalink
Fix: no-useless-return stack overflow on loops after throw (fixes #7855
Browse files Browse the repository at this point in the history
…) (#7856)
  • Loading branch information
not-an-aardvark authored and vitorbal committed Jan 5, 2017
1 parent d80d994 commit ca1f841
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 5 deletions.
18 changes: 13 additions & 5 deletions lib/rules/no-useless-return.js
Expand Up @@ -120,15 +120,23 @@ module.exports = {
*
* @param {ASTNode[]} uselessReturns - The collected return statements.
* @param {CodePathSegment[]} prevSegments - The previous segments to traverse.
* @param {WeakSet<CodePathSegment>} [traversedSegments] A set of segments that have already been traversed in this call
* @returns {ASTNode[]} `uselessReturns`.
*/
function getUselessReturns(uselessReturns, prevSegments) {
function getUselessReturns(uselessReturns, prevSegments, traversedSegments) {
if (!traversedSegments) {
traversedSegments = new WeakSet();
}
for (const segment of prevSegments) {
if (!segment.reachable) {
getUselessReturns(
uselessReturns,
segment.allPrevSegments.filter(isReturned)
);
if (!traversedSegments.has(segment)) {
traversedSegments.add(segment);
getUselessReturns(
uselessReturns,
segment.allPrevSegments.filter(isReturned),
traversedSegments
);
}
continue;
}

Expand Down
8 changes: 8 additions & 0 deletions tests/lib/rules/no-useless-return.js
Expand Up @@ -157,6 +157,14 @@ ruleTester.run("no-useless-return", rule, {
while (foo) return;
foo;
}
`,

// https://github.com/eslint/eslint/issues/7855
`
try {
throw new Error('foo');
while (false);
} catch (err) {}
`
],

Expand Down

0 comments on commit ca1f841

Please sign in to comment.