From 479320b3635bd5d3d31121a48bceb7619c4bec36 Mon Sep 17 00:00:00 2001 From: Carmen Date: Mon, 14 Jul 2025 14:42:18 +0200 Subject: [PATCH 1/2] fix keyed-destructuring-property-reference-target-evaluation-order-with-bindings.js --- .../declaration/declaration_pattern.rs | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/core/engine/src/bytecompiler/declaration/declaration_pattern.rs b/core/engine/src/bytecompiler/declaration/declaration_pattern.rs index 1622f67ed04..c9eade71cbe 100644 --- a/core/engine/src/bytecompiler/declaration/declaration_pattern.rs +++ b/core/engine/src/bytecompiler/declaration/declaration_pattern.rs @@ -39,43 +39,59 @@ impl ByteCompiler<'_> { let dst = self.register_allocator.alloc(); match name { - PropertyName::Literal(ident) => { + PropertyName::Literal(field_ident) => { self.emit_get_property_by_name( &dst, object, object, - ident.sym(), + field_ident.sym(), ); let key = self.register_allocator.alloc(); self.emit_push_literal( Literal::String( self.interner() - .resolve_expect(ident.sym()) + .resolve_expect(field_ident.sym()) .into_common(false), ), &key, ); excluded_keys_registers.push(key); + self.emit_binding( + def, + ident.to_js_string(self.interner()), + &dst, + ); } PropertyName::Computed(node) => { let key = self.register_allocator.alloc(); self.compile_expr(node, &key); + let property_key = self.register_allocator.alloc(); + self.bytecode.emit_to_property_key( + key.variable(), + property_key.variable(), + ); + self.register_allocator.dealloc(key); + self.emit_binding( + def, + ident.to_js_string(self.interner()), + &dst, + ); if rest_exits { self.bytecode.emit_get_property_by_value_push( dst.variable(), - key.variable(), + property_key.variable(), object.variable(), object.variable(), ); - excluded_keys_registers.push(key); + excluded_keys_registers.push(property_key); } else { self.bytecode.emit_get_property_by_value( dst.variable(), - key.variable(), + property_key.variable(), object.variable(), object.variable(), ); - self.register_allocator.dealloc(key); + self.register_allocator.dealloc(property_key); } } } @@ -86,7 +102,6 @@ impl ByteCompiler<'_> { self.patch_jump(skip); } - self.emit_binding(def, ident.to_js_string(self.interner()), &dst); self.register_allocator.dealloc(dst); } // BindingRestProperty : ... BindingIdentifier From 339103e4e535c19308c77e9d9c3ab3e8a65b1582 Mon Sep 17 00:00:00 2001 From: Carmen Date: Tue, 15 Jul 2025 13:42:25 +0200 Subject: [PATCH 2/2] fix handling of default inits --- core/engine/src/bytecompiler/declaration/declaration_pattern.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/core/engine/src/bytecompiler/declaration/declaration_pattern.rs b/core/engine/src/bytecompiler/declaration/declaration_pattern.rs index c9eade71cbe..3fd9141574f 100644 --- a/core/engine/src/bytecompiler/declaration/declaration_pattern.rs +++ b/core/engine/src/bytecompiler/declaration/declaration_pattern.rs @@ -100,6 +100,7 @@ impl ByteCompiler<'_> { let skip = self.emit_jump_if_not_undefined(&dst); self.compile_expr(init, &dst); self.patch_jump(skip); + self.emit_binding(def, ident.to_js_string(self.interner()), &dst); } self.register_allocator.dealloc(dst);