bpo-43977: Use tp_flags for collection matching (GH-25723)

* Add Py_TPFLAGS_SEQUENCE and Py_TPFLAGS_MAPPING, add to all relevant standard builtin classes.

* Set relevant flags on collections.abc.Sequence and Mapping.

* Use flags in MATCH_SEQUENCE and MATCH_MAPPING opcodes.

* Inherit Py_TPFLAGS_SEQUENCE and Py_TPFLAGS_MAPPING.

* Add NEWS

* Remove interpreter-state map_abc and seq_abc fields.
This commit is contained in:
Mark Shannon 2021-04-30 09:50:28 +01:00 committed by GitHub
parent 2abbd8f2ad
commit 069e81ab3d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 74 additions and 83 deletions

View file

@ -793,7 +793,6 @@ MutableSet.register(set)
### MAPPINGS ###
class Mapping(Collection):
"""A Mapping is a generic container for associating key/value
pairs.
@ -804,6 +803,9 @@ class Mapping(Collection):
__slots__ = ()
# Tell ABCMeta.__new__ that this class should have TPFLAGS_MAPPING set.
__abc_tpflags__ = 1 << 6 # Py_TPFLAGS_MAPPING
@abstractmethod
def __getitem__(self, key):
raise KeyError
@ -842,7 +844,6 @@ class Mapping(Collection):
__reversed__ = None
Mapping.register(mappingproxy)
@ -1011,7 +1012,6 @@ MutableMapping.register(dict)
### SEQUENCES ###
class Sequence(Reversible, Collection):
"""All the operations on a read-only sequence.
@ -1021,6 +1021,9 @@ class Sequence(Reversible, Collection):
__slots__ = ()
# Tell ABCMeta.__new__ that this class should have TPFLAGS_SEQUENCE set.
__abc_tpflags__ = 1 << 5 # Py_TPFLAGS_SEQUENCE
@abstractmethod
def __getitem__(self, index):
raise IndexError
@ -1072,7 +1075,6 @@ class Sequence(Reversible, Collection):
'S.count(value) -> integer -- return number of occurrences of value'
return sum(1 for v in self if v is value or v == value)
Sequence.register(tuple)
Sequence.register(str)
Sequence.register(range)