8000 gh-118473: Fix set_asyncgen_hooks not to be partially set when argume… · python/cpython@8d8275b · GitHub
[go: up one dir, main page]

Skip to content

Commit 8d8275b

Browse files
authored
gh-118473: Fix set_asyncgen_hooks not to be partially set when arguments are invalid (#118474)
1 parent e272195 commit 8d8275b

File tree

3 files changed

+36
-9
lines changed

3 files changed

+36
-9
lines changed

Lib/test/test_sys.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1788,14 +1788,28 @@ def test_asyncgen_hooks(self):
17881788
self.assertIsNone(old.finalizer)
17891789

17901790
firstiter = lambda *a: None
1791+
finalizer = lambda *a: None
1792+
1793+
with self.assertRaises(TypeError):
1794+
sys.set_asyncgen_hooks(firstiter=firstiter, finalizer="invalid")
1795+
cur = sys.get_asyncgen_hooks()
1796+
self.assertIsNone(cur.firstiter)
1797+
self.assertIsNone(cur.finalizer)
1798+
1799+
# gh-118473
1800+
with self.assertRaises(TypeError):
1801+
sys.set_asyncgen_hooks(firstiter="invalid", finalizer=finalizer)
1802+
cur = sys.get_asyncgen_hooks()
1803+
self.assertIsNone(cur.firstiter)
1804+
self.assertIsNone(cur.finalizer)
1805+
17911806
sys.set_asyncgen_hooks(firstiter=firstiter)
17921807
hooks = sys.get_asyncgen_hooks()
17931808
self.assertIs(hooks.firstiter, firstiter)
17941809
self.assertIs(hooks[0], firstiter)
17951810
self.assertIs(hooks.finalizer, None)
17961811
self.assertIs(hooks[1], None)
17971812

1798-
finalizer = lambda *a: None
17991813
sys.set_asyncgen_hooks(finalizer=finalizer)
18001814
hooks = sys.get_asyncgen_hooks()
18011815
self.assertIs(hooks.firstiter, firstiter)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix :func:`sys.set_asyncgen_hooks` not to be partially set when raising :exc:`TypeError`.

Python/sysmodule.c

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1399,12 +1399,6 @@ sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw)
13991399
Py_TYPE(finalizer)->tp_name);
14001400
return NULL;
14011401
}
1402-
if (_PyEval_SetAsyncGenFinalizer(finalizer) < 0) {
1403-
return NULL;
1404-
}
1405-
}
1406-
else if (finalizer == Py_None && _PyEval_SetAsyncGenFinalizer(NULL) < 0) {
1407-
return NULL;
14081402
}
14091403

14101404
if (firstiter && firstiter != Py_None) {
@@ -1414,15 +1408,33 @@ sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw)
14141408
Py_TYPE(firstiter)->tp_name);
14151409
return NULL;
14161410
}
1417-
if (_PyEval_SetAsyncGenFirstiter(firstiter) < 0) {
1411+
}
1412+
1413+
PyObject *cur_finalizer = _PyEval_GetAsyncGenFinalizer();
1414+
1415+
if (finalizer && finalizer != Py_None) {
1416+
if (_PyEval_SetAsyncGenFinalizer(finalizer) < 0) {
14181417
return NULL;
14191418
}
14201419
}
1421-
else if (firstiter == Py_None && _PyEval_SetAsyncGenFirstiter(NULL) < 0) {
1420+
else if (finalizer == Py_None && _PyEval_SetAsyncGenFinalizer(NULL) < 0) {
14221421
return NULL;
14231422
}
14241423

1424+
if (firstiter && firstiter != Py_None) {
1425+
if (_PyEval_SetAsyncGenFirstiter(firstiter) < 0) {
1426+
goto error;
1427+
}
1428+
}
1429+
else if (firstiter == Py_None && _PyEval_SetAsyncGenFirstiter(NULL) < 0) {
1430+
goto error;
1431+
}
1432+
14251433
Py_RETURN_NONE;
1434+
1435+
error:
1436+
_PyEval_SetAsyncGenFinalizer(cur_finalizer);
1437+
return NULL;
14261438
}
14271439

14281440
PyDoc_STRVAR(set_asyncgen_hooks_doc,

0 commit comments

Comments
 (0)
0