summaryrefslogtreecommitdiffstats
path: root/Python
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 /Python
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 'Python')
-rw-r--r--Python/bytecodes.c8
-rw-r--r--Python/ceval.c8
-rw-r--r--Python/executor_cases.c.h10
-rw-r--r--Python/generated_cases.c.h10
4 files changed, 4 insertions, 32 deletions
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 343481e..76587a4 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -1780,13 +1780,7 @@ dummy_func(
}
inst(BUILD_TUPLE, (values[oparg] -- tup)) {
- STACKREFS_TO_PYOBJECTS(values, oparg, values_o);
- if (CONVERSION_FAILED(values_o)) {
- DECREF_INPUTS();
- ERROR_IF(true, error);
- }
- PyObject *tup_o = _PyTuple_FromArraySteal(values_o, oparg);
- STACKREFS_TO_PYOBJECTS_CLEANUP(values_o);
+ PyObject *tup_o = _PyTuple_FromStackRefSteal(values, oparg);
ERROR_IF(tup_o == NULL, error);
tup = PyStackRef_FromPyObjectSteal(tup_o);
}
diff --git a/Python/ceval.c b/Python/ceval.c
index a712446..a240ed4 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -1500,13 +1500,7 @@ initialize_locals(PyThreadState *tstate, PyFunctionObject *func,
u = (PyObject *)&_Py_SINGLETON(tuple_empty);
}
else {
- assert(args != NULL);
- STACKREFS_TO_PYOBJECTS((_PyStackRef *)args, argcount, args_o);
- if (args_o == NULL) {
- goto fail_pre_positional;
- }
- u = _PyTuple_FromArraySteal((args_o + n), argcount - n);
- STACKREFS_TO_PYOBJECTS_CLEANUP(args_o);
+ u = _PyTuple_FromStackRefSteal(args + n, argcount - n);
}
if (u == NULL) {
goto fail_post_positional;
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index d70a57a..3b99946 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -1816,15 +1816,7 @@
_PyStackRef tup;
oparg = CURRENT_OPARG();
values = &stack_pointer[-oparg];
- STACKREFS_TO_PYOBJECTS(values, oparg, values_o);
- if (CONVERSION_FAILED(values_o)) {
- for (int _i = oparg; --_i >= 0;) {
- PyStackRef_CLOSE(values[_i]);
- }
- if (true) JUMP_TO_ERROR();
- }
- PyObject *tup_o = _PyTuple_FromArraySteal(values_o, oparg);
- STACKREFS_TO_PYOBJECTS_CLEANUP(values_o);
+ PyObject *tup_o = _PyTuple_FromStackRefSteal(values, oparg);
if (tup_o == NULL) JUMP_TO_ERROR();
tup = PyStackRef_FromPyObjectSteal(tup_o);
stack_pointer[-oparg] = tup;
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index 32b22af..6105722 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -769,15 +769,7 @@
_PyStackRef *values;
_PyStackRef tup;
values = &stack_pointer[-oparg];
- STACKREFS_TO_PYOBJECTS(values, oparg, values_o);
- if (CONVERSION_FAILED(values_o)) {
- for (int _i = oparg; --_i >= 0;) {
- PyStackRef_CLOSE(values[_i]);
- }
- if (true) { stack_pointer += -oparg; goto error; }
- }
- PyObject *tup_o = _PyTuple_FromArraySteal(values_o, oparg);
- STACKREFS_TO_PYOBJECTS_CLEANUP(values_o);
+ PyObject *tup_o = _PyTuple_FromStackRefSteal(values, oparg);
if (tup_o == NULL) { stack_pointer += -oparg; goto error; }
tup = PyStackRef_FromPyObjectSteal(tup_o);
stack_pointer[-oparg] = tup;