Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use Cython's array to back Py_ssize_t[::1] #307

Merged
merged 1 commit into from
Oct 22, 2024
Merged
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
Use Cython's array to back Py_ssize_t[::1]
In `Array`, `Py_ssize_t[::1]` objects are currently backed by CPython
`array`'s with some internal bits expressed in Cython. However these are
not compatible with Python's Limited API and Stable ABI. To address
that, switch to Cython's own`array` type. As this is baked into Cython
and doesn't use anything special, it is compatible with Python's Limited
API and Stable ABI.

https://cython.readthedocs.io/en/latest/src/userguide/memoryviews.html#cython-arrays
  • Loading branch information
jakirkham committed Oct 22, 2024

Verified

This commit was signed with the committer’s verified signature.
commit 30374c6d819700a1031ec5e9fe4e90ab156d0bc0
15 changes: 8 additions & 7 deletions python/ucxx/ucxx/_lib/arr.pyx
Original file line number Diff line number Diff line change
@@ -4,13 +4,12 @@
# cython: language_level=3


from cpython.array cimport array, newarrayobject
from cpython.buffer cimport PyBuffer_IsContiguous
from cpython.mem cimport PyMem_Free, PyMem_Malloc
from cpython.memoryview cimport (
PyMemoryView_FromObject,
PyMemoryView_GET_BUFFER,
)
from cpython.object cimport PyObject
from cpython.ref cimport Py_INCREF
from cpython.tuple cimport PyTuple_New, PyTuple_SET_ITEM
from cython cimport (
@@ -20,6 +19,7 @@ from cython cimport (
nonecheck,
wraparound,
)
from cython.view cimport array
from libc.stdint cimport uintptr_t
from libc.string cimport memcpy

@@ -62,13 +62,14 @@ cdef dict itemsize_mapping = {
}


cdef array array_Py_ssize_t = array("q")
cdef sizeof_Py_ssize_t = sizeof(Py_ssize_t)


cdef inline Py_ssize_t[::1] new_Py_ssize_t_array(Py_ssize_t n):
return newarrayobject(
(<PyObject*>array_Py_ssize_t).ob_type, n, array_Py_ssize_t.ob_descr
)
cdef Py_ssize_t[::1] new_Py_ssize_t_array(Py_ssize_t n):
cdef array a = array((n,), sizeof_Py_ssize_t, b"q", "c", False)
a.data = <char*>PyMem_Malloc(n * sizeof(Py_ssize_t))
a.callback_free_data = PyMem_Free
return a


@auto_pickle(False)