From 77dcec382b8c45263bc2a15cd905625712a3def3 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Thu, 20 Apr 2023 06:41:30 +0200 Subject: [PATCH] Deoptimize right side in for-of loops --- src/ast/nodes/ForOfStatement.ts | 3 ++- test/function/samples/deoptimize-loop-element/_config.js | 3 +++ test/function/samples/deoptimize-loop-element/main.js | 7 +++++++ 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 test/function/samples/deoptimize-loop-element/_config.js create mode 100644 test/function/samples/deoptimize-loop-element/main.js diff --git a/src/ast/nodes/ForOfStatement.ts b/src/ast/nodes/ForOfStatement.ts index b3e9e63244b..ea4f40795c1 100644 --- a/src/ast/nodes/ForOfStatement.ts +++ b/src/ast/nodes/ForOfStatement.ts @@ -3,7 +3,7 @@ import { NO_SEMICOLON, type RenderOptions } from '../../utils/renderHelpers'; import type { InclusionContext } from '../ExecutionContext'; import BlockScope from '../scopes/BlockScope'; import type Scope from '../scopes/Scope'; -import { EMPTY_PATH } from '../utils/PathTracker'; +import { EMPTY_PATH, UNKNOWN_PATH } from '../utils/PathTracker'; import type MemberExpression from './MemberExpression'; import type * as NodeType from './NodeType'; import type VariableDeclaration from './VariableDeclaration'; @@ -60,6 +60,7 @@ export default class ForOfStatement extends StatementBase { protected applyDeoptimizations(): void { this.deoptimized = true; this.left.deoptimizePath(EMPTY_PATH); + this.right.deoptimizePath(UNKNOWN_PATH); this.context.requestTreeshakingPass(); } } diff --git a/test/function/samples/deoptimize-loop-element/_config.js b/test/function/samples/deoptimize-loop-element/_config.js new file mode 100644 index 00000000000..0e0cd6ac573 --- /dev/null +++ b/test/function/samples/deoptimize-loop-element/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'deoptimizes the loop element when it is reassigned' +}; diff --git a/test/function/samples/deoptimize-loop-element/main.js b/test/function/samples/deoptimize-loop-element/main.js new file mode 100644 index 00000000000..a5a0d0d5edb --- /dev/null +++ b/test/function/samples/deoptimize-loop-element/main.js @@ -0,0 +1,7 @@ +const foo = [{ value: 1 }]; + +for (const item of foo) { + item.value = 0; +} + +assert.ok(foo[0].value === 0 ? true : false);