Skip to content

Commit d25b6e2

Browse files
authored
Deoptimize parameter defaults when referenced from object/array/class literals (#4518)
1 parent 2795815 commit d25b6e2

47 files changed

Lines changed: 122 additions & 24 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/ast/nodes/ArrayExpression.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import { ObjectEntity, type ObjectProperty } from './shared/ObjectEntity';
1919
export default class ArrayExpression extends NodeBase {
2020
declare elements: readonly (ExpressionNode | SpreadElement | null)[];
2121
declare type: NodeType.tArrayExpression;
22-
protected deoptimized = false;
2322
private objectEntity: ObjectEntity | null = null;
2423

2524
deoptimizePath(path: ObjectPath): void {
@@ -83,10 +82,14 @@ export default class ArrayExpression extends NodeBase {
8382
let hasSpread = false;
8483
for (let index = 0; index < this.elements.length; index++) {
8584
const element = this.elements[index];
86-
if (hasSpread || element instanceof SpreadElement) {
87-
if (element) {
85+
if (element) {
86+
if (hasSpread || element instanceof SpreadElement) {
8887
hasSpread = true;
88+
// This also deoptimizes parameter defaults
8989
element.deoptimizePath(UNKNOWN_PATH);
90+
} else {
91+
// We do not track parameter defaults in arrays
92+
element.deoptimizeCallParameters();
9093
}
9194
}
9295
}

src/ast/nodes/AssignmentExpression.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ export default class AssignmentExpression extends NodeBase {
4343
| '**=';
4444
declare right: ExpressionNode;
4545
declare type: NodeType.tAssignmentExpression;
46-
protected deoptimized = false;
4746

4847
hasEffects(context: HasEffectsContext): boolean {
4948
if (!this.deoptimized) this.applyDeoptimizations();

src/ast/nodes/AssignmentPattern.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ export default class AssignmentPattern extends NodeBase implements PatternNode {
1515
declare left: PatternNode;
1616
declare right: ExpressionNode;
1717
declare type: NodeType.tAssignmentPattern;
18-
protected deoptimized = false;
1918

2019
addExportedVariables(
2120
variables: readonly Variable[],

src/ast/nodes/AwaitExpression.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { type ExpressionNode, type IncludeChildren, type Node, NodeBase } from '
77
export default class AwaitExpression extends NodeBase {
88
declare argument: ExpressionNode;
99
declare type: NodeType.tAwaitExpression;
10-
protected deoptimized = false;
1110

1211
hasEffects(): boolean {
1312
if (!this.deoptimized) this.applyDeoptimizations();

src/ast/nodes/ClassBody.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,6 @@ export default class ClassBody extends NodeBase {
3737
}
3838
super.parseNode(esTreeNode);
3939
}
40+
41+
protected applyDeoptimizations() {}
4042
}

src/ast/nodes/ExportAllDeclaration.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ export default class ExportAllDeclaration extends NodeBase {
2222
render(code: MagicString, _options: RenderOptions, nodeRenderOptions?: NodeRenderOptions): void {
2323
code.remove(nodeRenderOptions!.start!, nodeRenderOptions!.end!);
2424
}
25+
26+
protected applyDeoptimizations() {}
2527
}
2628

2729
ExportAllDeclaration.prototype.needsBoundaries = true;

src/ast/nodes/ExportDefaultDeclaration.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ export default class ExportDefaultDeclaration extends NodeBase {
109109
this.declaration.render(code, options);
110110
}
111111

112+
protected applyDeoptimizations() {}
113+
112114
private renderNamedDeclaration(
113115
code: MagicString,
114116
declarationStart: number,

src/ast/nodes/ExportNamedDeclaration.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ export default class ExportNamedDeclaration extends NodeBase {
3838
(this.declaration as Node).render(code, options, { end, start });
3939
}
4040
}
41+
42+
protected applyDeoptimizations() {}
4143
}
4244

4345
ExportNamedDeclaration.prototype.needsBoundaries = true;

src/ast/nodes/ExportSpecifier.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@ export default class ExportSpecifier extends NodeBase {
66
declare exported: Identifier;
77
declare local: Identifier;
88
declare type: NodeType.tExportSpecifier;
9+
10+
protected applyDeoptimizations() {}
911
}

src/ast/nodes/ExpressionStatement.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,6 @@ export default class ExpressionStatement extends StatementBase {
3636

3737
return super.shouldBeIncluded(context);
3838
}
39+
40+
protected applyDeoptimizations() {}
3941
}

0 commit comments

Comments
 (0)