diff options
author | Dino Viehland <dinoviehland@meta.com> | 2025-03-21 22:58:32 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-21 22:58:32 (GMT) |
commit | d9411ae3c2f6b59d97a0a16ad3dd148cc58ad943 (patch) | |
tree | 16782c6830410075ef762f658e47a57561c5f70b /Python/bytecodes.c | |
parent | 7101cba6bf12639e277f7681b90a70c11368cabb (diff) | |
download | cpython-d9411ae3c2f6b59d97a0a16ad3dd148cc58ad943.zip cpython-d9411ae3c2f6b59d97a0a16ad3dd148cc58ad943.tar.gz cpython-d9411ae3c2f6b59d97a0a16ad3dd148cc58ad943.tar.bz2 |
gh-130312: SET_ADD should not lock (#130136)
SET_ADD should not lock
Diffstat (limited to 'Python/bytecodes.c')
-rw-r--r-- | Python/bytecodes.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/Python/bytecodes.c b/Python/bytecodes.c index fe1465b..0db4da0 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -975,9 +975,8 @@ dummy_func( } inst(SET_ADD, (set, unused[oparg-1], v -- set, unused[oparg-1])) { - int err = PySet_Add(PyStackRef_AsPyObjectBorrow(set), - PyStackRef_AsPyObjectBorrow(v)); - PyStackRef_CLOSE(v); + int err = _PySet_AddTakeRef((PySetObject *)PyStackRef_AsPyObjectBorrow(set), + PyStackRef_AsPyObjectSteal(v)); ERROR_IF(err, error); } @@ -1916,17 +1915,24 @@ dummy_func( DECREF_INPUTS(); ERROR_IF(true, error); } + int err = 0; - for (int i = 0; i < oparg; i++) { + for (Py_ssize_t i = 0; i < oparg; i++) { + _PyStackRef value = values[i]; + values[i] = PyStackRef_NULL; if (err == 0) { - err = PySet_Add(set_o, PyStackRef_AsPyObjectBorrow(values[i])); + err = _PySet_AddTakeRef((PySetObject *)set_o, PyStackRef_AsPyObjectSteal(value)); + } + else { + PyStackRef_CLOSE(value); } } - DECREF_INPUTS(); - if (err != 0) { + if (err) { Py_DECREF(set_o); ERROR_IF(true, error); } + + INPUTS_DEAD(); set = PyStackRef_FromPyObjectStealMortal(set_o); } |