gh-131666: mark anext_awaitable.close as a METH_NOARGS instead of METH_VARARGS (#131671)

This commit is contained in:
Bénédikt Tran 2025-03-25 04:33:22 +01:00 committed by GitHub
parent c3b8d73208
commit 1393bd3548
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 20 additions and 6 deletions

View file

@ -1191,6 +1191,17 @@ class CoroutineTest(unittest.TestCase):
_, result = run_async(g())
self.assertIsNone(result.__context__)
def test_await_17(self):
# See https://github.com/python/cpython/issues/131666 for details.
class A:
async def __anext__(self):
raise StopAsyncIteration
def __aiter__(self):
return self
anext_awaitable = anext(A(), "a").__await__()
self.assertRaises(TypeError, anext_awaitable.close, 1)
def test_with_1(self):
class Manager:
def __init__(self, name):

View file

@ -0,0 +1 @@
Fix signature of ``anext_awaitable.close`` objects. Patch by Bénédikt Tran.

View file

@ -414,9 +414,11 @@ anextawaitable_proxy(anextawaitableobject *obj, char *meth, PyObject *arg)
if (awaitable == NULL) {
return NULL;
}
// 'arg' may be a tuple (if coming from a METH_VARARGS method)
// or a single object (if coming from a METH_O method).
PyObject *ret = PyObject_CallMethod(awaitable, meth, "O", arg);
// When specified, 'arg' may be a tuple (if coming from a METH_VARARGS
// method) or a single object (if coming from a METH_O method).
PyObject *ret = arg == NULL
? PyObject_CallMethod(awaitable, meth, NULL)
: PyObject_CallMethod(awaitable, meth, "O", arg);
Py_DECREF(awaitable);
if (ret != NULL) {
return ret;
@ -451,10 +453,10 @@ anextawaitable_throw(PyObject *op, PyObject *args)
static PyObject *
anextawaitable_close(PyObject *op, PyObject *args)
anextawaitable_close(PyObject *op, PyObject *Py_UNUSED(dummy))
{
anextawaitableobject *obj = anextawaitableobject_CAST(op);
return anextawaitable_proxy(obj, "close", args);
return anextawaitable_proxy(obj, "close", NULL);
}
@ -480,7 +482,7 @@ PyDoc_STRVAR(close_doc,
static PyMethodDef anextawaitable_methods[] = {
{"send", anextawaitable_send, METH_O, send_doc},
{"throw", anextawaitable_throw, METH_VARARGS, throw_doc},
{"close", anextawaitable_close, METH_VARARGS, close_doc},
{"close", anextawaitable_close, METH_NOARGS, close_doc},
{NULL, NULL} /* Sentinel */
};