1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
use crate::instance::Py;
use crate::pyclass_init::PyObjectInit;
use crate::types::{PyAny, PyType};
use crate::{ffi, AsPyPointer, Python};
use std::ptr::NonNull;
pub trait PyObjectLayout<T: PyTypeInfo> {
const IS_NATIVE_TYPE: bool = true;
fn get_super_or(&mut self) -> Option<&mut <T::BaseType as PyTypeInfo>::ConcreteLayout> {
None
}
unsafe fn internal_ref_cast(obj: &PyAny) -> &T {
&*(obj as *const _ as *const T)
}
#[allow(clippy::mut_from_ref)]
unsafe fn internal_mut_cast(obj: &PyAny) -> &mut T {
&mut *(obj as *const _ as *const T as *mut T)
}
unsafe fn py_init(&mut self, _value: T) {}
unsafe fn py_drop(&mut self, _py: Python) {}
}
pub trait PyObjectSizedLayout<T: PyTypeInfo>: PyObjectLayout<T> + Sized {}
#[doc(hidden)]
pub mod type_flags {
pub const GC: usize = 1;
pub const WEAKREF: usize = 1 << 1;
pub const BASETYPE: usize = 1 << 2;
pub const DICT: usize = 1 << 3;
pub const EXTENDED: usize = 1 << 4;
}
pub trait PyTypeInfo: Sized {
type Type;
const NAME: &'static str;
const MODULE: Option<&'static str>;
const DESCRIPTION: &'static str = "\0";
const FLAGS: usize = 0;
type BaseType: PyTypeInfo + PyTypeObject;
type ConcreteLayout: PyObjectLayout<Self>;
type Initializer: PyObjectInit<Self>;
unsafe fn type_object() -> &'static mut ffi::PyTypeObject;
fn is_instance(object: &PyAny) -> bool {
unsafe { ffi::PyObject_TypeCheck(object.as_ptr(), Self::type_object()) != 0 }
}
fn is_exact_instance(object: &PyAny) -> bool {
unsafe { (*object.as_ptr()).ob_type == Self::type_object() }
}
}
pub unsafe trait PyTypeObject {
fn init_type() -> NonNull<ffi::PyTypeObject>;
fn type_object() -> Py<PyType> {
unsafe { Py::from_borrowed_ptr(Self::init_type().as_ptr() as *mut ffi::PyObject) }
}
}