From 56fb5a3f5d2d4654d3a2e5af771dc76bc1dda032 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 26 Jun 2023 17:21:12 +0200 Subject: [PATCH] LibJS/Bytecode: Ensure iterator is closed after array destructuring If destructuring didn't exhaust the iterator, we have to manually close the iterator. 49 new passes on test262. :^) --- Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index be7df5b9a9..c8967a7f5f 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -1152,6 +1152,8 @@ static Bytecode::CodeGenerationErrorOr generate_array_binding_pattern_byte */ auto is_iterator_exhausted_register = generator.allocate_register(); + generator.emit(Value(false)); + generator.emit(is_iterator_exhausted_register); auto iterator_reg = generator.allocate_register(); generator.emit(value_reg); @@ -1306,6 +1308,20 @@ static Bytecode::CodeGenerationErrorOr generate_array_binding_pattern_byte first = false; } + auto& done_block = generator.make_block(); + auto& not_done_block = generator.make_block(); + + generator.emit(is_iterator_exhausted_register); + generator.emit().set_targets( + Bytecode::Label { done_block }, + Bytecode::Label { not_done_block }); + + generator.switch_to_basic_block(not_done_block); + generator.emit(iterator_reg); + generator.emit(Completion::Type::Normal, Optional {}); + generator.emit(Bytecode::Label { done_block }); + + generator.switch_to_basic_block(done_block); return {}; }