pub unsafe trait Traverse {
// Required method
fn traverse(&self, traverse_fn: &mut TraverseFn<'_>);
// Provided method
fn clear(&mut self, _out: &mut Vec<PyObjectRef>) { ... }
}Expand description
Type that need traverse it’s children should impl Traverse (not MaybeTraverse)
§Safety
Please carefully read Traverse::traverse() and follow the guideline
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 repeatedly, panic and deadlock can happen.
-
DO NOT clone a
PyObjectReforPyRef<T>inTraverse::traverse()
Provided Methods§
Sourcefn clear(&mut self, _out: &mut Vec<PyObjectRef>)
fn clear(&mut self, _out: &mut Vec<PyObjectRef>)
Extract all owned child PyObjectRefs for circular reference resolution (tp_clear). Called just before object deallocation to break circular references. Default implementation does nothing.
Dyn Compatibility§
This trait is dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".
Implementations on Foreign Types§
Source§impl Traverse for IndexMap<&'static PyStrInterned, PyObjectRef, RandomState>
impl Traverse for IndexMap<&'static PyStrInterned, PyObjectRef, RandomState>
fn traverse(&self, tracer_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, L: Traverse> Traverse for (A, B, C, D, E, F, G, H, I, J, K, L)
impl<A: Traverse, B: Traverse, C: Traverse, D: Traverse, E: Traverse, F: Traverse, G: Traverse, H: Traverse, I: Traverse, J: Traverse, K: Traverse, L: Traverse> Traverse for (A, B, C, D, E, F, G, H, I, J, K, L)
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<A: Traverse, B: Traverse, C: Traverse, D: Traverse, E: Traverse, F: Traverse, G: Traverse, H: Traverse, I: Traverse, J: Traverse> Traverse for (A, B, C, D, E, F, G, H, I, J)
impl<A: Traverse, B: Traverse, C: Traverse, D: Traverse, E: Traverse, F: Traverse, G: Traverse, H: Traverse, I: Traverse, J: Traverse> Traverse for (A, B, C, D, E, F, G, H, I, J)
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> Traverse for (A, B, C, D, E, F, G, H, I)
impl<A: Traverse, B: Traverse, C: Traverse, D: Traverse, E: Traverse, F: Traverse, G: Traverse, H: Traverse, I: Traverse> Traverse for (A, B, C, D, E, F, G, H, I)
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> Traverse for (A, B, C, D, E, F, G, H)
impl<A: Traverse, B: Traverse, C: Traverse, D: Traverse, E: Traverse, F: Traverse, G: Traverse, H: Traverse> Traverse for (A, B, C, D, E, F, G, H)
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<A: Traverse, B: Traverse, C: Traverse, D: Traverse, E: Traverse, F: Traverse> Traverse for (A, B, C, D, E, F)
impl<A: Traverse, B: Traverse, C: Traverse, D: Traverse, E: Traverse, F: Traverse> Traverse for (A, B, C, D, E, F)
fn traverse(&self, traverse_fn: &mut TraverseFn<'_>)
Source§impl<A: Traverse, B: Traverse, C: Traverse, D: Traverse, E: Traverse> Traverse for (A, B, C, D, E)
impl<A: Traverse, B: Traverse, C: Traverse, D: Traverse, E: Traverse> Traverse for (A, B, C, D, E)
fn traverse(&self, traverse_fn: &mut TraverseFn<'_>)
Source§impl<A: Traverse, B: Traverse, C: Traverse, D: Traverse> Traverse for (A, B, C, D)
impl<A: Traverse, B: Traverse, C: Traverse, D: Traverse> Traverse for (A, B, C, D)
fn traverse(&self, traverse_fn: &mut TraverseFn<'_>)
Source§impl<A: Traverse, B: Traverse, C: Traverse> Traverse for (A, B, C)
impl<A: Traverse, B: Traverse, C: Traverse> Traverse for (A, B, C)
fn traverse(&self, traverse_fn: &mut TraverseFn<'_>)
Source§impl<A: Traverse, B: Traverse> Traverse for (A, B)
impl<A: Traverse, B: Traverse> Traverse for (A, B)
fn traverse(&self, traverse_fn: &mut TraverseFn<'_>)
Source§impl<T: Traverse> Traverse for Option<T>
impl<T: Traverse> Traverse for Option<T>
fn traverse(&self, traverse_fn: &mut TraverseFn<'_>)
Source§impl<T: Traverse> Traverse for PyMutex<T>
Safety: the lock is not held across visiting children to avoid a re-entrant
deadlock. In threading builds traversal runs under stop-the-world so no
other thread mutates the guarded value while we read it; in single-threaded
builds there is no other writer.
impl<T: Traverse> Traverse for PyMutex<T>
Safety: the lock is not held across visiting children to avoid a re-entrant deadlock. In threading builds traversal runs under stop-the-world so no other thread mutates the guarded value while we read it; in single-threaded builds there is no other writer.