diff options
author | Dino Viehland <dinoviehland@meta.com> | 2025-03-21 15:58:32 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-21 15:58:32 -0700 |
commit | d9411ae3c2f6b59d97a0a16ad3dd148cc58ad943 (patch) | |
tree | 16782c6830410075ef762f658e47a57561c5f70b /Python/executor_cases.c.h | |
parent | 7101cba6bf12639e277f7681b90a70c11368cabb (diff) | |
download | cpython-d9411ae3c2f6b59d97a0a16ad3dd148cc58ad943.tar.gz cpython-d9411ae3c2f6b59d97a0a16ad3dd148cc58ad943.zip |
gh-130312: SET_ADD should not lock (#130136)
SET_ADD should not lock
Diffstat (limited to 'Python/executor_cases.c.h')
-rw-r--r-- | Python/executor_cases.c.h | 42 |
1 files changed, 20 insertions, 22 deletions
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 2bd009e3755..2942680a222 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -1481,17 +1481,16 @@ v = stack_pointer[-1]; set = stack_pointer[-2 - (oparg-1)]; _PyFrame_SetStackPointer(frame, stack_pointer); - int err = PySet_Add(PyStackRef_AsPyObjectBorrow(set), - PyStackRef_AsPyObjectBorrow(v)); - stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer += -1; - assert(WITHIN_STACK_BOUNDS()); - _PyFrame_SetStackPointer(frame, stack_pointer); - PyStackRef_CLOSE(v); + int err = _PySet_AddTakeRef((PySetObject *)PyStackRef_AsPyObjectBorrow(set), + PyStackRef_AsPyObjectSteal(v)); stack_pointer = _PyFrame_GetStackPointer(frame); if (err) { + stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); JUMP_TO_ERROR(); } + stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2687,32 +2686,31 @@ JUMP_TO_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) { _PyFrame_SetStackPointer(frame, stack_pointer); - err = PySet_Add(set_o, PyStackRef_AsPyObjectBorrow(values[i])); + err = _PySet_AddTakeRef((PySetObject *)set_o, PyStackRef_AsPyObjectSteal(value)); + stack_pointer = _PyFrame_GetStackPointer(frame); + } + else { + _PyFrame_SetStackPointer(frame, stack_pointer); + PyStackRef_CLOSE(value); stack_pointer = _PyFrame_GetStackPointer(frame); } } - _PyFrame_SetStackPointer(frame, stack_pointer); - _PyStackRef tmp; - for (int _i = oparg; --_i >= 0;) { - tmp = values[_i]; - values[_i] = PyStackRef_NULL; - PyStackRef_CLOSE(tmp); - } - stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer += -oparg; - assert(WITHIN_STACK_BOUNDS()); - if (err != 0) { + if (err) { _PyFrame_SetStackPointer(frame, stack_pointer); Py_DECREF(set_o); stack_pointer = _PyFrame_GetStackPointer(frame); + stack_pointer += -oparg; + assert(WITHIN_STACK_BOUNDS()); JUMP_TO_ERROR(); } set = PyStackRef_FromPyObjectStealMortal(set_o); - stack_pointer[0] = set; - stack_pointer += 1; + stack_pointer[-oparg] = set; + stack_pointer += 1 - oparg; assert(WITHIN_STACK_BOUNDS()); break; } |