diff options
author | Sam Gross <colesbury@gmail.com> | 2024-08-12 18:49:33 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-12 18:49:33 (GMT) |
commit | 736fe4d23e267a70d3b769046f03c1f3bdc0f430 (patch) | |
tree | 3f6973549382b5dce397458d583157ba611b390e /Python | |
parent | be90648fb2de58b148dcc7553a08ca646911baf2 (diff) | |
download | cpython-736fe4d23e267a70d3b769046f03c1f3bdc0f430.zip cpython-736fe4d23e267a70d3b769046f03c1f3bdc0f430.tar.gz cpython-736fe4d23e267a70d3b769046f03c1f3bdc0f430.tar.bz2 |
gh-117139: Fix a few `_PyStackRef` related bugs (#122831)
`BUILD_SET` should use a borrow instead of a steal. The cleanup in `_DO_CALL`
`CONVERSION_FAILED` was incorrect.
Co-authored-by: Ken Jin <kenjin@python.org>
Diffstat (limited to 'Python')
-rw-r--r-- | Python/bytecodes.c | 10 | ||||
-rw-r--r-- | Python/executor_cases.c.h | 5 | ||||
-rw-r--r-- | Python/generated_cases.c.h | 15 |
3 files changed, 14 insertions, 16 deletions
diff --git a/Python/bytecodes.c b/Python/bytecodes.c index b68f932..70c7d82 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -1714,11 +1714,10 @@ dummy_func( } int err = 0; for (int i = 0; i < oparg; i++) { - PyObject *item = PyStackRef_AsPyObjectSteal(values[i]); if (err == 0) { - err = PySet_Add(set_o, item); + err = PySet_Add(set_o, PyStackRef_AsPyObjectBorrow(values[i])); } - Py_DECREF(item); + PyStackRef_CLOSE(values[i]); } if (err != 0) { Py_DECREF(set_o); @@ -3235,7 +3234,10 @@ dummy_func( /* Callable is not a normal Python function */ STACKREFS_TO_PYOBJECTS(args, total_args, args_o); if (CONVERSION_FAILED(args_o)) { - DECREF_INPUTS(); + PyStackRef_CLOSE(callable); + for (int i = 0; i < total_args; i++) { + PyStackRef_CLOSE(args[i]); + } ERROR_IF(true, error); } PyObject *res_o = PyObject_Vectorcall( diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index f274128..d64ef0c 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -1957,11 +1957,10 @@ } int err = 0; for (int i = 0; i < oparg; i++) { - PyObject *item = PyStackRef_AsPyObjectSteal(values[i]); if (err == 0) { - err = PySet_Add(set_o, item); + err = PySet_Add(set_o, PyStackRef_AsPyObjectBorrow(values[i])); } - Py_DECREF(item); + PyStackRef_CLOSE(values[i]); } if (err != 0) { Py_DECREF(set_o); diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index d0aa0f9..a290e1e 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -714,11 +714,10 @@ } int err = 0; for (int i = 0; i < oparg; i++) { - PyObject *item = PyStackRef_AsPyObjectSteal(values[i]); if (err == 0) { - err = PySet_Add(set_o, item); + err = PySet_Add(set_o, PyStackRef_AsPyObjectBorrow(values[i])); } - Py_DECREF(item); + PyStackRef_CLOSE(values[i]); } if (err != 0) { Py_DECREF(set_o); @@ -917,9 +916,8 @@ STACKREFS_TO_PYOBJECTS(args, total_args, args_o); if (CONVERSION_FAILED(args_o)) { PyStackRef_CLOSE(callable); - PyStackRef_CLOSE(self_or_null); - for (int _i = oparg; --_i >= 0;) { - PyStackRef_CLOSE(args[_i]); + for (int i = 0; i < total_args; i++) { + PyStackRef_CLOSE(args[i]); } if (true) { stack_pointer += -2 - oparg; @@ -3705,9 +3703,8 @@ STACKREFS_TO_PYOBJECTS(args, total_args, args_o); if (CONVERSION_FAILED(args_o)) { PyStackRef_CLOSE(callable); - PyStackRef_CLOSE(self_or_null); - for (int _i = oparg; --_i >= 0;) { - PyStackRef_CLOSE(args[_i]); + for (int i = 0; i < total_args; i++) { + PyStackRef_CLOSE(args[i]); } if (true) { stack_pointer += -2 - oparg; |