| 1 | use crate::methodobject::PyMethodDef; |
| 2 | use crate::object::{PyObject, PyTypeObject}; |
| 3 | use crate::Py_ssize_t; |
| 4 | use std::os::raw::{c_char, c_int, c_void}; |
| 5 | use std::ptr; |
| 6 | |
| 7 | pub type getter = unsafe extern "C" fn(slf: *mut PyObject, closure: *mut c_void) -> *mut PyObject; |
| 8 | pub type setter = |
| 9 | unsafe extern "C" fn(slf: *mut PyObject, value: *mut PyObject, closure: *mut c_void) -> c_int; |
| 10 | |
| 11 | /// Represents the [PyGetSetDef](https://docs.python.org/3/c-api/structures.html#c.PyGetSetDef) |
| 12 | /// structure. |
| 13 | /// |
| 14 | /// Note that CPython may leave fields uninitialized. You must ensure that |
| 15 | /// `name` != NULL before dereferencing or reading other fields. |
| 16 | #[repr (C)] |
| 17 | #[derive (Copy, Clone, Debug, Eq, PartialEq)] |
| 18 | pub struct PyGetSetDef { |
| 19 | pub name: *const c_char, |
| 20 | pub get: Option<getter>, |
| 21 | pub set: Option<setter>, |
| 22 | pub doc: *const c_char, |
| 23 | pub closure: *mut c_void, |
| 24 | } |
| 25 | |
| 26 | impl Default for PyGetSetDef { |
| 27 | fn default() -> PyGetSetDef { |
| 28 | PyGetSetDef { |
| 29 | name: ptr::null(), |
| 30 | get: None, |
| 31 | set: None, |
| 32 | doc: ptr::null(), |
| 33 | closure: ptr::null_mut(), |
| 34 | } |
| 35 | } |
| 36 | } |
| 37 | |
| 38 | #[cfg_attr (windows, link(name = "pythonXY" ))] |
| 39 | unsafeextern "C" { |
| 40 | #[cfg_attr (PyPy, link_name = "PyPyClassMethodDescr_Type" )] |
| 41 | pub unsafestatic mut PyClassMethodDescr_Type: PyTypeObject; |
| 42 | #[cfg_attr (PyPy, link_name = "PyPyGetSetDescr_Type" )] |
| 43 | pub unsafestatic mut PyGetSetDescr_Type: PyTypeObject; |
| 44 | #[cfg_attr (PyPy, link_name = "PyPyMemberDescr_Type" )] |
| 45 | pub unsafestatic mut PyMemberDescr_Type: PyTypeObject; |
| 46 | #[cfg_attr (PyPy, link_name = "PyPyMethodDescr_Type" )] |
| 47 | pub unsafestatic mut PyMethodDescr_Type: PyTypeObject; |
| 48 | #[cfg_attr (PyPy, link_name = "PyPyWrapperDescr_Type" )] |
| 49 | pub unsafestatic mut PyWrapperDescr_Type: PyTypeObject; |
| 50 | #[cfg_attr (PyPy, link_name = "PyPyDictProxy_Type" )] |
| 51 | pub unsafestatic mut PyDictProxy_Type: PyTypeObject; |
| 52 | #[cfg_attr (PyPy, link_name = "PyPyProperty_Type" )] |
| 53 | pub unsafestatic mut PyProperty_Type: PyTypeObject; |
| 54 | } |
| 55 | |
| 56 | unsafeextern "C" { |
| 57 | pub unsafefn PyDescr_NewMethod(arg1: *mut PyTypeObject, arg2: *mut PyMethodDef) -> *mut PyObject; |
| 58 | #[cfg_attr (PyPy, link_name = "PyPyDescr_NewClassMethod" )] |
| 59 | pub unsafefn PyDescr_NewClassMethod(arg1: *mut PyTypeObject, arg2: *mut PyMethodDef) |
| 60 | -> *mut PyObject; |
| 61 | #[cfg_attr (PyPy, link_name = "PyPyDescr_NewMember" )] |
| 62 | pub unsafefn PyDescr_NewMember(arg1: *mut PyTypeObject, arg2: *mut PyMemberDef) -> *mut PyObject; |
| 63 | #[cfg_attr (PyPy, link_name = "PyPyDescr_NewGetSet" )] |
| 64 | pub unsafefn PyDescr_NewGetSet(arg1: *mut PyTypeObject, arg2: *mut PyGetSetDef) -> *mut PyObject; |
| 65 | |
| 66 | #[cfg_attr (PyPy, link_name = "PyPyDictProxy_New" )] |
| 67 | pub unsafefn PyDictProxy_New(arg1: *mut PyObject) -> *mut PyObject; |
| 68 | pub unsafefn PyWrapper_New(arg1: *mut PyObject, arg2: *mut PyObject) -> *mut PyObject; |
| 69 | } |
| 70 | |
| 71 | /// Represents the [PyMemberDef](https://docs.python.org/3/c-api/structures.html#c.PyMemberDef) |
| 72 | /// structure. |
| 73 | /// |
| 74 | /// Note that CPython may leave fields uninitialized. You must always ensure that |
| 75 | /// `name` != NULL before dereferencing or reading other fields. |
| 76 | #[repr (C)] |
| 77 | #[derive (Copy, Clone, Eq, PartialEq)] |
| 78 | pub struct PyMemberDef { |
| 79 | pub name: *const c_char, |
| 80 | pub type_code: c_int, |
| 81 | pub offset: Py_ssize_t, |
| 82 | pub flags: c_int, |
| 83 | pub doc: *const c_char, |
| 84 | } |
| 85 | |
| 86 | impl Default for PyMemberDef { |
| 87 | fn default() -> PyMemberDef { |
| 88 | PyMemberDef { |
| 89 | name: ptr::null_mut(), |
| 90 | type_code: 0, |
| 91 | offset: 0, |
| 92 | flags: 0, |
| 93 | doc: ptr::null_mut(), |
| 94 | } |
| 95 | } |
| 96 | } |
| 97 | |
| 98 | /* Types */ |
| 99 | pub const Py_T_SHORT: c_int = 0; |
| 100 | pub const Py_T_INT: c_int = 1; |
| 101 | pub const Py_T_LONG: c_int = 2; |
| 102 | pub const Py_T_FLOAT: c_int = 3; |
| 103 | pub const Py_T_DOUBLE: c_int = 4; |
| 104 | pub const Py_T_STRING: c_int = 5; |
| 105 | #[deprecated (note = "Use Py_T_OBJECT_EX instead" )] |
| 106 | pub const _Py_T_OBJECT: c_int = 6; |
| 107 | pub const Py_T_CHAR: c_int = 7; |
| 108 | pub const Py_T_BYTE: c_int = 8; |
| 109 | pub const Py_T_UBYTE: c_int = 9; |
| 110 | pub const Py_T_USHORT: c_int = 10; |
| 111 | pub const Py_T_UINT: c_int = 11; |
| 112 | pub const Py_T_ULONG: c_int = 12; |
| 113 | pub const Py_T_STRING_INPLACE: c_int = 13; |
| 114 | pub const Py_T_BOOL: c_int = 14; |
| 115 | pub const Py_T_OBJECT_EX: c_int = 16; |
| 116 | pub const Py_T_LONGLONG: c_int = 17; |
| 117 | pub const Py_T_ULONGLONG: c_int = 18; |
| 118 | pub const Py_T_PYSSIZET: c_int = 19; |
| 119 | #[deprecated (note = "Value is always none" )] |
| 120 | pub const _Py_T_NONE: c_int = 20; |
| 121 | |
| 122 | /* Flags */ |
| 123 | pub const Py_READONLY: c_int = 1; |
| 124 | #[cfg (Py_3_10)] |
| 125 | pub const Py_AUDIT_READ: c_int = 2; // Added in 3.10, harmless no-op before that |
| 126 | #[deprecated ] |
| 127 | pub const _Py_WRITE_RESTRICTED: c_int = 4; // Deprecated, no-op. Do not reuse the value. |
| 128 | pub const Py_RELATIVE_OFFSET: c_int = 8; |
| 129 | |
| 130 | unsafeextern "C" { |
| 131 | pub unsafefn PyMember_GetOne(addr: *const c_char, l: *mut PyMemberDef) -> *mut PyObject; |
| 132 | pub unsafefn PyMember_SetOne(addr: *mut c_char, l: *mut PyMemberDef, value: *mut PyObject) -> c_int; |
| 133 | } |
| 134 | |