Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions newsfragments/5942.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add FFI definitions `PyObject_GetAIter`, `PyAIter_Check`, `PyMapping_HasKeyWithError`, `PyMapping_HasKeyStringWithError`, `PyMapping_GetOptionalItem`, `PyMapping_GetOptionalItemString`, `PySequence_ITEM`, `PySequence_Fast_GET_SIZE`, `PySequence_Fast_GET_ITEM`, and `PySequence_Fast_ITEMS`.
3 changes: 3 additions & 0 deletions newsfragments/5942.removed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Remove private FFI definitions `_PyStack_AsDict`, `_PyObject_CallNoArg`, `_PyObject_FastCall`, `_PyObject_FastCallTstate`. `_PyObject_VectorcallTstate`, `_PyObject_MakeTpCall`, `_Py_CheckFunctionResult`, `_PyObject_CallFunction_SizeT`, `_PyObject_CallMethod_SizeT`, and `_PySequence_IterSearch`.

Remove FFI definitions `PY_ITERSEARCH_COUNT`, `PY_ITERSEARCH_INDEX`, and `PY_ITERSEARCH_CONTAINS`.
121 changes: 59 additions & 62 deletions pyo3-ffi/src/abstract_.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,21 +54,13 @@ extern_libpython! {
...
) -> *mut PyObject;

#[cfg(not(Py_3_13))]
#[cfg(all(PyPy, not(Py_3_13)))] // called internally in PyUnicodeDecodeError_Create on PyPy
#[cfg_attr(PyPy, link_name = "_PyPyObject_CallFunction_SizeT")]
pub fn _PyObject_CallFunction_SizeT(
pub(crate) fn _PyObject_CallFunction_SizeT(
callable_object: *mut PyObject,
format: *const c_char,
...
) -> *mut PyObject;
#[cfg(not(Py_3_13))]
#[cfg_attr(PyPy, link_name = "_PyPyObject_CallMethod_SizeT")]
pub fn _PyObject_CallMethod_SizeT(
o: *mut PyObject,
method: *const c_char,
format: *const c_char,
...
) -> *mut PyObject;

#[cfg_attr(PyPy, link_name = "PyPyObject_CallFunctionObjArgs")]
pub fn PyObject_CallFunctionObjArgs(callable: *mut PyObject, ...) -> *mut PyObject;
Expand All @@ -78,10 +70,24 @@ extern_libpython! {
method: *mut PyObject,
...
) -> *mut PyObject;

#[cfg(all(Py_3_12, Py_LIMITED_API))] // is an inline function in cpython/abstract.rs on version-specific ABI
#[cfg_attr(PyPy, link_name = "PyPyVectorcall_NARGS")]
pub fn PyVectorcall_NARGS(nargsf: size_t) -> Py_ssize_t;

#[cfg_attr(not(any(Py_3_12, PyPy)), link_name = "_PyVectorcall_Call")] // symbol made public in 3.12
#[cfg_attr(PyPy, link_name = "PyPyVectorcall_Call")]
pub fn PyVectorcall_Call(
callable: *mut PyObject,
tuple: *mut PyObject,
dict: *mut PyObject,
) -> *mut PyObject;
}

#[cfg(any(Py_3_12, not(Py_LIMITED_API)))]
pub const PY_VECTORCALL_ARGUMENTS_OFFSET: size_t =
1 << (8 * std::mem::size_of::<size_t>() as size_t - 1);
pub const PY_VECTORCALL_ARGUMENTS_OFFSET: size_t = (1 as size_t)
.checked_shl((8 * std::mem::size_of::<size_t>() - 1) as u32)
.expect("size_t should fit the flag bits");

extern_libpython! {
#[cfg_attr(PyPy, link_name = "PyPyObject_Vectorcall")]
Expand All @@ -104,14 +110,12 @@ extern_libpython! {
pub fn PyObject_Type(o: *mut PyObject) -> *mut PyObject;
#[cfg_attr(PyPy, link_name = "PyPyObject_Size")]
pub fn PyObject_Size(o: *mut PyObject) -> Py_ssize_t;
}

#[inline]
pub unsafe fn PyObject_Length(o: *mut PyObject) -> Py_ssize_t {
PyObject_Size(o)
}
// PyObject_Length is a direct alias for PyObject_Size
#[cfg_attr(not(PyPy), link_name = "PyObject_Size")]
#[cfg_attr(PyPy, link_name = "PyPyObject_Size")]
pub fn PyObject_Length(o: *mut PyObject) -> Py_ssize_t;

extern_libpython! {
#[cfg_attr(PyPy, link_name = "PyPyObject_GetItem")]
pub fn PyObject_GetItem(o: *mut PyObject, key: *mut PyObject) -> *mut PyObject;
#[cfg_attr(PyPy, link_name = "PyPyObject_SetItem")]
Expand All @@ -120,18 +124,20 @@ extern_libpython! {
pub fn PyObject_DelItemString(o: *mut PyObject, key: *const c_char) -> c_int;
#[cfg_attr(PyPy, link_name = "PyPyObject_DelItem")]
pub fn PyObject_DelItem(o: *mut PyObject, key: *mut PyObject) -> c_int;
}

extern_libpython! {
#[cfg_attr(PyPy, link_name = "PyPyObject_Format")]
pub fn PyObject_Format(obj: *mut PyObject, format_spec: *mut PyObject) -> *mut PyObject;
#[cfg_attr(PyPy, link_name = "PyPyObject_GetIter")]
pub fn PyObject_GetIter(arg1: *mut PyObject) -> *mut PyObject;
}
#[cfg(Py_3_10)]
#[cfg_attr(PyPy, link_name = "PyPyObject_GetAIter")]
pub fn PyObject_GetAIter(arg1: *mut PyObject) -> *mut PyObject;

extern_libpython! {
#[cfg_attr(PyPy, link_name = "PyPyIter_Check")]
pub fn PyIter_Check(obj: *mut PyObject) -> c_int;
#[cfg(Py_3_10)]
#[cfg_attr(PyPy, link_name = "PyPyAIter_Check")]
pub fn PyAIter_Check(obj: *mut PyObject) -> c_int;

#[cfg(Py_3_14)]
#[cfg_attr(PyPy, link_name = "PyPyIter_NextItem")]
Expand Down Expand Up @@ -185,20 +191,8 @@ extern_libpython! {
pub fn PyNumber_Xor(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
#[cfg_attr(PyPy, link_name = "PyPyNumber_Or")]
pub fn PyNumber_Or(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
}

// Defined as this macro in Python limited API, but relies on
// non-limited PyTypeObject. Don't expose this since it cannot be used.
#[cfg(not(any(Py_LIMITED_API, PyPy)))]
#[inline]
pub unsafe fn PyIndex_Check(o: *mut PyObject) -> c_int {
let tp_as_number = (*Py_TYPE(o)).tp_as_number;
(!tp_as_number.is_null() && (*tp_as_number).nb_index.is_some()) as c_int
}

extern_libpython! {
#[cfg(any(Py_LIMITED_API, PyPy))]
#[link_name = "PyPyIndex_Check"]
#[cfg_attr(PyPy, link_name = "PyPyIndex_Check")]
pub fn PyIndex_Check(o: *mut PyObject) -> c_int;

#[cfg_attr(PyPy, link_name = "PyPyNumber_Index")]
Expand Down Expand Up @@ -246,18 +240,11 @@ extern_libpython! {
#[cfg_attr(PyPy, link_name = "PyPySequence_Size")]
pub fn PySequence_Size(o: *mut PyObject) -> Py_ssize_t;

#[cfg(PyPy)]
#[link_name = "PyPySequence_Length"]
// PySequence_Length is a direct alias for PySequence_Size
#[cfg_attr(not(PyPy), link_name = "PySequence_Size")]
#[cfg_attr(PyPy, link_name = "PyPySequence_Size")]
pub fn PySequence_Length(o: *mut PyObject) -> Py_ssize_t;
}

#[inline]
#[cfg(not(PyPy))]
pub unsafe fn PySequence_Length(o: *mut PyObject) -> Py_ssize_t {
PySequence_Size(o)
}

extern_libpython! {
#[cfg_attr(PyPy, link_name = "PyPySequence_Concat")]
pub fn PySequence_Concat(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
#[cfg_attr(PyPy, link_name = "PyPySequence_Repeat")]
Expand Down Expand Up @@ -285,20 +272,15 @@ extern_libpython! {
pub fn PySequence_List(o: *mut PyObject) -> *mut PyObject;
#[cfg_attr(PyPy, link_name = "PyPySequence_Fast")]
pub fn PySequence_Fast(o: *mut PyObject, m: *const c_char) -> *mut PyObject;
// skipped PySequence_Fast_GET_SIZE
// skipped PySequence_Fast_GET_ITEM
// skipped PySequence_Fast_GET_ITEMS
Comment thread
davidhewitt marked this conversation as resolved.
pub fn PySequence_Count(o: *mut PyObject, value: *mut PyObject) -> Py_ssize_t;
#[cfg_attr(PyPy, link_name = "PyPySequence_Contains")]
pub fn PySequence_Contains(seq: *mut PyObject, ob: *mut PyObject) -> c_int;
}

#[inline]
pub unsafe fn PySequence_In(o: *mut PyObject, value: *mut PyObject) -> c_int {
PySequence_Contains(o, value)
}
// PySequence_In is a direct alias for PySequence_Contains
#[cfg_attr(not(PyPy), link_name = "PySequence_Contains")]
#[cfg_attr(PyPy, link_name = "PyPySequence_Contains")]
pub fn PySequence_In(o: *mut PyObject, value: *mut PyObject) -> c_int;

extern_libpython! {
#[cfg_attr(PyPy, link_name = "PyPySequence_Index")]
pub fn PySequence_Index(o: *mut PyObject, value: *mut PyObject) -> Py_ssize_t;
#[cfg_attr(PyPy, link_name = "PyPySequence_InPlaceConcat")]
Expand All @@ -310,17 +292,12 @@ extern_libpython! {
#[cfg_attr(PyPy, link_name = "PyPyMapping_Size")]
pub fn PyMapping_Size(o: *mut PyObject) -> Py_ssize_t;

#[cfg(PyPy)]
#[link_name = "PyPyMapping_Length"]
// PyMapping_Length is a direct alias for PyMapping_Size
#[cfg_attr(not(PyPy), link_name = "PyMapping_Size")]
#[cfg_attr(PyPy, link_name = "PyPyMapping_Size")]
pub fn PyMapping_Length(o: *mut PyObject) -> Py_ssize_t;
}

#[inline]
#[cfg(not(PyPy))]
pub unsafe fn PyMapping_Length(o: *mut PyObject) -> Py_ssize_t {
PyMapping_Size(o)
}

#[inline]
pub unsafe fn PyMapping_DelItemString(o: *mut PyObject, key: *mut c_char) -> c_int {
PyObject_DelItemString(o, key)
Expand All @@ -336,6 +313,12 @@ extern_libpython! {
pub fn PyMapping_HasKeyString(o: *mut PyObject, key: *const c_char) -> c_int;
#[cfg_attr(PyPy, link_name = "PyPyMapping_HasKey")]
pub fn PyMapping_HasKey(o: *mut PyObject, key: *mut PyObject) -> c_int;
#[cfg(Py_3_13)]
#[cfg_attr(PyPy, link_name = "PyPyMapping_HasKeyWithError")]
pub fn PyMapping_HasKeyWithError(o: *mut PyObject, key: *mut PyObject) -> c_int;
#[cfg(Py_3_13)]
#[cfg_attr(PyPy, link_name = "PyPyMapping_HasKeyStringWithError")]
pub fn PyMapping_HasKeyStringWithError(o: *mut PyObject, key: *const c_char) -> c_int;
#[cfg_attr(PyPy, link_name = "PyPyMapping_Keys")]
pub fn PyMapping_Keys(o: *mut PyObject) -> *mut PyObject;
#[cfg_attr(PyPy, link_name = "PyPyMapping_Values")]
Expand All @@ -344,6 +327,20 @@ extern_libpython! {
pub fn PyMapping_Items(o: *mut PyObject) -> *mut PyObject;
#[cfg_attr(PyPy, link_name = "PyPyMapping_GetItemString")]
pub fn PyMapping_GetItemString(o: *mut PyObject, key: *const c_char) -> *mut PyObject;
#[cfg(Py_3_13)]
#[cfg_attr(PyPy, link_name = "PyPyMapping_GetOptionalItem")]
pub fn PyMapping_GetOptionalItem(
o: *mut PyObject,
key: *mut PyObject,
result: *mut *mut PyObject,
) -> c_int;
#[cfg(Py_3_13)]
#[cfg_attr(PyPy, link_name = "PyPyMapping_GetOptionalItemString")]
pub fn PyMapping_GetOptionalItemString(
o: *mut PyObject,
key: *const c_char,
result: *mut *mut PyObject,
) -> c_int;
#[cfg_attr(PyPy, link_name = "PyPyMapping_SetItemString")]
pub fn PyMapping_SetItemString(
o: *mut PyObject,
Expand Down
Loading
Loading