From fd4bf5682b0d1c845acae2cdd32f4b0db07f2afd Mon Sep 17 00:00:00 2001 From: Jeong YunWon Date: Thu, 25 Apr 2024 15:19:32 +0900 Subject: [PATCH 1/2] remove pop-push --- vm/src/frame.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/vm/src/frame.rs b/vm/src/frame.rs index 80f848fc94..0a2bfa32ae 100644 --- a/vm/src/frame.rs +++ b/vm/src/frame.rs @@ -1496,8 +1496,7 @@ impl ExecutingFrame<'_> { } PyIterReturn::StopIteration(value) => { let value = vm.unwrap_or_none(value); - self.pop_value(); - self.push_value(value); + self.replace_top(value); Ok(None) } } From e0550077b5d9406b9ac9d6506fd7d6a1893f979d Mon Sep 17 00:00:00 2001 From: Jeong YunWon Date: Thu, 25 Apr 2024 17:16:48 +0900 Subject: [PATCH 2/2] Fix async for block --- vm/src/frame.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/vm/src/frame.rs b/vm/src/frame.rs index 0a2bfa32ae..e9ac41aacb 100644 --- a/vm/src/frame.rs +++ b/vm/src/frame.rs @@ -1005,7 +1005,9 @@ impl ExecutingFrame<'_> { } bytecode::Instruction::EndAsyncFor => { let exc = self.pop_value(); - self.pop_value(); // async iterator we were calling __anext__ on + let except_block = self.pop_block(); // pushed by TryExcept unwind + debug_assert_eq!(except_block.level, self.state.stack.len()); + let _async_iterator = self.pop_value(); // __anext__ provider in the loop if exc.fast_isinstance(vm.ctx.exceptions.stop_async_iteration) { vm.take_exception().expect("Should have exception in stack"); Ok(None) @@ -1932,6 +1934,7 @@ impl ExecutingFrame<'_> { } #[inline] + #[track_caller] // not a real track_caller but push_value is not very useful fn push_value(&mut self, obj: PyObjectRef) { match self.state.stack.try_push(obj) { Ok(()) => {}