Skip to content

Commit a3a93f5

Browse files
authored
Merge branch 'main' into support-IPv6-in-cookiejar
2 parents 7f65ca9 + f491125 commit a3a93f5

File tree

6 files changed

+92
-15
lines changed

6 files changed

+92
-15
lines changed

Doc/library/dialog.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ is the base class for dialogs defined in other supporting modules.
220220

221221
.. class:: Dialog(master=None, **options)
222222

223-
.. method:: show(color=None, **options)
223+
.. method:: show(**options)
224224

225225
Render the Dialog window.
226226

Include/internal/pycore_critical_section.h

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ extern "C" {
6464

6565
# define _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(op) \
6666
if (Py_REFCNT(op) != 1) { \
67-
_Py_CRITICAL_SECTION_ASSERT_MUTEX_LOCKED(&_PyObject_CAST(op)->ob_mutex); \
67+
_PyCriticalSection_AssertHeldObj(_PyObject_CAST(op)); \
6868
}
6969

7070
#else /* Py_DEBUG */
@@ -239,6 +239,28 @@ _PyCriticalSection_AssertHeld(PyMutex *mutex)
239239
#endif
240240
}
241241

242+
static inline void
243+
_PyCriticalSection_AssertHeldObj(PyObject *op)
244+
{
245+
#ifdef Py_DEBUG
246+
PyMutex *mutex = &_PyObject_CAST(op)->ob_mutex;
247+
PyThreadState *tstate = _PyThreadState_GET();
248+
uintptr_t prev = tstate->critical_section;
249+
if (prev & _Py_CRITICAL_SECTION_TWO_MUTEXES) {
250+
PyCriticalSection2 *cs = (PyCriticalSection2 *)(prev & ~_Py_CRITICAL_SECTION_MASK);
251+
_PyObject_ASSERT_WITH_MSG(op,
252+
(cs != NULL && (cs->_cs_base._cs_mutex == mutex || cs->_cs_mutex2 == mutex)),
253+
"Critical section of object is not held");
254+
}
255+
else {
256+
PyCriticalSection *cs = (PyCriticalSection *)(prev & ~_Py_CRITICAL_SECTION_MASK);
257+
_PyObject_ASSERT_WITH_MSG(op,
258+
(cs != NULL && cs->_cs_mutex == mutex),
259+
"Critical section of object is not held");
260+
}
261+
262+
#endif
263+
}
242264
#endif /* Py_GIL_DISABLED */
243265

244266
#ifdef __cplusplus

Lib/test/test_capi/test_misc.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,11 +413,13 @@ def test_trashcan_subclass(self):
413413

414414
@support.requires_resource('cpu')
415415
@support.skip_emscripten_stack_overflow()
416+
@support.skip_wasi_stack_overflow()
416417
def test_trashcan_python_class1(self):
417418
self.do_test_trashcan_python_class(list)
418419

419420
@support.requires_resource('cpu')
420421
@support.skip_emscripten_stack_overflow()
422+
@support.skip_wasi_stack_overflow()
421423
def test_trashcan_python_class2(self):
422424
from _testcapi import MyList
423425
self.do_test_trashcan_python_class(MyList)

Lib/test/test_interpreters/test_queues.py

Lines changed: 57 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -208,18 +208,64 @@ def test_empty(self):
208208
self.assertIs(after, True)
209209

210210
def test_full(self):
211-
expected = [False, False, False, True, False, False, False]
212-
actual = []
213-
queue = queues.create(3)
214-
for _ in range(3):
215-
actual.append(queue.full())
216-
queue.put(None)
217-
actual.append(queue.full())
218-
for _ in range(3):
219-
queue.get()
220-
actual.append(queue.full())
211+
for maxsize in [1, 3, 11]:
212+
with self.subTest(f'maxsize={maxsize}'):
213+
num_to_add = maxsize
214+
expected = [False] * (num_to_add * 2 + 3)
215+
expected[maxsize] = True
216+
expected[maxsize + 1] = True
217+
218+
queue = queues.create(maxsize)
219+
actual = []
220+
empty = [queue.empty()]
221+
222+
for _ in range(num_to_add):
223+
actual.append(queue.full())
224+
queue.put_nowait(None)
225+
actual.append(queue.full())
226+
with self.assertRaises(queues.QueueFull):
227+
queue.put_nowait(None)
228+
empty.append(queue.empty())
229+
230+
for _ in range(num_to_add):
231+
actual.append(queue.full())
232+
queue.get_nowait()
233+
actual.append(queue.full())
234+
with self.assertRaises(queues.QueueEmpty):
235+
queue.get_nowait()
236+
actual.append(queue.full())
237+
empty.append(queue.empty())
221238

222-
self.assertEqual(actual, expected)
239+
self.assertEqual(actual, expected)
240+
self.assertEqual(empty, [True, False, True])
241+
242+
# no max size
243+
for args in [(), (0,), (-1,), (-10,)]:
244+
with self.subTest(f'maxsize={args[0]}' if args else '<default>'):
245+
num_to_add = 13
246+
expected = [False] * (num_to_add * 2 + 3)
247+
248+
queue = queues.create(*args)
249+
actual = []
250+
empty = [queue.empty()]
251+
252+
for _ in range(num_to_add):
253+
actual.append(queue.full())
254+
queue.put_nowait(None)
255+
actual.append(queue.full())
256+
empty.append(queue.empty())
257+
258+
for _ in range(num_to_add):
259+
actual.append(queue.full())
260+
queue.get_nowait()
261+
actual.append(queue.full())
262+
with self.assertRaises(queues.QueueEmpty):
263+
queue.get_nowait()
264+
actual.append(queue.full())
265+
empty.append(queue.empty())
266+
267+
self.assertEqual(actual, expected)
268+
self.assertEqual(empty, [True, False, True])
223269

224270
def test_qsize(self):
225271
expected = [0, 1, 2, 3, 2, 3, 2, 1, 0, 1, 0]

Lib/test/test_os.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1918,6 +1918,10 @@ def test_makedir(self):
19181918
support.is_wasi,
19191919
"WASI's umask is a stub."
19201920
)
1921+
@unittest.skipIf(
1922+
support.is_emscripten,
1923+
"TODO: Fails in buildbot; see #135783"
1924+
)
19211925
def test_mode(self):
19221926
with os_helper.temp_umask(0o002):
19231927
base = os_helper.TESTFN

Modules/_interpqueuesmodule.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -707,8 +707,11 @@ _queue_is_full(_queue *queue, int *p_is_full)
707707
return err;
708708
}
709709

710-
assert(queue->items.count <= queue->items.maxsize);
711-
*p_is_full = queue->items.count == queue->items.maxsize;
710+
assert(queue->items.maxsize <= 0
711+
|| queue->items.count <= queue->items.maxsize);
712+
*p_is_full = queue->items.maxsize > 0
713+
? queue->items.count == queue->items.maxsize
714+
: 0;
712715

713716
_queue_unlock(queue);
714717
return 0;

0 commit comments

Comments
 (0)