2021-08-17 06:11:51 +00:00
|
|
|
use crate::ffi::{Py_ssize_t, PY_SSIZE_T_MAX};
|
2021-03-02 22:34:25 +00:00
|
|
|
use std::ffi::{CStr, CString};
|
2019-10-27 09:03:01 +00:00
|
|
|
use std::marker::PhantomData;
|
|
|
|
use std::rc::Rc;
|
|
|
|
|
|
|
|
/// A marker type that makes the type !Send.
|
|
|
|
/// Temporal hack until https://github.com/rust-lang/rust/issues/13231 is resolved.
|
|
|
|
pub(crate) type Unsendable = PhantomData<Rc<()>>;
|
2019-12-08 08:18:25 +00:00
|
|
|
|
|
|
|
pub struct PrivateMarker;
|
|
|
|
|
|
|
|
macro_rules! private_decl {
|
|
|
|
() => {
|
|
|
|
/// This trait is private to implement; this method exists to make it
|
|
|
|
/// impossible to implement outside the crate.
|
|
|
|
fn __private__(&self) -> crate::internal_tricks::PrivateMarker;
|
2020-04-07 19:50:01 +00:00
|
|
|
};
|
2019-12-08 08:18:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
macro_rules! private_impl {
|
|
|
|
() => {
|
|
|
|
#[doc(hidden)]
|
|
|
|
fn __private__(&self) -> crate::internal_tricks::PrivateMarker {
|
|
|
|
crate::internal_tricks::PrivateMarker
|
|
|
|
}
|
2020-04-07 19:50:01 +00:00
|
|
|
};
|
2019-12-08 08:18:25 +00:00
|
|
|
}
|
2020-02-09 07:36:32 +00:00
|
|
|
|
|
|
|
macro_rules! pyo3_exception {
|
2020-05-24 12:38:27 +00:00
|
|
|
($doc: expr, $name: ident, $base: ty) => {
|
|
|
|
#[doc = $doc]
|
|
|
|
#[repr(transparent)]
|
|
|
|
#[allow(non_camel_case_types)]
|
|
|
|
pub struct $name($crate::PyAny);
|
|
|
|
|
2020-02-09 07:36:32 +00:00
|
|
|
$crate::impl_exception_boilerplate!($name);
|
2020-05-24 12:38:27 +00:00
|
|
|
|
2020-02-09 07:36:32 +00:00
|
|
|
$crate::create_exception_type_object!(pyo3_runtime, $name, $base);
|
|
|
|
};
|
|
|
|
}
|
2021-03-02 22:34:25 +00:00
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
pub(crate) struct NulByteInString(pub(crate) &'static str);
|
|
|
|
|
|
|
|
pub(crate) fn extract_cstr_or_leak_cstring(
|
|
|
|
src: &'static str,
|
|
|
|
err_msg: &'static str,
|
|
|
|
) -> Result<&'static CStr, NulByteInString> {
|
|
|
|
CStr::from_bytes_with_nul(src.as_bytes())
|
|
|
|
.or_else(|_| {
|
|
|
|
CString::new(src.as_bytes()).map(|c_string| &*Box::leak(c_string.into_boxed_c_str()))
|
|
|
|
})
|
|
|
|
.map_err(|_| NulByteInString(err_msg))
|
|
|
|
}
|
2021-08-17 06:11:51 +00:00
|
|
|
|
|
|
|
/// Convert an usize index into a Py_ssize_t index, clamping overflow to
|
|
|
|
/// PY_SSIZE_T_MAX.
|
|
|
|
pub(crate) fn get_ssize_index(index: usize) -> Py_ssize_t {
|
|
|
|
index.min(PY_SSIZE_T_MAX as usize) as Py_ssize_t
|
|
|
|
}
|