Skip to content

Commit d51978e

Browse files
committed
fix asyncgen
1 parent 23e3ebb commit d51978e

File tree

6 files changed

+42
-5
lines changed

6 files changed

+42
-5
lines changed

crates/vm/src/builtins/asyncgenerator.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::{
77
coroutine::{Coro, warn_deprecated_throw_signature},
88
frame::FrameRef,
99
function::OptionalArg,
10-
object::traverse::{Traverse, TraverseFn},
10+
object::{Traverse, TraverseFn},
1111
protocol::PyIterReturn,
1212
types::{Destructor, IterNext, Iterable, Representable, SelfIter},
1313
};
@@ -492,11 +492,13 @@ impl PyAsyncGenAThrow {
492492
}
493493
fn yield_close(&self, vm: &VirtualMachine) -> PyBaseExceptionRef {
494494
self.ag.running_async.store(false);
495+
self.ag.inner.closed.store(true);
495496
self.state.store(AwaitableState::Closed);
496497
vm.new_runtime_error("async generator ignored GeneratorExit")
497498
}
498499
fn check_error(&self, exc: PyBaseExceptionRef, vm: &VirtualMachine) -> PyBaseExceptionRef {
499500
self.ag.running_async.store(false);
501+
self.ag.inner.closed.store(true);
500502
self.state.store(AwaitableState::Closed);
501503
if self.aclose
502504
&& (exc.fast_isinstance(vm.ctx.exceptions.stop_async_iteration)

crates/vm/src/builtins/coroutine.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::{
55
coroutine::{Coro, warn_deprecated_throw_signature},
66
frame::FrameRef,
77
function::OptionalArg,
8-
object::traverse::{Traverse, TraverseFn},
8+
object::{Traverse, TraverseFn},
99
protocol::PyIterReturn,
1010
types::{IterNext, Iterable, Representable, SelfIter},
1111
};

crates/vm/src/builtins/generator.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::{
99
coroutine::{Coro, warn_deprecated_throw_signature},
1010
frame::FrameRef,
1111
function::OptionalArg,
12-
object::traverse::{Traverse, TraverseFn},
12+
object::{Traverse, TraverseFn},
1313
protocol::PyIterReturn,
1414
types::{IterNext, Iterable, Representable, SelfIter},
1515
};

crates/vm/src/coroutine.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::{
55
exceptions::types::PyBaseException,
66
frame::{ExecutionResult, FrameRef},
77
function::OptionalArg,
8-
object::traverse::{Traverse, TraverseFn},
8+
object::{Traverse, TraverseFn},
99
protocol::PyIterReturn,
1010
};
1111
use crossbeam_utils::atomic::AtomicCell;

crates/vm/src/frame.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use crate::{
1212
coroutine::Coro,
1313
exceptions::ExceptionCtor,
1414
function::{ArgMapping, Either, FuncArgs},
15+
object::{Traverse, TraverseFn},
1516
protocol::{PyIter, PyIterReturn},
1617
scope::Scope,
1718
stdlib::{builtins, typing},
@@ -65,7 +66,7 @@ type Lasti = atomic::AtomicU32;
6566
#[cfg(not(feature = "threading"))]
6667
type Lasti = core::cell::Cell<u32>;
6768

68-
#[pyclass(module = false, name = "frame")]
69+
#[pyclass(module = false, name = "frame", traverse = "manual")]
6970
pub struct Frame {
7071
pub code: PyRef<PyCode>,
7172
pub func_obj: Option<PyObjectRef>,
@@ -96,6 +97,27 @@ impl PyPayload for Frame {
9697
}
9798
}
9899

100+
unsafe impl Traverse for FrameState {
101+
fn traverse(&self, tracer_fn: &mut TraverseFn<'_>) {
102+
self.stack.traverse(tracer_fn);
103+
}
104+
}
105+
106+
unsafe impl Traverse for Frame {
107+
fn traverse(&self, tracer_fn: &mut TraverseFn<'_>) {
108+
self.code.traverse(tracer_fn);
109+
self.func_obj.traverse(tracer_fn);
110+
self.fastlocals.traverse(tracer_fn);
111+
self.cells_frees.traverse(tracer_fn);
112+
self.locals.traverse(tracer_fn);
113+
self.globals.traverse(tracer_fn);
114+
self.builtins.traverse(tracer_fn);
115+
self.trace.traverse(tracer_fn);
116+
self.state.traverse(tracer_fn);
117+
self.temporary_refs.traverse(tracer_fn);
118+
}
119+
}
120+
99121
// Running a frame can result in one of the below:
100122
pub enum ExecutionResult {
101123
Return(PyObjectRef),

crates/vm/src/object/traverse.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use core::ptr::NonNull;
22

3+
use rustpython_common::boxvec::BoxVec;
34
use rustpython_common::lock::{PyMutex, PyRwLock};
45

56
use crate::{AsObject, PyObject, PyObjectRef, PyRef, function::Either, object::PyObjectPayload};
@@ -100,6 +101,18 @@ where
100101
}
101102
}
102103

104+
unsafe impl<T> Traverse for BoxVec<T>
105+
where
106+
T: Traverse,
107+
{
108+
#[inline]
109+
fn traverse(&self, traverse_fn: &mut TraverseFn<'_>) {
110+
for elem in self {
111+
elem.traverse(traverse_fn);
112+
}
113+
}
114+
}
115+
103116
unsafe impl<T: Traverse> Traverse for PyRwLock<T> {
104117
#[inline]
105118
fn traverse(&self, traverse_fn: &mut TraverseFn<'_>) {

0 commit comments

Comments
 (0)