Trait rustpython_vm::object::Traverse
source · pub unsafe trait Traverse {
// Required method
fn traverse(&self, traverse_fn: &mut TraverseFn<'_>);
}
Expand description
Type that need traverse it’s children should impl Traverse
(Not MaybeTraverse
)
Safety
impl traverse()
with caution! Following those guideline so traverse doesn’t cause memory error!:
-
Make sure that every owned object(Every PyObjectRef/PyRef) is called with traverse_fn at most once. If some field is not called, the worst results is just memory leak, but if some field is called repeatly, panic and deadlock can happen.
-
DO NOT clone a
PyObjectRef
orPyef<T>
intraverse()
Required Methods§
sourcefn traverse(&self, traverse_fn: &mut TraverseFn<'_>)
fn traverse(&self, traverse_fn: &mut TraverseFn<'_>)
impl traverse()
with caution! Following those guideline so traverse doesn’t cause memory error!:
-
Make sure that every owned object(Every PyObjectRef/PyRef) is called with traverse_fn at most once. If some field is not called, the worst results is just memory leak, but if some field is called repeatly, panic and deadlock can happen.
-
DO NOT clone a
PyObjectRef
orPyef<T>
intraverse()
Implementations on Foreign Types§
source§impl<T> Traverse for [T]where
T: Traverse,
impl<T> Traverse for [T]where T: Traverse,
fn traverse(&self, traverse_fn: &mut TraverseFn<'_>)
source§impl<A: Traverse, B: Traverse, C: Traverse, D: Traverse, E: Traverse, F: Traverse, G: Traverse, H: Traverse, I: Traverse, J: Traverse, K: Traverse> Traverse for (A, B, C, D, E, F, G, H, I, J, K)
impl<A: Traverse, B: Traverse, C: Traverse, D: Traverse, E: Traverse, F: Traverse, G: Traverse, H: Traverse, I: Traverse, J: Traverse, K: Traverse> Traverse for (A, B, C, D, E, F, G, H, I, J, K)
fn traverse(&self, traverse_fn: &mut TraverseFn<'_>)
source§impl<T> Traverse for Box<[T]>where
T: Traverse,
impl<T> Traverse for Box<[T]>where T: Traverse,
fn traverse(&self, traverse_fn: &mut TraverseFn<'_>)
source§impl<A: Traverse, B: Traverse, C: Traverse, D: Traverse, E: Traverse, F: Traverse, G: Traverse> Traverse for (A, B, C, D, E, F, G)
impl<A: Traverse, B: Traverse, C: Traverse, D: Traverse, E: Traverse, F: Traverse, G: Traverse> Traverse for (A, B, C, D, E, F, G)
fn traverse(&self, traverse_fn: &mut TraverseFn<'_>)
source§impl<T: Traverse> Traverse for PyMutex<T>
impl<T: Traverse> Traverse for PyMutex<T>
Safety: We can’t hold lock during traverse it’s child because it may cause deadlock. TODO(discord9): check if this is thread-safe to do (Outside of gc phase, only incref/decref will call trace, and refcnt is atomic, so it should be fine?)