From b0ae1e80fb023a9b17169f65f7586dbda0654956 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 2 Jul 2023 11:24:55 +0200 Subject: [PATCH] LibJS/Bytecode: Support using MemberExpression as rest property Also, don't assert while dumping an AST with this construct. 7 new passes on test262. :^) --- Userland/Libraries/LibJS/AST.cpp | 6 ++++- .../Libraries/LibJS/Bytecode/ASTCodegen.cpp | 25 +++++++++++-------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/Userland/Libraries/LibJS/AST.cpp b/Userland/Libraries/LibJS/AST.cpp index 9cab06633a..a6a1e5c764 100644 --- a/Userland/Libraries/LibJS/AST.cpp +++ b/Userland/Libraries/LibJS/AST.cpp @@ -2461,8 +2461,12 @@ void BindingPattern::dump(int indent) const outln("(Identifier)"); if (entry.name.has>()) { entry.name.get>()->dump(indent + 3); - } else { + } else if (entry.name.has>()) { entry.name.get>()->dump(indent + 3); + } else { + VERIFY(entry.name.has()); + print_indent(indent + 3); + outln(""); } } else if (entry.is_elision()) { print_indent(indent + 2); diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index 5e962af277..b9618372cc 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -1032,19 +1032,24 @@ static Bytecode::CodeGenerationErrorOr generate_object_binding_pattern_byt for (auto& [name, alias, initializer, is_rest] : pattern.entries) { if (is_rest) { - VERIFY(name.has>()); - VERIFY(alias.has()); VERIFY(!initializer); + if (name.has>()) { + auto identifier = name.get>()->string(); + auto interned_identifier = generator.intern_identifier(identifier); - auto identifier = name.get>()->string(); - auto interned_identifier = generator.intern_identifier(identifier); + generator.emit_with_extra_register_slots(excluded_property_names.size(), value_reg, excluded_property_names); + if (create_variables) + generator.emit(interned_identifier, Bytecode::Op::EnvironmentMode::Lexical, false); + generator.emit(interned_identifier, initialization_mode); - generator.emit_with_extra_register_slots(excluded_property_names.size(), value_reg, excluded_property_names); - if (create_variables) - generator.emit(interned_identifier, Bytecode::Op::EnvironmentMode::Lexical, false); - generator.emit(interned_identifier, initialization_mode); - - return {}; + return {}; + } + if (alias.has>()) { + generator.emit_with_extra_register_slots(excluded_property_names.size(), value_reg, excluded_property_names); + TRY(generator.emit_store_to_reference(alias.get>())); + return {}; + } + VERIFY_NOT_REACHED(); } Bytecode::StringTableIndex name_index;