@@ -6243,24 +6243,21 @@ impl<'gc> Compiler<'gc> {
62436243 let throw_idx = self.chunk.add_constant(Value::String(throw_key));
62446244 self.chunk.write_opcode(Opcode::GetProperty);
62456245 self.chunk.write_u16(throw_idx);
6246+ self.chunk.write_opcode(Opcode::Dup);
62466247 let null_check_idx = self.chunk.add_constant(Value::Undefined);
62476248 self.chunk.write_opcode(Opcode::Constant);
62486249 self.chunk.write_u16(null_check_idx);
62496250 self.chunk.write_opcode(Opcode::StrictNotEqual);
62506251 self.chunk.write_opcode(Opcode::Not);
62516252 let throw_is_undefined = self.emit_jump(Opcode::JumpIfTrue);
6252- self.emit_helper_get(&ys_iter);
6253- let throw_key_null = crate::unicode::utf8_to_utf16("throw");
6254- let throw_idx_null = self.chunk.add_constant(Value::String(throw_key_null));
6255- self.chunk.write_opcode(Opcode::GetProperty);
6256- self.chunk.write_u16(throw_idx_null);
6253+ self.chunk.write_opcode(Opcode::Dup);
62576254 let null_check_idx = self.chunk.add_constant(Value::Null);
62586255 self.chunk.write_opcode(Opcode::Constant);
62596256 self.chunk.write_u16(null_check_idx);
62606257 self.chunk.write_opcode(Opcode::StrictNotEqual);
62616258 self.chunk.write_opcode(Opcode::Not);
62626259 let no_throw_method = self.emit_jump(Opcode::JumpIfTrue);
6263- self.patch_jump(throw_is_undefined );
6260+ self.chunk.write_opcode(Opcode::Pop );
62646261
62656262 // Has .throw method: ys_result = iter.throw(thrown)
62666263 self.emit_helper_get(&ys_iter);
@@ -6287,30 +6284,29 @@ impl<'gc> Compiler<'gc> {
62876284 self.chunk.write_u32(result_check as u32);
62886285
62896286 // No .throw method: close iterator then throw TypeError
6287+ self.patch_jump(throw_is_undefined);
62906288 self.patch_jump(no_throw_method);
6289+ self.chunk.write_opcode(Opcode::Pop);
62916290 self.emit_helper_get(&ys_iter);
62926291 let return_key = crate::unicode::utf8_to_utf16("return");
62936292 let return_idx = self.chunk.add_constant(Value::String(return_key));
62946293 self.chunk.write_opcode(Opcode::GetProperty);
62956294 self.chunk.write_u16(return_idx);
6295+ self.chunk.write_opcode(Opcode::Dup);
62966296 let null_check2_idx = self.chunk.add_constant(Value::Undefined);
62976297 self.chunk.write_opcode(Opcode::Constant);
62986298 self.chunk.write_u16(null_check2_idx);
62996299 self.chunk.write_opcode(Opcode::StrictNotEqual);
63006300 self.chunk.write_opcode(Opcode::Not);
63016301 let return_is_undefined = self.emit_jump(Opcode::JumpIfTrue);
6302- self.emit_helper_get(&ys_iter);
6303- let return_key_null = crate::unicode::utf8_to_utf16("return");
6304- let return_idx_null = self.chunk.add_constant(Value::String(return_key_null));
6305- self.chunk.write_opcode(Opcode::GetProperty);
6306- self.chunk.write_u16(return_idx_null);
6302+ self.chunk.write_opcode(Opcode::Dup);
63076303 let null_check2_idx = self.chunk.add_constant(Value::Null);
63086304 self.chunk.write_opcode(Opcode::Constant);
63096305 self.chunk.write_u16(null_check2_idx);
63106306 self.chunk.write_opcode(Opcode::StrictNotEqual);
63116307 self.chunk.write_opcode(Opcode::Not);
63126308 let no_return_method = self.emit_jump(Opcode::JumpIfTrue);
6313- self.patch_jump(return_is_undefined );
6309+ self.chunk.write_opcode(Opcode::Pop );
63146310 self.emit_helper_get(&ys_iter);
63156311 let return_key2 = crate::unicode::utf8_to_utf16("return");
63166312 let return_idx2 = self.chunk.add_constant(Value::String(return_key2));
@@ -6319,7 +6315,9 @@ impl<'gc> Compiler<'gc> {
63196315 self.chunk.write_u16(return_idx2);
63206316 self.emit_call_opcode(0, 0x80);
63216317 self.chunk.write_opcode(Opcode::Pop);
6318+ self.patch_jump(return_is_undefined);
63226319 self.patch_jump(no_return_method);
6320+ self.chunk.write_opcode(Opcode::Pop);
63236321 let te_msg = "The iterator does not provide a 'throw' method";
63246322 let te_msg_idx = self.chunk.add_constant(Value::from(te_msg));
63256323 self.chunk.write_opcode(Opcode::Constant);
@@ -6339,24 +6337,21 @@ impl<'gc> Compiler<'gc> {
63396337 let ret_idx_rd = self.chunk.add_constant(Value::String(ret_key_rd));
63406338 self.chunk.write_opcode(Opcode::GetProperty);
63416339 self.chunk.write_u16(ret_idx_rd);
6340+ self.chunk.write_opcode(Opcode::Dup);
63426341 let undef_rd = self.chunk.add_constant(Value::Undefined);
63436342 self.chunk.write_opcode(Opcode::Constant);
63446343 self.chunk.write_u16(undef_rd);
63456344 self.chunk.write_opcode(Opcode::StrictNotEqual);
63466345 self.chunk.write_opcode(Opcode::Not);
63476346 let return_is_undefined = self.emit_jump(Opcode::JumpIfTrue);
6348- self.emit_helper_get(&ys_iter);
6349- let ret_key_rd_null = crate::unicode::utf8_to_utf16("return");
6350- let ret_idx_rd_null = self.chunk.add_constant(Value::String(ret_key_rd_null));
6351- self.chunk.write_opcode(Opcode::GetProperty);
6352- self.chunk.write_u16(ret_idx_rd_null);
6347+ self.chunk.write_opcode(Opcode::Dup);
63536348 let null_rd = self.chunk.add_constant(Value::Null);
63546349 self.chunk.write_opcode(Opcode::Constant);
63556350 self.chunk.write_u16(null_rd);
63566351 self.chunk.write_opcode(Opcode::StrictNotEqual);
63576352 self.chunk.write_opcode(Opcode::Not);
63586353 let has_return_method = self.emit_jump(Opcode::JumpIfTrue);
6359- self.patch_jump(return_is_undefined );
6354+ self.chunk.write_opcode(Opcode::Pop );
63606355
63616356 // c.iv: innerReturnResult = Call(return, iterator, « received.[[Value]] »)
63626357 self.emit_helper_get(&ys_iter);
@@ -6404,7 +6399,9 @@ impl<'gc> Compiler<'gc> {
64046399 // c.iii: return is undefined — return Completion(received)
64056400 // Restore generator_return_pending before throwing so the return
64066401 // propagates through finally handlers as a return completion.
6402+ self.patch_jump(return_is_undefined);
64076403 self.patch_jump(has_return_method);
6404+ self.chunk.write_opcode(Opcode::Pop);
64086405 self.emit_helper_get(&ys_thrown);
64096406 self.chunk.write_opcode(Opcode::Dup);
64106407 self.chunk.write_opcode(Opcode::SetGeneratorReturn);
0 commit comments