xref: /third_party/python/Modules/_abc.c (revision 7db96d56)
1/* ABCMeta implementation */
2#ifndef Py_BUILD_CORE_BUILTIN
3#  define Py_BUILD_CORE_MODULE 1
4#endif
5
6#include "Python.h"
7#include "pycore_moduleobject.h"  // _PyModule_GetState()
8#include "pycore_object.h"        // _PyType_GetSubclasses()
9#include "pycore_runtime.h"       // _Py_ID()
10#include "clinic/_abc.c.h"
11
12/*[clinic input]
13module _abc
14[clinic start generated code]*/
15/*[clinic end generated code: output=da39a3ee5e6b4b0d input=964f5328e1aefcda]*/
16
17PyDoc_STRVAR(_abc__doc__,
18"Module contains faster C implementation of abc.ABCMeta");
19
20typedef struct {
21    PyTypeObject *_abc_data_type;
22    unsigned long long abc_invalidation_counter;
23} _abcmodule_state;
24
25static inline _abcmodule_state*
26get_abc_state(PyObject *module)
27{
28    void *state = _PyModule_GetState(module);
29    assert(state != NULL);
30    return (_abcmodule_state *)state;
31}
32
33/* This object stores internal state for ABCs.
34   Note that we can use normal sets for caches,
35   since they are never iterated over. */
36typedef struct {
37    PyObject_HEAD
38    PyObject *_abc_registry;
39    PyObject *_abc_cache; /* Normal set of weak references. */
40    PyObject *_abc_negative_cache; /* Normal set of weak references. */
41    unsigned long long _abc_negative_cache_version;
42} _abc_data;
43
44static int
45abc_data_traverse(_abc_data *self, visitproc visit, void *arg)
46{
47    Py_VISIT(Py_TYPE(self));
48    Py_VISIT(self->_abc_registry);
49    Py_VISIT(self->_abc_cache);
50    Py_VISIT(self->_abc_negative_cache);
51    return 0;
52}
53
54static int
55abc_data_clear(_abc_data *self)
56{
57    Py_CLEAR(self->_abc_registry);
58    Py_CLEAR(self->_abc_cache);
59    Py_CLEAR(self->_abc_negative_cache);
60    return 0;
61}
62
63static void
64abc_data_dealloc(_abc_data *self)
65{
66    PyObject_GC_UnTrack(self);
67    PyTypeObject *tp = Py_TYPE(self);
68    (void)abc_data_clear(self);
69    tp->tp_free(self);
70    Py_DECREF(tp);
71}
72
73static PyObject *
74abc_data_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
75{
76    _abc_data *self = (_abc_data *) type->tp_alloc(type, 0);
77    _abcmodule_state *state = NULL;
78    if (self == NULL) {
79        return NULL;
80    }
81
82    state = PyType_GetModuleState(type);
83    if (state == NULL) {
84        Py_DECREF(self);
85        return NULL;
86    }
87
88    self->_abc_registry = NULL;
89    self->_abc_cache = NULL;
90    self->_abc_negative_cache = NULL;
91    self->_abc_negative_cache_version = state->abc_invalidation_counter;
92    return (PyObject *) self;
93}
94
95PyDoc_STRVAR(abc_data_doc,
96"Internal state held by ABC machinery.");
97
98static PyType_Slot _abc_data_type_spec_slots[] = {
99    {Py_tp_doc, (void *)abc_data_doc},
100    {Py_tp_new, abc_data_new},
101    {Py_tp_dealloc, abc_data_dealloc},
102    {Py_tp_traverse, abc_data_traverse},
103    {Py_tp_clear, abc_data_clear},
104    {0, 0}
105};
106
107static PyType_Spec _abc_data_type_spec = {
108    .name = "_abc._abc_data",
109    .basicsize = sizeof(_abc_data),
110    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
111    .slots = _abc_data_type_spec_slots,
112};
113
114static _abc_data *
115_get_impl(PyObject *module, PyObject *self)
116{
117    _abcmodule_state *state = get_abc_state(module);
118    PyObject *impl = PyObject_GetAttr(self, &_Py_ID(_abc_impl));
119    if (impl == NULL) {
120        return NULL;
121    }
122    if (!Py_IS_TYPE(impl, state->_abc_data_type)) {
123        PyErr_SetString(PyExc_TypeError, "_abc_impl is set to a wrong type");
124        Py_DECREF(impl);
125        return NULL;
126    }
127    return (_abc_data *)impl;
128}
129
130static int
131_in_weak_set(PyObject *set, PyObject *obj)
132{
133    if (set == NULL || PySet_GET_SIZE(set) == 0) {
134        return 0;
135    }
136    PyObject *ref = PyWeakref_NewRef(obj, NULL);
137    if (ref == NULL) {
138        if (PyErr_ExceptionMatches(PyExc_TypeError)) {
139            PyErr_Clear();
140            return 0;
141        }
142        return -1;
143    }
144    int res = PySet_Contains(set, ref);
145    Py_DECREF(ref);
146    return res;
147}
148
149static PyObject *
150_destroy(PyObject *setweakref, PyObject *objweakref)
151{
152    PyObject *set;
153    set = PyWeakref_GET_OBJECT(setweakref);
154    if (set == Py_None) {
155        Py_RETURN_NONE;
156    }
157    Py_INCREF(set);
158    if (PySet_Discard(set, objweakref) < 0) {
159        Py_DECREF(set);
160        return NULL;
161    }
162    Py_DECREF(set);
163    Py_RETURN_NONE;
164}
165
166static PyMethodDef _destroy_def = {
167    "_destroy", (PyCFunction) _destroy, METH_O
168};
169
170static int
171_add_to_weak_set(PyObject **pset, PyObject *obj)
172{
173    if (*pset == NULL) {
174        *pset = PySet_New(NULL);
175        if (*pset == NULL) {
176            return -1;
177        }
178    }
179
180    PyObject *set = *pset;
181    PyObject *ref, *wr;
182    PyObject *destroy_cb;
183    wr = PyWeakref_NewRef(set, NULL);
184    if (wr == NULL) {
185        return -1;
186    }
187    destroy_cb = PyCFunction_NewEx(&_destroy_def, wr, NULL);
188    if (destroy_cb == NULL) {
189        Py_DECREF(wr);
190        return -1;
191    }
192    ref = PyWeakref_NewRef(obj, destroy_cb);
193    Py_DECREF(destroy_cb);
194    if (ref == NULL) {
195        Py_DECREF(wr);
196        return -1;
197    }
198    int ret = PySet_Add(set, ref);
199    Py_DECREF(wr);
200    Py_DECREF(ref);
201    return ret;
202}
203
204/*[clinic input]
205_abc._reset_registry
206
207    self: object
208    /
209
210Internal ABC helper to reset registry of a given class.
211
212Should be only used by refleak.py
213[clinic start generated code]*/
214
215static PyObject *
216_abc__reset_registry(PyObject *module, PyObject *self)
217/*[clinic end generated code: output=92d591a43566cc10 input=12a0b7eb339ac35c]*/
218{
219    _abc_data *impl = _get_impl(module, self);
220    if (impl == NULL) {
221        return NULL;
222    }
223    if (impl->_abc_registry != NULL && PySet_Clear(impl->_abc_registry) < 0) {
224        Py_DECREF(impl);
225        return NULL;
226    }
227    Py_DECREF(impl);
228    Py_RETURN_NONE;
229}
230
231/*[clinic input]
232_abc._reset_caches
233
234    self: object
235    /
236
237Internal ABC helper to reset both caches of a given class.
238
239Should be only used by refleak.py
240[clinic start generated code]*/
241
242static PyObject *
243_abc__reset_caches(PyObject *module, PyObject *self)
244/*[clinic end generated code: output=f296f0d5c513f80c input=c0ac616fd8acfb6f]*/
245{
246    _abc_data *impl = _get_impl(module, self);
247    if (impl == NULL) {
248        return NULL;
249    }
250    if (impl->_abc_cache != NULL && PySet_Clear(impl->_abc_cache) < 0) {
251        Py_DECREF(impl);
252        return NULL;
253    }
254    /* also the second cache */
255    if (impl->_abc_negative_cache != NULL &&
256            PySet_Clear(impl->_abc_negative_cache) < 0) {
257        Py_DECREF(impl);
258        return NULL;
259    }
260    Py_DECREF(impl);
261    Py_RETURN_NONE;
262}
263
264/*[clinic input]
265_abc._get_dump
266
267    self: object
268    /
269
270Internal ABC helper for cache and registry debugging.
271
272Return shallow copies of registry, of both caches, and
273negative cache version. Don't call this function directly,
274instead use ABC._dump_registry() for a nice repr.
275[clinic start generated code]*/
276
277static PyObject *
278_abc__get_dump(PyObject *module, PyObject *self)
279/*[clinic end generated code: output=9d9569a8e2c1c443 input=2c5deb1bfe9e3c79]*/
280{
281    _abc_data *impl = _get_impl(module, self);
282    if (impl == NULL) {
283        return NULL;
284    }
285    PyObject *res = Py_BuildValue("NNNK",
286                                  PySet_New(impl->_abc_registry),
287                                  PySet_New(impl->_abc_cache),
288                                  PySet_New(impl->_abc_negative_cache),
289                                  impl->_abc_negative_cache_version);
290    Py_DECREF(impl);
291    return res;
292}
293
294// Compute set of abstract method names.
295static int
296compute_abstract_methods(PyObject *self)
297{
298    int ret = -1;
299    PyObject *abstracts = PyFrozenSet_New(NULL);
300    if (abstracts == NULL) {
301        return -1;
302    }
303
304    PyObject *ns = NULL, *items = NULL, *bases = NULL;  // Py_XDECREF()ed on error.
305
306    /* Stage 1: direct abstract methods. */
307    ns = PyObject_GetAttr(self, &_Py_ID(__dict__));
308    if (!ns) {
309        goto error;
310    }
311
312    // We can't use PyDict_Next(ns) even when ns is dict because
313    // _PyObject_IsAbstract() can mutate ns.
314    items = PyMapping_Items(ns);
315    if (!items) {
316        goto error;
317    }
318    assert(PyList_Check(items));
319    for (Py_ssize_t pos = 0; pos < PyList_GET_SIZE(items); pos++) {
320        PyObject *it = PySequence_Fast(
321                PyList_GET_ITEM(items, pos),
322                "items() returned non-iterable");
323        if (!it) {
324            goto error;
325        }
326        if (PySequence_Fast_GET_SIZE(it) != 2) {
327            PyErr_SetString(PyExc_TypeError,
328                            "items() returned item which size is not 2");
329            Py_DECREF(it);
330            goto error;
331        }
332
333        // borrowed
334        PyObject *key = PySequence_Fast_GET_ITEM(it, 0);
335        PyObject *value = PySequence_Fast_GET_ITEM(it, 1);
336        // items or it may be cleared while accessing __abstractmethod__
337        // So we need to keep strong reference for key
338        Py_INCREF(key);
339        int is_abstract = _PyObject_IsAbstract(value);
340        if (is_abstract < 0 ||
341                (is_abstract && PySet_Add(abstracts, key) < 0)) {
342            Py_DECREF(it);
343            Py_DECREF(key);
344            goto error;
345        }
346        Py_DECREF(key);
347        Py_DECREF(it);
348    }
349
350    /* Stage 2: inherited abstract methods. */
351    bases = PyObject_GetAttr(self, &_Py_ID(__bases__));
352    if (!bases) {
353        goto error;
354    }
355    if (!PyTuple_Check(bases)) {
356        PyErr_SetString(PyExc_TypeError, "__bases__ is not tuple");
357        goto error;
358    }
359
360    for (Py_ssize_t pos = 0; pos < PyTuple_GET_SIZE(bases); pos++) {
361        PyObject *item = PyTuple_GET_ITEM(bases, pos);  // borrowed
362        PyObject *base_abstracts, *iter;
363
364        if (_PyObject_LookupAttr(item, &_Py_ID(__abstractmethods__),
365                                 &base_abstracts) < 0) {
366            goto error;
367        }
368        if (base_abstracts == NULL) {
369            continue;
370        }
371        if (!(iter = PyObject_GetIter(base_abstracts))) {
372            Py_DECREF(base_abstracts);
373            goto error;
374        }
375        Py_DECREF(base_abstracts);
376        PyObject *key, *value;
377        while ((key = PyIter_Next(iter))) {
378            if (_PyObject_LookupAttr(self, key, &value) < 0) {
379                Py_DECREF(key);
380                Py_DECREF(iter);
381                goto error;
382            }
383            if (value == NULL) {
384                Py_DECREF(key);
385                continue;
386            }
387
388            int is_abstract = _PyObject_IsAbstract(value);
389            Py_DECREF(value);
390            if (is_abstract < 0 ||
391                    (is_abstract && PySet_Add(abstracts, key) < 0))
392            {
393                Py_DECREF(key);
394                Py_DECREF(iter);
395                goto error;
396            }
397            Py_DECREF(key);
398        }
399        Py_DECREF(iter);
400        if (PyErr_Occurred()) {
401            goto error;
402        }
403    }
404
405    if (PyObject_SetAttr(self, &_Py_ID(__abstractmethods__), abstracts) < 0) {
406        goto error;
407    }
408
409    ret = 0;
410error:
411    Py_DECREF(abstracts);
412    Py_XDECREF(ns);
413    Py_XDECREF(items);
414    Py_XDECREF(bases);
415    return ret;
416}
417
418#define COLLECTION_FLAGS (Py_TPFLAGS_SEQUENCE | Py_TPFLAGS_MAPPING)
419
420/*[clinic input]
421_abc._abc_init
422
423    self: object
424    /
425
426Internal ABC helper for class set-up. Should be never used outside abc module.
427[clinic start generated code]*/
428
429static PyObject *
430_abc__abc_init(PyObject *module, PyObject *self)
431/*[clinic end generated code: output=594757375714cda1 input=8d7fe470ff77f029]*/
432{
433    _abcmodule_state *state = get_abc_state(module);
434    PyObject *data;
435    if (compute_abstract_methods(self) < 0) {
436        return NULL;
437    }
438
439    /* Set up inheritance registry. */
440    data = abc_data_new(state->_abc_data_type, NULL, NULL);
441    if (data == NULL) {
442        return NULL;
443    }
444    if (PyObject_SetAttr(self, &_Py_ID(_abc_impl), data) < 0) {
445        Py_DECREF(data);
446        return NULL;
447    }
448    Py_DECREF(data);
449    /* If __abc_tpflags__ & COLLECTION_FLAGS is set, then set the corresponding bit(s)
450     * in the new class.
451     * Used by collections.abc.Sequence and collections.abc.Mapping to indicate
452     * their special status w.r.t. pattern matching. */
453    if (PyType_Check(self)) {
454        PyTypeObject *cls = (PyTypeObject *)self;
455        PyObject *flags = PyDict_GetItemWithError(cls->tp_dict,
456                                                  &_Py_ID(__abc_tpflags__));
457        if (flags == NULL) {
458            if (PyErr_Occurred()) {
459                return NULL;
460            }
461        }
462        else {
463            if (PyLong_CheckExact(flags)) {
464                long val = PyLong_AsLong(flags);
465                if (val == -1 && PyErr_Occurred()) {
466                    return NULL;
467                }
468                if ((val & COLLECTION_FLAGS) == COLLECTION_FLAGS) {
469                    PyErr_SetString(PyExc_TypeError, "__abc_tpflags__ cannot be both Py_TPFLAGS_SEQUENCE and Py_TPFLAGS_MAPPING");
470                    return NULL;
471                }
472                ((PyTypeObject *)self)->tp_flags |= (val & COLLECTION_FLAGS);
473            }
474            if (PyDict_DelItem(cls->tp_dict, &_Py_ID(__abc_tpflags__)) < 0) {
475                return NULL;
476            }
477        }
478    }
479    Py_RETURN_NONE;
480}
481
482static void
483set_collection_flag_recursive(PyTypeObject *child, unsigned long flag)
484{
485    assert(flag == Py_TPFLAGS_MAPPING || flag == Py_TPFLAGS_SEQUENCE);
486    if (PyType_HasFeature(child, Py_TPFLAGS_IMMUTABLETYPE) ||
487        (child->tp_flags & COLLECTION_FLAGS) == flag)
488    {
489        return;
490    }
491
492    child->tp_flags &= ~COLLECTION_FLAGS;
493    child->tp_flags |= flag;
494
495    PyObject *grandchildren = _PyType_GetSubclasses(child);
496    if (grandchildren == NULL) {
497        return;
498    }
499
500    for (Py_ssize_t i = 0; i < PyList_GET_SIZE(grandchildren); i++) {
501        PyObject *grandchild = PyList_GET_ITEM(grandchildren, i);
502        set_collection_flag_recursive((PyTypeObject *)grandchild, flag);
503    }
504    Py_DECREF(grandchildren);
505}
506
507/*[clinic input]
508_abc._abc_register
509
510    self: object
511    subclass: object
512    /
513
514Internal ABC helper for subclasss registration. Should be never used outside abc module.
515[clinic start generated code]*/
516
517static PyObject *
518_abc__abc_register_impl(PyObject *module, PyObject *self, PyObject *subclass)
519/*[clinic end generated code: output=7851e7668c963524 input=ca589f8c3080e67f]*/
520{
521    if (!PyType_Check(subclass)) {
522        PyErr_SetString(PyExc_TypeError, "Can only register classes");
523        return NULL;
524    }
525    int result = PyObject_IsSubclass(subclass, self);
526    if (result > 0) {
527        Py_INCREF(subclass);
528        return subclass;  /* Already a subclass. */
529    }
530    if (result < 0) {
531        return NULL;
532    }
533    /* Subtle: test for cycles *after* testing for "already a subclass";
534       this means we allow X.register(X) and interpret it as a no-op. */
535    result = PyObject_IsSubclass(self, subclass);
536    if (result > 0) {
537        /* This would create a cycle, which is bad for the algorithm below. */
538        PyErr_SetString(PyExc_RuntimeError, "Refusing to create an inheritance cycle");
539        return NULL;
540    }
541    if (result < 0) {
542        return NULL;
543    }
544    _abc_data *impl = _get_impl(module, self);
545    if (impl == NULL) {
546        return NULL;
547    }
548    if (_add_to_weak_set(&impl->_abc_registry, subclass) < 0) {
549        Py_DECREF(impl);
550        return NULL;
551    }
552    Py_DECREF(impl);
553
554    /* Invalidate negative cache */
555    get_abc_state(module)->abc_invalidation_counter++;
556
557    /* Set Py_TPFLAGS_SEQUENCE  or Py_TPFLAGS_MAPPING flag */
558    if (PyType_Check(self)) {
559        unsigned long collection_flag = ((PyTypeObject *)self)->tp_flags & COLLECTION_FLAGS;
560        if (collection_flag) {
561            set_collection_flag_recursive((PyTypeObject *)subclass, collection_flag);
562        }
563    }
564    Py_INCREF(subclass);
565    return subclass;
566}
567
568
569/*[clinic input]
570_abc._abc_instancecheck
571
572    self: object
573    instance: object
574    /
575
576Internal ABC helper for instance checks. Should be never used outside abc module.
577[clinic start generated code]*/
578
579static PyObject *
580_abc__abc_instancecheck_impl(PyObject *module, PyObject *self,
581                             PyObject *instance)
582/*[clinic end generated code: output=b8b5148f63b6b56f input=a4f4525679261084]*/
583{
584    PyObject *subtype, *result = NULL, *subclass = NULL;
585    _abc_data *impl = _get_impl(module, self);
586    if (impl == NULL) {
587        return NULL;
588    }
589
590    subclass = PyObject_GetAttr(instance, &_Py_ID(__class__));
591    if (subclass == NULL) {
592        Py_DECREF(impl);
593        return NULL;
594    }
595    /* Inline the cache checking. */
596    int incache = _in_weak_set(impl->_abc_cache, subclass);
597    if (incache < 0) {
598        goto end;
599    }
600    if (incache > 0) {
601        result = Py_True;
602        Py_INCREF(result);
603        goto end;
604    }
605    subtype = (PyObject *)Py_TYPE(instance);
606    if (subtype == subclass) {
607        if (impl->_abc_negative_cache_version == get_abc_state(module)->abc_invalidation_counter) {
608            incache = _in_weak_set(impl->_abc_negative_cache, subclass);
609            if (incache < 0) {
610                goto end;
611            }
612            if (incache > 0) {
613                result = Py_False;
614                Py_INCREF(result);
615                goto end;
616            }
617        }
618        /* Fall back to the subclass check. */
619        result = PyObject_CallMethodOneArg(self, &_Py_ID(__subclasscheck__),
620                                           subclass);
621        goto end;
622    }
623    result = PyObject_CallMethodOneArg(self, &_Py_ID(__subclasscheck__),
624                                       subclass);
625    if (result == NULL) {
626        goto end;
627    }
628
629    switch (PyObject_IsTrue(result)) {
630    case -1:
631        Py_DECREF(result);
632        result = NULL;
633        break;
634    case 0:
635        Py_DECREF(result);
636        result = PyObject_CallMethodOneArg(self, &_Py_ID(__subclasscheck__),
637                                           subtype);
638        break;
639    case 1:  // Nothing to do.
640        break;
641    default:
642        Py_UNREACHABLE();
643    }
644
645end:
646    Py_XDECREF(impl);
647    Py_XDECREF(subclass);
648    return result;
649}
650
651
652// Return -1 when exception occurred.
653// Return 1 when result is set.
654// Return 0 otherwise.
655static int subclasscheck_check_registry(_abc_data *impl, PyObject *subclass,
656                                        PyObject **result);
657
658/*[clinic input]
659_abc._abc_subclasscheck
660
661    self: object
662    subclass: object
663    /
664
665Internal ABC helper for subclasss checks. Should be never used outside abc module.
666[clinic start generated code]*/
667
668static PyObject *
669_abc__abc_subclasscheck_impl(PyObject *module, PyObject *self,
670                             PyObject *subclass)
671/*[clinic end generated code: output=b56c9e4a530e3894 input=1d947243409d10b8]*/
672{
673    if (!PyType_Check(subclass)) {
674        PyErr_SetString(PyExc_TypeError, "issubclass() arg 1 must be a class");
675        return NULL;
676    }
677
678    PyObject *ok, *subclasses = NULL, *result = NULL;
679    _abcmodule_state *state = NULL;
680    Py_ssize_t pos;
681    int incache;
682    _abc_data *impl = _get_impl(module, self);
683    if (impl == NULL) {
684        return NULL;
685    }
686
687    /* 1. Check cache. */
688    incache = _in_weak_set(impl->_abc_cache, subclass);
689    if (incache < 0) {
690        goto end;
691    }
692    if (incache > 0) {
693        result = Py_True;
694        goto end;
695    }
696
697    state = get_abc_state(module);
698    /* 2. Check negative cache; may have to invalidate. */
699    if (impl->_abc_negative_cache_version < state->abc_invalidation_counter) {
700        /* Invalidate the negative cache. */
701        if (impl->_abc_negative_cache != NULL &&
702                PySet_Clear(impl->_abc_negative_cache) < 0)
703        {
704            goto end;
705        }
706        impl->_abc_negative_cache_version = state->abc_invalidation_counter;
707    }
708    else {
709        incache = _in_weak_set(impl->_abc_negative_cache, subclass);
710        if (incache < 0) {
711            goto end;
712        }
713        if (incache > 0) {
714            result = Py_False;
715            goto end;
716        }
717    }
718
719    /* 3. Check the subclass hook. */
720    ok = PyObject_CallMethodOneArg(
721            (PyObject *)self, &_Py_ID(__subclasshook__), subclass);
722    if (ok == NULL) {
723        goto end;
724    }
725    if (ok == Py_True) {
726        Py_DECREF(ok);
727        if (_add_to_weak_set(&impl->_abc_cache, subclass) < 0) {
728            goto end;
729        }
730        result = Py_True;
731        goto end;
732    }
733    if (ok == Py_False) {
734        Py_DECREF(ok);
735        if (_add_to_weak_set(&impl->_abc_negative_cache, subclass) < 0) {
736            goto end;
737        }
738        result = Py_False;
739        goto end;
740    }
741    if (ok != Py_NotImplemented) {
742        Py_DECREF(ok);
743        PyErr_SetString(PyExc_AssertionError, "__subclasshook__ must return either"
744                                              " False, True, or NotImplemented");
745        goto end;
746    }
747    Py_DECREF(ok);
748
749    /* 4. Check if it's a direct subclass. */
750    PyObject *mro = ((PyTypeObject *)subclass)->tp_mro;
751    assert(PyTuple_Check(mro));
752    for (pos = 0; pos < PyTuple_GET_SIZE(mro); pos++) {
753        PyObject *mro_item = PyTuple_GET_ITEM(mro, pos);
754        assert(mro_item != NULL);
755        if ((PyObject *)self == mro_item) {
756            if (_add_to_weak_set(&impl->_abc_cache, subclass) < 0) {
757                goto end;
758            }
759            result = Py_True;
760            goto end;
761        }
762    }
763
764    /* 5. Check if it's a subclass of a registered class (recursive). */
765    if (subclasscheck_check_registry(impl, subclass, &result)) {
766        // Exception occurred or result is set.
767        goto end;
768    }
769
770    /* 6. Check if it's a subclass of a subclass (recursive). */
771    subclasses = PyObject_CallMethod(self, "__subclasses__", NULL);
772    if (subclasses == NULL) {
773        goto end;
774    }
775    if (!PyList_Check(subclasses)) {
776        PyErr_SetString(PyExc_TypeError, "__subclasses__() must return a list");
777        goto end;
778    }
779    for (pos = 0; pos < PyList_GET_SIZE(subclasses); pos++) {
780        PyObject *scls = PyList_GET_ITEM(subclasses, pos);
781        Py_INCREF(scls);
782        int r = PyObject_IsSubclass(subclass, scls);
783        Py_DECREF(scls);
784        if (r > 0) {
785            if (_add_to_weak_set(&impl->_abc_cache, subclass) < 0) {
786                goto end;
787            }
788            result = Py_True;
789            goto end;
790        }
791        if (r < 0) {
792            goto end;
793        }
794    }
795
796    /* No dice; update negative cache. */
797    if (_add_to_weak_set(&impl->_abc_negative_cache, subclass) < 0) {
798        goto end;
799    }
800    result = Py_False;
801
802end:
803    Py_DECREF(impl);
804    Py_XDECREF(subclasses);
805    Py_XINCREF(result);
806    return result;
807}
808
809
810static int
811subclasscheck_check_registry(_abc_data *impl, PyObject *subclass,
812                             PyObject **result)
813{
814    // Fast path: check subclass is in weakref directly.
815    int ret = _in_weak_set(impl->_abc_registry, subclass);
816    if (ret < 0) {
817        *result = NULL;
818        return -1;
819    }
820    if (ret > 0) {
821        *result = Py_True;
822        return 1;
823    }
824
825    if (impl->_abc_registry == NULL) {
826        return 0;
827    }
828    Py_ssize_t registry_size = PySet_Size(impl->_abc_registry);
829    if (registry_size == 0) {
830        return 0;
831    }
832    // Weakref callback may remove entry from set.
833    // So we take snapshot of registry first.
834    PyObject **copy = PyMem_Malloc(sizeof(PyObject*) * registry_size);
835    if (copy == NULL) {
836        PyErr_NoMemory();
837        return -1;
838    }
839    PyObject *key;
840    Py_ssize_t pos = 0;
841    Py_hash_t hash;
842    Py_ssize_t i = 0;
843
844    while (_PySet_NextEntry(impl->_abc_registry, &pos, &key, &hash)) {
845        Py_INCREF(key);
846        copy[i++] = key;
847    }
848    assert(i == registry_size);
849
850    for (i = 0; i < registry_size; i++) {
851        PyObject *rkey = PyWeakref_GetObject(copy[i]);
852        if (rkey == NULL) {
853            // Someone inject non-weakref type in the registry.
854            ret = -1;
855            break;
856        }
857        if (rkey == Py_None) {
858            continue;
859        }
860        Py_INCREF(rkey);
861        int r = PyObject_IsSubclass(subclass, rkey);
862        Py_DECREF(rkey);
863        if (r < 0) {
864            ret = -1;
865            break;
866        }
867        if (r > 0) {
868            if (_add_to_weak_set(&impl->_abc_cache, subclass) < 0) {
869                ret = -1;
870                break;
871            }
872            *result = Py_True;
873            ret = 1;
874            break;
875        }
876    }
877
878    for (i = 0; i < registry_size; i++) {
879        Py_DECREF(copy[i]);
880    }
881    PyMem_Free(copy);
882    return ret;
883}
884
885/*[clinic input]
886_abc.get_cache_token
887
888Returns the current ABC cache token.
889
890The token is an opaque object (supporting equality testing) identifying the
891current version of the ABC cache for virtual subclasses. The token changes
892with every call to register() on any ABC.
893[clinic start generated code]*/
894
895static PyObject *
896_abc_get_cache_token_impl(PyObject *module)
897/*[clinic end generated code: output=c7d87841e033dacc input=70413d1c423ad9f9]*/
898{
899    _abcmodule_state *state = get_abc_state(module);
900    return PyLong_FromUnsignedLongLong(state->abc_invalidation_counter);
901}
902
903static struct PyMethodDef _abcmodule_methods[] = {
904    _ABC_GET_CACHE_TOKEN_METHODDEF
905    _ABC__ABC_INIT_METHODDEF
906    _ABC__RESET_REGISTRY_METHODDEF
907    _ABC__RESET_CACHES_METHODDEF
908    _ABC__GET_DUMP_METHODDEF
909    _ABC__ABC_REGISTER_METHODDEF
910    _ABC__ABC_INSTANCECHECK_METHODDEF
911    _ABC__ABC_SUBCLASSCHECK_METHODDEF
912    {NULL,       NULL}          /* sentinel */
913};
914
915static int
916_abcmodule_exec(PyObject *module)
917{
918    _abcmodule_state *state = get_abc_state(module);
919    state->abc_invalidation_counter = 0;
920    state->_abc_data_type = (PyTypeObject *)PyType_FromModuleAndSpec(module, &_abc_data_type_spec, NULL);
921    if (state->_abc_data_type == NULL) {
922        return -1;
923    }
924
925    return 0;
926}
927
928static int
929_abcmodule_traverse(PyObject *module, visitproc visit, void *arg)
930{
931    _abcmodule_state *state = get_abc_state(module);
932    Py_VISIT(state->_abc_data_type);
933    return 0;
934}
935
936static int
937_abcmodule_clear(PyObject *module)
938{
939    _abcmodule_state *state = get_abc_state(module);
940    Py_CLEAR(state->_abc_data_type);
941    return 0;
942}
943
944static void
945_abcmodule_free(void *module)
946{
947    _abcmodule_clear((PyObject *)module);
948}
949
950static PyModuleDef_Slot _abcmodule_slots[] = {
951    {Py_mod_exec, _abcmodule_exec},
952    {0, NULL}
953};
954
955static struct PyModuleDef _abcmodule = {
956    PyModuleDef_HEAD_INIT,
957    .m_name = "_abc",
958    .m_doc = _abc__doc__,
959    .m_size = sizeof(_abcmodule_state),
960    .m_methods = _abcmodule_methods,
961    .m_slots = _abcmodule_slots,
962    .m_traverse = _abcmodule_traverse,
963    .m_clear = _abcmodule_clear,
964    .m_free = _abcmodule_free,
965};
966
967PyMODINIT_FUNC
968PyInit__abc(void)
969{
970    return PyModuleDef_Init(&_abcmodule);
971}
972