summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2024-07-02 16:30:14 (GMT)
committerGitHub <noreply@github.com>2024-07-02 16:30:14 (GMT)
commit8e8d202f552c993f40913b628139a39a5abe6a03 (patch)
treea907d73519febe133d4b86f57f33908e241ff41a /Objects
parent1ac273224a85126c4356e355f7445206fadde7ec (diff)
downloadcpython-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.c21
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) {