Skip to content

Commit

Permalink
Prevent infinite deoptimizations (#3280)
Browse files Browse the repository at this point in the history
  • Loading branch information
lukastaegert committed Dec 12, 2019
1 parent a562ec5 commit 9f77b73
Show file tree
Hide file tree
Showing 13 changed files with 35 additions and 86 deletions.
4 changes: 3 additions & 1 deletion src/ast/nodes/ConditionalExpression.ts
Expand Up @@ -45,10 +45,12 @@ export default class ConditionalExpression extends NodeBase implements Deoptimiz
if (this.usedBranch !== null) {
const unusedBranch = this.usedBranch === this.consequent ? this.alternate : this.consequent;
this.usedBranch = null;
const expressionsToBeDeoptimized = this.expressionsToBeDeoptimized;
this.expressionsToBeDeoptimized = [];
if (this.wasPathDeoptimizedWhileOptimized) {
unusedBranch.deoptimizePath(UNKNOWN_PATH);
}
for (const expression of this.expressionsToBeDeoptimized) {
for (const expression of expressionsToBeDeoptimized) {
expression.deoptimizeCache();
}
}
Expand Down
4 changes: 3 additions & 1 deletion src/ast/nodes/LogicalExpression.ts
Expand Up @@ -48,10 +48,12 @@ export default class LogicalExpression extends NodeBase implements Deoptimizable
deoptimizeCache() {
if (this.usedBranch !== null) {
this.usedBranch = null;
const expressionsToBeDeoptimized = this.expressionsToBeDeoptimized;
this.expressionsToBeDeoptimized = [];
if (this.wasPathDeoptimizedWhileOptimized) {
this.unusedBranch!.deoptimizePath(UNKNOWN_PATH);
}
for (const expression of this.expressionsToBeDeoptimized) {
for (const expression of expressionsToBeDeoptimized) {
expression.deoptimizeCache();
}
}
Expand Down
4 changes: 3 additions & 1 deletion src/ast/nodes/MemberExpression.ts
Expand Up @@ -115,11 +115,13 @@ export default class MemberExpression extends NodeBase implements DeoptimizableE
}

deoptimizeCache() {
const expressionsToBeDeoptimized = this.expressionsToBeDeoptimized;
this.expressionsToBeDeoptimized = [];
this.propertyKey = UnknownKey;
if (this.wasPathDeoptimizedWhileOptimized) {
this.object.deoptimizePath(UNKNOWN_PATH);
}
for (const expression of this.expressionsToBeDeoptimized) {
for (const expression of expressionsToBeDeoptimized) {
expression.deoptimizeCache();
}
}
Expand Down
4 changes: 3 additions & 1 deletion src/ast/variables/LocalVariable.ts
Expand Up @@ -70,7 +70,9 @@ export default class LocalVariable extends Variable {
if (path.length === 0) {
if (!this.isReassigned) {
this.isReassigned = true;
for (const expression of this.expressionsToBeDeoptimized) {
const expressionsToBeDeoptimized = this.expressionsToBeDeoptimized;
this.expressionsToBeDeoptimized = [];
for (const expression of expressionsToBeDeoptimized) {
expression.deoptimizeCache();
}
if (this.init) {
Expand Down
15 changes: 0 additions & 15 deletions test/form/samples/recursive-assignments/_expected/amd.js

This file was deleted.

13 changes: 0 additions & 13 deletions test/form/samples/recursive-assignments/_expected/cjs.js

This file was deleted.

16 changes: 0 additions & 16 deletions test/form/samples/recursive-assignments/_expected/iife.js

This file was deleted.

20 changes: 0 additions & 20 deletions test/form/samples/recursive-assignments/_expected/system.js

This file was deleted.

18 changes: 0 additions & 18 deletions test/form/samples/recursive-assignments/_expected/umd.js

This file was deleted.

3 changes: 3 additions & 0 deletions test/form/samples/self-deoptimization/_config.js
@@ -0,0 +1,3 @@
module.exports = {
description: 'handles situations where a member expression is deoptimized while being deoptimized'
};
10 changes: 10 additions & 0 deletions test/form/samples/self-deoptimization/_expected.js
@@ -0,0 +1,10 @@
function foo(a) {
var b = bar({}, a);
b && b.delete();
}

function bar(a, b) {
return (b = 1) ? a.a[b] || null : null;
}

foo({});
10 changes: 10 additions & 0 deletions test/form/samples/self-deoptimization/main.js
@@ -0,0 +1,10 @@
function foo(a) {
var b = bar({}, a);
b && b.delete();
}

function bar(a, b) {
return (b = 1) ? a.a[b] || null : null;
}

foo({});

0 comments on commit 9f77b73

Please sign in to comment.