summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2024-08-12 18:49:33 (GMT)
committerGitHub <noreply@github.com>2024-08-12 18:49:33 (GMT)
commit736fe4d23e267a70d3b769046f03c1f3bdc0f430 (patch)
tree3f6973549382b5dce397458d583157ba611b390e /Python
parentbe90648fb2de58b148dcc7553a08ca646911baf2 (diff)
downloadcpython-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.c10
-rw-r--r--Python/executor_cases.c.h5
-rw-r--r--Python/generated_cases.c.h15
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;