diff options
author | Sam Gross <colesbury@gmail.com> | 2024-07-02 16:30:14 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-02 16:30:14 (GMT) |
commit | 8e8d202f552c993f40913b628139a39a5abe6a03 (patch) | |
tree | a907d73519febe133d4b86f57f33908e241ff41a /Objects | |
parent | 1ac273224a85126c4356e355f7445206fadde7ec (diff) | |
download | cpython-8e8d202f552c993f40913b628139a39a5abe6a03.zip cpython-8e8d202f552c993f40913b628139a39a5abe6a03.tar.gz cpython-8e8d202f552c993f40913b628139a39a5abe6a03.tar.bz2 |
gh-117139: Add _PyTuple_FromStackRefSteal and use it (#121244)
Avoids the extra conversion from stack refs to PyObjects.
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/tupleobject.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 5ae1ee9..994258f 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -391,6 +391,27 @@ _PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) } PyObject * +_PyTuple_FromStackRefSteal(const _PyStackRef *src, Py_ssize_t n) +{ + if (n == 0) { + return tuple_get_empty(); + } + PyTupleObject *tuple = tuple_alloc(n); + if (tuple == NULL) { + for (Py_ssize_t i = 0; i < n; i++) { + PyStackRef_CLOSE(src[i]); + } + return NULL; + } + PyObject **dst = tuple->ob_item; + for (Py_ssize_t i = 0; i < n; i++) { + dst[i] = PyStackRef_AsPyObjectSteal(src[i]); + } + _PyObject_GC_TRACK(tuple); + return (PyObject *)tuple; +} + +PyObject * _PyTuple_FromArraySteal(PyObject *const *src, Py_ssize_t n) { if (n == 0) { |