aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2023-04-09 05:07:07 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2023-04-09 05:07:07 -0700
commitc97cb4ec1eb91ece1b241bd86da794d53ae0053e (patch)
treed62ee3201b9fd284a5abecceef638ec3f75642db /src
parent21acc50d88d79de9a0576ad9d78eb5123f870df7 (diff)
downloadbun-c97cb4ec1eb91ece1b241bd86da794d53ae0053e.tar.gz
bun-c97cb4ec1eb91ece1b241bd86da794d53ae0053e.tar.zst
bun-c97cb4ec1eb91ece1b241bd86da794d53ae0053e.zip
Lower for-in variable initializers
Diffstat (limited to 'src')
-rw-r--r--src/js_parser.zig22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/js_parser.zig b/src/js_parser.zig
index 219aee8ad..afbc631b9 100644
--- a/src/js_parser.zig
+++ b/src/js_parser.zig
@@ -17623,6 +17623,28 @@ fn NewParser_(
data.value = p.visitExpr(data.value);
data.body = p.visitLoopBody(data.body);
+ // Check for a variable initializer
+ if (data.init.data == .s_local and data.init.data.s_local.kind == .k_var) {
+
+ // Lower for-in variable initializers in case the output is used in strict mode
+ var local = data.init.data.s_local;
+ if (local.decls.len == 1) {
+ var decl: *G.Decl = &local.decls[0];
+ if (decl.binding.data == .b_identifier) {
+ if (decl.value) |val| {
+ stmts.append(
+ Stmt.assign(
+ Expr.initIdentifier(decl.binding.data.b_identifier.ref, decl.binding.loc),
+ val,
+ p.allocator,
+ ),
+ ) catch unreachable;
+ decl.value = null;
+ }
+ }
+ }
+ }
+
if (data.init.data == .s_local and data.init.data.s_local.kind == .k_var) {
const relocate = p.maybeRelocateVarsToTopLevel(data.init.data.s_local.decls, RelocateVars.Mode.for_in_or_for_of);
if (relocate.stmt) |relocated_stmt| {