Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Next Next commit
gh-91051: fix segfault when using all 8 type watchers
  • Loading branch information
carljm committed Aug 11, 2023
commit e149aed693535d6d3e914ed0e37afc5c96d3d5b5
4 changes: 2 additions & 2 deletions Doc/c-api/typeobj.rst
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ Quick Reference
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
| :c:member:`~PyTypeObject.tp_vectorcall` | :c:type:`vectorcallfunc` | | | | | |
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
| [:c:member:`~PyTypeObject.tp_watched`] | char | | | | | |
| [:c:member:`~PyTypeObject.tp_watched`] | unsigned char | | | | | |
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+

.. [#slots]
Expand Down Expand Up @@ -2141,7 +2141,7 @@ and :c:data:`PyType_Type` effectively act as defaults.)
.. versionadded:: 3.9 (the field exists since 3.8 but it's only used since 3.9)


.. c:member:: char PyTypeObject.tp_watched
.. c:member:: unsigned char PyTypeObject.tp_watched

Internal. Do not use.

Expand Down
2 changes: 1 addition & 1 deletion Doc/includes/typestruct.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,5 +82,5 @@ typedef struct _typeobject {
vectorcallfunc tp_vectorcall;

/* bitset of which type-watchers care about this type */
char tp_watched;
unsigned char tp_watched;
} PyTypeObject;
2 changes: 1 addition & 1 deletion Include/cpython/object.h
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ struct _typeobject {
vectorcallfunc tp_vectorcall;

/* bitset of which type-watchers care about this type */
char tp_watched;
unsigned char tp_watched;
};

/* This struct is used by the specializer
Expand Down
10 changes: 10 additions & 0 deletions Lib/test/test_capi/test_watchers.py
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,16 @@ class C2: pass
C2.hmm = "baz"
self.assert_events([C1, [C2]])

def test_all_watchers(self):
class C: pass
with ExitStack() as stack:
last_wid = -1
while last_wid < self.TYPE_MAX_WATCHERS - 1:
last_wid = stack.enter_context(self.watcher())
Comment thread
carljm marked this conversation as resolved.
self.watch(last_wid, C)
C.foo = "bar"
self.assert_events([C])

def test_watch_non_type(self):
with self.watcher() as wid:
with self.assertRaisesRegex(ValueError, r"Cannot watch non-type"):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fix abort / segfault when using all eight type watcher slots, on platforms
where ``char`` is signed by default.