pub mod gc;
#[doc(hidden)]
pub mod members;
#[allow(clippy::module_inception)]
mod py_class;
#[cfg(feature = "python27-sys")]
#[rustfmt::skip]
mod py_class_impl2;
#[cfg(feature = "python3-sys")]
#[rustfmt::skip]
mod py_class_impl3;
#[doc(hidden)]
pub mod slots;
use std::{cell, mem, ptr};
use crate::err::{self, PyResult};
use crate::ffi;
use crate::objects::{PyModule, PyObject, PyType};
use crate::python::{self, Python, PythonObject};
#[derive(Debug)]
pub enum CompareOp {
Lt = ffi::Py_LT as isize,
Le = ffi::Py_LE as isize,
Eq = ffi::Py_EQ as isize,
Ne = ffi::Py_NE as isize,
Gt = ffi::Py_GT as isize,
Ge = ffi::Py_GE as isize,
}
pub trait PythonObjectFromPyClassMacro: python::PythonObjectWithTypeObject {
fn initialize(py: Python, module_name: Option<&str>) -> PyResult<PyType>;
fn add_to_module(py: Python, module: &PyModule) -> PyResult<()>;
}
#[inline]
#[doc(hidden)]
pub fn data_offset<T>(base_size: usize) -> usize {
let align = mem::align_of::<T>();
(base_size + align - 1) / align * align
}
#[inline]
#[doc(hidden)]
pub fn data_new_size<T>(base_size: usize) -> usize {
data_offset::<T>(base_size) + mem::size_of::<T>()
}
#[inline]
#[doc(hidden)]
pub unsafe fn data_get<'a, T>(_py: Python<'a>, obj: &'a PyObject, offset: usize) -> &'a T {
let ptr = (obj.as_ptr() as *const u8).add(offset) as *const T;
&*ptr
}
#[inline]
#[doc(hidden)]
pub unsafe fn data_init<'a, T>(_py: Python<'a>, obj: &'a PyObject, offset: usize, value: T)
where
T: Send + 'static,
{
let ptr = (obj.as_ptr() as *mut u8).add(offset) as *mut T;
ptr::write(ptr, value)
}
#[inline]
#[doc(hidden)]
pub unsafe fn data_drop<T>(_py: Python<'_>, obj: *mut ffi::PyObject, offset: usize) {
let ptr = (obj as *mut u8).add(offset) as *mut T;
ptr::drop_in_place(ptr)
}
#[inline]
#[doc(hidden)]
pub fn is_ready(_py: Python, ty: &ffi::PyTypeObject) -> bool {
(ty.tp_flags & ffi::Py_TPFLAGS_READY) != 0
}
pub trait BaseObject: PythonObject {
fn size() -> usize;
type InitType;
unsafe fn alloc(py: Python, ty: &PyType, init_val: Self::InitType) -> PyResult<PyObject>;
unsafe fn dealloc(py: Python, obj: *mut ffi::PyObject);
}
impl BaseObject for PyObject {
#[inline]
fn size() -> usize {
mem::size_of::<ffi::PyObject>()
}
type InitType = ();
unsafe fn alloc(py: Python, ty: &PyType, _init_val: ()) -> PyResult<PyObject> {
let ptr = ffi::PyType_GenericAlloc(ty.as_type_ptr(), 0);
err::result_from_owned_ptr(py, ptr)
}
unsafe fn dealloc(_py: Python, obj: *mut ffi::PyObject) {
let ty = ffi::Py_TYPE(obj);
if ffi::PyType_IS_GC(ty) != 0 {
ffi::PyObject_GC_Del(obj as *mut libc::c_void);
} else {
ffi::PyObject_Free(obj as *mut libc::c_void);
}
if ffi::PyType_HasFeature(ty, ffi::Py_TPFLAGS_HEAPTYPE) != 0 {
ffi::Py_DECREF(ty as *mut ffi::PyObject);
}
}
}