feature: PyTraverse derive macro for traverse object's childrens(like CPython's tp_traverse) (#4872)

This commit is contained in:
discord9 authored and GitHub committed 2023-04-23 21:43:49 +09:00
1 parent 2c90b128c3
commit 94bdb6b97a
59 files changed
+940 -120

No files matched your search

+32 -7
View File
@@ -69,6 +69,7 @@ mod _sqlite {
AsObject, Py, PyAtomicRef, PyObject, PyObjectRef, PyPayload, PyRef, PyResult,
TryFromBorrowedObject, VirtualMachine,
__exports::paste,
object::{Traverse, TraverseFn},
};
use std::{
ffi::{c_int, c_longlong, c_uint, c_void, CStr},
@@ -311,6 +312,13 @@ mod _sqlite {
uri: bool,
}
unsafe impl Traverse for ConnectArgs {
fn traverse(&self, tracer_fn: &mut TraverseFn) {
self.isolation_level.traverse(tracer_fn);
self.factory.traverse(tracer_fn);
}
}
#[derive(FromArgs)]
struct BackupArgs {
#[pyarg(any)]
@@ -325,36 +333,48 @@ mod _sqlite {
sleep: f64,
}
#[derive(FromArgs)]
unsafe impl Traverse for BackupArgs {
fn traverse(&self, tracer_fn: &mut TraverseFn) {
self.progress.traverse(tracer_fn);
self.name.traverse(tracer_fn);
}
}
#[derive(FromArgs, Traverse)]
struct CreateFunctionArgs {
#[pyarg(any)]
name: PyStrRef,
#[pytraverse(skip)]
#[pyarg(any)]
narg: c_int,
#[pyarg(any)]
func: PyObjectRef,
#[pytraverse(skip)]
#[pyarg(named, default)]
deterministic: bool,
}
#[derive(FromArgs)]
#[derive(FromArgs, Traverse)]
struct CreateAggregateArgs {
#[pyarg(any)]
name: PyStrRef,
#[pytraverse(skip)]
#[pyarg(positional)]
narg: c_int,
#[pyarg(positional)]
aggregate_class: PyObjectRef,
}
#[derive(FromArgs)]
#[derive(FromArgs, Traverse)]
struct BlobOpenArgs {
#[pyarg(positional)]
table: PyStrRef,
#[pyarg(positional)]
column: PyStrRef,
#[pytraverse(skip)]
#[pyarg(positional)]
row: i64,
#[pytraverse(skip)]
#[pyarg(named, default)]
readonly: bool,
#[pyarg(named, default = "vm.ctx.new_str(stringify!(main))")]
@@ -1340,20 +1360,24 @@ mod _sqlite {
}
#[pyattr]
#[pyclass(name)]
#[pyclass(name, traverse)]
#[derive(Debug, PyPayload)]
struct Cursor {
connection: PyRef<Connection>,
#[pytraverse(skip)]
arraysize: PyAtomic<c_int>,
#[pytraverse(skip)]
row_factory: PyAtomicRef<Option<PyObject>>,
inner: PyMutex<Option<CursorInner>>,
}
#[derive(Debug)]
#[derive(Debug, Traverse)]
struct CursorInner {
description: Option<PyTupleRef>,
row_cast_map: Vec<Option<PyObjectRef>>,
#[pytraverse(skip)]
lastrowid: i64,
#[pytraverse(skip)]
rowcount: i64,
statement: Option<PyRef<Statement>>,
}
@@ -1793,7 +1817,7 @@ mod _sqlite {
}
#[pyattr]
#[pyclass(name)]
#[pyclass(name, traverse)]
#[derive(Debug, PyPayload)]
struct Row {
data: PyTupleRef,
@@ -1922,10 +1946,11 @@ mod _sqlite {
}
#[pyattr]
#[pyclass(name)]
#[pyclass(name, traverse)]
#[derive(Debug, PyPayload)]
struct Blob {
connection: PyRef<Connection>,
#[pytraverse(skip)]
inner: PyMutex<Option<BlobInner>>,
}