From 87415f701fbaf9bde073a29f197cfa1e103a0ab7 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sun, 4 Jul 2021 11:03:45 +0200 Subject: [PATCH] PyPy: the PyList/Tuple_GET/SET macros are defined as functions --- src/ffi/cpython/listobject.rs | 3 +++ src/ffi/listobject.rs | 11 +++++++++++ src/ffi/tupleobject.rs | 17 ++++++++++++++--- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/ffi/cpython/listobject.rs b/src/ffi/cpython/listobject.rs index e0f583ad5c0..0489407850b 100644 --- a/src/ffi/cpython/listobject.rs +++ b/src/ffi/cpython/listobject.rs @@ -15,17 +15,20 @@ pub struct PyListObject { /// Macro, trading safety for speed #[inline] +#[cfg(not(PyPy))] pub unsafe fn PyList_GET_ITEM(op: *mut PyObject, i: Py_ssize_t) -> *mut PyObject { *(*(op as *mut PyListObject)).ob_item.offset(i as isize) } /// Macro, *only* to be used to fill in brand new lists #[inline] +#[cfg(not(PyPy))] pub unsafe fn PyList_SET_ITEM(op: *mut PyObject, i: Py_ssize_t, v: *mut PyObject) { *(*(op as *mut PyListObject)).ob_item.offset(i as isize) = v; } #[inline] +#[cfg(not(PyPy))] pub unsafe fn PyList_GET_SIZE(op: *mut PyObject) -> Py_ssize_t { Py_SIZE(op) } diff --git a/src/ffi/listobject.rs b/src/ffi/listobject.rs index cc9ca0de7e9..79885bcff3e 100644 --- a/src/ffi/listobject.rs +++ b/src/ffi/listobject.rs @@ -52,4 +52,15 @@ extern "C" { pub fn PyList_Reverse(arg1: *mut PyObject) -> c_int; #[cfg_attr(PyPy, link_name = "PyPyList_AsTuple")] pub fn PyList_AsTuple(arg1: *mut PyObject) -> *mut PyObject; + + // CPython macros exported as functions on PyPy + #[cfg(PyPy)] + #[cfg_attr(PyPy, link_name = "PyPyList_GET_ITEM")] + pub fn PyList_GET_ITEM(arg1: *mut PyObject, arg2: Py_ssize_t) -> *mut PyObject; + #[cfg(PyPy)] + #[cfg_attr(PyPy, link_name = "PyPyList_GET_SIZE")] + pub fn PyList_GET_SIZE(arg1: *mut PyObject) -> Py_ssize_t; + #[cfg(PyPy)] + #[cfg_attr(PyPy, link_name = "PyPyList_SET_ITEM")] + pub fn PyList_SET_ITEM(arg1: *mut PyObject, arg2: Py_ssize_t, arg3: *mut PyObject); } diff --git a/src/ffi/tupleobject.rs b/src/ffi/tupleobject.rs index fb38718950f..c88af5d964a 100644 --- a/src/ffi/tupleobject.rs +++ b/src/ffi/tupleobject.rs @@ -43,11 +43,22 @@ extern "C" { #[cfg_attr(PyPy, link_name = "PyPyTuple_Pack")] pub fn PyTuple_Pack(arg1: Py_ssize_t, ...) -> *mut PyObject; pub fn PyTuple_ClearFreeList() -> c_int; + + // CPython macros exported as functions on PyPy + #[cfg(PyPy)] + #[cfg_attr(PyPy, link_name = "PyPyTuple_GET_ITEM")] + pub fn PyTuple_GET_ITEM(arg1: *mut PyObject, arg2: Py_ssize_t) -> *mut PyObject; + #[cfg(PyPy)] + #[cfg_attr(PyPy, link_name = "PyPyTuple_GET_SIZE")] + pub fn PyTuple_GET_SIZE(arg1: *mut PyObject) -> Py_ssize_t; + #[cfg(PyPy)] + #[cfg_attr(PyPy, link_name = "PyPyTuple_SET_ITEM")] + pub fn PyTuple_SET_ITEM(arg1: *mut PyObject, arg2: Py_ssize_t, arg3: *mut PyObject); } /// Macro, trading safety for speed #[inline] -#[cfg(not(Py_LIMITED_API))] +#[cfg(not(any(Py_LIMITED_API, PyPy)))] pub unsafe fn PyTuple_GET_ITEM(op: *mut PyObject, i: Py_ssize_t) -> *mut PyObject { *(*(op as *mut PyTupleObject)) .ob_item @@ -56,14 +67,14 @@ pub unsafe fn PyTuple_GET_ITEM(op: *mut PyObject, i: Py_ssize_t) -> *mut PyObjec } #[inline] -#[cfg(not(Py_LIMITED_API))] +#[cfg(not(any(Py_LIMITED_API, PyPy)))] pub unsafe fn PyTuple_GET_SIZE(op: *mut PyObject) -> Py_ssize_t { Py_SIZE(op) } /// Macro, *only* to be used to fill in brand new tuples #[inline] -#[cfg(not(Py_LIMITED_API))] +#[cfg(not(any(Py_LIMITED_API, PyPy)))] pub unsafe fn PyTuple_SET_ITEM(op: *mut PyObject, i: Py_ssize_t, v: *mut PyObject) { *(*(op as *mut PyTupleObject)) .ob_item