mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
GH-128682: Change a couple of functions to only steal references on success. (GH-129132)
Change PyTuple_FromStackRefSteal and PyList_FromStackRefSteal to only steal on success to avoid escaping
This commit is contained in:
parent
a65f802692
commit
470a0a68eb
11 changed files with 34 additions and 32 deletions
|
@ -1852,16 +1852,20 @@ dummy_func(
|
|||
}
|
||||
|
||||
inst(BUILD_TUPLE, (values[oparg] -- tup)) {
|
||||
PyObject *tup_o = _PyTuple_FromStackRefSteal(values, oparg);
|
||||
PyObject *tup_o = _PyTuple_FromStackRefStealOnSuccess(values, oparg);
|
||||
if (tup_o == NULL) {
|
||||
ERROR_NO_POP();
|
||||
}
|
||||
INPUTS_DEAD();
|
||||
ERROR_IF(tup_o == NULL, error);
|
||||
tup = PyStackRef_FromPyObjectSteal(tup_o);
|
||||
}
|
||||
|
||||
inst(BUILD_LIST, (values[oparg] -- list)) {
|
||||
PyObject *list_o = _PyList_FromStackRefSteal(values, oparg);
|
||||
PyObject *list_o = _PyList_FromStackRefStealOnSuccess(values, oparg);
|
||||
if (list_o == NULL) {
|
||||
ERROR_NO_POP();
|
||||
}
|
||||
INPUTS_DEAD();
|
||||
ERROR_IF(list_o == NULL, error);
|
||||
list = PyStackRef_FromPyObjectSteal(list_o);
|
||||
}
|
||||
|
||||
|
|
|
@ -1527,7 +1527,12 @@ initialize_locals(PyThreadState *tstate, PyFunctionObject *func,
|
|||
u = (PyObject *)&_Py_SINGLETON(tuple_empty);
|
||||
}
|
||||
else {
|
||||
u = _PyTuple_FromStackRefSteal(args + n, argcount - n);
|
||||
u = _PyTuple_FromStackRefStealOnSuccess(args + n, argcount - n);
|
||||
if (u == NULL) {
|
||||
for (Py_ssize_t i = n; i < argcount; i++) {
|
||||
PyStackRef_CLOSE(args[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (u == NULL) {
|
||||
goto fail_post_positional;
|
||||
|
|
12
Python/executor_cases.c.h
generated
12
Python/executor_cases.c.h
generated
|
@ -2240,8 +2240,10 @@
|
|||
_PyStackRef tup;
|
||||
oparg = CURRENT_OPARG();
|
||||
values = &stack_pointer[-oparg];
|
||||
PyObject *tup_o = _PyTuple_FromStackRefSteal(values, oparg);
|
||||
if (tup_o == NULL) JUMP_TO_ERROR();
|
||||
PyObject *tup_o = _PyTuple_FromStackRefStealOnSuccess(values, oparg);
|
||||
if (tup_o == NULL) {
|
||||
JUMP_TO_ERROR();
|
||||
}
|
||||
tup = PyStackRef_FromPyObjectSteal(tup_o);
|
||||
stack_pointer[-oparg] = tup;
|
||||
stack_pointer += 1 - oparg;
|
||||
|
@ -2254,8 +2256,10 @@
|
|||
_PyStackRef list;
|
||||
oparg = CURRENT_OPARG();
|
||||
values = &stack_pointer[-oparg];
|
||||
PyObject *list_o = _PyList_FromStackRefSteal(values, oparg);
|
||||
if (list_o == NULL) JUMP_TO_ERROR();
|
||||
PyObject *list_o = _PyList_FromStackRefStealOnSuccess(values, oparg);
|
||||
if (list_o == NULL) {
|
||||
JUMP_TO_ERROR();
|
||||
}
|
||||
list = PyStackRef_FromPyObjectSteal(list_o);
|
||||
stack_pointer[-oparg] = list;
|
||||
stack_pointer += 1 - oparg;
|
||||
|
|
8
Python/generated_cases.c.h
generated
8
Python/generated_cases.c.h
generated
|
@ -732,10 +732,8 @@
|
|||
_PyStackRef *values;
|
||||
_PyStackRef list;
|
||||
values = &stack_pointer[-oparg];
|
||||
PyObject *list_o = _PyList_FromStackRefSteal(values, oparg);
|
||||
PyObject *list_o = _PyList_FromStackRefStealOnSuccess(values, oparg);
|
||||
if (list_o == NULL) {
|
||||
stack_pointer += -oparg;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
goto error;
|
||||
}
|
||||
list = PyStackRef_FromPyObjectSteal(list_o);
|
||||
|
@ -905,10 +903,8 @@
|
|||
_PyStackRef *values;
|
||||
_PyStackRef tup;
|
||||
values = &stack_pointer[-oparg];
|
||||
PyObject *tup_o = _PyTuple_FromStackRefSteal(values, oparg);
|
||||
PyObject *tup_o = _PyTuple_FromStackRefStealOnSuccess(values, oparg);
|
||||
if (tup_o == NULL) {
|
||||
stack_pointer += -oparg;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
goto error;
|
||||
}
|
||||
tup = PyStackRef_FromPyObjectSteal(tup_o);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue