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 Traverse for IndexMap<String, PyObjectRef>
impl Traverse for IndexMap<String, PyObjectRef>
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: 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?)
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?)