Skip to content

GH-132775: Fix argument parsing for _interpqueues.put() #137686

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Lib/concurrent/interpreters/_queues.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ def create(maxsize=0, *, unbounditems=UNBOUND):
"""
unbound = _serialize_unbound(unbounditems)
unboundop, = unbound
qid = _queues.create(maxsize, unboundop, -1)
qid = _queues.create(maxsize, unboundop)
self = Queue(qid)
self._set_unbound(unboundop, unbounditems)
return self
Expand Down
33 changes: 27 additions & 6 deletions Lib/test/test_interpreters/test_queues.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ def test_highlevel_reloaded(self):
importlib.reload(queues)

def test_create_destroy(self):
qid = _queues.create(2, REPLACE, -1)
qid = _queues.create(2, REPLACE)
_queues.destroy(qid)
self.assertEqual(get_num_queues(), 0)
with self.assertRaises(queues.QueueNotFoundError):
Expand All @@ -56,7 +56,7 @@ def test_not_destroyed(self):
'-c',
dedent(f"""
import {_queues.__name__} as _queues
_queues.create(2, {REPLACE}, -1)
_queues.create(2, {REPLACE})
"""),
)
self.assertEqual(stdout, '')
Expand All @@ -67,32 +67,53 @@ def test_not_destroyed(self):

def test_bind_release(self):
with self.subTest('typical'):
qid = _queues.create(2, REPLACE, -1)
qid = _queues.create(2, REPLACE)
_queues.bind(qid)
_queues.release(qid)
self.assertEqual(get_num_queues(), 0)

with self.subTest('bind too much'):
qid = _queues.create(2, REPLACE, -1)
qid = _queues.create(2, REPLACE)
_queues.bind(qid)
_queues.bind(qid)
_queues.release(qid)
_queues.destroy(qid)
self.assertEqual(get_num_queues(), 0)

with self.subTest('nested'):
qid = _queues.create(2, REPLACE, -1)
qid = _queues.create(2, REPLACE)
_queues.bind(qid)
_queues.bind(qid)
_queues.release(qid)
_queues.release(qid)
self.assertEqual(get_num_queues(), 0)

with self.subTest('release without binding'):
qid = _queues.create(2, REPLACE, -1)
qid = _queues.create(2, REPLACE)
with self.assertRaises(queues.QueueError):
_queues.release(qid)

def test_parse_fallback(self):
# see https://github.com/python/cpython/pull/137686
# does not raise TypeError / OverflowError / ValueError
for arg in False, True, None, -1, 2**1000:
_queues.create(2, REPLACE, fallback=arg)
msg = r'create\(\) takes at most 2 positional arguments'
with self.assertRaisesRegex(TypeError, msg):
_queues.create(2, REPLACE, -1)

obj = None
unboundop = -1
for arg in False, True, None, -1, 2**1000:
qid = _queues.create(2, REPLACE)
_queues.put(qid, obj, unboundop, fallback=arg)
_queues.destroy(qid)
msg = r'put\(\) takes at most 3 positional arguments'
with self.assertRaisesRegex(TypeError, msg):
qid = _queues.create(2, REPLACE)
_queues.put(qid, obj, unboundop, -1)
_queues.destroy(qid)


class QueueTests(TestBase):

Expand Down
4 changes: 2 additions & 2 deletions Modules/_interpqueuesmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -1486,7 +1486,7 @@ queuesmod_create(PyObject *self, PyObject *args, PyObject *kwds)
Py_ssize_t maxsize;
int unboundarg = -1;
int fallbackarg = -1;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "n|ii:create", kwlist,
if (!PyArg_ParseTupleAndKeywords(args, kwds, "n|i$p:create", kwlist,
&maxsize, &unboundarg, &fallbackarg))
{
return NULL;
Expand Down Expand Up @@ -1603,7 +1603,7 @@ queuesmod_put(PyObject *self, PyObject *args, PyObject *kwds)
PyObject *obj;
int unboundarg = -1;
int fallbackarg = -1;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&O|ii$p:put", kwlist,
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&O|i$p:put", kwlist,
qidarg_converter, &qidarg, &obj,
&unboundarg, &fallbackarg))
{
Expand Down
Loading