31 lines
1.3 KiB
Rust
31 lines
1.3 KiB
Rust
|
use pyo3::ffi::*;
|
||
|
use std::sync::Once;
|
||
|
|
||
|
pub static mut TRUE: *mut pyo3::ffi::PyObject = 0 as *mut pyo3::ffi::PyObject;
|
||
|
|
||
|
pub static mut STR_TYPE: *mut PyTypeObject = 0 as *mut PyTypeObject;
|
||
|
pub static mut INT_TYPE: *mut PyTypeObject = 0 as *mut PyTypeObject;
|
||
|
pub static mut BOOL_TYPE: *mut PyTypeObject = 0 as *mut PyTypeObject;
|
||
|
pub static mut NONE_TYPE: *mut PyTypeObject = 0 as *mut PyTypeObject;
|
||
|
pub static mut FLOAT_TYPE: *mut PyTypeObject = 0 as *mut PyTypeObject;
|
||
|
pub static mut LIST_TYPE: *mut PyTypeObject = 0 as *mut PyTypeObject;
|
||
|
pub static mut DICT_TYPE: *mut PyTypeObject = 0 as *mut PyTypeObject;
|
||
|
|
||
|
static INIT: Once = Once::new();
|
||
|
|
||
|
/// Set empty type object pointers with their actual values.
|
||
|
/// We need these Python-side type objects for direct comparison during conversion to serde types
|
||
|
/// NOTE. This function should be called before any serialization logic
|
||
|
pub fn init() {
|
||
|
INIT.call_once(|| unsafe {
|
||
|
TRUE = Py_True();
|
||
|
STR_TYPE = Py_TYPE(PyUnicode_New(0, 255));
|
||
|
DICT_TYPE = Py_TYPE(PyDict_New());
|
||
|
LIST_TYPE = Py_TYPE(PyList_New(0 as Py_ssize_t));
|
||
|
NONE_TYPE = Py_TYPE(Py_None());
|
||
|
BOOL_TYPE = Py_TYPE(TRUE);
|
||
|
INT_TYPE = Py_TYPE(PyLong_FromLongLong(0));
|
||
|
FLOAT_TYPE = Py_TYPE(PyFloat_FromDouble(0.0));
|
||
|
});
|
||
|
}
|