• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /* Type object implementation */
2  
3  #include "Python.h"
4  #include "pycore_call.h"
5  #include "pycore_compile.h"       // _Py_Mangle()
6  #include "pycore_initconfig.h"
7  #include "pycore_moduleobject.h"  // _PyModule_GetDef()
8  #include "pycore_object.h"
9  #include "pycore_pyerrors.h"
10  #include "pycore_pystate.h"       // _PyThreadState_GET()
11  #include "pycore_unionobject.h"   // _Py_union_type_or
12  #include "frameobject.h"
13  #include "structmember.h"         // PyMemberDef
14  
15  #include <ctype.h>
16  
17  /*[clinic input]
18  class type "PyTypeObject *" "&PyType_Type"
19  class object "PyObject *" "&PyBaseObject_Type"
20  [clinic start generated code]*/
21  /*[clinic end generated code: output=da39a3ee5e6b4b0d input=4b94608d231c434b]*/
22  
23  #include "clinic/typeobject.c.h"
24  
25  /* Support type attribute lookup cache */
26  
27  /* The cache can keep references to the names alive for longer than
28     they normally would.  This is why the maximum size is limited to
29     MCACHE_MAX_ATTR_SIZE, since it might be a problem if very large
30     strings are used as attribute names. */
31  #define MCACHE_MAX_ATTR_SIZE    100
32  #define MCACHE_HASH(version, name_hash)                                 \
33          (((unsigned int)(version) ^ (unsigned int)(name_hash))          \
34           & ((1 << MCACHE_SIZE_EXP) - 1))
35  
36  #define MCACHE_HASH_METHOD(type, name)                                  \
37      MCACHE_HASH((type)->tp_version_tag, ((Py_ssize_t)(name)) >> 3)
38  #define MCACHE_CACHEABLE_NAME(name)                             \
39          PyUnicode_CheckExact(name) &&                           \
40          PyUnicode_IS_READY(name) &&                             \
41          (PyUnicode_GET_LENGTH(name) <= MCACHE_MAX_ATTR_SIZE)
42  
43  // bpo-42745: next_version_tag remains shared by all interpreters because of static types
44  // Used to set PyTypeObject.tp_version_tag
45  static unsigned int next_version_tag = 0;
46  
47  typedef struct PySlot_Offset {
48      short subslot_offset;
49      short slot_offset;
50  } PySlot_Offset;
51  
52  
53  /* bpo-40521: Interned strings are shared by all subinterpreters */
54  #ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
55  #  define INTERN_NAME_STRINGS
56  #endif
57  
58  /* alphabetical order */
59  _Py_IDENTIFIER(__abstractmethods__);
60  _Py_IDENTIFIER(__annotations__);
61  _Py_IDENTIFIER(__class__);
62  _Py_IDENTIFIER(__class_getitem__);
63  _Py_IDENTIFIER(__classcell__);
64  _Py_IDENTIFIER(__delitem__);
65  _Py_IDENTIFIER(__dict__);
66  _Py_IDENTIFIER(__doc__);
67  _Py_IDENTIFIER(__getattribute__);
68  _Py_IDENTIFIER(__getitem__);
69  _Py_IDENTIFIER(__hash__);
70  _Py_IDENTIFIER(__init_subclass__);
71  _Py_IDENTIFIER(__len__);
72  _Py_IDENTIFIER(__module__);
73  _Py_IDENTIFIER(__name__);
74  _Py_IDENTIFIER(__new__);
75  _Py_IDENTIFIER(__qualname__);
76  _Py_IDENTIFIER(__set_name__);
77  _Py_IDENTIFIER(__setitem__);
78  _Py_IDENTIFIER(__weakref__);
79  _Py_IDENTIFIER(builtins);
80  _Py_IDENTIFIER(mro);
81  
82  static PyObject *
83  slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
84  
85  static void
86  clear_slotdefs(void);
87  
88  static PyObject *
89  lookup_maybe_method(PyObject *self, _Py_Identifier *attrid, int *unbound);
90  
91  static int
92  slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value);
93  
94  /*
95   * finds the beginning of the docstring's introspection signature.
96   * if present, returns a pointer pointing to the first '('.
97   * otherwise returns NULL.
98   *
99   * doesn't guarantee that the signature is valid, only that it
100   * has a valid prefix.  (the signature must also pass skip_signature.)
101   */
102  static const char *
find_signature(const char * name,const char * doc)103  find_signature(const char *name, const char *doc)
104  {
105      const char *dot;
106      size_t length;
107  
108      if (!doc)
109          return NULL;
110  
111      assert(name != NULL);
112  
113      /* for dotted names like classes, only use the last component */
114      dot = strrchr(name, '.');
115      if (dot)
116          name = dot + 1;
117  
118      length = strlen(name);
119      if (strncmp(doc, name, length))
120          return NULL;
121      doc += length;
122      if (*doc != '(')
123          return NULL;
124      return doc;
125  }
126  
127  #define SIGNATURE_END_MARKER         ")\n--\n\n"
128  #define SIGNATURE_END_MARKER_LENGTH  6
129  /*
130   * skips past the end of the docstring's introspection signature.
131   * (assumes doc starts with a valid signature prefix.)
132   */
133  static const char *
skip_signature(const char * doc)134  skip_signature(const char *doc)
135  {
136      while (*doc) {
137          if ((*doc == *SIGNATURE_END_MARKER) &&
138              !strncmp(doc, SIGNATURE_END_MARKER, SIGNATURE_END_MARKER_LENGTH))
139              return doc + SIGNATURE_END_MARKER_LENGTH;
140          if ((*doc == '\n') && (doc[1] == '\n'))
141              return NULL;
142          doc++;
143      }
144      return NULL;
145  }
146  
147  int
_PyType_CheckConsistency(PyTypeObject * type)148  _PyType_CheckConsistency(PyTypeObject *type)
149  {
150  #define CHECK(expr) \
151      do { if (!(expr)) { _PyObject_ASSERT_FAILED_MSG((PyObject *)type, Py_STRINGIFY(expr)); } } while (0)
152  
153      CHECK(!_PyObject_IsFreed((PyObject *)type));
154  
155      if (!(type->tp_flags & Py_TPFLAGS_READY)) {
156          /* don't check static types before PyType_Ready() */
157          return 1;
158      }
159  
160      CHECK(Py_REFCNT(type) >= 1);
161      CHECK(PyType_Check(type));
162  
163      CHECK(!(type->tp_flags & Py_TPFLAGS_READYING));
164      CHECK(type->tp_dict != NULL);
165  
166      if (type->tp_flags & Py_TPFLAGS_DISALLOW_INSTANTIATION) {
167          CHECK(type->tp_new == NULL);
168          CHECK(_PyDict_ContainsId(type->tp_dict, &PyId___new__) == 0);
169      }
170  
171      return 1;
172  #undef CHECK
173  }
174  
175  static const char *
_PyType_DocWithoutSignature(const char * name,const char * internal_doc)176  _PyType_DocWithoutSignature(const char *name, const char *internal_doc)
177  {
178      const char *doc = find_signature(name, internal_doc);
179  
180      if (doc) {
181          doc = skip_signature(doc);
182          if (doc)
183              return doc;
184          }
185      return internal_doc;
186  }
187  
188  PyObject *
_PyType_GetDocFromInternalDoc(const char * name,const char * internal_doc)189  _PyType_GetDocFromInternalDoc(const char *name, const char *internal_doc)
190  {
191      const char *doc = _PyType_DocWithoutSignature(name, internal_doc);
192  
193      if (!doc || *doc == '\0') {
194          Py_RETURN_NONE;
195      }
196  
197      return PyUnicode_FromString(doc);
198  }
199  
200  PyObject *
_PyType_GetTextSignatureFromInternalDoc(const char * name,const char * internal_doc)201  _PyType_GetTextSignatureFromInternalDoc(const char *name, const char *internal_doc)
202  {
203      const char *start = find_signature(name, internal_doc);
204      const char *end;
205  
206      if (start)
207          end = skip_signature(start);
208      else
209          end = NULL;
210      if (!end) {
211          Py_RETURN_NONE;
212      }
213  
214      /* back "end" up until it points just past the final ')' */
215      end -= SIGNATURE_END_MARKER_LENGTH - 1;
216      assert((end - start) >= 2); /* should be "()" at least */
217      assert(end[-1] == ')');
218      assert(end[0] == '\n');
219      return PyUnicode_FromStringAndSize(start, end - start);
220  }
221  
222  
223  static struct type_cache*
get_type_cache(void)224  get_type_cache(void)
225  {
226      PyInterpreterState *interp = _PyInterpreterState_GET();
227      return &interp->type_cache;
228  }
229  
230  
231  static void
type_cache_clear(struct type_cache * cache,int use_none)232  type_cache_clear(struct type_cache *cache, int use_none)
233  {
234      for (Py_ssize_t i = 0; i < (1 << MCACHE_SIZE_EXP); i++) {
235          struct type_cache_entry *entry = &cache->hashtable[i];
236          entry->version = 0;
237          if (use_none) {
238              // Set to None so _PyType_Lookup() can use Py_SETREF(),
239              // rather than using slower Py_XSETREF().
240              Py_XSETREF(entry->name, Py_NewRef(Py_None));
241          }
242          else {
243              Py_CLEAR(entry->name);
244          }
245          entry->value = NULL;
246      }
247  
248      // Mark all version tags as invalid
249      PyType_Modified(&PyBaseObject_Type);
250  }
251  
252  
253  void
_PyType_InitCache(PyInterpreterState * interp)254  _PyType_InitCache(PyInterpreterState *interp)
255  {
256      struct type_cache *cache = &interp->type_cache;
257      for (Py_ssize_t i = 0; i < (1 << MCACHE_SIZE_EXP); i++) {
258          struct type_cache_entry *entry = &cache->hashtable[i];
259          assert(entry->name == NULL);
260  
261          entry->version = 0;
262          // Set to None so _PyType_Lookup() can use Py_SETREF(),
263          // rather than using slower Py_XSETREF().
264          entry->name = Py_NewRef(Py_None);
265          entry->value = NULL;
266      }
267  }
268  
269  
270  static unsigned int
_PyType_ClearCache(PyInterpreterState * interp)271  _PyType_ClearCache(PyInterpreterState *interp)
272  {
273      struct type_cache *cache = &interp->type_cache;
274  #if MCACHE_STATS
275      size_t total = cache->hits + cache->collisions + cache->misses;
276      fprintf(stderr, "-- Method cache hits        = %zd (%d%%)\n",
277              cache->hits, (int) (100.0 * cache->hits / total));
278      fprintf(stderr, "-- Method cache true misses = %zd (%d%%)\n",
279              cache->misses, (int) (100.0 * cache->misses / total));
280      fprintf(stderr, "-- Method cache collisions  = %zd (%d%%)\n",
281              cache->collisions, (int) (100.0 * cache->collisions / total));
282      fprintf(stderr, "-- Method cache size        = %zd KiB\n",
283              sizeof(cache->hashtable) / 1024);
284  #endif
285  
286      unsigned int cur_version_tag = next_version_tag - 1;
287      if (_Py_IsMainInterpreter(interp)) {
288          next_version_tag = 0;
289      }
290  
291      type_cache_clear(cache, 0);
292  
293      return cur_version_tag;
294  }
295  
296  
297  unsigned int
PyType_ClearCache(void)298  PyType_ClearCache(void)
299  {
300      PyInterpreterState *interp = _PyInterpreterState_GET();
301      return _PyType_ClearCache(interp);
302  }
303  
304  
305  void
_PyType_Fini(PyInterpreterState * interp)306  _PyType_Fini(PyInterpreterState *interp)
307  {
308      _PyType_ClearCache(interp);
309      if (_Py_IsMainInterpreter(interp)) {
310          clear_slotdefs();
311      }
312  }
313  
314  
315  void
PyType_Modified(PyTypeObject * type)316  PyType_Modified(PyTypeObject *type)
317  {
318      /* Invalidate any cached data for the specified type and all
319         subclasses.  This function is called after the base
320         classes, mro, or attributes of the type are altered.
321  
322         Invariants:
323  
324         - before Py_TPFLAGS_VALID_VERSION_TAG can be set on a type,
325           it must first be set on all super types.
326  
327         This function clears the Py_TPFLAGS_VALID_VERSION_TAG of a
328         type (so it must first clear it on all subclasses).  The
329         tp_version_tag value is meaningless unless this flag is set.
330         We don't assign new version tags eagerly, but only as
331         needed.
332       */
333      PyObject *raw, *ref;
334      Py_ssize_t i;
335  
336      if (!_PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG))
337          return;
338  
339      raw = type->tp_subclasses;
340      if (raw != NULL) {
341          assert(PyDict_CheckExact(raw));
342          i = 0;
343          while (PyDict_Next(raw, &i, NULL, &ref)) {
344              assert(PyWeakref_CheckRef(ref));
345              ref = PyWeakref_GET_OBJECT(ref);
346              if (ref != Py_None) {
347                  PyType_Modified((PyTypeObject *)ref);
348              }
349          }
350      }
351      type->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG;
352      type->tp_version_tag = 0; /* 0 is not a valid version tag */
353  }
354  
355  static void
type_mro_modified(PyTypeObject * type,PyObject * bases)356  type_mro_modified(PyTypeObject *type, PyObject *bases) {
357      /*
358         Check that all base classes or elements of the MRO of type are
359         able to be cached.  This function is called after the base
360         classes or mro of the type are altered.
361  
362         Unset HAVE_VERSION_TAG and VALID_VERSION_TAG if the type
363         has a custom MRO that includes a type which is not officially
364         super type, or if the type implements its own mro() method.
365  
366         Called from mro_internal, which will subsequently be called on
367         each subclass when their mro is recursively updated.
368       */
369      Py_ssize_t i, n;
370      int custom = !Py_IS_TYPE(type, &PyType_Type);
371      int unbound;
372      PyObject *mro_meth = NULL;
373      PyObject *type_mro_meth = NULL;
374  
375      if (custom) {
376          mro_meth = lookup_maybe_method(
377              (PyObject *)type, &PyId_mro, &unbound);
378          if (mro_meth == NULL)
379              goto clear;
380          type_mro_meth = lookup_maybe_method(
381              (PyObject *)&PyType_Type, &PyId_mro, &unbound);
382          if (type_mro_meth == NULL)
383              goto clear;
384          if (mro_meth != type_mro_meth)
385              goto clear;
386          Py_XDECREF(mro_meth);
387          Py_XDECREF(type_mro_meth);
388      }
389      n = PyTuple_GET_SIZE(bases);
390      for (i = 0; i < n; i++) {
391          PyObject *b = PyTuple_GET_ITEM(bases, i);
392          PyTypeObject *cls;
393  
394          assert(PyType_Check(b));
395          cls = (PyTypeObject *)b;
396  
397          if (!PyType_IsSubtype(type, cls)) {
398              goto clear;
399          }
400      }
401      return;
402   clear:
403      Py_XDECREF(mro_meth);
404      Py_XDECREF(type_mro_meth);
405      type->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG;
406      type->tp_version_tag = 0; /* 0 is not a valid version tag */
407  }
408  
409  static int
assign_version_tag(struct type_cache * cache,PyTypeObject * type)410  assign_version_tag(struct type_cache *cache, PyTypeObject *type)
411  {
412      /* Ensure that the tp_version_tag is valid and set
413         Py_TPFLAGS_VALID_VERSION_TAG.  To respect the invariant, this
414         must first be done on all super classes.  Return 0 if this
415         cannot be done, 1 if Py_TPFLAGS_VALID_VERSION_TAG.
416      */
417      Py_ssize_t i, n;
418      PyObject *bases;
419  
420      if (_PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG))
421          return 1;
422      if (!_PyType_HasFeature(type, Py_TPFLAGS_READY))
423          return 0;
424  
425      type->tp_version_tag = next_version_tag++;
426      /* for stress-testing: next_version_tag &= 0xFF; */
427  
428      if (type->tp_version_tag == 0) {
429          // Wrap-around or just starting Python - clear the whole cache
430          type_cache_clear(cache, 1);
431          return 0;
432      }
433  
434      bases = type->tp_bases;
435      n = PyTuple_GET_SIZE(bases);
436      for (i = 0; i < n; i++) {
437          PyObject *b = PyTuple_GET_ITEM(bases, i);
438          assert(PyType_Check(b));
439          if (!assign_version_tag(cache, (PyTypeObject *)b))
440              return 0;
441      }
442      type->tp_flags |= Py_TPFLAGS_VALID_VERSION_TAG;
443      return 1;
444  }
445  
446  
447  static PyMemberDef type_members[] = {
448      {"__basicsize__", T_PYSSIZET, offsetof(PyTypeObject,tp_basicsize),READONLY},
449      {"__itemsize__", T_PYSSIZET, offsetof(PyTypeObject, tp_itemsize), READONLY},
450      {"__flags__", T_ULONG, offsetof(PyTypeObject, tp_flags), READONLY},
451      {"__weakrefoffset__", T_PYSSIZET,
452       offsetof(PyTypeObject, tp_weaklistoffset), READONLY},
453      {"__base__", T_OBJECT, offsetof(PyTypeObject, tp_base), READONLY},
454      {"__dictoffset__", T_PYSSIZET,
455       offsetof(PyTypeObject, tp_dictoffset), READONLY},
456      {"__mro__", T_OBJECT, offsetof(PyTypeObject, tp_mro), READONLY},
457      {0}
458  };
459  
460  static int
check_set_special_type_attr(PyTypeObject * type,PyObject * value,const char * name)461  check_set_special_type_attr(PyTypeObject *type, PyObject *value, const char *name)
462  {
463      if (_PyType_HasFeature(type, Py_TPFLAGS_IMMUTABLETYPE)) {
464          PyErr_Format(PyExc_TypeError,
465                       "cannot set '%s' attribute of immutable type '%s'",
466                       name, type->tp_name);
467          return 0;
468      }
469      if (!value) {
470          PyErr_Format(PyExc_TypeError,
471                       "cannot delete '%s' attribute of immutable type '%s'",
472                       name, type->tp_name);
473          return 0;
474      }
475  
476      if (PySys_Audit("object.__setattr__", "OsO",
477                      type, name, value) < 0) {
478          return 0;
479      }
480  
481      return 1;
482  }
483  
484  const char *
_PyType_Name(PyTypeObject * type)485  _PyType_Name(PyTypeObject *type)
486  {
487      assert(type->tp_name != NULL);
488      const char *s = strrchr(type->tp_name, '.');
489      if (s == NULL) {
490          s = type->tp_name;
491      }
492      else {
493          s++;
494      }
495      return s;
496  }
497  
498  static PyObject *
type_name(PyTypeObject * type,void * context)499  type_name(PyTypeObject *type, void *context)
500  {
501      if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
502          PyHeapTypeObject* et = (PyHeapTypeObject*)type;
503  
504          Py_INCREF(et->ht_name);
505          return et->ht_name;
506      }
507      else {
508          return PyUnicode_FromString(_PyType_Name(type));
509      }
510  }
511  
512  static PyObject *
type_qualname(PyTypeObject * type,void * context)513  type_qualname(PyTypeObject *type, void *context)
514  {
515      if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
516          PyHeapTypeObject* et = (PyHeapTypeObject*)type;
517          Py_INCREF(et->ht_qualname);
518          return et->ht_qualname;
519      }
520      else {
521          return PyUnicode_FromString(_PyType_Name(type));
522      }
523  }
524  
525  static int
type_set_name(PyTypeObject * type,PyObject * value,void * context)526  type_set_name(PyTypeObject *type, PyObject *value, void *context)
527  {
528      const char *tp_name;
529      Py_ssize_t name_size;
530  
531      if (!check_set_special_type_attr(type, value, "__name__"))
532          return -1;
533      if (!PyUnicode_Check(value)) {
534          PyErr_Format(PyExc_TypeError,
535                       "can only assign string to %s.__name__, not '%s'",
536                       type->tp_name, Py_TYPE(value)->tp_name);
537          return -1;
538      }
539  
540      tp_name = PyUnicode_AsUTF8AndSize(value, &name_size);
541      if (tp_name == NULL)
542          return -1;
543      if (strlen(tp_name) != (size_t)name_size) {
544          PyErr_SetString(PyExc_ValueError,
545                          "type name must not contain null characters");
546          return -1;
547      }
548  
549      type->tp_name = tp_name;
550      Py_INCREF(value);
551      Py_SETREF(((PyHeapTypeObject*)type)->ht_name, value);
552  
553      return 0;
554  }
555  
556  static int
type_set_qualname(PyTypeObject * type,PyObject * value,void * context)557  type_set_qualname(PyTypeObject *type, PyObject *value, void *context)
558  {
559      PyHeapTypeObject* et;
560  
561      if (!check_set_special_type_attr(type, value, "__qualname__"))
562          return -1;
563      if (!PyUnicode_Check(value)) {
564          PyErr_Format(PyExc_TypeError,
565                       "can only assign string to %s.__qualname__, not '%s'",
566                       type->tp_name, Py_TYPE(value)->tp_name);
567          return -1;
568      }
569  
570      et = (PyHeapTypeObject*)type;
571      Py_INCREF(value);
572      Py_SETREF(et->ht_qualname, value);
573      return 0;
574  }
575  
576  static PyObject *
type_module(PyTypeObject * type,void * context)577  type_module(PyTypeObject *type, void *context)
578  {
579      PyObject *mod;
580  
581      if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
582          mod = _PyDict_GetItemIdWithError(type->tp_dict, &PyId___module__);
583          if (mod == NULL) {
584              if (!PyErr_Occurred()) {
585                  PyErr_Format(PyExc_AttributeError, "__module__");
586              }
587              return NULL;
588          }
589          Py_INCREF(mod);
590      }
591      else {
592          const char *s = strrchr(type->tp_name, '.');
593          if (s != NULL) {
594              mod = PyUnicode_FromStringAndSize(
595                  type->tp_name, (Py_ssize_t)(s - type->tp_name));
596              if (mod != NULL)
597                  PyUnicode_InternInPlace(&mod);
598          }
599          else {
600              mod = _PyUnicode_FromId(&PyId_builtins);
601              Py_XINCREF(mod);
602          }
603      }
604      return mod;
605  }
606  
607  static int
type_set_module(PyTypeObject * type,PyObject * value,void * context)608  type_set_module(PyTypeObject *type, PyObject *value, void *context)
609  {
610      if (!check_set_special_type_attr(type, value, "__module__"))
611          return -1;
612  
613      PyType_Modified(type);
614  
615      return _PyDict_SetItemId(type->tp_dict, &PyId___module__, value);
616  }
617  
618  static PyObject *
type_abstractmethods(PyTypeObject * type,void * context)619  type_abstractmethods(PyTypeObject *type, void *context)
620  {
621      PyObject *mod = NULL;
622      /* type itself has an __abstractmethods__ descriptor (this). Don't return
623         that. */
624      if (type != &PyType_Type)
625          mod = _PyDict_GetItemIdWithError(type->tp_dict, &PyId___abstractmethods__);
626      if (!mod) {
627          if (!PyErr_Occurred()) {
628              PyObject *message = _PyUnicode_FromId(&PyId___abstractmethods__);
629              if (message)
630                  PyErr_SetObject(PyExc_AttributeError, message);
631          }
632          return NULL;
633      }
634      Py_INCREF(mod);
635      return mod;
636  }
637  
638  static int
type_set_abstractmethods(PyTypeObject * type,PyObject * value,void * context)639  type_set_abstractmethods(PyTypeObject *type, PyObject *value, void *context)
640  {
641      /* __abstractmethods__ should only be set once on a type, in
642         abc.ABCMeta.__new__, so this function doesn't do anything
643         special to update subclasses.
644      */
645      int abstract, res;
646      if (value != NULL) {
647          abstract = PyObject_IsTrue(value);
648          if (abstract < 0)
649              return -1;
650          res = _PyDict_SetItemId(type->tp_dict, &PyId___abstractmethods__, value);
651      }
652      else {
653          abstract = 0;
654          res = _PyDict_DelItemId(type->tp_dict, &PyId___abstractmethods__);
655          if (res && PyErr_ExceptionMatches(PyExc_KeyError)) {
656              PyObject *message = _PyUnicode_FromId(&PyId___abstractmethods__);
657              if (message)
658                  PyErr_SetObject(PyExc_AttributeError, message);
659              return -1;
660          }
661      }
662      if (res == 0) {
663          PyType_Modified(type);
664          if (abstract)
665              type->tp_flags |= Py_TPFLAGS_IS_ABSTRACT;
666          else
667              type->tp_flags &= ~Py_TPFLAGS_IS_ABSTRACT;
668      }
669      return res;
670  }
671  
672  static PyObject *
type_get_bases(PyTypeObject * type,void * context)673  type_get_bases(PyTypeObject *type, void *context)
674  {
675      Py_INCREF(type->tp_bases);
676      return type->tp_bases;
677  }
678  
679  static PyTypeObject *best_base(PyObject *);
680  static int mro_internal(PyTypeObject *, PyObject **);
681  static int type_is_subtype_base_chain(PyTypeObject *, PyTypeObject *);
682  static int compatible_for_assignment(PyTypeObject *, PyTypeObject *, const char *);
683  static int add_subclass(PyTypeObject*, PyTypeObject*);
684  static int add_all_subclasses(PyTypeObject *type, PyObject *bases);
685  static void remove_subclass(PyTypeObject *, PyTypeObject *);
686  static void remove_all_subclasses(PyTypeObject *type, PyObject *bases);
687  static void update_all_slots(PyTypeObject *);
688  
689  typedef int (*update_callback)(PyTypeObject *, void *);
690  static int update_subclasses(PyTypeObject *type, PyObject *name,
691                               update_callback callback, void *data);
692  static int recurse_down_subclasses(PyTypeObject *type, PyObject *name,
693                                     update_callback callback, void *data);
694  
695  static int
mro_hierarchy(PyTypeObject * type,PyObject * temp)696  mro_hierarchy(PyTypeObject *type, PyObject *temp)
697  {
698      int res;
699      PyObject *new_mro, *old_mro;
700      PyObject *tuple;
701      PyObject *subclasses;
702      Py_ssize_t i, n;
703  
704      res = mro_internal(type, &old_mro);
705      if (res <= 0)
706          /* error / reentrance */
707          return res;
708      new_mro = type->tp_mro;
709  
710      if (old_mro != NULL)
711          tuple = PyTuple_Pack(3, type, new_mro, old_mro);
712      else
713          tuple = PyTuple_Pack(2, type, new_mro);
714  
715      if (tuple != NULL)
716          res = PyList_Append(temp, tuple);
717      else
718          res = -1;
719      Py_XDECREF(tuple);
720  
721      if (res < 0) {
722          type->tp_mro = old_mro;
723          Py_DECREF(new_mro);
724          return -1;
725      }
726      Py_XDECREF(old_mro);
727  
728      /* Obtain a copy of subclasses list to iterate over.
729  
730         Otherwise type->tp_subclasses might be altered
731         in the middle of the loop, for example, through a custom mro(),
732         by invoking type_set_bases on some subclass of the type
733         which in turn calls remove_subclass/add_subclass on this type.
734  
735         Finally, this makes things simple avoiding the need to deal
736         with dictionary iterators and weak references.
737      */
738      subclasses = type___subclasses___impl(type);
739      if (subclasses == NULL)
740          return -1;
741      n = PyList_GET_SIZE(subclasses);
742      for (i = 0; i < n; i++) {
743          PyTypeObject *subclass;
744          subclass = (PyTypeObject *)PyList_GET_ITEM(subclasses, i);
745          res = mro_hierarchy(subclass, temp);
746          if (res < 0)
747              break;
748      }
749      Py_DECREF(subclasses);
750  
751      return res;
752  }
753  
754  static int
type_set_bases(PyTypeObject * type,PyObject * new_bases,void * context)755  type_set_bases(PyTypeObject *type, PyObject *new_bases, void *context)
756  {
757      int res = 0;
758      PyObject *temp;
759      PyObject *old_bases;
760      PyTypeObject *new_base, *old_base;
761      Py_ssize_t i;
762  
763      if (!check_set_special_type_attr(type, new_bases, "__bases__"))
764          return -1;
765      if (!PyTuple_Check(new_bases)) {
766          PyErr_Format(PyExc_TypeError,
767               "can only assign tuple to %s.__bases__, not %s",
768                   type->tp_name, Py_TYPE(new_bases)->tp_name);
769          return -1;
770      }
771      if (PyTuple_GET_SIZE(new_bases) == 0) {
772          PyErr_Format(PyExc_TypeError,
773               "can only assign non-empty tuple to %s.__bases__, not ()",
774                   type->tp_name);
775          return -1;
776      }
777      for (i = 0; i < PyTuple_GET_SIZE(new_bases); i++) {
778          PyObject *ob;
779          PyTypeObject *base;
780  
781          ob = PyTuple_GET_ITEM(new_bases, i);
782          if (!PyType_Check(ob)) {
783              PyErr_Format(PyExc_TypeError,
784                           "%s.__bases__ must be tuple of classes, not '%s'",
785                           type->tp_name, Py_TYPE(ob)->tp_name);
786              return -1;
787          }
788  
789          base = (PyTypeObject*)ob;
790          if (PyType_IsSubtype(base, type) ||
791              /* In case of reentering here again through a custom mro()
792                 the above check is not enough since it relies on
793                 base->tp_mro which would gonna be updated inside
794                 mro_internal only upon returning from the mro().
795  
796                 However, base->tp_base has already been assigned (see
797                 below), which in turn may cause an inheritance cycle
798                 through tp_base chain.  And this is definitely
799                 not what you want to ever happen.  */
800              (base->tp_mro != NULL && type_is_subtype_base_chain(base, type))) {
801  
802              PyErr_SetString(PyExc_TypeError,
803                              "a __bases__ item causes an inheritance cycle");
804              return -1;
805          }
806      }
807  
808      new_base = best_base(new_bases);
809      if (new_base == NULL)
810          return -1;
811  
812      if (!compatible_for_assignment(type->tp_base, new_base, "__bases__"))
813          return -1;
814  
815      Py_INCREF(new_bases);
816      Py_INCREF(new_base);
817  
818      old_bases = type->tp_bases;
819      old_base = type->tp_base;
820  
821      type->tp_bases = new_bases;
822      type->tp_base = new_base;
823  
824      temp = PyList_New(0);
825      if (temp == NULL)
826          goto bail;
827      if (mro_hierarchy(type, temp) < 0)
828          goto undo;
829      Py_DECREF(temp);
830  
831      /* Take no action in case if type->tp_bases has been replaced
832         through reentrance.  */
833      if (type->tp_bases == new_bases) {
834          /* any base that was in __bases__ but now isn't, we
835             need to remove |type| from its tp_subclasses.
836             conversely, any class now in __bases__ that wasn't
837             needs to have |type| added to its subclasses. */
838  
839          /* for now, sod that: just remove from all old_bases,
840             add to all new_bases */
841          remove_all_subclasses(type, old_bases);
842          res = add_all_subclasses(type, new_bases);
843          update_all_slots(type);
844      }
845  
846      Py_DECREF(old_bases);
847      Py_DECREF(old_base);
848  
849      assert(_PyType_CheckConsistency(type));
850      return res;
851  
852    undo:
853      for (i = PyList_GET_SIZE(temp) - 1; i >= 0; i--) {
854          PyTypeObject *cls;
855          PyObject *new_mro, *old_mro = NULL;
856  
857          PyArg_UnpackTuple(PyList_GET_ITEM(temp, i),
858                            "", 2, 3, &cls, &new_mro, &old_mro);
859          /* Do not rollback if cls has a newer version of MRO.  */
860          if (cls->tp_mro == new_mro) {
861              Py_XINCREF(old_mro);
862              cls->tp_mro = old_mro;
863              Py_DECREF(new_mro);
864          }
865      }
866      Py_DECREF(temp);
867  
868    bail:
869      if (type->tp_bases == new_bases) {
870          assert(type->tp_base == new_base);
871  
872          type->tp_bases = old_bases;
873          type->tp_base = old_base;
874  
875          Py_DECREF(new_bases);
876          Py_DECREF(new_base);
877      }
878      else {
879          Py_DECREF(old_bases);
880          Py_DECREF(old_base);
881      }
882  
883      assert(_PyType_CheckConsistency(type));
884      return -1;
885  }
886  
887  static PyObject *
type_dict(PyTypeObject * type,void * context)888  type_dict(PyTypeObject *type, void *context)
889  {
890      if (type->tp_dict == NULL) {
891          Py_RETURN_NONE;
892      }
893      return PyDictProxy_New(type->tp_dict);
894  }
895  
896  static PyObject *
type_get_doc(PyTypeObject * type,void * context)897  type_get_doc(PyTypeObject *type, void *context)
898  {
899      PyObject *result;
900      if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE) && type->tp_doc != NULL) {
901          return _PyType_GetDocFromInternalDoc(type->tp_name, type->tp_doc);
902      }
903      result = _PyDict_GetItemIdWithError(type->tp_dict, &PyId___doc__);
904      if (result == NULL) {
905          if (!PyErr_Occurred()) {
906              result = Py_None;
907              Py_INCREF(result);
908          }
909      }
910      else if (Py_TYPE(result)->tp_descr_get) {
911          result = Py_TYPE(result)->tp_descr_get(result, NULL,
912                                                 (PyObject *)type);
913      }
914      else {
915          Py_INCREF(result);
916      }
917      return result;
918  }
919  
920  static PyObject *
type_get_text_signature(PyTypeObject * type,void * context)921  type_get_text_signature(PyTypeObject *type, void *context)
922  {
923      return _PyType_GetTextSignatureFromInternalDoc(type->tp_name, type->tp_doc);
924  }
925  
926  static int
type_set_doc(PyTypeObject * type,PyObject * value,void * context)927  type_set_doc(PyTypeObject *type, PyObject *value, void *context)
928  {
929      if (!check_set_special_type_attr(type, value, "__doc__"))
930          return -1;
931      PyType_Modified(type);
932      return _PyDict_SetItemId(type->tp_dict, &PyId___doc__, value);
933  }
934  
935  static PyObject *
type_get_annotations(PyTypeObject * type,void * context)936  type_get_annotations(PyTypeObject *type, void *context)
937  {
938      if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
939          PyErr_Format(PyExc_AttributeError, "type object '%s' has no attribute '__annotations__'", type->tp_name);
940          return NULL;
941      }
942  
943      PyObject *annotations;
944      /* there's no _PyDict_GetItemId without WithError, so let's LBYL. */
945      if (_PyDict_ContainsId(type->tp_dict, &PyId___annotations__)) {
946          annotations = _PyDict_GetItemIdWithError(type->tp_dict, &PyId___annotations__);
947          /*
948          ** _PyDict_GetItemIdWithError could still fail,
949          ** for instance with a well-timed Ctrl-C or a MemoryError.
950          ** so let's be totally safe.
951          */
952          if (annotations) {
953              if (Py_TYPE(annotations)->tp_descr_get) {
954                  annotations = Py_TYPE(annotations)->tp_descr_get(annotations, NULL,
955                                                         (PyObject *)type);
956              } else {
957                  Py_INCREF(annotations);
958              }
959          }
960      } else {
961          annotations = PyDict_New();
962          if (annotations) {
963              int result = _PyDict_SetItemId(type->tp_dict, &PyId___annotations__, annotations);
964              if (result) {
965                  Py_CLEAR(annotations);
966              } else {
967                  PyType_Modified(type);
968              }
969          }
970      }
971      return annotations;
972  }
973  
974  static int
type_set_annotations(PyTypeObject * type,PyObject * value,void * context)975  type_set_annotations(PyTypeObject *type, PyObject *value, void *context)
976  {
977      if (_PyType_HasFeature(type, Py_TPFLAGS_IMMUTABLETYPE)) {
978          PyErr_Format(PyExc_TypeError,
979                       "cannot set '__annotations__' attribute of immutable type '%s'",
980                       type->tp_name);
981          return -1;
982      }
983  
984      int result;
985      if (value != NULL) {
986          /* set */
987          result = _PyDict_SetItemId(type->tp_dict, &PyId___annotations__, value);
988      } else {
989          /* delete */
990          if (!_PyDict_ContainsId(type->tp_dict, &PyId___annotations__)) {
991              PyErr_Format(PyExc_AttributeError, "__annotations__");
992              return -1;
993          }
994          result = _PyDict_DelItemId(type->tp_dict, &PyId___annotations__);
995      }
996  
997      if (result == 0) {
998          PyType_Modified(type);
999      }
1000      return result;
1001  }
1002  
1003  
1004  /*[clinic input]
1005  type.__instancecheck__ -> bool
1006  
1007      instance: object
1008      /
1009  
1010  Check if an object is an instance.
1011  [clinic start generated code]*/
1012  
1013  static int
type___instancecheck___impl(PyTypeObject * self,PyObject * instance)1014  type___instancecheck___impl(PyTypeObject *self, PyObject *instance)
1015  /*[clinic end generated code: output=08b6bf5f591c3618 input=cdbfeaee82c01a0f]*/
1016  {
1017      return _PyObject_RealIsInstance(instance, (PyObject *)self);
1018  }
1019  
1020  /*[clinic input]
1021  type.__subclasscheck__ -> bool
1022  
1023      subclass: object
1024      /
1025  
1026  Check if a class is a subclass.
1027  [clinic start generated code]*/
1028  
1029  static int
type___subclasscheck___impl(PyTypeObject * self,PyObject * subclass)1030  type___subclasscheck___impl(PyTypeObject *self, PyObject *subclass)
1031  /*[clinic end generated code: output=97a4e51694500941 input=071b2ca9e03355f4]*/
1032  {
1033      return _PyObject_RealIsSubclass(subclass, (PyObject *)self);
1034  }
1035  
1036  
1037  static PyGetSetDef type_getsets[] = {
1038      {"__name__", (getter)type_name, (setter)type_set_name, NULL},
1039      {"__qualname__", (getter)type_qualname, (setter)type_set_qualname, NULL},
1040      {"__bases__", (getter)type_get_bases, (setter)type_set_bases, NULL},
1041      {"__module__", (getter)type_module, (setter)type_set_module, NULL},
1042      {"__abstractmethods__", (getter)type_abstractmethods,
1043       (setter)type_set_abstractmethods, NULL},
1044      {"__dict__",  (getter)type_dict,  NULL, NULL},
1045      {"__doc__", (getter)type_get_doc, (setter)type_set_doc, NULL},
1046      {"__text_signature__", (getter)type_get_text_signature, NULL, NULL},
1047      {"__annotations__", (getter)type_get_annotations, (setter)type_set_annotations, NULL},
1048      {0}
1049  };
1050  
1051  static PyObject *
type_repr(PyTypeObject * type)1052  type_repr(PyTypeObject *type)
1053  {
1054      PyObject *mod, *name, *rtn;
1055  
1056      mod = type_module(type, NULL);
1057      if (mod == NULL)
1058          PyErr_Clear();
1059      else if (!PyUnicode_Check(mod)) {
1060          Py_DECREF(mod);
1061          mod = NULL;
1062      }
1063      name = type_qualname(type, NULL);
1064      if (name == NULL) {
1065          Py_XDECREF(mod);
1066          return NULL;
1067      }
1068  
1069      if (mod != NULL && !_PyUnicode_EqualToASCIIId(mod, &PyId_builtins))
1070          rtn = PyUnicode_FromFormat("<class '%U.%U'>", mod, name);
1071      else
1072          rtn = PyUnicode_FromFormat("<class '%s'>", type->tp_name);
1073  
1074      Py_XDECREF(mod);
1075      Py_DECREF(name);
1076      return rtn;
1077  }
1078  
1079  static PyObject *
type_call(PyTypeObject * type,PyObject * args,PyObject * kwds)1080  type_call(PyTypeObject *type, PyObject *args, PyObject *kwds)
1081  {
1082      PyObject *obj;
1083      PyThreadState *tstate = _PyThreadState_GET();
1084  
1085  #ifdef Py_DEBUG
1086      /* type_call() must not be called with an exception set,
1087         because it can clear it (directly or indirectly) and so the
1088         caller loses its exception */
1089      assert(!_PyErr_Occurred(tstate));
1090  #endif
1091  
1092      /* Special case: type(x) should return Py_TYPE(x) */
1093      /* We only want type itself to accept the one-argument form (#27157) */
1094      if (type == &PyType_Type) {
1095          assert(args != NULL && PyTuple_Check(args));
1096          assert(kwds == NULL || PyDict_Check(kwds));
1097          Py_ssize_t nargs = PyTuple_GET_SIZE(args);
1098  
1099          if (nargs == 1 && (kwds == NULL || !PyDict_GET_SIZE(kwds))) {
1100              obj = (PyObject *) Py_TYPE(PyTuple_GET_ITEM(args, 0));
1101              Py_INCREF(obj);
1102              return obj;
1103          }
1104  
1105          /* SF bug 475327 -- if that didn't trigger, we need 3
1106             arguments. But PyArg_ParseTuple in type_new may give
1107             a msg saying type() needs exactly 3. */
1108          if (nargs != 3) {
1109              PyErr_SetString(PyExc_TypeError,
1110                              "type() takes 1 or 3 arguments");
1111              return NULL;
1112          }
1113      }
1114  
1115      if (type->tp_new == NULL) {
1116          _PyErr_Format(tstate, PyExc_TypeError,
1117                        "cannot create '%s' instances", type->tp_name);
1118          return NULL;
1119      }
1120  
1121      obj = type->tp_new(type, args, kwds);
1122      obj = _Py_CheckFunctionResult(tstate, (PyObject*)type, obj, NULL);
1123      if (obj == NULL)
1124          return NULL;
1125  
1126      /* If the returned object is not an instance of type,
1127         it won't be initialized. */
1128      if (!PyType_IsSubtype(Py_TYPE(obj), type))
1129          return obj;
1130  
1131      type = Py_TYPE(obj);
1132      if (type->tp_init != NULL) {
1133          int res = type->tp_init(obj, args, kwds);
1134          if (res < 0) {
1135              assert(_PyErr_Occurred(tstate));
1136              Py_DECREF(obj);
1137              obj = NULL;
1138          }
1139          else {
1140              assert(!_PyErr_Occurred(tstate));
1141          }
1142      }
1143      return obj;
1144  }
1145  
1146  PyObject *
PyType_GenericAlloc(PyTypeObject * type,Py_ssize_t nitems)1147  PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
1148  {
1149      PyObject *obj;
1150      const size_t size = _PyObject_VAR_SIZE(type, nitems+1);
1151      /* note that we need to add one, for the sentinel */
1152  
1153      if (_PyType_IS_GC(type)) {
1154          obj = _PyObject_GC_Malloc(size);
1155      }
1156      else {
1157          obj = (PyObject *)PyObject_Malloc(size);
1158      }
1159  
1160      if (obj == NULL) {
1161          return PyErr_NoMemory();
1162      }
1163  
1164      memset(obj, '\0', size);
1165  
1166      if (type->tp_itemsize == 0) {
1167          _PyObject_Init(obj, type);
1168      }
1169      else {
1170          _PyObject_InitVar((PyVarObject *)obj, type, nitems);
1171      }
1172  
1173      if (_PyType_IS_GC(type)) {
1174          _PyObject_GC_TRACK(obj);
1175      }
1176      return obj;
1177  }
1178  
1179  PyObject *
PyType_GenericNew(PyTypeObject * type,PyObject * args,PyObject * kwds)1180  PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
1181  {
1182      return type->tp_alloc(type, 0);
1183  }
1184  
1185  /* Helpers for subtyping */
1186  
1187  static int
traverse_slots(PyTypeObject * type,PyObject * self,visitproc visit,void * arg)1188  traverse_slots(PyTypeObject *type, PyObject *self, visitproc visit, void *arg)
1189  {
1190      Py_ssize_t i, n;
1191      PyMemberDef *mp;
1192  
1193      n = Py_SIZE(type);
1194      mp = PyHeapType_GET_MEMBERS((PyHeapTypeObject *)type);
1195      for (i = 0; i < n; i++, mp++) {
1196          if (mp->type == T_OBJECT_EX) {
1197              char *addr = (char *)self + mp->offset;
1198              PyObject *obj = *(PyObject **)addr;
1199              if (obj != NULL) {
1200                  int err = visit(obj, arg);
1201                  if (err)
1202                      return err;
1203              }
1204          }
1205      }
1206      return 0;
1207  }
1208  
1209  static int
subtype_traverse(PyObject * self,visitproc visit,void * arg)1210  subtype_traverse(PyObject *self, visitproc visit, void *arg)
1211  {
1212      PyTypeObject *type, *base;
1213      traverseproc basetraverse;
1214  
1215      /* Find the nearest base with a different tp_traverse,
1216         and traverse slots while we're at it */
1217      type = Py_TYPE(self);
1218      base = type;
1219      while ((basetraverse = base->tp_traverse) == subtype_traverse) {
1220          if (Py_SIZE(base)) {
1221              int err = traverse_slots(base, self, visit, arg);
1222              if (err)
1223                  return err;
1224          }
1225          base = base->tp_base;
1226          assert(base);
1227      }
1228  
1229      if (type->tp_dictoffset != base->tp_dictoffset) {
1230          PyObject **dictptr = _PyObject_GetDictPtr(self);
1231          if (dictptr && *dictptr)
1232              Py_VISIT(*dictptr);
1233      }
1234  
1235      if (type->tp_flags & Py_TPFLAGS_HEAPTYPE
1236          && (!basetraverse || !(base->tp_flags & Py_TPFLAGS_HEAPTYPE))) {
1237          /* For a heaptype, the instances count as references
1238             to the type.          Traverse the type so the collector
1239             can find cycles involving this link.
1240             Skip this visit if basetraverse belongs to a heap type: in that
1241             case, basetraverse will visit the type when we call it later.
1242             */
1243          Py_VISIT(type);
1244      }
1245  
1246      if (basetraverse)
1247          return basetraverse(self, visit, arg);
1248      return 0;
1249  }
1250  
1251  static void
clear_slots(PyTypeObject * type,PyObject * self)1252  clear_slots(PyTypeObject *type, PyObject *self)
1253  {
1254      Py_ssize_t i, n;
1255      PyMemberDef *mp;
1256  
1257      n = Py_SIZE(type);
1258      mp = PyHeapType_GET_MEMBERS((PyHeapTypeObject *)type);
1259      for (i = 0; i < n; i++, mp++) {
1260          if (mp->type == T_OBJECT_EX && !(mp->flags & READONLY)) {
1261              char *addr = (char *)self + mp->offset;
1262              PyObject *obj = *(PyObject **)addr;
1263              if (obj != NULL) {
1264                  *(PyObject **)addr = NULL;
1265                  Py_DECREF(obj);
1266              }
1267          }
1268      }
1269  }
1270  
1271  static int
subtype_clear(PyObject * self)1272  subtype_clear(PyObject *self)
1273  {
1274      PyTypeObject *type, *base;
1275      inquiry baseclear;
1276  
1277      /* Find the nearest base with a different tp_clear
1278         and clear slots while we're at it */
1279      type = Py_TYPE(self);
1280      base = type;
1281      while ((baseclear = base->tp_clear) == subtype_clear) {
1282          if (Py_SIZE(base))
1283              clear_slots(base, self);
1284          base = base->tp_base;
1285          assert(base);
1286      }
1287  
1288      /* Clear the instance dict (if any), to break cycles involving only
1289         __dict__ slots (as in the case 'self.__dict__ is self'). */
1290      if (type->tp_dictoffset != base->tp_dictoffset) {
1291          PyObject **dictptr = _PyObject_GetDictPtr(self);
1292          if (dictptr && *dictptr)
1293              Py_CLEAR(*dictptr);
1294      }
1295  
1296      if (baseclear)
1297          return baseclear(self);
1298      return 0;
1299  }
1300  
1301  static void
subtype_dealloc(PyObject * self)1302  subtype_dealloc(PyObject *self)
1303  {
1304      PyTypeObject *type, *base;
1305      destructor basedealloc;
1306      int has_finalizer;
1307  
1308      /* Extract the type; we expect it to be a heap type */
1309      type = Py_TYPE(self);
1310      _PyObject_ASSERT((PyObject *)type, type->tp_flags & Py_TPFLAGS_HEAPTYPE);
1311  
1312      /* Test whether the type has GC exactly once */
1313  
1314      if (!_PyType_IS_GC(type)) {
1315          /* A non GC dynamic type allows certain simplifications:
1316             there's no need to call clear_slots(), or DECREF the dict,
1317             or clear weakrefs. */
1318  
1319          /* Maybe call finalizer; exit early if resurrected */
1320          if (type->tp_finalize) {
1321              if (PyObject_CallFinalizerFromDealloc(self) < 0)
1322                  return;
1323          }
1324          if (type->tp_del) {
1325              type->tp_del(self);
1326              if (Py_REFCNT(self) > 0) {
1327                  return;
1328              }
1329          }
1330  
1331          /* Find the nearest base with a different tp_dealloc */
1332          base = type;
1333          while ((basedealloc = base->tp_dealloc) == subtype_dealloc) {
1334              base = base->tp_base;
1335              assert(base);
1336          }
1337  
1338          /* Extract the type again; tp_del may have changed it */
1339          type = Py_TYPE(self);
1340  
1341          // Don't read type memory after calling basedealloc() since basedealloc()
1342          // can deallocate the type and free its memory.
1343          int type_needs_decref = (type->tp_flags & Py_TPFLAGS_HEAPTYPE
1344                                   && !(base->tp_flags & Py_TPFLAGS_HEAPTYPE));
1345  
1346          /* Call the base tp_dealloc() */
1347          assert(basedealloc);
1348          basedealloc(self);
1349  
1350          /* Can't reference self beyond this point. It's possible tp_del switched
1351             our type from a HEAPTYPE to a non-HEAPTYPE, so be careful about
1352             reference counting. Only decref if the base type is not already a heap
1353             allocated type. Otherwise, basedealloc should have decref'd it already */
1354          if (type_needs_decref) {
1355              Py_DECREF(type);
1356          }
1357  
1358          /* Done */
1359          return;
1360      }
1361  
1362      /* We get here only if the type has GC */
1363  
1364      /* UnTrack and re-Track around the trashcan macro, alas */
1365      /* See explanation at end of function for full disclosure */
1366      PyObject_GC_UnTrack(self);
1367      Py_TRASHCAN_BEGIN(self, subtype_dealloc);
1368  
1369      /* Find the nearest base with a different tp_dealloc */
1370      base = type;
1371      while ((/*basedealloc =*/ base->tp_dealloc) == subtype_dealloc) {
1372          base = base->tp_base;
1373          assert(base);
1374      }
1375  
1376      has_finalizer = type->tp_finalize || type->tp_del;
1377  
1378      if (type->tp_finalize) {
1379          _PyObject_GC_TRACK(self);
1380          if (PyObject_CallFinalizerFromDealloc(self) < 0) {
1381              /* Resurrected */
1382              goto endlabel;
1383          }
1384          _PyObject_GC_UNTRACK(self);
1385      }
1386      /*
1387        If we added a weaklist, we clear it. Do this *before* calling tp_del,
1388        clearing slots, or clearing the instance dict.
1389  
1390        GC tracking must be off at this point. weakref callbacks (if any, and
1391        whether directly here or indirectly in something we call) may trigger GC,
1392        and if self is tracked at that point, it will look like trash to GC and GC
1393        will try to delete self again.
1394      */
1395      if (type->tp_weaklistoffset && !base->tp_weaklistoffset)
1396          PyObject_ClearWeakRefs(self);
1397  
1398      if (type->tp_del) {
1399          _PyObject_GC_TRACK(self);
1400          type->tp_del(self);
1401          if (Py_REFCNT(self) > 0) {
1402              /* Resurrected */
1403              goto endlabel;
1404          }
1405          _PyObject_GC_UNTRACK(self);
1406      }
1407      if (has_finalizer) {
1408          /* New weakrefs could be created during the finalizer call.
1409             If this occurs, clear them out without calling their
1410             finalizers since they might rely on part of the object
1411             being finalized that has already been destroyed. */
1412          if (type->tp_weaklistoffset && !base->tp_weaklistoffset) {
1413              /* Modeled after GET_WEAKREFS_LISTPTR() */
1414              PyWeakReference **list = (PyWeakReference **) \
1415                  _PyObject_GET_WEAKREFS_LISTPTR(self);
1416              while (*list)
1417                  _PyWeakref_ClearRef(*list);
1418          }
1419      }
1420  
1421      /*  Clear slots up to the nearest base with a different tp_dealloc */
1422      base = type;
1423      while ((basedealloc = base->tp_dealloc) == subtype_dealloc) {
1424          if (Py_SIZE(base))
1425              clear_slots(base, self);
1426          base = base->tp_base;
1427          assert(base);
1428      }
1429  
1430      /* If we added a dict, DECREF it */
1431      if (type->tp_dictoffset && !base->tp_dictoffset) {
1432          PyObject **dictptr = _PyObject_GetDictPtr(self);
1433          if (dictptr != NULL) {
1434              PyObject *dict = *dictptr;
1435              if (dict != NULL) {
1436                  Py_DECREF(dict);
1437                  *dictptr = NULL;
1438              }
1439          }
1440      }
1441  
1442      /* Extract the type again; tp_del may have changed it */
1443      type = Py_TYPE(self);
1444  
1445      /* Call the base tp_dealloc(); first retrack self if
1446       * basedealloc knows about gc.
1447       */
1448      if (_PyType_IS_GC(base)) {
1449          _PyObject_GC_TRACK(self);
1450      }
1451  
1452      // Don't read type memory after calling basedealloc() since basedealloc()
1453      // can deallocate the type and free its memory.
1454      int type_needs_decref = (type->tp_flags & Py_TPFLAGS_HEAPTYPE
1455                               && !(base->tp_flags & Py_TPFLAGS_HEAPTYPE));
1456  
1457      assert(basedealloc);
1458      basedealloc(self);
1459  
1460      /* Can't reference self beyond this point. It's possible tp_del switched
1461         our type from a HEAPTYPE to a non-HEAPTYPE, so be careful about
1462         reference counting. Only decref if the base type is not already a heap
1463         allocated type. Otherwise, basedealloc should have decref'd it already */
1464      if (type_needs_decref) {
1465          Py_DECREF(type);
1466      }
1467  
1468    endlabel:
1469      Py_TRASHCAN_END
1470  
1471      /* Explanation of the weirdness around the trashcan macros:
1472  
1473         Q. What do the trashcan macros do?
1474  
1475         A. Read the comment titled "Trashcan mechanism" in object.h.
1476            For one, this explains why there must be a call to GC-untrack
1477            before the trashcan begin macro.      Without understanding the
1478            trashcan code, the answers to the following questions don't make
1479            sense.
1480  
1481         Q. Why do we GC-untrack before the trashcan and then immediately
1482            GC-track again afterward?
1483  
1484         A. In the case that the base class is GC-aware, the base class
1485            probably GC-untracks the object.      If it does that using the
1486            UNTRACK macro, this will crash when the object is already
1487            untracked.  Because we don't know what the base class does, the
1488            only safe thing is to make sure the object is tracked when we
1489            call the base class dealloc.  But...  The trashcan begin macro
1490            requires that the object is *untracked* before it is called.  So
1491            the dance becomes:
1492  
1493           GC untrack
1494           trashcan begin
1495           GC track
1496  
1497         Q. Why did the last question say "immediately GC-track again"?
1498            It's nowhere near immediately.
1499  
1500         A. Because the code *used* to re-track immediately.      Bad Idea.
1501            self has a refcount of 0, and if gc ever gets its hands on it
1502            (which can happen if any weakref callback gets invoked), it
1503            looks like trash to gc too, and gc also tries to delete self
1504            then.  But we're already deleting self.  Double deallocation is
1505            a subtle disaster.
1506      */
1507  }
1508  
1509  static PyTypeObject *solid_base(PyTypeObject *type);
1510  
1511  /* type test with subclassing support */
1512  
1513  static int
type_is_subtype_base_chain(PyTypeObject * a,PyTypeObject * b)1514  type_is_subtype_base_chain(PyTypeObject *a, PyTypeObject *b)
1515  {
1516      do {
1517          if (a == b)
1518              return 1;
1519          a = a->tp_base;
1520      } while (a != NULL);
1521  
1522      return (b == &PyBaseObject_Type);
1523  }
1524  
1525  int
PyType_IsSubtype(PyTypeObject * a,PyTypeObject * b)1526  PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
1527  {
1528      PyObject *mro;
1529  
1530      mro = a->tp_mro;
1531      if (mro != NULL) {
1532          /* Deal with multiple inheritance without recursion
1533             by walking the MRO tuple */
1534          Py_ssize_t i, n;
1535          assert(PyTuple_Check(mro));
1536          n = PyTuple_GET_SIZE(mro);
1537          for (i = 0; i < n; i++) {
1538              if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b)
1539                  return 1;
1540          }
1541          return 0;
1542      }
1543      else
1544          /* a is not completely initialized yet; follow tp_base */
1545          return type_is_subtype_base_chain(a, b);
1546  }
1547  
1548  /* Routines to do a method lookup in the type without looking in the
1549     instance dictionary (so we can't use PyObject_GetAttr) but still
1550     binding it to the instance.
1551  
1552     Variants:
1553  
1554     - _PyObject_LookupSpecial() returns NULL without raising an exception
1555       when the _PyType_Lookup() call fails;
1556  
1557     - lookup_maybe_method() and lookup_method() are internal routines similar
1558       to _PyObject_LookupSpecial(), but can return unbound PyFunction
1559       to avoid temporary method object. Pass self as first argument when
1560       unbound == 1.
1561  */
1562  
1563  PyObject *
_PyObject_LookupSpecial(PyObject * self,_Py_Identifier * attrid)1564  _PyObject_LookupSpecial(PyObject *self, _Py_Identifier *attrid)
1565  {
1566      PyObject *res;
1567  
1568      res = _PyType_LookupId(Py_TYPE(self), attrid);
1569      if (res != NULL) {
1570          descrgetfunc f;
1571          if ((f = Py_TYPE(res)->tp_descr_get) == NULL)
1572              Py_INCREF(res);
1573          else
1574              res = f(res, self, (PyObject *)(Py_TYPE(self)));
1575      }
1576      return res;
1577  }
1578  
1579  static PyObject *
lookup_maybe_method(PyObject * self,_Py_Identifier * attrid,int * unbound)1580  lookup_maybe_method(PyObject *self, _Py_Identifier *attrid, int *unbound)
1581  {
1582      PyObject *res = _PyType_LookupId(Py_TYPE(self), attrid);
1583      if (res == NULL) {
1584          return NULL;
1585      }
1586  
1587      if (_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR)) {
1588          /* Avoid temporary PyMethodObject */
1589          *unbound = 1;
1590          Py_INCREF(res);
1591      }
1592      else {
1593          *unbound = 0;
1594          descrgetfunc f = Py_TYPE(res)->tp_descr_get;
1595          if (f == NULL) {
1596              Py_INCREF(res);
1597          }
1598          else {
1599              res = f(res, self, (PyObject *)(Py_TYPE(self)));
1600          }
1601      }
1602      return res;
1603  }
1604  
1605  static PyObject *
lookup_method(PyObject * self,_Py_Identifier * attrid,int * unbound)1606  lookup_method(PyObject *self, _Py_Identifier *attrid, int *unbound)
1607  {
1608      PyObject *res = lookup_maybe_method(self, attrid, unbound);
1609      if (res == NULL && !PyErr_Occurred()) {
1610          PyErr_SetObject(PyExc_AttributeError, _PyUnicode_FromId(attrid));
1611      }
1612      return res;
1613  }
1614  
1615  
1616  static inline PyObject*
vectorcall_unbound(PyThreadState * tstate,int unbound,PyObject * func,PyObject * const * args,Py_ssize_t nargs)1617  vectorcall_unbound(PyThreadState *tstate, int unbound, PyObject *func,
1618                     PyObject *const *args, Py_ssize_t nargs)
1619  {
1620      size_t nargsf = nargs;
1621      if (!unbound) {
1622          /* Skip self argument, freeing up args[0] to use for
1623           * PY_VECTORCALL_ARGUMENTS_OFFSET */
1624          args++;
1625          nargsf = nargsf - 1 + PY_VECTORCALL_ARGUMENTS_OFFSET;
1626      }
1627      return _PyObject_VectorcallTstate(tstate, func, args, nargsf, NULL);
1628  }
1629  
1630  static PyObject*
call_unbound_noarg(int unbound,PyObject * func,PyObject * self)1631  call_unbound_noarg(int unbound, PyObject *func, PyObject *self)
1632  {
1633      if (unbound) {
1634          return PyObject_CallOneArg(func, self);
1635      }
1636      else {
1637          return _PyObject_CallNoArg(func);
1638      }
1639  }
1640  
1641  /* A variation of PyObject_CallMethod* that uses lookup_method()
1642     instead of PyObject_GetAttrString().
1643  
1644     args is an argument vector of length nargs. The first element in this
1645     vector is the special object "self" which is used for the method lookup */
1646  static PyObject *
vectorcall_method(_Py_Identifier * name,PyObject * const * args,Py_ssize_t nargs)1647  vectorcall_method(_Py_Identifier *name,
1648                    PyObject *const *args, Py_ssize_t nargs)
1649  {
1650      assert(nargs >= 1);
1651  
1652      PyThreadState *tstate = _PyThreadState_GET();
1653      int unbound;
1654      PyObject *self = args[0];
1655      PyObject *func = lookup_method(self, name, &unbound);
1656      if (func == NULL) {
1657          return NULL;
1658      }
1659      PyObject *retval = vectorcall_unbound(tstate, unbound, func, args, nargs);
1660      Py_DECREF(func);
1661      return retval;
1662  }
1663  
1664  /* Clone of vectorcall_method() that returns NotImplemented
1665   * when the lookup fails. */
1666  static PyObject *
vectorcall_maybe(PyThreadState * tstate,_Py_Identifier * name,PyObject * const * args,Py_ssize_t nargs)1667  vectorcall_maybe(PyThreadState *tstate, _Py_Identifier *name,
1668                   PyObject *const *args, Py_ssize_t nargs)
1669  {
1670      assert(nargs >= 1);
1671  
1672      int unbound;
1673      PyObject *self = args[0];
1674      PyObject *func = lookup_maybe_method(self, name, &unbound);
1675      if (func == NULL) {
1676          if (!PyErr_Occurred())
1677              Py_RETURN_NOTIMPLEMENTED;
1678          return NULL;
1679      }
1680      PyObject *retval = vectorcall_unbound(tstate, unbound, func, args, nargs);
1681      Py_DECREF(func);
1682      return retval;
1683  }
1684  
1685  /*
1686      Method resolution order algorithm C3 described in
1687      "A Monotonic Superclass Linearization for Dylan",
1688      by Kim Barrett, Bob Cassel, Paul Haahr,
1689      David A. Moon, Keith Playford, and P. Tucker Withington.
1690      (OOPSLA 1996)
1691  
1692      Some notes about the rules implied by C3:
1693  
1694      No duplicate bases.
1695      It isn't legal to repeat a class in a list of base classes.
1696  
1697      The next three properties are the 3 constraints in "C3".
1698  
1699      Local precedence order.
1700      If A precedes B in C's MRO, then A will precede B in the MRO of all
1701      subclasses of C.
1702  
1703      Monotonicity.
1704      The MRO of a class must be an extension without reordering of the
1705      MRO of each of its superclasses.
1706  
1707      Extended Precedence Graph (EPG).
1708      Linearization is consistent if there is a path in the EPG from
1709      each class to all its successors in the linearization.  See
1710      the paper for definition of EPG.
1711   */
1712  
1713  static int
tail_contains(PyObject * tuple,int whence,PyObject * o)1714  tail_contains(PyObject *tuple, int whence, PyObject *o)
1715  {
1716      Py_ssize_t j, size;
1717      size = PyTuple_GET_SIZE(tuple);
1718  
1719      for (j = whence+1; j < size; j++) {
1720          if (PyTuple_GET_ITEM(tuple, j) == o)
1721              return 1;
1722      }
1723      return 0;
1724  }
1725  
1726  static PyObject *
class_name(PyObject * cls)1727  class_name(PyObject *cls)
1728  {
1729      PyObject *name;
1730      if (_PyObject_LookupAttrId(cls, &PyId___name__, &name) == 0) {
1731          name = PyObject_Repr(cls);
1732      }
1733      return name;
1734  }
1735  
1736  static int
check_duplicates(PyObject * tuple)1737  check_duplicates(PyObject *tuple)
1738  {
1739      Py_ssize_t i, j, n;
1740      /* Let's use a quadratic time algorithm,
1741         assuming that the bases tuples is short.
1742      */
1743      n = PyTuple_GET_SIZE(tuple);
1744      for (i = 0; i < n; i++) {
1745          PyObject *o = PyTuple_GET_ITEM(tuple, i);
1746          for (j = i + 1; j < n; j++) {
1747              if (PyTuple_GET_ITEM(tuple, j) == o) {
1748                  o = class_name(o);
1749                  if (o != NULL) {
1750                      if (PyUnicode_Check(o)) {
1751                          PyErr_Format(PyExc_TypeError,
1752                                       "duplicate base class %U", o);
1753                      }
1754                      else {
1755                          PyErr_SetString(PyExc_TypeError,
1756                                          "duplicate base class");
1757                      }
1758                      Py_DECREF(o);
1759                  }
1760                  return -1;
1761              }
1762          }
1763      }
1764      return 0;
1765  }
1766  
1767  /* Raise a TypeError for an MRO order disagreement.
1768  
1769     It's hard to produce a good error message.  In the absence of better
1770     insight into error reporting, report the classes that were candidates
1771     to be put next into the MRO.  There is some conflict between the
1772     order in which they should be put in the MRO, but it's hard to
1773     diagnose what constraint can't be satisfied.
1774  */
1775  
1776  static void
set_mro_error(PyObject ** to_merge,Py_ssize_t to_merge_size,int * remain)1777  set_mro_error(PyObject **to_merge, Py_ssize_t to_merge_size, int *remain)
1778  {
1779      Py_ssize_t i, n, off;
1780      char buf[1000];
1781      PyObject *k, *v;
1782      PyObject *set = PyDict_New();
1783      if (!set) return;
1784  
1785      for (i = 0; i < to_merge_size; i++) {
1786          PyObject *L = to_merge[i];
1787          if (remain[i] < PyTuple_GET_SIZE(L)) {
1788              PyObject *c = PyTuple_GET_ITEM(L, remain[i]);
1789              if (PyDict_SetItem(set, c, Py_None) < 0) {
1790                  Py_DECREF(set);
1791                  return;
1792              }
1793          }
1794      }
1795      n = PyDict_GET_SIZE(set);
1796  
1797      off = PyOS_snprintf(buf, sizeof(buf), "Cannot create a \
1798  consistent method resolution\norder (MRO) for bases");
1799      i = 0;
1800      while (PyDict_Next(set, &i, &k, &v) && (size_t)off < sizeof(buf)) {
1801          PyObject *name = class_name(k);
1802          const char *name_str = NULL;
1803          if (name != NULL) {
1804              if (PyUnicode_Check(name)) {
1805                  name_str = PyUnicode_AsUTF8(name);
1806              }
1807              else {
1808                  name_str = "?";
1809              }
1810          }
1811          if (name_str == NULL) {
1812              Py_XDECREF(name);
1813              Py_DECREF(set);
1814              return;
1815          }
1816          off += PyOS_snprintf(buf + off, sizeof(buf) - off, " %s", name_str);
1817          Py_XDECREF(name);
1818          if (--n && (size_t)(off+1) < sizeof(buf)) {
1819              buf[off++] = ',';
1820              buf[off] = '\0';
1821          }
1822      }
1823      PyErr_SetString(PyExc_TypeError, buf);
1824      Py_DECREF(set);
1825  }
1826  
1827  static int
pmerge(PyObject * acc,PyObject ** to_merge,Py_ssize_t to_merge_size)1828  pmerge(PyObject *acc, PyObject **to_merge, Py_ssize_t to_merge_size)
1829  {
1830      int res = 0;
1831      Py_ssize_t i, j, empty_cnt;
1832      int *remain;
1833  
1834      /* remain stores an index into each sublist of to_merge.
1835         remain[i] is the index of the next base in to_merge[i]
1836         that is not included in acc.
1837      */
1838      remain = PyMem_New(int, to_merge_size);
1839      if (remain == NULL) {
1840          PyErr_NoMemory();
1841          return -1;
1842      }
1843      for (i = 0; i < to_merge_size; i++)
1844          remain[i] = 0;
1845  
1846    again:
1847      empty_cnt = 0;
1848      for (i = 0; i < to_merge_size; i++) {
1849          PyObject *candidate;
1850  
1851          PyObject *cur_tuple = to_merge[i];
1852  
1853          if (remain[i] >= PyTuple_GET_SIZE(cur_tuple)) {
1854              empty_cnt++;
1855              continue;
1856          }
1857  
1858          /* Choose next candidate for MRO.
1859  
1860             The input sequences alone can determine the choice.
1861             If not, choose the class which appears in the MRO
1862             of the earliest direct superclass of the new class.
1863          */
1864  
1865          candidate = PyTuple_GET_ITEM(cur_tuple, remain[i]);
1866          for (j = 0; j < to_merge_size; j++) {
1867              PyObject *j_lst = to_merge[j];
1868              if (tail_contains(j_lst, remain[j], candidate))
1869                  goto skip; /* continue outer loop */
1870          }
1871          res = PyList_Append(acc, candidate);
1872          if (res < 0)
1873              goto out;
1874  
1875          for (j = 0; j < to_merge_size; j++) {
1876              PyObject *j_lst = to_merge[j];
1877              if (remain[j] < PyTuple_GET_SIZE(j_lst) &&
1878                  PyTuple_GET_ITEM(j_lst, remain[j]) == candidate) {
1879                  remain[j]++;
1880              }
1881          }
1882          goto again;
1883        skip: ;
1884      }
1885  
1886      if (empty_cnt != to_merge_size) {
1887          set_mro_error(to_merge, to_merge_size, remain);
1888          res = -1;
1889      }
1890  
1891    out:
1892      PyMem_Free(remain);
1893  
1894      return res;
1895  }
1896  
1897  static PyObject *
mro_implementation(PyTypeObject * type)1898  mro_implementation(PyTypeObject *type)
1899  {
1900      PyObject *result;
1901      PyObject *bases;
1902      PyObject **to_merge;
1903      Py_ssize_t i, n;
1904  
1905      if (!_PyType_IsReady(type)) {
1906          if (PyType_Ready(type) < 0)
1907              return NULL;
1908      }
1909  
1910      bases = type->tp_bases;
1911      assert(PyTuple_Check(bases));
1912      n = PyTuple_GET_SIZE(bases);
1913      for (i = 0; i < n; i++) {
1914          PyTypeObject *base = (PyTypeObject *)PyTuple_GET_ITEM(bases, i);
1915          if (base->tp_mro == NULL) {
1916              PyErr_Format(PyExc_TypeError,
1917                           "Cannot extend an incomplete type '%.100s'",
1918                           base->tp_name);
1919              return NULL;
1920          }
1921          assert(PyTuple_Check(base->tp_mro));
1922      }
1923  
1924      if (n == 1) {
1925          /* Fast path: if there is a single base, constructing the MRO
1926           * is trivial.
1927           */
1928          PyTypeObject *base = (PyTypeObject *)PyTuple_GET_ITEM(bases, 0);
1929          Py_ssize_t k = PyTuple_GET_SIZE(base->tp_mro);
1930          result = PyTuple_New(k + 1);
1931          if (result == NULL) {
1932              return NULL;
1933          }
1934          Py_INCREF(type);
1935          PyTuple_SET_ITEM(result, 0, (PyObject *) type);
1936          for (i = 0; i < k; i++) {
1937              PyObject *cls = PyTuple_GET_ITEM(base->tp_mro, i);
1938              Py_INCREF(cls);
1939              PyTuple_SET_ITEM(result, i + 1, cls);
1940          }
1941          return result;
1942      }
1943  
1944      /* This is just a basic sanity check. */
1945      if (check_duplicates(bases) < 0) {
1946          return NULL;
1947      }
1948  
1949      /* Find a superclass linearization that honors the constraints
1950         of the explicit tuples of bases and the constraints implied by
1951         each base class.
1952  
1953         to_merge is an array of tuples, where each tuple is a superclass
1954         linearization implied by a base class.  The last element of
1955         to_merge is the declared tuple of bases.
1956      */
1957  
1958      to_merge = PyMem_New(PyObject *, n + 1);
1959      if (to_merge == NULL) {
1960          PyErr_NoMemory();
1961          return NULL;
1962      }
1963  
1964      for (i = 0; i < n; i++) {
1965          PyTypeObject *base = (PyTypeObject *)PyTuple_GET_ITEM(bases, i);
1966          to_merge[i] = base->tp_mro;
1967      }
1968      to_merge[n] = bases;
1969  
1970      result = PyList_New(1);
1971      if (result == NULL) {
1972          PyMem_Free(to_merge);
1973          return NULL;
1974      }
1975  
1976      Py_INCREF(type);
1977      PyList_SET_ITEM(result, 0, (PyObject *)type);
1978      if (pmerge(result, to_merge, n + 1) < 0) {
1979          Py_CLEAR(result);
1980      }
1981  
1982      PyMem_Free(to_merge);
1983      return result;
1984  }
1985  
1986  /*[clinic input]
1987  type.mro
1988  
1989  Return a type's method resolution order.
1990  [clinic start generated code]*/
1991  
1992  static PyObject *
type_mro_impl(PyTypeObject * self)1993  type_mro_impl(PyTypeObject *self)
1994  /*[clinic end generated code: output=bffc4a39b5b57027 input=28414f4e156db28d]*/
1995  {
1996      PyObject *seq;
1997      seq = mro_implementation(self);
1998      if (seq != NULL && !PyList_Check(seq)) {
1999          Py_SETREF(seq, PySequence_List(seq));
2000      }
2001      return seq;
2002  }
2003  
2004  static int
mro_check(PyTypeObject * type,PyObject * mro)2005  mro_check(PyTypeObject *type, PyObject *mro)
2006  {
2007      PyTypeObject *solid;
2008      Py_ssize_t i, n;
2009  
2010      solid = solid_base(type);
2011  
2012      n = PyTuple_GET_SIZE(mro);
2013      for (i = 0; i < n; i++) {
2014          PyTypeObject *base;
2015          PyObject *tmp;
2016  
2017          tmp = PyTuple_GET_ITEM(mro, i);
2018          if (!PyType_Check(tmp)) {
2019              PyErr_Format(
2020                  PyExc_TypeError,
2021                  "mro() returned a non-class ('%.500s')",
2022                  Py_TYPE(tmp)->tp_name);
2023              return -1;
2024          }
2025  
2026          base = (PyTypeObject*)tmp;
2027          if (!PyType_IsSubtype(solid, solid_base(base))) {
2028              PyErr_Format(
2029                  PyExc_TypeError,
2030                  "mro() returned base with unsuitable layout ('%.500s')",
2031                  base->tp_name);
2032              return -1;
2033          }
2034      }
2035  
2036      return 0;
2037  }
2038  
2039  /* Lookups an mcls.mro method, invokes it and checks the result (if needed,
2040     in case of a custom mro() implementation).
2041  
2042     Keep in mind that during execution of this function type->tp_mro
2043     can be replaced due to possible reentrance (for example,
2044     through type_set_bases):
2045  
2046        - when looking up the mcls.mro attribute (it could be
2047          a user-provided descriptor);
2048  
2049        - from inside a custom mro() itself;
2050  
2051        - through a finalizer of the return value of mro().
2052  */
2053  static PyObject *
mro_invoke(PyTypeObject * type)2054  mro_invoke(PyTypeObject *type)
2055  {
2056      PyObject *mro_result;
2057      PyObject *new_mro;
2058      const int custom = !Py_IS_TYPE(type, &PyType_Type);
2059  
2060      if (custom) {
2061          int unbound;
2062          PyObject *mro_meth = lookup_method((PyObject *)type, &PyId_mro,
2063                                             &unbound);
2064          if (mro_meth == NULL)
2065              return NULL;
2066          mro_result = call_unbound_noarg(unbound, mro_meth, (PyObject *)type);
2067          Py_DECREF(mro_meth);
2068      }
2069      else {
2070          mro_result = mro_implementation(type);
2071      }
2072      if (mro_result == NULL)
2073          return NULL;
2074  
2075      new_mro = PySequence_Tuple(mro_result);
2076      Py_DECREF(mro_result);
2077      if (new_mro == NULL) {
2078          return NULL;
2079      }
2080  
2081      if (PyTuple_GET_SIZE(new_mro) == 0) {
2082          Py_DECREF(new_mro);
2083          PyErr_Format(PyExc_TypeError, "type MRO must not be empty");
2084          return NULL;
2085      }
2086  
2087      if (custom && mro_check(type, new_mro) < 0) {
2088          Py_DECREF(new_mro);
2089          return NULL;
2090      }
2091      return new_mro;
2092  }
2093  
2094  /* Calculates and assigns a new MRO to type->tp_mro.
2095     Return values and invariants:
2096  
2097       - Returns 1 if a new MRO value has been set to type->tp_mro due to
2098         this call of mro_internal (no tricky reentrancy and no errors).
2099  
2100         In case if p_old_mro argument is not NULL, a previous value
2101         of type->tp_mro is put there, and the ownership of this
2102         reference is transferred to a caller.
2103         Otherwise, the previous value (if any) is decref'ed.
2104  
2105       - Returns 0 in case when type->tp_mro gets changed because of
2106         reentering here through a custom mro() (see a comment to mro_invoke).
2107  
2108         In this case, a refcount of an old type->tp_mro is adjusted
2109         somewhere deeper in the call stack (by the innermost mro_internal
2110         or its caller) and may become zero upon returning from here.
2111         This also implies that the whole hierarchy of subclasses of the type
2112         has seen the new value and updated their MRO accordingly.
2113  
2114       - Returns -1 in case of an error.
2115  */
2116  static int
mro_internal(PyTypeObject * type,PyObject ** p_old_mro)2117  mro_internal(PyTypeObject *type, PyObject **p_old_mro)
2118  {
2119      PyObject *new_mro, *old_mro;
2120      int reent;
2121  
2122      /* Keep a reference to be able to do a reentrancy check below.
2123         Don't let old_mro be GC'ed and its address be reused for
2124         another object, like (suddenly!) a new tp_mro.  */
2125      old_mro = type->tp_mro;
2126      Py_XINCREF(old_mro);
2127      new_mro = mro_invoke(type);  /* might cause reentrance */
2128      reent = (type->tp_mro != old_mro);
2129      Py_XDECREF(old_mro);
2130      if (new_mro == NULL) {
2131          return -1;
2132      }
2133  
2134      if (reent) {
2135          Py_DECREF(new_mro);
2136          return 0;
2137      }
2138  
2139      type->tp_mro = new_mro;
2140  
2141      type_mro_modified(type, type->tp_mro);
2142      /* corner case: the super class might have been hidden
2143         from the custom MRO */
2144      type_mro_modified(type, type->tp_bases);
2145  
2146      PyType_Modified(type);
2147  
2148      if (p_old_mro != NULL)
2149          *p_old_mro = old_mro;  /* transfer the ownership */
2150      else
2151          Py_XDECREF(old_mro);
2152  
2153      return 1;
2154  }
2155  
2156  
2157  /* Calculate the best base amongst multiple base classes.
2158     This is the first one that's on the path to the "solid base". */
2159  
2160  static PyTypeObject *
best_base(PyObject * bases)2161  best_base(PyObject *bases)
2162  {
2163      Py_ssize_t i, n;
2164      PyTypeObject *base, *winner, *candidate, *base_i;
2165      PyObject *base_proto;
2166  
2167      assert(PyTuple_Check(bases));
2168      n = PyTuple_GET_SIZE(bases);
2169      assert(n > 0);
2170      base = NULL;
2171      winner = NULL;
2172      for (i = 0; i < n; i++) {
2173          base_proto = PyTuple_GET_ITEM(bases, i);
2174          if (!PyType_Check(base_proto)) {
2175              PyErr_SetString(
2176                  PyExc_TypeError,
2177                  "bases must be types");
2178              return NULL;
2179          }
2180          base_i = (PyTypeObject *)base_proto;
2181          if (!_PyType_IsReady(base_i)) {
2182              if (PyType_Ready(base_i) < 0)
2183                  return NULL;
2184          }
2185          if (!_PyType_HasFeature(base_i, Py_TPFLAGS_BASETYPE)) {
2186              PyErr_Format(PyExc_TypeError,
2187                           "type '%.100s' is not an acceptable base type",
2188                           base_i->tp_name);
2189              return NULL;
2190          }
2191          candidate = solid_base(base_i);
2192          if (winner == NULL) {
2193              winner = candidate;
2194              base = base_i;
2195          }
2196          else if (PyType_IsSubtype(winner, candidate))
2197              ;
2198          else if (PyType_IsSubtype(candidate, winner)) {
2199              winner = candidate;
2200              base = base_i;
2201          }
2202          else {
2203              PyErr_SetString(
2204                  PyExc_TypeError,
2205                  "multiple bases have "
2206                  "instance lay-out conflict");
2207              return NULL;
2208          }
2209      }
2210      assert (base != NULL);
2211  
2212      return base;
2213  }
2214  
2215  static int
extra_ivars(PyTypeObject * type,PyTypeObject * base)2216  extra_ivars(PyTypeObject *type, PyTypeObject *base)
2217  {
2218      size_t t_size = type->tp_basicsize;
2219      size_t b_size = base->tp_basicsize;
2220  
2221      assert(t_size >= b_size); /* Else type smaller than base! */
2222      if (type->tp_itemsize || base->tp_itemsize) {
2223          /* If itemsize is involved, stricter rules */
2224          return t_size != b_size ||
2225              type->tp_itemsize != base->tp_itemsize;
2226      }
2227      if (type->tp_weaklistoffset && base->tp_weaklistoffset == 0 &&
2228          type->tp_weaklistoffset + sizeof(PyObject *) == t_size &&
2229          type->tp_flags & Py_TPFLAGS_HEAPTYPE)
2230          t_size -= sizeof(PyObject *);
2231      if (type->tp_dictoffset && base->tp_dictoffset == 0 &&
2232          type->tp_dictoffset + sizeof(PyObject *) == t_size &&
2233          type->tp_flags & Py_TPFLAGS_HEAPTYPE)
2234          t_size -= sizeof(PyObject *);
2235  
2236      return t_size != b_size;
2237  }
2238  
2239  static PyTypeObject *
solid_base(PyTypeObject * type)2240  solid_base(PyTypeObject *type)
2241  {
2242      PyTypeObject *base;
2243  
2244      if (type->tp_base)
2245          base = solid_base(type->tp_base);
2246      else
2247          base = &PyBaseObject_Type;
2248      if (extra_ivars(type, base))
2249          return type;
2250      else
2251          return base;
2252  }
2253  
2254  static void object_dealloc(PyObject *);
2255  static int object_init(PyObject *, PyObject *, PyObject *);
2256  static int update_slot(PyTypeObject *, PyObject *);
2257  static void fixup_slot_dispatchers(PyTypeObject *);
2258  static int type_new_set_names(PyTypeObject *);
2259  static int type_new_init_subclass(PyTypeObject *, PyObject *);
2260  
2261  /*
2262   * Helpers for  __dict__ descriptor.  We don't want to expose the dicts
2263   * inherited from various builtin types.  The builtin base usually provides
2264   * its own __dict__ descriptor, so we use that when we can.
2265   */
2266  static PyTypeObject *
get_builtin_base_with_dict(PyTypeObject * type)2267  get_builtin_base_with_dict(PyTypeObject *type)
2268  {
2269      while (type->tp_base != NULL) {
2270          if (type->tp_dictoffset != 0 &&
2271              !(type->tp_flags & Py_TPFLAGS_HEAPTYPE))
2272              return type;
2273          type = type->tp_base;
2274      }
2275      return NULL;
2276  }
2277  
2278  static PyObject *
get_dict_descriptor(PyTypeObject * type)2279  get_dict_descriptor(PyTypeObject *type)
2280  {
2281      PyObject *descr;
2282  
2283      descr = _PyType_LookupId(type, &PyId___dict__);
2284      if (descr == NULL || !PyDescr_IsData(descr))
2285          return NULL;
2286  
2287      return descr;
2288  }
2289  
2290  static void
raise_dict_descr_error(PyObject * obj)2291  raise_dict_descr_error(PyObject *obj)
2292  {
2293      PyErr_Format(PyExc_TypeError,
2294                   "this __dict__ descriptor does not support "
2295                   "'%.200s' objects", Py_TYPE(obj)->tp_name);
2296  }
2297  
2298  static PyObject *
subtype_dict(PyObject * obj,void * context)2299  subtype_dict(PyObject *obj, void *context)
2300  {
2301      PyTypeObject *base;
2302  
2303      base = get_builtin_base_with_dict(Py_TYPE(obj));
2304      if (base != NULL) {
2305          descrgetfunc func;
2306          PyObject *descr = get_dict_descriptor(base);
2307          if (descr == NULL) {
2308              raise_dict_descr_error(obj);
2309              return NULL;
2310          }
2311          func = Py_TYPE(descr)->tp_descr_get;
2312          if (func == NULL) {
2313              raise_dict_descr_error(obj);
2314              return NULL;
2315          }
2316          return func(descr, obj, (PyObject *)(Py_TYPE(obj)));
2317      }
2318      return PyObject_GenericGetDict(obj, context);
2319  }
2320  
2321  static int
subtype_setdict(PyObject * obj,PyObject * value,void * context)2322  subtype_setdict(PyObject *obj, PyObject *value, void *context)
2323  {
2324      PyObject **dictptr;
2325      PyTypeObject *base;
2326  
2327      base = get_builtin_base_with_dict(Py_TYPE(obj));
2328      if (base != NULL) {
2329          descrsetfunc func;
2330          PyObject *descr = get_dict_descriptor(base);
2331          if (descr == NULL) {
2332              raise_dict_descr_error(obj);
2333              return -1;
2334          }
2335          func = Py_TYPE(descr)->tp_descr_set;
2336          if (func == NULL) {
2337              raise_dict_descr_error(obj);
2338              return -1;
2339          }
2340          return func(descr, obj, value);
2341      }
2342      /* Almost like PyObject_GenericSetDict, but allow __dict__ to be deleted. */
2343      dictptr = _PyObject_GetDictPtr(obj);
2344      if (dictptr == NULL) {
2345          PyErr_SetString(PyExc_AttributeError,
2346                          "This object has no __dict__");
2347          return -1;
2348      }
2349      if (value != NULL && !PyDict_Check(value)) {
2350          PyErr_Format(PyExc_TypeError,
2351                       "__dict__ must be set to a dictionary, "
2352                       "not a '%.200s'", Py_TYPE(value)->tp_name);
2353          return -1;
2354      }
2355      Py_XINCREF(value);
2356      Py_XSETREF(*dictptr, value);
2357      return 0;
2358  }
2359  
2360  static PyObject *
subtype_getweakref(PyObject * obj,void * context)2361  subtype_getweakref(PyObject *obj, void *context)
2362  {
2363      PyObject **weaklistptr;
2364      PyObject *result;
2365      PyTypeObject *type = Py_TYPE(obj);
2366  
2367      if (type->tp_weaklistoffset == 0) {
2368          PyErr_SetString(PyExc_AttributeError,
2369                          "This object has no __weakref__");
2370          return NULL;
2371      }
2372      _PyObject_ASSERT((PyObject *)type,
2373                       type->tp_weaklistoffset > 0);
2374      _PyObject_ASSERT((PyObject *)type,
2375                       ((type->tp_weaklistoffset + sizeof(PyObject *))
2376                        <= (size_t)(type->tp_basicsize)));
2377      weaklistptr = (PyObject **)((char *)obj + type->tp_weaklistoffset);
2378      if (*weaklistptr == NULL)
2379          result = Py_None;
2380      else
2381          result = *weaklistptr;
2382      Py_INCREF(result);
2383      return result;
2384  }
2385  
2386  /* Three variants on the subtype_getsets list. */
2387  
2388  static PyGetSetDef subtype_getsets_full[] = {
2389      {"__dict__", subtype_dict, subtype_setdict,
2390       PyDoc_STR("dictionary for instance variables (if defined)")},
2391      {"__weakref__", subtype_getweakref, NULL,
2392       PyDoc_STR("list of weak references to the object (if defined)")},
2393      {0}
2394  };
2395  
2396  static PyGetSetDef subtype_getsets_dict_only[] = {
2397      {"__dict__", subtype_dict, subtype_setdict,
2398       PyDoc_STR("dictionary for instance variables (if defined)")},
2399      {0}
2400  };
2401  
2402  static PyGetSetDef subtype_getsets_weakref_only[] = {
2403      {"__weakref__", subtype_getweakref, NULL,
2404       PyDoc_STR("list of weak references to the object (if defined)")},
2405      {0}
2406  };
2407  
2408  static int
valid_identifier(PyObject * s)2409  valid_identifier(PyObject *s)
2410  {
2411      if (!PyUnicode_Check(s)) {
2412          PyErr_Format(PyExc_TypeError,
2413                       "__slots__ items must be strings, not '%.200s'",
2414                       Py_TYPE(s)->tp_name);
2415          return 0;
2416      }
2417      if (!PyUnicode_IsIdentifier(s)) {
2418          PyErr_SetString(PyExc_TypeError,
2419                          "__slots__ must be identifiers");
2420          return 0;
2421      }
2422      return 1;
2423  }
2424  
2425  /* Forward */
2426  static int
2427  object_init(PyObject *self, PyObject *args, PyObject *kwds);
2428  
2429  static int
type_init(PyObject * cls,PyObject * args,PyObject * kwds)2430  type_init(PyObject *cls, PyObject *args, PyObject *kwds)
2431  {
2432      int res;
2433  
2434      assert(args != NULL && PyTuple_Check(args));
2435      assert(kwds == NULL || PyDict_Check(kwds));
2436  
2437      if (kwds != NULL && PyTuple_Check(args) && PyTuple_GET_SIZE(args) == 1 &&
2438          PyDict_Check(kwds) && PyDict_GET_SIZE(kwds) != 0) {
2439          PyErr_SetString(PyExc_TypeError,
2440                          "type.__init__() takes no keyword arguments");
2441          return -1;
2442      }
2443  
2444      if (args != NULL && PyTuple_Check(args) &&
2445          (PyTuple_GET_SIZE(args) != 1 && PyTuple_GET_SIZE(args) != 3)) {
2446          PyErr_SetString(PyExc_TypeError,
2447                          "type.__init__() takes 1 or 3 arguments");
2448          return -1;
2449      }
2450  
2451      /* Call object.__init__(self) now. */
2452      /* XXX Could call super(type, cls).__init__() but what's the point? */
2453      args = PyTuple_GetSlice(args, 0, 0);
2454      if (args == NULL) {
2455          return -1;
2456      }
2457      res = object_init(cls, args, NULL);
2458      Py_DECREF(args);
2459      return res;
2460  }
2461  
2462  unsigned long
PyType_GetFlags(PyTypeObject * type)2463  PyType_GetFlags(PyTypeObject *type)
2464  {
2465      return type->tp_flags;
2466  }
2467  
2468  /* Determine the most derived metatype. */
2469  PyTypeObject *
_PyType_CalculateMetaclass(PyTypeObject * metatype,PyObject * bases)2470  _PyType_CalculateMetaclass(PyTypeObject *metatype, PyObject *bases)
2471  {
2472      Py_ssize_t i, nbases;
2473      PyTypeObject *winner;
2474      PyObject *tmp;
2475      PyTypeObject *tmptype;
2476  
2477      /* Determine the proper metatype to deal with this,
2478         and check for metatype conflicts while we're at it.
2479         Note that if some other metatype wins to contract,
2480         it's possible that its instances are not types. */
2481  
2482      nbases = PyTuple_GET_SIZE(bases);
2483      winner = metatype;
2484      for (i = 0; i < nbases; i++) {
2485          tmp = PyTuple_GET_ITEM(bases, i);
2486          tmptype = Py_TYPE(tmp);
2487          if (PyType_IsSubtype(winner, tmptype))
2488              continue;
2489          if (PyType_IsSubtype(tmptype, winner)) {
2490              winner = tmptype;
2491              continue;
2492          }
2493          /* else: */
2494          PyErr_SetString(PyExc_TypeError,
2495                          "metaclass conflict: "
2496                          "the metaclass of a derived class "
2497                          "must be a (non-strict) subclass "
2498                          "of the metaclasses of all its bases");
2499          return NULL;
2500      }
2501      return winner;
2502  }
2503  
2504  
2505  // Forward declaration
2506  static PyObject *
2507  type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds);
2508  
2509  typedef struct {
2510      PyTypeObject *metatype;
2511      PyObject *args;
2512      PyObject *kwds;
2513      PyObject *orig_dict;
2514      PyObject *name;
2515      PyObject *bases;
2516      PyTypeObject *base;
2517      PyObject *slots;
2518      Py_ssize_t nslot;
2519      int add_dict;
2520      int add_weak;
2521      int may_add_dict;
2522      int may_add_weak;
2523  } type_new_ctx;
2524  
2525  
2526  /* Check for valid slot names and two special cases */
2527  static int
type_new_visit_slots(type_new_ctx * ctx)2528  type_new_visit_slots(type_new_ctx *ctx)
2529  {
2530      PyObject *slots = ctx->slots;
2531      Py_ssize_t nslot = ctx->nslot;
2532      for (Py_ssize_t i = 0; i < nslot; i++) {
2533          PyObject *name = PyTuple_GET_ITEM(slots, i);
2534          if (!valid_identifier(name)) {
2535              return -1;
2536          }
2537          assert(PyUnicode_Check(name));
2538          if (_PyUnicode_EqualToASCIIId(name, &PyId___dict__)) {
2539              if (!ctx->may_add_dict || ctx->add_dict != 0) {
2540                  PyErr_SetString(PyExc_TypeError,
2541                      "__dict__ slot disallowed: "
2542                      "we already got one");
2543                  return -1;
2544              }
2545              ctx->add_dict++;
2546          }
2547          if (_PyUnicode_EqualToASCIIId(name, &PyId___weakref__)) {
2548              if (!ctx->may_add_weak || ctx->add_weak != 0) {
2549                  PyErr_SetString(PyExc_TypeError,
2550                      "__weakref__ slot disallowed: "
2551                      "either we already got one, "
2552                      "or __itemsize__ != 0");
2553                  return -1;
2554              }
2555              ctx->add_weak++;
2556          }
2557      }
2558      return 0;
2559  }
2560  
2561  
2562  /* Copy slots into a list, mangle names and sort them.
2563     Sorted names are needed for __class__ assignment.
2564     Convert them back to tuple at the end.
2565  */
2566  static PyObject*
type_new_copy_slots(type_new_ctx * ctx,PyObject * dict)2567  type_new_copy_slots(type_new_ctx *ctx, PyObject *dict)
2568  {
2569      PyObject *slots = ctx->slots;
2570      Py_ssize_t nslot = ctx->nslot;
2571  
2572      Py_ssize_t new_nslot = nslot - ctx->add_dict - ctx->add_weak;
2573      PyObject *new_slots = PyList_New(new_nslot);
2574      if (new_slots == NULL) {
2575          return NULL;
2576      }
2577  
2578      Py_ssize_t j = 0;
2579      for (Py_ssize_t i = 0; i < nslot; i++) {
2580          PyObject *slot = PyTuple_GET_ITEM(slots, i);
2581          if ((ctx->add_dict &&
2582               _PyUnicode_EqualToASCIIId(slot, &PyId___dict__)) ||
2583              (ctx->add_weak &&
2584               _PyUnicode_EqualToASCIIString(slot, "__weakref__")))
2585          {
2586              continue;
2587          }
2588  
2589          slot =_Py_Mangle(ctx->name, slot);
2590          if (!slot) {
2591              goto error;
2592          }
2593          PyList_SET_ITEM(new_slots, j, slot);
2594  
2595          int r = PyDict_Contains(dict, slot);
2596          if (r < 0) {
2597              goto error;
2598          }
2599          if (r > 0) {
2600              /* CPython inserts __qualname__ and __classcell__ (when needed)
2601                 into the namespace when creating a class.  They will be deleted
2602                 below so won't act as class variables. */
2603              if (!_PyUnicode_EqualToASCIIId(slot, &PyId___qualname__) &&
2604                  !_PyUnicode_EqualToASCIIId(slot, &PyId___classcell__))
2605              {
2606                  PyErr_Format(PyExc_ValueError,
2607                               "%R in __slots__ conflicts with class variable",
2608                               slot);
2609                  goto error;
2610              }
2611          }
2612  
2613          j++;
2614      }
2615      assert(j == new_nslot);
2616  
2617      if (PyList_Sort(new_slots) == -1) {
2618          goto error;
2619      }
2620  
2621      PyObject *tuple = PyList_AsTuple(new_slots);
2622      Py_DECREF(new_slots);
2623      if (tuple == NULL) {
2624          return NULL;
2625      }
2626  
2627      assert(PyTuple_GET_SIZE(tuple) == new_nslot);
2628      return tuple;
2629  
2630  error:
2631      Py_DECREF(new_slots);
2632      return NULL;
2633  }
2634  
2635  
2636  static void
type_new_slots_bases(type_new_ctx * ctx)2637  type_new_slots_bases(type_new_ctx *ctx)
2638  {
2639      Py_ssize_t nbases = PyTuple_GET_SIZE(ctx->bases);
2640      if (nbases > 1 &&
2641          ((ctx->may_add_dict && ctx->add_dict == 0) ||
2642           (ctx->may_add_weak && ctx->add_weak == 0)))
2643      {
2644          for (Py_ssize_t i = 0; i < nbases; i++) {
2645              PyObject *base = PyTuple_GET_ITEM(ctx->bases, i);
2646              if (base == (PyObject *)ctx->base) {
2647                  /* Skip primary base */
2648                  continue;
2649              }
2650  
2651              assert(PyType_Check(base));
2652              PyTypeObject *type = (PyTypeObject *)base;
2653              if (ctx->may_add_dict && ctx->add_dict == 0 &&
2654                  type->tp_dictoffset != 0)
2655              {
2656                  ctx->add_dict++;
2657              }
2658              if (ctx->may_add_weak && ctx->add_weak == 0 &&
2659                  type->tp_weaklistoffset != 0)
2660              {
2661                  ctx->add_weak++;
2662              }
2663              if (ctx->may_add_dict && ctx->add_dict == 0) {
2664                  continue;
2665              }
2666              if (ctx->may_add_weak && ctx->add_weak == 0) {
2667                  continue;
2668              }
2669              /* Nothing more to check */
2670              break;
2671          }
2672      }
2673  }
2674  
2675  
2676  static int
type_new_slots_impl(type_new_ctx * ctx,PyObject * dict)2677  type_new_slots_impl(type_new_ctx *ctx, PyObject *dict)
2678  {
2679      /* Are slots allowed? */
2680      if (ctx->nslot > 0 && ctx->base->tp_itemsize != 0) {
2681          PyErr_Format(PyExc_TypeError,
2682                       "nonempty __slots__ not supported for subtype of '%s'",
2683                       ctx->base->tp_name);
2684          return -1;
2685      }
2686  
2687      if (type_new_visit_slots(ctx) < 0) {
2688          return -1;
2689      }
2690  
2691      PyObject *new_slots = type_new_copy_slots(ctx, dict);
2692      if (new_slots == NULL) {
2693          return -1;
2694      }
2695      assert(PyTuple_CheckExact(new_slots));
2696  
2697      Py_XSETREF(ctx->slots, new_slots);
2698      ctx->nslot = PyTuple_GET_SIZE(new_slots);
2699  
2700      /* Secondary bases may provide weakrefs or dict */
2701      type_new_slots_bases(ctx);
2702      return 0;
2703  }
2704  
2705  
2706  static Py_ssize_t
type_new_slots(type_new_ctx * ctx,PyObject * dict)2707  type_new_slots(type_new_ctx *ctx, PyObject *dict)
2708  {
2709      // Check for a __slots__ sequence variable in dict, and count it
2710      ctx->add_dict = 0;
2711      ctx->add_weak = 0;
2712      ctx->may_add_dict = (ctx->base->tp_dictoffset == 0);
2713      ctx->may_add_weak = (ctx->base->tp_weaklistoffset == 0
2714                           && ctx->base->tp_itemsize == 0);
2715  
2716      if (ctx->slots == NULL) {
2717          if (ctx->may_add_dict) {
2718              ctx->add_dict++;
2719          }
2720          if (ctx->may_add_weak) {
2721              ctx->add_weak++;
2722          }
2723      }
2724      else {
2725          /* Have slots */
2726          if (type_new_slots_impl(ctx, dict) < 0) {
2727              return -1;
2728          }
2729      }
2730      return 0;
2731  }
2732  
2733  
2734  static PyTypeObject*
type_new_alloc(type_new_ctx * ctx)2735  type_new_alloc(type_new_ctx *ctx)
2736  {
2737      PyTypeObject *metatype = ctx->metatype;
2738      PyTypeObject *type;
2739  
2740      // Allocate the type object
2741      type = (PyTypeObject *)metatype->tp_alloc(metatype, ctx->nslot);
2742      if (type == NULL) {
2743          return NULL;
2744      }
2745      PyHeapTypeObject *et = (PyHeapTypeObject *)type;
2746  
2747      // Initialize tp_flags.
2748      // All heap types need GC, since we can create a reference cycle by storing
2749      // an instance on one of its parents.
2750      type->tp_flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE |
2751                        Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC);
2752  
2753      // Initialize essential fields
2754      type->tp_as_async = &et->as_async;
2755      type->tp_as_number = &et->as_number;
2756      type->tp_as_sequence = &et->as_sequence;
2757      type->tp_as_mapping = &et->as_mapping;
2758      type->tp_as_buffer = &et->as_buffer;
2759  
2760      type->tp_bases = Py_NewRef(ctx->bases);
2761      type->tp_base = (PyTypeObject *)Py_NewRef(ctx->base);
2762  
2763      type->tp_dealloc = subtype_dealloc;
2764      /* Always override allocation strategy to use regular heap */
2765      type->tp_alloc = PyType_GenericAlloc;
2766      type->tp_free = PyObject_GC_Del;
2767  
2768      type->tp_traverse = subtype_traverse;
2769      type->tp_clear = subtype_clear;
2770  
2771      et->ht_name = Py_NewRef(ctx->name);
2772      et->ht_module = NULL;
2773  
2774      return type;
2775  }
2776  
2777  
2778  static int
type_new_set_name(const type_new_ctx * ctx,PyTypeObject * type)2779  type_new_set_name(const type_new_ctx *ctx, PyTypeObject *type)
2780  {
2781      Py_ssize_t name_size;
2782      type->tp_name = PyUnicode_AsUTF8AndSize(ctx->name, &name_size);
2783      if (!type->tp_name) {
2784          return -1;
2785      }
2786      if (strlen(type->tp_name) != (size_t)name_size) {
2787          PyErr_SetString(PyExc_ValueError,
2788                          "type name must not contain null characters");
2789          return -1;
2790      }
2791      return 0;
2792  }
2793  
2794  
2795  /* Set __module__ in the dict */
2796  static int
type_new_set_module(PyTypeObject * type)2797  type_new_set_module(PyTypeObject *type)
2798  {
2799      int r = _PyDict_ContainsId(type->tp_dict, &PyId___module__);
2800      if (r < 0) {
2801          return -1;
2802      }
2803      if (r > 0) {
2804          return 0;
2805      }
2806  
2807      PyObject *globals = PyEval_GetGlobals();
2808      if (globals == NULL) {
2809          return 0;
2810      }
2811  
2812      PyObject *module = _PyDict_GetItemIdWithError(globals, &PyId___name__);
2813      if (module == NULL) {
2814          if (PyErr_Occurred()) {
2815              return -1;
2816          }
2817          return 0;
2818      }
2819  
2820      if (_PyDict_SetItemId(type->tp_dict, &PyId___module__, module) < 0) {
2821          return -1;
2822      }
2823      return 0;
2824  }
2825  
2826  
2827  /* Set ht_qualname to dict['__qualname__'] if available, else to
2828     __name__.  The __qualname__ accessor will look for ht_qualname. */
2829  static int
type_new_set_ht_name(PyTypeObject * type)2830  type_new_set_ht_name(PyTypeObject *type)
2831  {
2832      PyHeapTypeObject *et = (PyHeapTypeObject *)type;
2833      PyObject *qualname = _PyDict_GetItemIdWithError(type->tp_dict,
2834                                                      &PyId___qualname__);
2835      if (qualname != NULL) {
2836          if (!PyUnicode_Check(qualname)) {
2837              PyErr_Format(PyExc_TypeError,
2838                      "type __qualname__ must be a str, not %s",
2839                      Py_TYPE(qualname)->tp_name);
2840              return -1;
2841          }
2842          et->ht_qualname = Py_NewRef(qualname);
2843          if (_PyDict_DelItemId(type->tp_dict, &PyId___qualname__) < 0) {
2844              return -1;
2845          }
2846      }
2847      else {
2848          if (PyErr_Occurred()) {
2849              return -1;
2850          }
2851          et->ht_qualname = Py_NewRef(et->ht_name);
2852      }
2853      return 0;
2854  }
2855  
2856  
2857  /* Set tp_doc to a copy of dict['__doc__'], if the latter is there
2858     and is a string.  The __doc__ accessor will first look for tp_doc;
2859     if that fails, it will still look into __dict__. */
2860  static int
type_new_set_doc(PyTypeObject * type)2861  type_new_set_doc(PyTypeObject *type)
2862  {
2863      PyObject *doc = _PyDict_GetItemIdWithError(type->tp_dict, &PyId___doc__);
2864      if (doc == NULL) {
2865          if (PyErr_Occurred()) {
2866              return -1;
2867          }
2868          // no __doc__ key
2869          return 0;
2870      }
2871      if (!PyUnicode_Check(doc)) {
2872          // ignore non-string __doc__
2873          return 0;
2874      }
2875  
2876      const char *doc_str = PyUnicode_AsUTF8(doc);
2877      if (doc_str == NULL) {
2878          return -1;
2879      }
2880  
2881      // Silently truncate the docstring if it contains a null byte
2882      Py_ssize_t size = strlen(doc_str) + 1;
2883      char *tp_doc = (char *)PyObject_Malloc(size);
2884      if (tp_doc == NULL) {
2885          PyErr_NoMemory();
2886          return -1;
2887      }
2888  
2889      memcpy(tp_doc, doc_str, size);
2890      type->tp_doc = tp_doc;
2891      return 0;
2892  }
2893  
2894  
2895  static int
type_new_staticmethod(PyTypeObject * type,_Py_Identifier * attr_id)2896  type_new_staticmethod(PyTypeObject *type, _Py_Identifier *attr_id)
2897  {
2898      PyObject *func = _PyDict_GetItemIdWithError(type->tp_dict, attr_id);
2899      if (func == NULL) {
2900          if (PyErr_Occurred()) {
2901              return -1;
2902          }
2903          return 0;
2904      }
2905      if (!PyFunction_Check(func)) {
2906          return 0;
2907      }
2908  
2909      PyObject *static_func = PyStaticMethod_New(func);
2910      if (static_func == NULL) {
2911          return -1;
2912      }
2913      if (_PyDict_SetItemId(type->tp_dict, attr_id, static_func) < 0) {
2914          Py_DECREF(static_func);
2915          return -1;
2916      }
2917      Py_DECREF(static_func);
2918      return 0;
2919  }
2920  
2921  
2922  static int
type_new_classmethod(PyTypeObject * type,_Py_Identifier * attr_id)2923  type_new_classmethod(PyTypeObject *type, _Py_Identifier *attr_id)
2924  {
2925      PyObject *func = _PyDict_GetItemIdWithError(type->tp_dict, attr_id);
2926      if (func == NULL) {
2927          if (PyErr_Occurred()) {
2928              return -1;
2929          }
2930          return 0;
2931      }
2932      if (!PyFunction_Check(func)) {
2933          return 0;
2934      }
2935  
2936      PyObject *method = PyClassMethod_New(func);
2937      if (method == NULL) {
2938          return -1;
2939      }
2940  
2941      if (_PyDict_SetItemId(type->tp_dict, attr_id, method) < 0) {
2942          Py_DECREF(method);
2943          return -1;
2944      }
2945      Py_DECREF(method);
2946      return 0;
2947  }
2948  
2949  
2950  /* Add descriptors for custom slots from __slots__, or for __dict__ */
2951  static int
type_new_descriptors(const type_new_ctx * ctx,PyTypeObject * type)2952  type_new_descriptors(const type_new_ctx *ctx, PyTypeObject *type)
2953  {
2954      PyHeapTypeObject *et = (PyHeapTypeObject *)type;
2955      Py_ssize_t slotoffset = ctx->base->tp_basicsize;
2956      if (et->ht_slots != NULL) {
2957          PyMemberDef *mp = PyHeapType_GET_MEMBERS(et);
2958          Py_ssize_t nslot = PyTuple_GET_SIZE(et->ht_slots);
2959          for (Py_ssize_t i = 0; i < nslot; i++, mp++) {
2960              mp->name = PyUnicode_AsUTF8(
2961                  PyTuple_GET_ITEM(et->ht_slots, i));
2962              if (mp->name == NULL) {
2963                  return -1;
2964              }
2965              mp->type = T_OBJECT_EX;
2966              mp->offset = slotoffset;
2967  
2968              /* __dict__ and __weakref__ are already filtered out */
2969              assert(strcmp(mp->name, "__dict__") != 0);
2970              assert(strcmp(mp->name, "__weakref__") != 0);
2971  
2972              slotoffset += sizeof(PyObject *);
2973          }
2974      }
2975  
2976      if (ctx->add_dict) {
2977          if (ctx->base->tp_itemsize) {
2978              type->tp_dictoffset = -(long)sizeof(PyObject *);
2979          }
2980          else {
2981              type->tp_dictoffset = slotoffset;
2982          }
2983          slotoffset += sizeof(PyObject *);
2984      }
2985  
2986      if (ctx->add_weak) {
2987          assert(!ctx->base->tp_itemsize);
2988          type->tp_weaklistoffset = slotoffset;
2989          slotoffset += sizeof(PyObject *);
2990      }
2991  
2992      type->tp_basicsize = slotoffset;
2993      type->tp_itemsize = ctx->base->tp_itemsize;
2994      type->tp_members = PyHeapType_GET_MEMBERS(et);
2995      return 0;
2996  }
2997  
2998  
2999  static void
type_new_set_slots(const type_new_ctx * ctx,PyTypeObject * type)3000  type_new_set_slots(const type_new_ctx *ctx, PyTypeObject *type)
3001  {
3002      if (type->tp_weaklistoffset && type->tp_dictoffset) {
3003          type->tp_getset = subtype_getsets_full;
3004      }
3005      else if (type->tp_weaklistoffset && !type->tp_dictoffset) {
3006          type->tp_getset = subtype_getsets_weakref_only;
3007      }
3008      else if (!type->tp_weaklistoffset && type->tp_dictoffset) {
3009          type->tp_getset = subtype_getsets_dict_only;
3010      }
3011      else {
3012          type->tp_getset = NULL;
3013      }
3014  
3015      /* Special case some slots */
3016      if (type->tp_dictoffset != 0 || ctx->nslot > 0) {
3017          PyTypeObject *base = ctx->base;
3018          if (base->tp_getattr == NULL && base->tp_getattro == NULL) {
3019              type->tp_getattro = PyObject_GenericGetAttr;
3020          }
3021          if (base->tp_setattr == NULL && base->tp_setattro == NULL) {
3022              type->tp_setattro = PyObject_GenericSetAttr;
3023          }
3024      }
3025  }
3026  
3027  
3028  /* store type in class' cell if one is supplied */
3029  static int
type_new_set_classcell(PyTypeObject * type)3030  type_new_set_classcell(PyTypeObject *type)
3031  {
3032      PyObject *cell = _PyDict_GetItemIdWithError(type->tp_dict,
3033                                                  &PyId___classcell__);
3034      if (cell == NULL) {
3035          if (PyErr_Occurred()) {
3036              return -1;
3037          }
3038          return 0;
3039      }
3040  
3041      /* At least one method requires a reference to its defining class */
3042      if (!PyCell_Check(cell)) {
3043          PyErr_Format(PyExc_TypeError,
3044                       "__classcell__ must be a nonlocal cell, not %.200R",
3045                       Py_TYPE(cell));
3046          return -1;
3047      }
3048  
3049      (void)PyCell_Set(cell, (PyObject *) type);
3050      if (_PyDict_DelItemId(type->tp_dict, &PyId___classcell__) < 0) {
3051          return -1;
3052      }
3053      return 0;
3054  }
3055  
3056  
3057  static int
type_new_set_attrs(const type_new_ctx * ctx,PyTypeObject * type)3058  type_new_set_attrs(const type_new_ctx *ctx, PyTypeObject *type)
3059  {
3060      if (type_new_set_name(ctx, type) < 0) {
3061          return -1;
3062      }
3063  
3064      if (type_new_set_module(type) < 0) {
3065          return -1;
3066      }
3067  
3068      if (type_new_set_ht_name(type) < 0) {
3069          return -1;
3070      }
3071  
3072      if (type_new_set_doc(type) < 0) {
3073          return -1;
3074      }
3075  
3076      /* Special-case __new__: if it's a plain function,
3077         make it a static function */
3078      if (type_new_staticmethod(type, &PyId___new__) < 0) {
3079          return -1;
3080      }
3081  
3082      /* Special-case __init_subclass__ and __class_getitem__:
3083         if they are plain functions, make them classmethods */
3084      if (type_new_classmethod(type, &PyId___init_subclass__) < 0) {
3085          return -1;
3086      }
3087      if (type_new_classmethod(type, &PyId___class_getitem__) < 0) {
3088          return -1;
3089      }
3090  
3091      if (type_new_descriptors(ctx, type) < 0) {
3092          return -1;
3093      }
3094  
3095      type_new_set_slots(ctx, type);
3096  
3097      if (type_new_set_classcell(type) < 0) {
3098          return -1;
3099      }
3100      return 0;
3101  }
3102  
3103  
3104  static int
type_new_get_slots(type_new_ctx * ctx,PyObject * dict)3105  type_new_get_slots(type_new_ctx *ctx, PyObject *dict)
3106  {
3107      _Py_IDENTIFIER(__slots__);
3108      PyObject *slots = _PyDict_GetItemIdWithError(dict, &PyId___slots__);
3109      if (slots == NULL) {
3110          if (PyErr_Occurred()) {
3111              return -1;
3112          }
3113          ctx->slots = NULL;
3114          ctx->nslot = 0;
3115          return 0;
3116      }
3117  
3118      // Make it into a tuple
3119      PyObject *new_slots;
3120      if (PyUnicode_Check(slots)) {
3121          new_slots = PyTuple_Pack(1, slots);
3122      }
3123      else {
3124          new_slots = PySequence_Tuple(slots);
3125      }
3126      if (new_slots == NULL) {
3127          return -1;
3128      }
3129      assert(PyTuple_CheckExact(new_slots));
3130      ctx->slots = new_slots;
3131      ctx->nslot = PyTuple_GET_SIZE(new_slots);
3132      return 0;
3133  }
3134  
3135  
3136  static PyTypeObject*
type_new_init(type_new_ctx * ctx)3137  type_new_init(type_new_ctx *ctx)
3138  {
3139      PyObject *dict = PyDict_Copy(ctx->orig_dict);
3140      if (dict == NULL) {
3141          goto error;
3142      }
3143  
3144      if (type_new_get_slots(ctx, dict) < 0) {
3145          goto error;
3146      }
3147      assert(!PyErr_Occurred());
3148  
3149      if (type_new_slots(ctx, dict) < 0) {
3150          goto error;
3151      }
3152  
3153      PyTypeObject *type = type_new_alloc(ctx);
3154      if (type == NULL) {
3155          goto error;
3156      }
3157  
3158      type->tp_dict = dict;
3159  
3160      PyHeapTypeObject *et = (PyHeapTypeObject*)type;
3161      et->ht_slots = ctx->slots;
3162      ctx->slots = NULL;
3163  
3164      return type;
3165  
3166  error:
3167      Py_CLEAR(ctx->slots);
3168      Py_XDECREF(dict);
3169      return NULL;
3170  }
3171  
3172  
3173  static PyObject*
type_new_impl(type_new_ctx * ctx)3174  type_new_impl(type_new_ctx *ctx)
3175  {
3176      PyTypeObject *type = type_new_init(ctx);
3177      if (type == NULL) {
3178          return NULL;
3179      }
3180  
3181      if (type_new_set_attrs(ctx, type) < 0) {
3182          goto error;
3183      }
3184  
3185      /* Initialize the rest */
3186      if (PyType_Ready(type) < 0) {
3187          goto error;
3188      }
3189  
3190      // Put the proper slots in place
3191      fixup_slot_dispatchers(type);
3192  
3193      if (type->tp_dictoffset) {
3194          PyHeapTypeObject *et = (PyHeapTypeObject*)type;
3195          et->ht_cached_keys = _PyDict_NewKeysForClass();
3196      }
3197  
3198      if (type_new_set_names(type) < 0) {
3199          goto error;
3200      }
3201  
3202      if (type_new_init_subclass(type, ctx->kwds) < 0) {
3203          goto error;
3204      }
3205  
3206      assert(_PyType_CheckConsistency(type));
3207      return (PyObject *)type;
3208  
3209  error:
3210      Py_DECREF(type);
3211      return NULL;
3212  }
3213  
3214  
3215  static int
type_new_get_bases(type_new_ctx * ctx,PyObject ** type)3216  type_new_get_bases(type_new_ctx *ctx, PyObject **type)
3217  {
3218      Py_ssize_t nbases = PyTuple_GET_SIZE(ctx->bases);
3219      if (nbases == 0) {
3220          // Adjust for empty tuple bases
3221          ctx->base = &PyBaseObject_Type;
3222          PyObject *new_bases = PyTuple_Pack(1, ctx->base);
3223          if (new_bases == NULL) {
3224              return -1;
3225          }
3226          ctx->bases = new_bases;
3227          return 0;
3228      }
3229  
3230      _Py_IDENTIFIER(__mro_entries__);
3231      for (Py_ssize_t i = 0; i < nbases; i++) {
3232          PyObject *base = PyTuple_GET_ITEM(ctx->bases, i);
3233          if (PyType_Check(base)) {
3234              continue;
3235          }
3236          PyObject *mro_entries;
3237          if (_PyObject_LookupAttrId(base, &PyId___mro_entries__,
3238                                     &mro_entries) < 0) {
3239              return -1;
3240          }
3241          if (mro_entries != NULL) {
3242              PyErr_SetString(PyExc_TypeError,
3243                              "type() doesn't support MRO entry resolution; "
3244                              "use types.new_class()");
3245              Py_DECREF(mro_entries);
3246              return -1;
3247          }
3248      }
3249  
3250      // Search the bases for the proper metatype to deal with this
3251      PyTypeObject *winner;
3252      winner = _PyType_CalculateMetaclass(ctx->metatype, ctx->bases);
3253      if (winner == NULL) {
3254          return -1;
3255      }
3256  
3257      if (winner != ctx->metatype) {
3258          if (winner->tp_new != type_new) {
3259              /* Pass it to the winner */
3260              *type = winner->tp_new(winner, ctx->args, ctx->kwds);
3261              if (*type == NULL) {
3262                  return -1;
3263              }
3264              return 1;
3265          }
3266  
3267          ctx->metatype = winner;
3268      }
3269  
3270      /* Calculate best base, and check that all bases are type objects */
3271      PyTypeObject *base = best_base(ctx->bases);
3272      if (base == NULL) {
3273          return -1;
3274      }
3275  
3276      ctx->base = base;
3277      ctx->bases = Py_NewRef(ctx->bases);
3278      return 0;
3279  }
3280  
3281  
3282  static PyObject *
type_new(PyTypeObject * metatype,PyObject * args,PyObject * kwds)3283  type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
3284  {
3285      assert(args != NULL && PyTuple_Check(args));
3286      assert(kwds == NULL || PyDict_Check(kwds));
3287  
3288      /* Parse arguments: (name, bases, dict) */
3289      PyObject *name, *bases, *orig_dict;
3290      if (!PyArg_ParseTuple(args, "UO!O!:type.__new__",
3291                            &name,
3292                            &PyTuple_Type, &bases,
3293                            &PyDict_Type, &orig_dict))
3294      {
3295          return NULL;
3296      }
3297  
3298      type_new_ctx ctx = {
3299          .metatype = metatype,
3300          .args = args,
3301          .kwds = kwds,
3302          .orig_dict = orig_dict,
3303          .name = name,
3304          .bases = bases,
3305          .base = NULL,
3306          .slots = NULL,
3307          .nslot = 0,
3308          .add_dict = 0,
3309          .add_weak = 0,
3310          .may_add_dict = 0,
3311          .may_add_weak = 0};
3312      PyObject *type = NULL;
3313      int res = type_new_get_bases(&ctx, &type);
3314      if (res < 0) {
3315          assert(PyErr_Occurred());
3316          return NULL;
3317      }
3318      if (res == 1) {
3319          assert(type != NULL);
3320          return type;
3321      }
3322      assert(ctx.base != NULL);
3323      assert(ctx.bases != NULL);
3324  
3325      type = type_new_impl(&ctx);
3326      Py_DECREF(ctx.bases);
3327      return type;
3328  }
3329  
3330  
3331  static PyObject *
type_vectorcall(PyObject * metatype,PyObject * const * args,size_t nargsf,PyObject * kwnames)3332  type_vectorcall(PyObject *metatype, PyObject *const *args,
3333                   size_t nargsf, PyObject *kwnames)
3334  {
3335      Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
3336      if (nargs == 1 && metatype == (PyObject *)&PyType_Type){
3337          if (!_PyArg_NoKwnames("type", kwnames)) {
3338              return NULL;
3339          }
3340          return Py_NewRef(Py_TYPE(args[0]));
3341      }
3342      /* In other (much less common) cases, fall back to
3343         more flexible calling conventions. */
3344      PyThreadState *tstate = PyThreadState_GET();
3345      return _PyObject_MakeTpCall(tstate, metatype, args, nargs, kwnames);
3346  }
3347  
3348  /* An array of type slot offsets corresponding to Py_tp_* constants,
3349    * for use in e.g. PyType_Spec and PyType_GetSlot.
3350    * Each entry has two offsets: "slot_offset" and "subslot_offset".
3351    * If is subslot_offset is -1, slot_offset is an offset within the
3352    * PyTypeObject struct.
3353    * Otherwise slot_offset is an offset to a pointer to a sub-slots struct
3354    * (such as "tp_as_number"), and subslot_offset is the offset within
3355    * that struct.
3356    * The actual table is generated by a script.
3357    */
3358  static const PySlot_Offset pyslot_offsets[] = {
3359      {0, 0},
3360  #include "typeslots.inc"
3361  };
3362  
3363  PyObject *
PyType_FromSpecWithBases(PyType_Spec * spec,PyObject * bases)3364  PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
3365  {
3366      return PyType_FromModuleAndSpec(NULL, spec, bases);
3367  }
3368  
3369  PyObject *
PyType_FromModuleAndSpec(PyObject * module,PyType_Spec * spec,PyObject * bases)3370  PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)
3371  {
3372      PyHeapTypeObject *res;
3373      PyObject *modname;
3374      PyTypeObject *type, *base;
3375      int r;
3376  
3377      const PyType_Slot *slot;
3378      Py_ssize_t nmembers, weaklistoffset, dictoffset, vectorcalloffset;
3379      char *res_start;
3380      short slot_offset, subslot_offset;
3381  
3382      nmembers = weaklistoffset = dictoffset = vectorcalloffset = 0;
3383      for (slot = spec->slots; slot->slot; slot++) {
3384          if (slot->slot == Py_tp_members) {
3385              nmembers = 0;
3386              for (const PyMemberDef *memb = slot->pfunc; memb->name != NULL; memb++) {
3387                  nmembers++;
3388                  if (strcmp(memb->name, "__weaklistoffset__") == 0) {
3389                      // The PyMemberDef must be a Py_ssize_t and readonly
3390                      assert(memb->type == T_PYSSIZET);
3391                      assert(memb->flags == READONLY);
3392                      weaklistoffset = memb->offset;
3393                  }
3394                  if (strcmp(memb->name, "__dictoffset__") == 0) {
3395                      // The PyMemberDef must be a Py_ssize_t and readonly
3396                      assert(memb->type == T_PYSSIZET);
3397                      assert(memb->flags == READONLY);
3398                      dictoffset = memb->offset;
3399                  }
3400                  if (strcmp(memb->name, "__vectorcalloffset__") == 0) {
3401                      // The PyMemberDef must be a Py_ssize_t and readonly
3402                      assert(memb->type == T_PYSSIZET);
3403                      assert(memb->flags == READONLY);
3404                      vectorcalloffset = memb->offset;
3405                  }
3406              }
3407          }
3408      }
3409  
3410      res = (PyHeapTypeObject*)PyType_GenericAlloc(&PyType_Type, nmembers);
3411      if (res == NULL)
3412          return NULL;
3413      res_start = (char*)res;
3414  
3415      if (spec->name == NULL) {
3416          PyErr_SetString(PyExc_SystemError,
3417                          "Type spec does not define the name field.");
3418          goto fail;
3419      }
3420  
3421      /* Set the type name and qualname */
3422      const char *s = strrchr(spec->name, '.');
3423      if (s == NULL)
3424          s = spec->name;
3425      else
3426          s++;
3427  
3428      type = &res->ht_type;
3429      /* The flags must be initialized early, before the GC traverses us */
3430      type->tp_flags = spec->flags | Py_TPFLAGS_HEAPTYPE;
3431      res->ht_name = PyUnicode_FromString(s);
3432      if (!res->ht_name)
3433          goto fail;
3434      res->ht_qualname = res->ht_name;
3435      Py_INCREF(res->ht_qualname);
3436      type->tp_name = spec->name;
3437  
3438      Py_XINCREF(module);
3439      res->ht_module = module;
3440  
3441      /* Adjust for empty tuple bases */
3442      if (!bases) {
3443          base = &PyBaseObject_Type;
3444          /* See whether Py_tp_base(s) was specified */
3445          for (slot = spec->slots; slot->slot; slot++) {
3446              if (slot->slot == Py_tp_base)
3447                  base = slot->pfunc;
3448              else if (slot->slot == Py_tp_bases) {
3449                  bases = slot->pfunc;
3450              }
3451          }
3452          if (!bases) {
3453              bases = PyTuple_Pack(1, base);
3454              if (!bases)
3455                  goto fail;
3456          }
3457          else if (!PyTuple_Check(bases)) {
3458              PyErr_SetString(PyExc_SystemError, "Py_tp_bases is not a tuple");
3459              goto fail;
3460          }
3461          else {
3462              Py_INCREF(bases);
3463          }
3464      }
3465      else if (!PyTuple_Check(bases)) {
3466          bases = PyTuple_Pack(1, bases);
3467          if (!bases)
3468              goto fail;
3469      }
3470      else {
3471          Py_INCREF(bases);
3472      }
3473  
3474      /* Calculate best base, and check that all bases are type objects */
3475      base = best_base(bases);
3476      if (base == NULL) {
3477          Py_DECREF(bases);
3478          goto fail;
3479      }
3480      if (!_PyType_HasFeature(base, Py_TPFLAGS_BASETYPE)) {
3481          PyErr_Format(PyExc_TypeError,
3482                       "type '%.100s' is not an acceptable base type",
3483                       base->tp_name);
3484          Py_DECREF(bases);
3485          goto fail;
3486      }
3487  
3488      /* Initialize essential fields */
3489      type->tp_as_async = &res->as_async;
3490      type->tp_as_number = &res->as_number;
3491      type->tp_as_sequence = &res->as_sequence;
3492      type->tp_as_mapping = &res->as_mapping;
3493      type->tp_as_buffer = &res->as_buffer;
3494      /* Set tp_base and tp_bases */
3495      type->tp_bases = bases;
3496      Py_INCREF(base);
3497      type->tp_base = base;
3498  
3499      type->tp_basicsize = spec->basicsize;
3500      type->tp_itemsize = spec->itemsize;
3501  
3502      for (slot = spec->slots; slot->slot; slot++) {
3503          if (slot->slot < 0
3504              || (size_t)slot->slot >= Py_ARRAY_LENGTH(pyslot_offsets)) {
3505              PyErr_SetString(PyExc_RuntimeError, "invalid slot offset");
3506              goto fail;
3507          }
3508          else if (slot->slot == Py_tp_base || slot->slot == Py_tp_bases) {
3509              /* Processed above */
3510              continue;
3511          }
3512          else if (slot->slot == Py_tp_doc) {
3513              /* For the docstring slot, which usually points to a static string
3514                 literal, we need to make a copy */
3515              if (slot->pfunc == NULL) {
3516                  type->tp_doc = NULL;
3517                  continue;
3518              }
3519              size_t len = strlen(slot->pfunc)+1;
3520              char *tp_doc = PyObject_Malloc(len);
3521              if (tp_doc == NULL) {
3522                  type->tp_doc = NULL;
3523                  PyErr_NoMemory();
3524                  goto fail;
3525              }
3526              memcpy(tp_doc, slot->pfunc, len);
3527              type->tp_doc = tp_doc;
3528          }
3529          else if (slot->slot == Py_tp_members) {
3530              /* Move the slots to the heap type itself */
3531              size_t len = Py_TYPE(type)->tp_itemsize * nmembers;
3532              memcpy(PyHeapType_GET_MEMBERS(res), slot->pfunc, len);
3533              type->tp_members = PyHeapType_GET_MEMBERS(res);
3534          }
3535          else {
3536              /* Copy other slots directly */
3537              PySlot_Offset slotoffsets = pyslot_offsets[slot->slot];
3538              slot_offset = slotoffsets.slot_offset;
3539              if (slotoffsets.subslot_offset == -1) {
3540                  *(void**)((char*)res_start + slot_offset) = slot->pfunc;
3541              } else {
3542                  void *parent_slot = *(void**)((char*)res_start + slot_offset);
3543                  subslot_offset = slotoffsets.subslot_offset;
3544                  *(void**)((char*)parent_slot + subslot_offset) = slot->pfunc;
3545              }
3546          }
3547      }
3548      if (type->tp_dealloc == NULL) {
3549          /* It's a heap type, so needs the heap types' dealloc.
3550             subtype_dealloc will call the base type's tp_dealloc, if
3551             necessary. */
3552          type->tp_dealloc = subtype_dealloc;
3553      }
3554  
3555      if (vectorcalloffset) {
3556          type->tp_vectorcall_offset = vectorcalloffset;
3557      }
3558  
3559      if (PyType_Ready(type) < 0)
3560          goto fail;
3561  
3562      if (type->tp_dictoffset) {
3563          res->ht_cached_keys = _PyDict_NewKeysForClass();
3564      }
3565  
3566      if (type->tp_doc) {
3567          PyObject *__doc__ = PyUnicode_FromString(_PyType_DocWithoutSignature(type->tp_name, type->tp_doc));
3568          if (!__doc__)
3569              goto fail;
3570          r = _PyDict_SetItemId(type->tp_dict, &PyId___doc__, __doc__);
3571          Py_DECREF(__doc__);
3572          if (r < 0)
3573              goto fail;
3574      }
3575  
3576      if (weaklistoffset) {
3577          type->tp_weaklistoffset = weaklistoffset;
3578          if (PyDict_DelItemString((PyObject *)type->tp_dict, "__weaklistoffset__") < 0)
3579              goto fail;
3580      }
3581      if (dictoffset) {
3582          type->tp_dictoffset = dictoffset;
3583          if (PyDict_DelItemString((PyObject *)type->tp_dict, "__dictoffset__") < 0)
3584              goto fail;
3585      }
3586  
3587      /* Set type.__module__ */
3588      r = _PyDict_ContainsId(type->tp_dict, &PyId___module__);
3589      if (r < 0) {
3590          goto fail;
3591      }
3592      if (r == 0) {
3593          s = strrchr(spec->name, '.');
3594          if (s != NULL) {
3595              modname = PyUnicode_FromStringAndSize(
3596                      spec->name, (Py_ssize_t)(s - spec->name));
3597              if (modname == NULL) {
3598                  goto fail;
3599              }
3600              r = _PyDict_SetItemId(type->tp_dict, &PyId___module__, modname);
3601              Py_DECREF(modname);
3602              if (r != 0)
3603                  goto fail;
3604          } else {
3605              if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
3606                      "builtin type %.200s has no __module__ attribute",
3607                      spec->name))
3608                  goto fail;
3609          }
3610      }
3611  
3612      return (PyObject*)res;
3613  
3614   fail:
3615      Py_DECREF(res);
3616      return NULL;
3617  }
3618  
3619  PyObject *
PyType_FromSpec(PyType_Spec * spec)3620  PyType_FromSpec(PyType_Spec *spec)
3621  {
3622      return PyType_FromSpecWithBases(spec, NULL);
3623  }
3624  
3625  /* private in 3.10 and 3.9.8+; public in 3.11 */
3626  PyObject *
_PyType_GetQualName(PyTypeObject * type)3627  _PyType_GetQualName(PyTypeObject *type)
3628  {
3629      return type_qualname(type, NULL);
3630  }
3631  
3632  
3633  void *
PyType_GetSlot(PyTypeObject * type,int slot)3634  PyType_GetSlot(PyTypeObject *type, int slot)
3635  {
3636      void *parent_slot;
3637      int slots_len = Py_ARRAY_LENGTH(pyslot_offsets);
3638  
3639      if (slot <= 0 || slot >= slots_len) {
3640          PyErr_BadInternalCall();
3641          return NULL;
3642      }
3643  
3644      parent_slot = *(void**)((char*)type + pyslot_offsets[slot].slot_offset);
3645      if (parent_slot == NULL) {
3646          return NULL;
3647      }
3648      /* Return slot directly if we have no sub slot. */
3649      if (pyslot_offsets[slot].subslot_offset == -1) {
3650          return parent_slot;
3651      }
3652      return *(void**)((char*)parent_slot + pyslot_offsets[slot].subslot_offset);
3653  }
3654  
3655  PyObject *
PyType_GetModule(PyTypeObject * type)3656  PyType_GetModule(PyTypeObject *type)
3657  {
3658      assert(PyType_Check(type));
3659      if (!_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE)) {
3660          PyErr_Format(
3661              PyExc_TypeError,
3662              "PyType_GetModule: Type '%s' is not a heap type",
3663              type->tp_name);
3664          return NULL;
3665      }
3666  
3667      PyHeapTypeObject* et = (PyHeapTypeObject*)type;
3668      if (!et->ht_module) {
3669          PyErr_Format(
3670              PyExc_TypeError,
3671              "PyType_GetModule: Type '%s' has no associated module",
3672              type->tp_name);
3673          return NULL;
3674      }
3675      return et->ht_module;
3676  
3677  }
3678  
3679  void *
PyType_GetModuleState(PyTypeObject * type)3680  PyType_GetModuleState(PyTypeObject *type)
3681  {
3682      PyObject *m = PyType_GetModule(type);
3683      if (m == NULL) {
3684          return NULL;
3685      }
3686      return _PyModule_GetState(m);
3687  }
3688  
3689  
3690  /* Get the module of the first superclass where the module has the
3691   * given PyModuleDef.
3692   * Implemented by walking the MRO, is relatively slow.
3693   *
3694   * This is internal API for experimentation within stdlib. Discussion:
3695   * https://mail.python.org/archives/list/capi-sig@python.org/thread/T3P2QNLNLBRFHWSKYSTPMVEIL2EEKFJU/
3696   */
3697  PyObject *
_PyType_GetModuleByDef(PyTypeObject * type,struct PyModuleDef * def)3698  _PyType_GetModuleByDef(PyTypeObject *type, struct PyModuleDef *def)
3699  {
3700      assert(PyType_Check(type));
3701  
3702      PyObject *mro = type->tp_mro;
3703      // The type must be ready
3704      assert(mro != NULL);
3705      assert(PyTuple_Check(mro));
3706      // mro_invoke() ensures that the type MRO cannot be empty, so we don't have
3707      // to check i < PyTuple_GET_SIZE(mro) at the first loop iteration.
3708      assert(PyTuple_GET_SIZE(mro) >= 1);
3709  
3710      Py_ssize_t i = 0;
3711      do {
3712          PyObject *super = PyTuple_GET_ITEM(mro, i);
3713          // _PyType_GetModuleByDef() must only be called on a heap type created
3714          // by PyType_FromModuleAndSpec() or on its subclasses.
3715          // type_ready_mro() ensures that a static type cannot inherit from a
3716          // heap type.
3717          assert(_PyType_HasFeature((PyTypeObject *)type, Py_TPFLAGS_HEAPTYPE));
3718  
3719          PyHeapTypeObject *ht = (PyHeapTypeObject*)super;
3720          PyObject *module = ht->ht_module;
3721          if (module && _PyModule_GetDef(module) == def) {
3722              return module;
3723          }
3724          i++;
3725      } while (i < PyTuple_GET_SIZE(mro));
3726  
3727      PyErr_Format(
3728          PyExc_TypeError,
3729          "_PyType_GetModuleByDef: No superclass of '%s' has the given module",
3730          type->tp_name);
3731      return NULL;
3732  }
3733  
3734  
3735  /* Internal API to look for a name through the MRO, bypassing the method cache.
3736     This returns a borrowed reference, and might set an exception.
3737     'error' is set to: -1: error with exception; 1: error without exception; 0: ok */
3738  static PyObject *
find_name_in_mro(PyTypeObject * type,PyObject * name,int * error)3739  find_name_in_mro(PyTypeObject *type, PyObject *name, int *error)
3740  {
3741      Py_ssize_t i, n;
3742      PyObject *mro, *res, *base, *dict;
3743      Py_hash_t hash;
3744  
3745      if (!PyUnicode_CheckExact(name) ||
3746          (hash = ((PyASCIIObject *) name)->hash) == -1)
3747      {
3748          hash = PyObject_Hash(name);
3749          if (hash == -1) {
3750              *error = -1;
3751              return NULL;
3752          }
3753      }
3754  
3755      /* Look in tp_dict of types in MRO */
3756      mro = type->tp_mro;
3757  
3758      if (mro == NULL) {
3759          if ((type->tp_flags & Py_TPFLAGS_READYING) == 0) {
3760              if (PyType_Ready(type) < 0) {
3761                  *error = -1;
3762                  return NULL;
3763              }
3764              mro = type->tp_mro;
3765          }
3766          if (mro == NULL) {
3767              *error = 1;
3768              return NULL;
3769          }
3770      }
3771  
3772      res = NULL;
3773      /* Keep a strong reference to mro because type->tp_mro can be replaced
3774         during dict lookup, e.g. when comparing to non-string keys. */
3775      Py_INCREF(mro);
3776      assert(PyTuple_Check(mro));
3777      n = PyTuple_GET_SIZE(mro);
3778      for (i = 0; i < n; i++) {
3779          base = PyTuple_GET_ITEM(mro, i);
3780          assert(PyType_Check(base));
3781          dict = ((PyTypeObject *)base)->tp_dict;
3782          assert(dict && PyDict_Check(dict));
3783          res = _PyDict_GetItem_KnownHash(dict, name, hash);
3784          if (res != NULL)
3785              break;
3786          if (PyErr_Occurred()) {
3787              *error = -1;
3788              goto done;
3789          }
3790      }
3791      *error = 0;
3792  done:
3793      Py_DECREF(mro);
3794      return res;
3795  }
3796  
3797  /* Internal API to look for a name through the MRO.
3798     This returns a borrowed reference, and doesn't set an exception! */
3799  PyObject *
_PyType_Lookup(PyTypeObject * type,PyObject * name)3800  _PyType_Lookup(PyTypeObject *type, PyObject *name)
3801  {
3802      PyObject *res;
3803      int error;
3804  
3805      unsigned int h = MCACHE_HASH_METHOD(type, name);
3806      struct type_cache *cache = get_type_cache();
3807      struct type_cache_entry *entry = &cache->hashtable[h];
3808      if (entry->version == type->tp_version_tag &&
3809          entry->name == name) {
3810  #if MCACHE_STATS
3811          cache->hits++;
3812  #endif
3813          assert(_PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG));
3814          return entry->value;
3815      }
3816  
3817      /* We may end up clearing live exceptions below, so make sure it's ours. */
3818      assert(!PyErr_Occurred());
3819  
3820      res = find_name_in_mro(type, name, &error);
3821      /* Only put NULL results into cache if there was no error. */
3822      if (error) {
3823          /* It's not ideal to clear the error condition,
3824             but this function is documented as not setting
3825             an exception, and I don't want to change that.
3826             E.g., when PyType_Ready() can't proceed, it won't
3827             set the "ready" flag, so future attempts to ready
3828             the same type will call it again -- hopefully
3829             in a context that propagates the exception out.
3830          */
3831          if (error == -1) {
3832              PyErr_Clear();
3833          }
3834          return NULL;
3835      }
3836  
3837      if (MCACHE_CACHEABLE_NAME(name) && assign_version_tag(cache, type)) {
3838          h = MCACHE_HASH_METHOD(type, name);
3839          struct type_cache_entry *entry = &cache->hashtable[h];
3840          entry->version = type->tp_version_tag;
3841          entry->value = res;  /* borrowed */
3842          assert(((PyASCIIObject *)(name))->hash != -1);
3843  #if MCACHE_STATS
3844          if (entry->name != Py_None && entry->name != name) {
3845              cache->collisions++;
3846          }
3847          else {
3848              cache->misses++;
3849          }
3850  #endif
3851          assert(_PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG));
3852          Py_SETREF(entry->name, Py_NewRef(name));
3853      }
3854      return res;
3855  }
3856  
3857  PyObject *
_PyType_LookupId(PyTypeObject * type,struct _Py_Identifier * name)3858  _PyType_LookupId(PyTypeObject *type, struct _Py_Identifier *name)
3859  {
3860      PyObject *oname;
3861      oname = _PyUnicode_FromId(name);   /* borrowed */
3862      if (oname == NULL)
3863          return NULL;
3864      return _PyType_Lookup(type, oname);
3865  }
3866  
3867  /* Check if the "readied" PyUnicode name
3868     is a double-underscore special name. */
3869  static int
is_dunder_name(PyObject * name)3870  is_dunder_name(PyObject *name)
3871  {
3872      Py_ssize_t length = PyUnicode_GET_LENGTH(name);
3873      int kind = PyUnicode_KIND(name);
3874      /* Special names contain at least "__x__" and are always ASCII. */
3875      if (length > 4 && kind == PyUnicode_1BYTE_KIND) {
3876          const Py_UCS1 *characters = PyUnicode_1BYTE_DATA(name);
3877          return (
3878              ((characters[length-2] == '_') && (characters[length-1] == '_')) &&
3879              ((characters[0] == '_') && (characters[1] == '_'))
3880          );
3881      }
3882      return 0;
3883  }
3884  
3885  /* This is similar to PyObject_GenericGetAttr(),
3886     but uses _PyType_Lookup() instead of just looking in type->tp_dict. */
3887  static PyObject *
type_getattro(PyTypeObject * type,PyObject * name)3888  type_getattro(PyTypeObject *type, PyObject *name)
3889  {
3890      PyTypeObject *metatype = Py_TYPE(type);
3891      PyObject *meta_attribute, *attribute;
3892      descrgetfunc meta_get;
3893      PyObject* res;
3894  
3895      if (!PyUnicode_Check(name)) {
3896          PyErr_Format(PyExc_TypeError,
3897                       "attribute name must be string, not '%.200s'",
3898                       Py_TYPE(name)->tp_name);
3899          return NULL;
3900      }
3901  
3902      /* Initialize this type (we'll assume the metatype is initialized) */
3903      if (!_PyType_IsReady(type)) {
3904          if (PyType_Ready(type) < 0)
3905              return NULL;
3906      }
3907  
3908      /* No readable descriptor found yet */
3909      meta_get = NULL;
3910  
3911      /* Look for the attribute in the metatype */
3912      meta_attribute = _PyType_Lookup(metatype, name);
3913  
3914      if (meta_attribute != NULL) {
3915          Py_INCREF(meta_attribute);
3916          meta_get = Py_TYPE(meta_attribute)->tp_descr_get;
3917  
3918          if (meta_get != NULL && PyDescr_IsData(meta_attribute)) {
3919              /* Data descriptors implement tp_descr_set to intercept
3920               * writes. Assume the attribute is not overridden in
3921               * type's tp_dict (and bases): call the descriptor now.
3922               */
3923              res = meta_get(meta_attribute, (PyObject *)type,
3924                             (PyObject *)metatype);
3925              Py_DECREF(meta_attribute);
3926              return res;
3927          }
3928      }
3929  
3930      /* No data descriptor found on metatype. Look in tp_dict of this
3931       * type and its bases */
3932      attribute = _PyType_Lookup(type, name);
3933      if (attribute != NULL) {
3934          /* Implement descriptor functionality, if any */
3935          Py_INCREF(attribute);
3936          descrgetfunc local_get = Py_TYPE(attribute)->tp_descr_get;
3937  
3938          Py_XDECREF(meta_attribute);
3939  
3940          if (local_get != NULL) {
3941              /* NULL 2nd argument indicates the descriptor was
3942               * found on the target object itself (or a base)  */
3943              res = local_get(attribute, (PyObject *)NULL,
3944                              (PyObject *)type);
3945              Py_DECREF(attribute);
3946              return res;
3947          }
3948  
3949          return attribute;
3950      }
3951  
3952      /* No attribute found in local __dict__ (or bases): use the
3953       * descriptor from the metatype, if any */
3954      if (meta_get != NULL) {
3955          PyObject *res;
3956          res = meta_get(meta_attribute, (PyObject *)type,
3957                         (PyObject *)metatype);
3958          Py_DECREF(meta_attribute);
3959          return res;
3960      }
3961  
3962      /* If an ordinary attribute was found on the metatype, return it now */
3963      if (meta_attribute != NULL) {
3964          return meta_attribute;
3965      }
3966  
3967      /* Give up */
3968      PyErr_Format(PyExc_AttributeError,
3969                   "type object '%.50s' has no attribute '%U'",
3970                   type->tp_name, name);
3971      return NULL;
3972  }
3973  
3974  static int
type_setattro(PyTypeObject * type,PyObject * name,PyObject * value)3975  type_setattro(PyTypeObject *type, PyObject *name, PyObject *value)
3976  {
3977      int res;
3978      if (type->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) {
3979          PyErr_Format(
3980              PyExc_TypeError,
3981              "cannot set %R attribute of immutable type '%s'",
3982              name, type->tp_name);
3983          return -1;
3984      }
3985      if (PyUnicode_Check(name)) {
3986          if (PyUnicode_CheckExact(name)) {
3987              if (PyUnicode_READY(name) == -1)
3988                  return -1;
3989              Py_INCREF(name);
3990          }
3991          else {
3992              name = _PyUnicode_Copy(name);
3993              if (name == NULL)
3994                  return -1;
3995          }
3996  #ifdef INTERN_NAME_STRINGS
3997          if (!PyUnicode_CHECK_INTERNED(name)) {
3998              PyUnicode_InternInPlace(&name);
3999              if (!PyUnicode_CHECK_INTERNED(name)) {
4000                  PyErr_SetString(PyExc_MemoryError,
4001                                  "Out of memory interning an attribute name");
4002                  Py_DECREF(name);
4003                  return -1;
4004              }
4005          }
4006  #endif
4007      }
4008      else {
4009          /* Will fail in _PyObject_GenericSetAttrWithDict. */
4010          Py_INCREF(name);
4011      }
4012      res = _PyObject_GenericSetAttrWithDict((PyObject *)type, name, value, NULL);
4013      if (res == 0) {
4014          /* Clear the VALID_VERSION flag of 'type' and all its
4015             subclasses.  This could possibly be unified with the
4016             update_subclasses() recursion in update_slot(), but carefully:
4017             they each have their own conditions on which to stop
4018             recursing into subclasses. */
4019          PyType_Modified(type);
4020  
4021          if (is_dunder_name(name)) {
4022              res = update_slot(type, name);
4023          }
4024          assert(_PyType_CheckConsistency(type));
4025      }
4026      Py_DECREF(name);
4027      return res;
4028  }
4029  
4030  extern void
4031  _PyDictKeys_DecRef(PyDictKeysObject *keys);
4032  
4033  static void
type_dealloc(PyTypeObject * type)4034  type_dealloc(PyTypeObject *type)
4035  {
4036      PyHeapTypeObject *et;
4037      PyObject *tp, *val, *tb;
4038  
4039      /* Assert this is a heap-allocated type object */
4040      _PyObject_ASSERT((PyObject *)type, type->tp_flags & Py_TPFLAGS_HEAPTYPE);
4041      _PyObject_GC_UNTRACK(type);
4042      PyErr_Fetch(&tp, &val, &tb);
4043      remove_all_subclasses(type, type->tp_bases);
4044      PyErr_Restore(tp, val, tb);
4045      PyObject_ClearWeakRefs((PyObject *)type);
4046      et = (PyHeapTypeObject *)type;
4047      Py_XDECREF(type->tp_base);
4048      Py_XDECREF(type->tp_dict);
4049      Py_XDECREF(type->tp_bases);
4050      Py_XDECREF(type->tp_mro);
4051      Py_XDECREF(type->tp_cache);
4052      Py_XDECREF(type->tp_subclasses);
4053      /* A type's tp_doc is heap allocated, unlike the tp_doc slots
4054       * of most other objects.  It's okay to cast it to char *.
4055       */
4056      PyObject_Free((char *)type->tp_doc);
4057      Py_XDECREF(et->ht_name);
4058      Py_XDECREF(et->ht_qualname);
4059      Py_XDECREF(et->ht_slots);
4060      if (et->ht_cached_keys) {
4061          _PyDictKeys_DecRef(et->ht_cached_keys);
4062      }
4063      Py_XDECREF(et->ht_module);
4064      Py_TYPE(type)->tp_free((PyObject *)type);
4065  }
4066  
4067  /*[clinic input]
4068  type.__subclasses__
4069  
4070  Return a list of immediate subclasses.
4071  [clinic start generated code]*/
4072  
4073  static PyObject *
type___subclasses___impl(PyTypeObject * self)4074  type___subclasses___impl(PyTypeObject *self)
4075  /*[clinic end generated code: output=eb5eb54485942819 input=5af66132436f9a7b]*/
4076  {
4077      PyObject *list, *raw, *ref;
4078      Py_ssize_t i;
4079  
4080      list = PyList_New(0);
4081      if (list == NULL)
4082          return NULL;
4083      raw = self->tp_subclasses;
4084      if (raw == NULL)
4085          return list;
4086      assert(PyDict_CheckExact(raw));
4087      i = 0;
4088      while (PyDict_Next(raw, &i, NULL, &ref)) {
4089          assert(PyWeakref_CheckRef(ref));
4090          ref = PyWeakref_GET_OBJECT(ref);
4091          if (ref != Py_None) {
4092              if (PyList_Append(list, ref) < 0) {
4093                  Py_DECREF(list);
4094                  return NULL;
4095              }
4096          }
4097      }
4098      return list;
4099  }
4100  
4101  static PyObject *
type_prepare(PyObject * self,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)4102  type_prepare(PyObject *self, PyObject *const *args, Py_ssize_t nargs,
4103               PyObject *kwnames)
4104  {
4105      return PyDict_New();
4106  }
4107  
4108  /*
4109     Merge the __dict__ of aclass into dict, and recursively also all
4110     the __dict__s of aclass's base classes.  The order of merging isn't
4111     defined, as it's expected that only the final set of dict keys is
4112     interesting.
4113     Return 0 on success, -1 on error.
4114  */
4115  
4116  static int
merge_class_dict(PyObject * dict,PyObject * aclass)4117  merge_class_dict(PyObject *dict, PyObject *aclass)
4118  {
4119      PyObject *classdict;
4120      PyObject *bases;
4121      _Py_IDENTIFIER(__bases__);
4122  
4123      assert(PyDict_Check(dict));
4124      assert(aclass);
4125  
4126      /* Merge in the type's dict (if any). */
4127      if (_PyObject_LookupAttrId(aclass, &PyId___dict__, &classdict) < 0) {
4128          return -1;
4129      }
4130      if (classdict != NULL) {
4131          int status = PyDict_Update(dict, classdict);
4132          Py_DECREF(classdict);
4133          if (status < 0)
4134              return -1;
4135      }
4136  
4137      /* Recursively merge in the base types' (if any) dicts. */
4138      if (_PyObject_LookupAttrId(aclass, &PyId___bases__, &bases) < 0) {
4139          return -1;
4140      }
4141      if (bases != NULL) {
4142          /* We have no guarantee that bases is a real tuple */
4143          Py_ssize_t i, n;
4144          n = PySequence_Size(bases); /* This better be right */
4145          if (n < 0) {
4146              Py_DECREF(bases);
4147              return -1;
4148          }
4149          else {
4150              for (i = 0; i < n; i++) {
4151                  int status;
4152                  PyObject *base = PySequence_GetItem(bases, i);
4153                  if (base == NULL) {
4154                      Py_DECREF(bases);
4155                      return -1;
4156                  }
4157                  status = merge_class_dict(dict, base);
4158                  Py_DECREF(base);
4159                  if (status < 0) {
4160                      Py_DECREF(bases);
4161                      return -1;
4162                  }
4163              }
4164          }
4165          Py_DECREF(bases);
4166      }
4167      return 0;
4168  }
4169  
4170  /* __dir__ for type objects: returns __dict__ and __bases__.
4171     We deliberately don't suck up its __class__, as methods belonging to the
4172     metaclass would probably be more confusing than helpful.
4173  */
4174  /*[clinic input]
4175  type.__dir__
4176  
4177  Specialized __dir__ implementation for types.
4178  [clinic start generated code]*/
4179  
4180  static PyObject *
type___dir___impl(PyTypeObject * self)4181  type___dir___impl(PyTypeObject *self)
4182  /*[clinic end generated code: output=69d02fe92c0f15fa input=7733befbec645968]*/
4183  {
4184      PyObject *result = NULL;
4185      PyObject *dict = PyDict_New();
4186  
4187      if (dict != NULL && merge_class_dict(dict, (PyObject *)self) == 0)
4188          result = PyDict_Keys(dict);
4189  
4190      Py_XDECREF(dict);
4191      return result;
4192  }
4193  
4194  /*[clinic input]
4195  type.__sizeof__
4196  
4197  Return memory consumption of the type object.
4198  [clinic start generated code]*/
4199  
4200  static PyObject *
type___sizeof___impl(PyTypeObject * self)4201  type___sizeof___impl(PyTypeObject *self)
4202  /*[clinic end generated code: output=766f4f16cd3b1854 input=99398f24b9cf45d6]*/
4203  {
4204      Py_ssize_t size;
4205      if (self->tp_flags & Py_TPFLAGS_HEAPTYPE) {
4206          PyHeapTypeObject* et = (PyHeapTypeObject*)self;
4207          size = sizeof(PyHeapTypeObject);
4208          if (et->ht_cached_keys)
4209              size += _PyDict_KeysSize(et->ht_cached_keys);
4210      }
4211      else
4212          size = sizeof(PyTypeObject);
4213      return PyLong_FromSsize_t(size);
4214  }
4215  
4216  static PyMethodDef type_methods[] = {
4217      TYPE_MRO_METHODDEF
4218      TYPE___SUBCLASSES___METHODDEF
4219      {"__prepare__", (PyCFunction)(void(*)(void))type_prepare,
4220       METH_FASTCALL | METH_KEYWORDS | METH_CLASS,
4221       PyDoc_STR("__prepare__() -> dict\n"
4222                 "used to create the namespace for the class statement")},
4223      TYPE___INSTANCECHECK___METHODDEF
4224      TYPE___SUBCLASSCHECK___METHODDEF
4225      TYPE___DIR___METHODDEF
4226      TYPE___SIZEOF___METHODDEF
4227      {0}
4228  };
4229  
4230  PyDoc_STRVAR(type_doc,
4231  "type(object) -> the object's type\n"
4232  "type(name, bases, dict, **kwds) -> a new type");
4233  
4234  static int
type_traverse(PyTypeObject * type,visitproc visit,void * arg)4235  type_traverse(PyTypeObject *type, visitproc visit, void *arg)
4236  {
4237      /* Because of type_is_gc(), the collector only calls this
4238         for heaptypes. */
4239      if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
4240          char msg[200];
4241          sprintf(msg, "type_traverse() called on non-heap type '%.100s'",
4242                  type->tp_name);
4243          _PyObject_ASSERT_FAILED_MSG((PyObject *)type, msg);
4244      }
4245  
4246      Py_VISIT(type->tp_dict);
4247      Py_VISIT(type->tp_cache);
4248      Py_VISIT(type->tp_mro);
4249      Py_VISIT(type->tp_bases);
4250      Py_VISIT(type->tp_base);
4251      Py_VISIT(((PyHeapTypeObject *)type)->ht_module);
4252  
4253      /* There's no need to visit type->tp_subclasses or
4254         ((PyHeapTypeObject *)type)->ht_slots, because they can't be involved
4255         in cycles; tp_subclasses is a list of weak references,
4256         and slots is a tuple of strings. */
4257  
4258      return 0;
4259  }
4260  
4261  static int
type_clear(PyTypeObject * type)4262  type_clear(PyTypeObject *type)
4263  {
4264      PyDictKeysObject *cached_keys;
4265      /* Because of type_is_gc(), the collector only calls this
4266         for heaptypes. */
4267      _PyObject_ASSERT((PyObject *)type, type->tp_flags & Py_TPFLAGS_HEAPTYPE);
4268  
4269      /* We need to invalidate the method cache carefully before clearing
4270         the dict, so that other objects caught in a reference cycle
4271         don't start calling destroyed methods.
4272  
4273         Otherwise, the we need to clear tp_mro, which is
4274         part of a hard cycle (its first element is the class itself) that
4275         won't be broken otherwise (it's a tuple and tuples don't have a
4276         tp_clear handler).
4277         We also need to clear ht_module, if present: the module usually holds a
4278         reference to its class. None of the other fields need to be
4279  
4280         cleared, and here's why:
4281  
4282         tp_cache:
4283             Not used; if it were, it would be a dict.
4284  
4285         tp_bases, tp_base:
4286             If these are involved in a cycle, there must be at least
4287             one other, mutable object in the cycle, e.g. a base
4288             class's dict; the cycle will be broken that way.
4289  
4290         tp_subclasses:
4291             A dict of weak references can't be part of a cycle; and
4292             dicts have their own tp_clear.
4293  
4294         slots (in PyHeapTypeObject):
4295             A tuple of strings can't be part of a cycle.
4296      */
4297  
4298      PyType_Modified(type);
4299      cached_keys = ((PyHeapTypeObject *)type)->ht_cached_keys;
4300      if (cached_keys != NULL) {
4301          ((PyHeapTypeObject *)type)->ht_cached_keys = NULL;
4302          _PyDictKeys_DecRef(cached_keys);
4303      }
4304      if (type->tp_dict) {
4305          PyDict_Clear(type->tp_dict);
4306      }
4307      Py_CLEAR(((PyHeapTypeObject *)type)->ht_module);
4308  
4309      Py_CLEAR(type->tp_mro);
4310  
4311      return 0;
4312  }
4313  
4314  static int
type_is_gc(PyTypeObject * type)4315  type_is_gc(PyTypeObject *type)
4316  {
4317      return type->tp_flags & Py_TPFLAGS_HEAPTYPE;
4318  }
4319  
4320  
4321  static PyNumberMethods type_as_number = {
4322          .nb_or = _Py_union_type_or, // Add __or__ function
4323  };
4324  
4325  PyTypeObject PyType_Type = {
4326      PyVarObject_HEAD_INIT(&PyType_Type, 0)
4327      "type",                                     /* tp_name */
4328      sizeof(PyHeapTypeObject),                   /* tp_basicsize */
4329      sizeof(PyMemberDef),                        /* tp_itemsize */
4330      (destructor)type_dealloc,                   /* tp_dealloc */
4331      offsetof(PyTypeObject, tp_vectorcall),      /* tp_vectorcall_offset */
4332      0,                                          /* tp_getattr */
4333      0,                                          /* tp_setattr */
4334      0,                                          /* tp_as_async */
4335      (reprfunc)type_repr,                        /* tp_repr */
4336      &type_as_number,                            /* tp_as_number */
4337      0,                                          /* tp_as_sequence */
4338      0,                                          /* tp_as_mapping */
4339      0,                                          /* tp_hash */
4340      (ternaryfunc)type_call,                     /* tp_call */
4341      0,                                          /* tp_str */
4342      (getattrofunc)type_getattro,                /* tp_getattro */
4343      (setattrofunc)type_setattro,                /* tp_setattro */
4344      0,                                          /* tp_as_buffer */
4345      Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
4346      Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TYPE_SUBCLASS |
4347      Py_TPFLAGS_HAVE_VECTORCALL,                 /* tp_flags */
4348      type_doc,                                   /* tp_doc */
4349      (traverseproc)type_traverse,                /* tp_traverse */
4350      (inquiry)type_clear,                        /* tp_clear */
4351      0,                                          /* tp_richcompare */
4352      offsetof(PyTypeObject, tp_weaklist),        /* tp_weaklistoffset */
4353      0,                                          /* tp_iter */
4354      0,                                          /* tp_iternext */
4355      type_methods,                               /* tp_methods */
4356      type_members,                               /* tp_members */
4357      type_getsets,                               /* tp_getset */
4358      0,                                          /* tp_base */
4359      0,                                          /* tp_dict */
4360      0,                                          /* tp_descr_get */
4361      0,                                          /* tp_descr_set */
4362      offsetof(PyTypeObject, tp_dict),            /* tp_dictoffset */
4363      type_init,                                  /* tp_init */
4364      0,                                          /* tp_alloc */
4365      type_new,                                   /* tp_new */
4366      PyObject_GC_Del,                            /* tp_free */
4367      (inquiry)type_is_gc,                        /* tp_is_gc */
4368      .tp_vectorcall = type_vectorcall,
4369  };
4370  
4371  
4372  /* The base type of all types (eventually)... except itself. */
4373  
4374  /* You may wonder why object.__new__() only complains about arguments
4375     when object.__init__() is not overridden, and vice versa.
4376  
4377     Consider the use cases:
4378  
4379     1. When neither is overridden, we want to hear complaints about
4380        excess (i.e., any) arguments, since their presence could
4381        indicate there's a bug.
4382  
4383     2. When defining an Immutable type, we are likely to override only
4384        __new__(), since __init__() is called too late to initialize an
4385        Immutable object.  Since __new__() defines the signature for the
4386        type, it would be a pain to have to override __init__() just to
4387        stop it from complaining about excess arguments.
4388  
4389     3. When defining a Mutable type, we are likely to override only
4390        __init__().  So here the converse reasoning applies: we don't
4391        want to have to override __new__() just to stop it from
4392        complaining.
4393  
4394     4. When __init__() is overridden, and the subclass __init__() calls
4395        object.__init__(), the latter should complain about excess
4396        arguments; ditto for __new__().
4397  
4398     Use cases 2 and 3 make it unattractive to unconditionally check for
4399     excess arguments.  The best solution that addresses all four use
4400     cases is as follows: __init__() complains about excess arguments
4401     unless __new__() is overridden and __init__() is not overridden
4402     (IOW, if __init__() is overridden or __new__() is not overridden);
4403     symmetrically, __new__() complains about excess arguments unless
4404     __init__() is overridden and __new__() is not overridden
4405     (IOW, if __new__() is overridden or __init__() is not overridden).
4406  
4407     However, for backwards compatibility, this breaks too much code.
4408     Therefore, in 2.6, we'll *warn* about excess arguments when both
4409     methods are overridden; for all other cases we'll use the above
4410     rules.
4411  
4412  */
4413  
4414  /* Forward */
4415  static PyObject *
4416  object_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
4417  
4418  static int
excess_args(PyObject * args,PyObject * kwds)4419  excess_args(PyObject *args, PyObject *kwds)
4420  {
4421      return PyTuple_GET_SIZE(args) ||
4422          (kwds && PyDict_Check(kwds) && PyDict_GET_SIZE(kwds));
4423  }
4424  
4425  static int
object_init(PyObject * self,PyObject * args,PyObject * kwds)4426  object_init(PyObject *self, PyObject *args, PyObject *kwds)
4427  {
4428      PyTypeObject *type = Py_TYPE(self);
4429      if (excess_args(args, kwds)) {
4430          if (type->tp_init != object_init) {
4431              PyErr_SetString(PyExc_TypeError,
4432                              "object.__init__() takes exactly one argument (the instance to initialize)");
4433              return -1;
4434          }
4435          if (type->tp_new == object_new) {
4436              PyErr_Format(PyExc_TypeError,
4437                           "%.200s.__init__() takes exactly one argument (the instance to initialize)",
4438                           type->tp_name);
4439              return -1;
4440          }
4441      }
4442      return 0;
4443  }
4444  
4445  static PyObject *
object_new(PyTypeObject * type,PyObject * args,PyObject * kwds)4446  object_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4447  {
4448      if (excess_args(args, kwds)) {
4449          if (type->tp_new != object_new) {
4450              PyErr_SetString(PyExc_TypeError,
4451                              "object.__new__() takes exactly one argument (the type to instantiate)");
4452              return NULL;
4453          }
4454          if (type->tp_init == object_init) {
4455              PyErr_Format(PyExc_TypeError, "%.200s() takes no arguments",
4456                           type->tp_name);
4457              return NULL;
4458          }
4459      }
4460  
4461      if (type->tp_flags & Py_TPFLAGS_IS_ABSTRACT) {
4462          PyObject *abstract_methods;
4463          PyObject *sorted_methods;
4464          PyObject *joined;
4465          PyObject *comma;
4466          _Py_static_string(comma_id, ", ");
4467          Py_ssize_t method_count;
4468  
4469          /* Compute ", ".join(sorted(type.__abstractmethods__))
4470             into joined. */
4471          abstract_methods = type_abstractmethods(type, NULL);
4472          if (abstract_methods == NULL)
4473              return NULL;
4474          sorted_methods = PySequence_List(abstract_methods);
4475          Py_DECREF(abstract_methods);
4476          if (sorted_methods == NULL)
4477              return NULL;
4478          if (PyList_Sort(sorted_methods)) {
4479              Py_DECREF(sorted_methods);
4480              return NULL;
4481          }
4482          comma = _PyUnicode_FromId(&comma_id);
4483          if (comma == NULL) {
4484              Py_DECREF(sorted_methods);
4485              return NULL;
4486          }
4487          joined = PyUnicode_Join(comma, sorted_methods);
4488          method_count = PyObject_Length(sorted_methods);
4489          Py_DECREF(sorted_methods);
4490          if (joined == NULL)
4491              return NULL;
4492          if (method_count == -1)
4493              return NULL;
4494  
4495          PyErr_Format(PyExc_TypeError,
4496                       "Can't instantiate abstract class %s "
4497                       "with abstract method%s %U",
4498                       type->tp_name,
4499                       method_count > 1 ? "s" : "",
4500                       joined);
4501          Py_DECREF(joined);
4502          return NULL;
4503      }
4504      return type->tp_alloc(type, 0);
4505  }
4506  
4507  static void
object_dealloc(PyObject * self)4508  object_dealloc(PyObject *self)
4509  {
4510      Py_TYPE(self)->tp_free(self);
4511  }
4512  
4513  static PyObject *
object_repr(PyObject * self)4514  object_repr(PyObject *self)
4515  {
4516      PyTypeObject *type;
4517      PyObject *mod, *name, *rtn;
4518  
4519      type = Py_TYPE(self);
4520      mod = type_module(type, NULL);
4521      if (mod == NULL)
4522          PyErr_Clear();
4523      else if (!PyUnicode_Check(mod)) {
4524          Py_DECREF(mod);
4525          mod = NULL;
4526      }
4527      name = type_qualname(type, NULL);
4528      if (name == NULL) {
4529          Py_XDECREF(mod);
4530          return NULL;
4531      }
4532      if (mod != NULL && !_PyUnicode_EqualToASCIIId(mod, &PyId_builtins))
4533          rtn = PyUnicode_FromFormat("<%U.%U object at %p>", mod, name, self);
4534      else
4535          rtn = PyUnicode_FromFormat("<%s object at %p>",
4536                                    type->tp_name, self);
4537      Py_XDECREF(mod);
4538      Py_DECREF(name);
4539      return rtn;
4540  }
4541  
4542  static PyObject *
object_str(PyObject * self)4543  object_str(PyObject *self)
4544  {
4545      unaryfunc f;
4546  
4547      f = Py_TYPE(self)->tp_repr;
4548      if (f == NULL)
4549          f = object_repr;
4550      return f(self);
4551  }
4552  
4553  static PyObject *
object_richcompare(PyObject * self,PyObject * other,int op)4554  object_richcompare(PyObject *self, PyObject *other, int op)
4555  {
4556      PyObject *res;
4557  
4558      switch (op) {
4559  
4560      case Py_EQ:
4561          /* Return NotImplemented instead of False, so if two
4562             objects are compared, both get a chance at the
4563             comparison.  See issue #1393. */
4564          res = (self == other) ? Py_True : Py_NotImplemented;
4565          Py_INCREF(res);
4566          break;
4567  
4568      case Py_NE:
4569          /* By default, __ne__() delegates to __eq__() and inverts the result,
4570             unless the latter returns NotImplemented. */
4571          if (Py_TYPE(self)->tp_richcompare == NULL) {
4572              res = Py_NotImplemented;
4573              Py_INCREF(res);
4574              break;
4575          }
4576          res = (*Py_TYPE(self)->tp_richcompare)(self, other, Py_EQ);
4577          if (res != NULL && res != Py_NotImplemented) {
4578              int ok = PyObject_IsTrue(res);
4579              Py_DECREF(res);
4580              if (ok < 0)
4581                  res = NULL;
4582              else {
4583                  if (ok)
4584                      res = Py_False;
4585                  else
4586                      res = Py_True;
4587                  Py_INCREF(res);
4588              }
4589          }
4590          break;
4591  
4592      default:
4593          res = Py_NotImplemented;
4594          Py_INCREF(res);
4595          break;
4596      }
4597  
4598      return res;
4599  }
4600  
4601  static PyObject *
object_get_class(PyObject * self,void * closure)4602  object_get_class(PyObject *self, void *closure)
4603  {
4604      Py_INCREF(Py_TYPE(self));
4605      return (PyObject *)(Py_TYPE(self));
4606  }
4607  
4608  static int
compatible_with_tp_base(PyTypeObject * child)4609  compatible_with_tp_base(PyTypeObject *child)
4610  {
4611      PyTypeObject *parent = child->tp_base;
4612      return (parent != NULL &&
4613              child->tp_basicsize == parent->tp_basicsize &&
4614              child->tp_itemsize == parent->tp_itemsize &&
4615              child->tp_dictoffset == parent->tp_dictoffset &&
4616              child->tp_weaklistoffset == parent->tp_weaklistoffset &&
4617              ((child->tp_flags & Py_TPFLAGS_HAVE_GC) ==
4618               (parent->tp_flags & Py_TPFLAGS_HAVE_GC)) &&
4619              (child->tp_dealloc == subtype_dealloc ||
4620               child->tp_dealloc == parent->tp_dealloc));
4621  }
4622  
4623  static int
same_slots_added(PyTypeObject * a,PyTypeObject * b)4624  same_slots_added(PyTypeObject *a, PyTypeObject *b)
4625  {
4626      PyTypeObject *base = a->tp_base;
4627      Py_ssize_t size;
4628      PyObject *slots_a, *slots_b;
4629  
4630      assert(base == b->tp_base);
4631      size = base->tp_basicsize;
4632      if (a->tp_dictoffset == size && b->tp_dictoffset == size)
4633          size += sizeof(PyObject *);
4634      if (a->tp_weaklistoffset == size && b->tp_weaklistoffset == size)
4635          size += sizeof(PyObject *);
4636  
4637      /* Check slots compliance */
4638      if (!(a->tp_flags & Py_TPFLAGS_HEAPTYPE) ||
4639          !(b->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
4640          return 0;
4641      }
4642      slots_a = ((PyHeapTypeObject *)a)->ht_slots;
4643      slots_b = ((PyHeapTypeObject *)b)->ht_slots;
4644      if (slots_a && slots_b) {
4645          if (PyObject_RichCompareBool(slots_a, slots_b, Py_EQ) != 1)
4646              return 0;
4647          size += sizeof(PyObject *) * PyTuple_GET_SIZE(slots_a);
4648      }
4649      return size == a->tp_basicsize && size == b->tp_basicsize;
4650  }
4651  
4652  static int
compatible_for_assignment(PyTypeObject * oldto,PyTypeObject * newto,const char * attr)4653  compatible_for_assignment(PyTypeObject* oldto, PyTypeObject* newto, const char* attr)
4654  {
4655      PyTypeObject *newbase, *oldbase;
4656  
4657      if (newto->tp_free != oldto->tp_free) {
4658          PyErr_Format(PyExc_TypeError,
4659                       "%s assignment: "
4660                       "'%s' deallocator differs from '%s'",
4661                       attr,
4662                       newto->tp_name,
4663                       oldto->tp_name);
4664          return 0;
4665      }
4666      /*
4667       It's tricky to tell if two arbitrary types are sufficiently compatible as
4668       to be interchangeable; e.g., even if they have the same tp_basicsize, they
4669       might have totally different struct fields. It's much easier to tell if a
4670       type and its supertype are compatible; e.g., if they have the same
4671       tp_basicsize, then that means they have identical fields. So to check
4672       whether two arbitrary types are compatible, we first find the highest
4673       supertype that each is compatible with, and then if those supertypes are
4674       compatible then the original types must also be compatible.
4675      */
4676      newbase = newto;
4677      oldbase = oldto;
4678      while (compatible_with_tp_base(newbase))
4679          newbase = newbase->tp_base;
4680      while (compatible_with_tp_base(oldbase))
4681          oldbase = oldbase->tp_base;
4682      if (newbase != oldbase &&
4683          (newbase->tp_base != oldbase->tp_base ||
4684           !same_slots_added(newbase, oldbase))) {
4685          PyErr_Format(PyExc_TypeError,
4686                       "%s assignment: "
4687                       "'%s' object layout differs from '%s'",
4688                       attr,
4689                       newto->tp_name,
4690                       oldto->tp_name);
4691          return 0;
4692      }
4693  
4694      return 1;
4695  }
4696  
4697  static int
object_set_class(PyObject * self,PyObject * value,void * closure)4698  object_set_class(PyObject *self, PyObject *value, void *closure)
4699  {
4700      PyTypeObject *oldto = Py_TYPE(self);
4701      PyTypeObject *newto;
4702  
4703      if (value == NULL) {
4704          PyErr_SetString(PyExc_TypeError,
4705                          "can't delete __class__ attribute");
4706          return -1;
4707      }
4708      if (!PyType_Check(value)) {
4709          PyErr_Format(PyExc_TypeError,
4710            "__class__ must be set to a class, not '%s' object",
4711            Py_TYPE(value)->tp_name);
4712          return -1;
4713      }
4714      if (PySys_Audit("object.__setattr__", "OsO",
4715                      self, "__class__", value) < 0) {
4716          return -1;
4717      }
4718  
4719      newto = (PyTypeObject *)value;
4720      /* In versions of CPython prior to 3.5, the code in
4721         compatible_for_assignment was not set up to correctly check for memory
4722         layout / slot / etc. compatibility for non-HEAPTYPE classes, so we just
4723         disallowed __class__ assignment in any case that wasn't HEAPTYPE ->
4724         HEAPTYPE.
4725  
4726         During the 3.5 development cycle, we fixed the code in
4727         compatible_for_assignment to correctly check compatibility between
4728         arbitrary types, and started allowing __class__ assignment in all cases
4729         where the old and new types did in fact have compatible slots and
4730         memory layout (regardless of whether they were implemented as HEAPTYPEs
4731         or not).
4732  
4733         Just before 3.5 was released, though, we discovered that this led to
4734         problems with immutable types like int, where the interpreter assumes
4735         they are immutable and interns some values. Formerly this wasn't a
4736         problem, because they really were immutable -- in particular, all the
4737         types where the interpreter applied this interning trick happened to
4738         also be statically allocated, so the old HEAPTYPE rules were
4739         "accidentally" stopping them from allowing __class__ assignment. But
4740         with the changes to __class__ assignment, we started allowing code like
4741  
4742           class MyInt(int):
4743               ...
4744           # Modifies the type of *all* instances of 1 in the whole program,
4745           # including future instances (!), because the 1 object is interned.
4746           (1).__class__ = MyInt
4747  
4748         (see https://bugs.python.org/issue24912).
4749  
4750         In theory the proper fix would be to identify which classes rely on
4751         this invariant and somehow disallow __class__ assignment only for them,
4752         perhaps via some mechanism like a new Py_TPFLAGS_IMMUTABLE flag (a
4753         "denylisting" approach). But in practice, since this problem wasn't
4754         noticed late in the 3.5 RC cycle, we're taking the conservative
4755         approach and reinstating the same HEAPTYPE->HEAPTYPE check that we used
4756         to have, plus an "allowlist". For now, the allowlist consists only of
4757         ModuleType subtypes, since those are the cases that motivated the patch
4758         in the first place -- see https://bugs.python.org/issue22986 -- and
4759         since module objects are mutable we can be sure that they are
4760         definitely not being interned. So now we allow HEAPTYPE->HEAPTYPE *or*
4761         ModuleType subtype -> ModuleType subtype.
4762  
4763         So far as we know, all the code beyond the following 'if' statement
4764         will correctly handle non-HEAPTYPE classes, and the HEAPTYPE check is
4765         needed only to protect that subset of non-HEAPTYPE classes for which
4766         the interpreter has baked in the assumption that all instances are
4767         truly immutable.
4768      */
4769      if (!(PyType_IsSubtype(newto, &PyModule_Type) &&
4770            PyType_IsSubtype(oldto, &PyModule_Type)) &&
4771          (_PyType_HasFeature(newto, Py_TPFLAGS_IMMUTABLETYPE) ||
4772           _PyType_HasFeature(oldto, Py_TPFLAGS_IMMUTABLETYPE))) {
4773          PyErr_Format(PyExc_TypeError,
4774                       "__class__ assignment only supported for mutable types "
4775                       "or ModuleType subclasses");
4776          return -1;
4777      }
4778  
4779      if (compatible_for_assignment(oldto, newto, "__class__")) {
4780          if (newto->tp_flags & Py_TPFLAGS_HEAPTYPE) {
4781              Py_INCREF(newto);
4782          }
4783          Py_SET_TYPE(self, newto);
4784          if (oldto->tp_flags & Py_TPFLAGS_HEAPTYPE)
4785              Py_DECREF(oldto);
4786          return 0;
4787      }
4788      else {
4789          return -1;
4790      }
4791  }
4792  
4793  static PyGetSetDef object_getsets[] = {
4794      {"__class__", object_get_class, object_set_class,
4795       PyDoc_STR("the object's class")},
4796      {0}
4797  };
4798  
4799  
4800  /* Stuff to implement __reduce_ex__ for pickle protocols >= 2.
4801     We fall back to helpers in copyreg for:
4802     - pickle protocols < 2
4803     - calculating the list of slot names (done only once per class)
4804     - the __newobj__ function (which is used as a token but never called)
4805  */
4806  
4807  static PyObject *
import_copyreg(void)4808  import_copyreg(void)
4809  {
4810      PyObject *copyreg_str;
4811      PyObject *copyreg_module;
4812      _Py_IDENTIFIER(copyreg);
4813  
4814      copyreg_str = _PyUnicode_FromId(&PyId_copyreg);
4815      if (copyreg_str == NULL) {
4816          return NULL;
4817      }
4818      /* Try to fetch cached copy of copyreg from sys.modules first in an
4819         attempt to avoid the import overhead. Previously this was implemented
4820         by storing a reference to the cached module in a static variable, but
4821         this broke when multiple embedded interpreters were in use (see issue
4822         #17408 and #19088). */
4823      copyreg_module = PyImport_GetModule(copyreg_str);
4824      if (copyreg_module != NULL) {
4825          return copyreg_module;
4826      }
4827      if (PyErr_Occurred()) {
4828          return NULL;
4829      }
4830      return PyImport_Import(copyreg_str);
4831  }
4832  
4833  static PyObject *
_PyType_GetSlotNames(PyTypeObject * cls)4834  _PyType_GetSlotNames(PyTypeObject *cls)
4835  {
4836      PyObject *copyreg;
4837      PyObject *slotnames;
4838      _Py_IDENTIFIER(__slotnames__);
4839      _Py_IDENTIFIER(_slotnames);
4840  
4841      assert(PyType_Check(cls));
4842  
4843      /* Get the slot names from the cache in the class if possible. */
4844      slotnames = _PyDict_GetItemIdWithError(cls->tp_dict, &PyId___slotnames__);
4845      if (slotnames != NULL) {
4846          if (slotnames != Py_None && !PyList_Check(slotnames)) {
4847              PyErr_Format(PyExc_TypeError,
4848                           "%.200s.__slotnames__ should be a list or None, "
4849                           "not %.200s",
4850                           cls->tp_name, Py_TYPE(slotnames)->tp_name);
4851              return NULL;
4852          }
4853          Py_INCREF(slotnames);
4854          return slotnames;
4855      }
4856      else {
4857          if (PyErr_Occurred()) {
4858              return NULL;
4859          }
4860          /* The class does not have the slot names cached yet. */
4861      }
4862  
4863      copyreg = import_copyreg();
4864      if (copyreg == NULL)
4865          return NULL;
4866  
4867      /* Use _slotnames function from the copyreg module to find the slots
4868         by this class and its bases. This function will cache the result
4869         in __slotnames__. */
4870      slotnames = _PyObject_CallMethodIdOneArg(copyreg, &PyId__slotnames,
4871                                               (PyObject *)cls);
4872      Py_DECREF(copyreg);
4873      if (slotnames == NULL)
4874          return NULL;
4875  
4876      if (slotnames != Py_None && !PyList_Check(slotnames)) {
4877          PyErr_SetString(PyExc_TypeError,
4878                          "copyreg._slotnames didn't return a list or None");
4879          Py_DECREF(slotnames);
4880          return NULL;
4881      }
4882  
4883      return slotnames;
4884  }
4885  
4886  static PyObject *
_PyObject_GetState(PyObject * obj,int required)4887  _PyObject_GetState(PyObject *obj, int required)
4888  {
4889      PyObject *state;
4890      PyObject *getstate;
4891      _Py_IDENTIFIER(__getstate__);
4892  
4893      if (_PyObject_LookupAttrId(obj, &PyId___getstate__, &getstate) < 0) {
4894          return NULL;
4895      }
4896      if (getstate == NULL) {
4897          PyObject *slotnames;
4898  
4899          if (required && Py_TYPE(obj)->tp_itemsize) {
4900              PyErr_Format(PyExc_TypeError,
4901                           "cannot pickle '%.200s' object",
4902                           Py_TYPE(obj)->tp_name);
4903              return NULL;
4904          }
4905  
4906          {
4907              PyObject **dict;
4908              dict = _PyObject_GetDictPtr(obj);
4909              /* It is possible that the object's dict is not initialized
4910                 yet. In this case, we will return None for the state.
4911                 We also return None if the dict is empty to make the behavior
4912                 consistent regardless whether the dict was initialized or not.
4913                 This make unit testing easier. */
4914              if (dict != NULL && *dict != NULL && PyDict_GET_SIZE(*dict)) {
4915                  state = *dict;
4916              }
4917              else {
4918                  state = Py_None;
4919              }
4920              Py_INCREF(state);
4921          }
4922  
4923          slotnames = _PyType_GetSlotNames(Py_TYPE(obj));
4924          if (slotnames == NULL) {
4925              Py_DECREF(state);
4926              return NULL;
4927          }
4928  
4929          assert(slotnames == Py_None || PyList_Check(slotnames));
4930          if (required) {
4931              Py_ssize_t basicsize = PyBaseObject_Type.tp_basicsize;
4932              if (Py_TYPE(obj)->tp_dictoffset)
4933                  basicsize += sizeof(PyObject *);
4934              if (Py_TYPE(obj)->tp_weaklistoffset)
4935                  basicsize += sizeof(PyObject *);
4936              if (slotnames != Py_None)
4937                  basicsize += sizeof(PyObject *) * PyList_GET_SIZE(slotnames);
4938              if (Py_TYPE(obj)->tp_basicsize > basicsize) {
4939                  Py_DECREF(slotnames);
4940                  Py_DECREF(state);
4941                  PyErr_Format(PyExc_TypeError,
4942                               "cannot pickle '%.200s' object",
4943                               Py_TYPE(obj)->tp_name);
4944                  return NULL;
4945              }
4946          }
4947  
4948          if (slotnames != Py_None && PyList_GET_SIZE(slotnames) > 0) {
4949              PyObject *slots;
4950              Py_ssize_t slotnames_size, i;
4951  
4952              slots = PyDict_New();
4953              if (slots == NULL) {
4954                  Py_DECREF(slotnames);
4955                  Py_DECREF(state);
4956                  return NULL;
4957              }
4958  
4959              slotnames_size = PyList_GET_SIZE(slotnames);
4960              for (i = 0; i < slotnames_size; i++) {
4961                  PyObject *name, *value;
4962  
4963                  name = PyList_GET_ITEM(slotnames, i);
4964                  Py_INCREF(name);
4965                  if (_PyObject_LookupAttr(obj, name, &value) < 0) {
4966                      goto error;
4967                  }
4968                  if (value == NULL) {
4969                      Py_DECREF(name);
4970                      /* It is not an error if the attribute is not present. */
4971                  }
4972                  else {
4973                      int err = PyDict_SetItem(slots, name, value);
4974                      Py_DECREF(name);
4975                      Py_DECREF(value);
4976                      if (err) {
4977                          goto error;
4978                      }
4979                  }
4980  
4981                  /* The list is stored on the class so it may mutate while we
4982                     iterate over it */
4983                  if (slotnames_size != PyList_GET_SIZE(slotnames)) {
4984                      PyErr_Format(PyExc_RuntimeError,
4985                                   "__slotsname__ changed size during iteration");
4986                      goto error;
4987                  }
4988  
4989                  /* We handle errors within the loop here. */
4990                  if (0) {
4991                    error:
4992                      Py_DECREF(slotnames);
4993                      Py_DECREF(slots);
4994                      Py_DECREF(state);
4995                      return NULL;
4996                  }
4997              }
4998  
4999              /* If we found some slot attributes, pack them in a tuple along
5000                 the original attribute dictionary. */
5001              if (PyDict_GET_SIZE(slots) > 0) {
5002                  PyObject *state2;
5003  
5004                  state2 = PyTuple_Pack(2, state, slots);
5005                  Py_DECREF(state);
5006                  if (state2 == NULL) {
5007                      Py_DECREF(slotnames);
5008                      Py_DECREF(slots);
5009                      return NULL;
5010                  }
5011                  state = state2;
5012              }
5013              Py_DECREF(slots);
5014          }
5015          Py_DECREF(slotnames);
5016      }
5017      else { /* getstate != NULL */
5018          state = _PyObject_CallNoArg(getstate);
5019          Py_DECREF(getstate);
5020          if (state == NULL)
5021              return NULL;
5022      }
5023  
5024      return state;
5025  }
5026  
5027  static int
_PyObject_GetNewArguments(PyObject * obj,PyObject ** args,PyObject ** kwargs)5028  _PyObject_GetNewArguments(PyObject *obj, PyObject **args, PyObject **kwargs)
5029  {
5030      PyObject *getnewargs, *getnewargs_ex;
5031      _Py_IDENTIFIER(__getnewargs_ex__);
5032      _Py_IDENTIFIER(__getnewargs__);
5033  
5034      if (args == NULL || kwargs == NULL) {
5035          PyErr_BadInternalCall();
5036          return -1;
5037      }
5038  
5039      /* We first attempt to fetch the arguments for __new__ by calling
5040         __getnewargs_ex__ on the object. */
5041      getnewargs_ex = _PyObject_LookupSpecial(obj, &PyId___getnewargs_ex__);
5042      if (getnewargs_ex != NULL) {
5043          PyObject *newargs = _PyObject_CallNoArg(getnewargs_ex);
5044          Py_DECREF(getnewargs_ex);
5045          if (newargs == NULL) {
5046              return -1;
5047          }
5048          if (!PyTuple_Check(newargs)) {
5049              PyErr_Format(PyExc_TypeError,
5050                           "__getnewargs_ex__ should return a tuple, "
5051                           "not '%.200s'", Py_TYPE(newargs)->tp_name);
5052              Py_DECREF(newargs);
5053              return -1;
5054          }
5055          if (PyTuple_GET_SIZE(newargs) != 2) {
5056              PyErr_Format(PyExc_ValueError,
5057                           "__getnewargs_ex__ should return a tuple of "
5058                           "length 2, not %zd", PyTuple_GET_SIZE(newargs));
5059              Py_DECREF(newargs);
5060              return -1;
5061          }
5062          *args = PyTuple_GET_ITEM(newargs, 0);
5063          Py_INCREF(*args);
5064          *kwargs = PyTuple_GET_ITEM(newargs, 1);
5065          Py_INCREF(*kwargs);
5066          Py_DECREF(newargs);
5067  
5068          /* XXX We should perhaps allow None to be passed here. */
5069          if (!PyTuple_Check(*args)) {
5070              PyErr_Format(PyExc_TypeError,
5071                           "first item of the tuple returned by "
5072                           "__getnewargs_ex__ must be a tuple, not '%.200s'",
5073                           Py_TYPE(*args)->tp_name);
5074              Py_CLEAR(*args);
5075              Py_CLEAR(*kwargs);
5076              return -1;
5077          }
5078          if (!PyDict_Check(*kwargs)) {
5079              PyErr_Format(PyExc_TypeError,
5080                           "second item of the tuple returned by "
5081                           "__getnewargs_ex__ must be a dict, not '%.200s'",
5082                           Py_TYPE(*kwargs)->tp_name);
5083              Py_CLEAR(*args);
5084              Py_CLEAR(*kwargs);
5085              return -1;
5086          }
5087          return 0;
5088      } else if (PyErr_Occurred()) {
5089          return -1;
5090      }
5091  
5092      /* The object does not have __getnewargs_ex__ so we fallback on using
5093         __getnewargs__ instead. */
5094      getnewargs = _PyObject_LookupSpecial(obj, &PyId___getnewargs__);
5095      if (getnewargs != NULL) {
5096          *args = _PyObject_CallNoArg(getnewargs);
5097          Py_DECREF(getnewargs);
5098          if (*args == NULL) {
5099              return -1;
5100          }
5101          if (!PyTuple_Check(*args)) {
5102              PyErr_Format(PyExc_TypeError,
5103                           "__getnewargs__ should return a tuple, "
5104                           "not '%.200s'", Py_TYPE(*args)->tp_name);
5105              Py_CLEAR(*args);
5106              return -1;
5107          }
5108          *kwargs = NULL;
5109          return 0;
5110      } else if (PyErr_Occurred()) {
5111          return -1;
5112      }
5113  
5114      /* The object does not have __getnewargs_ex__ and __getnewargs__. This may
5115         mean __new__ does not takes any arguments on this object, or that the
5116         object does not implement the reduce protocol for pickling or
5117         copying. */
5118      *args = NULL;
5119      *kwargs = NULL;
5120      return 0;
5121  }
5122  
5123  static int
_PyObject_GetItemsIter(PyObject * obj,PyObject ** listitems,PyObject ** dictitems)5124  _PyObject_GetItemsIter(PyObject *obj, PyObject **listitems,
5125                         PyObject **dictitems)
5126  {
5127      if (listitems == NULL || dictitems == NULL) {
5128          PyErr_BadInternalCall();
5129          return -1;
5130      }
5131  
5132      if (!PyList_Check(obj)) {
5133          *listitems = Py_None;
5134          Py_INCREF(*listitems);
5135      }
5136      else {
5137          *listitems = PyObject_GetIter(obj);
5138          if (*listitems == NULL)
5139              return -1;
5140      }
5141  
5142      if (!PyDict_Check(obj)) {
5143          *dictitems = Py_None;
5144          Py_INCREF(*dictitems);
5145      }
5146      else {
5147          PyObject *items;
5148          _Py_IDENTIFIER(items);
5149  
5150          items = _PyObject_CallMethodIdNoArgs(obj, &PyId_items);
5151          if (items == NULL) {
5152              Py_CLEAR(*listitems);
5153              return -1;
5154          }
5155          *dictitems = PyObject_GetIter(items);
5156          Py_DECREF(items);
5157          if (*dictitems == NULL) {
5158              Py_CLEAR(*listitems);
5159              return -1;
5160          }
5161      }
5162  
5163      assert(*listitems != NULL && *dictitems != NULL);
5164  
5165      return 0;
5166  }
5167  
5168  static PyObject *
reduce_newobj(PyObject * obj)5169  reduce_newobj(PyObject *obj)
5170  {
5171      PyObject *args = NULL, *kwargs = NULL;
5172      PyObject *copyreg;
5173      PyObject *newobj, *newargs, *state, *listitems, *dictitems;
5174      PyObject *result;
5175      int hasargs;
5176  
5177      if (Py_TYPE(obj)->tp_new == NULL) {
5178          PyErr_Format(PyExc_TypeError,
5179                       "cannot pickle '%.200s' object",
5180                       Py_TYPE(obj)->tp_name);
5181          return NULL;
5182      }
5183      if (_PyObject_GetNewArguments(obj, &args, &kwargs) < 0)
5184          return NULL;
5185  
5186      copyreg = import_copyreg();
5187      if (copyreg == NULL) {
5188          Py_XDECREF(args);
5189          Py_XDECREF(kwargs);
5190          return NULL;
5191      }
5192      hasargs = (args != NULL);
5193      if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) {
5194          _Py_IDENTIFIER(__newobj__);
5195          PyObject *cls;
5196          Py_ssize_t i, n;
5197  
5198          Py_XDECREF(kwargs);
5199          newobj = _PyObject_GetAttrId(copyreg, &PyId___newobj__);
5200          Py_DECREF(copyreg);
5201          if (newobj == NULL) {
5202              Py_XDECREF(args);
5203              return NULL;
5204          }
5205          n = args ? PyTuple_GET_SIZE(args) : 0;
5206          newargs = PyTuple_New(n+1);
5207          if (newargs == NULL) {
5208              Py_XDECREF(args);
5209              Py_DECREF(newobj);
5210              return NULL;
5211          }
5212          cls = (PyObject *) Py_TYPE(obj);
5213          Py_INCREF(cls);
5214          PyTuple_SET_ITEM(newargs, 0, cls);
5215          for (i = 0; i < n; i++) {
5216              PyObject *v = PyTuple_GET_ITEM(args, i);
5217              Py_INCREF(v);
5218              PyTuple_SET_ITEM(newargs, i+1, v);
5219          }
5220          Py_XDECREF(args);
5221      }
5222      else if (args != NULL) {
5223          _Py_IDENTIFIER(__newobj_ex__);
5224  
5225          newobj = _PyObject_GetAttrId(copyreg, &PyId___newobj_ex__);
5226          Py_DECREF(copyreg);
5227          if (newobj == NULL) {
5228              Py_DECREF(args);
5229              Py_DECREF(kwargs);
5230              return NULL;
5231          }
5232          newargs = PyTuple_Pack(3, Py_TYPE(obj), args, kwargs);
5233          Py_DECREF(args);
5234          Py_DECREF(kwargs);
5235          if (newargs == NULL) {
5236              Py_DECREF(newobj);
5237              return NULL;
5238          }
5239      }
5240      else {
5241          /* args == NULL */
5242          Py_DECREF(kwargs);
5243          PyErr_BadInternalCall();
5244          return NULL;
5245      }
5246  
5247      state = _PyObject_GetState(obj,
5248                  !hasargs && !PyList_Check(obj) && !PyDict_Check(obj));
5249      if (state == NULL) {
5250          Py_DECREF(newobj);
5251          Py_DECREF(newargs);
5252          return NULL;
5253      }
5254      if (_PyObject_GetItemsIter(obj, &listitems, &dictitems) < 0) {
5255          Py_DECREF(newobj);
5256          Py_DECREF(newargs);
5257          Py_DECREF(state);
5258          return NULL;
5259      }
5260  
5261      result = PyTuple_Pack(5, newobj, newargs, state, listitems, dictitems);
5262      Py_DECREF(newobj);
5263      Py_DECREF(newargs);
5264      Py_DECREF(state);
5265      Py_DECREF(listitems);
5266      Py_DECREF(dictitems);
5267      return result;
5268  }
5269  
5270  /*
5271   * There were two problems when object.__reduce__ and object.__reduce_ex__
5272   * were implemented in the same function:
5273   *  - trying to pickle an object with a custom __reduce__ method that
5274   *    fell back to object.__reduce__ in certain circumstances led to
5275   *    infinite recursion at Python level and eventual RecursionError.
5276   *  - Pickling objects that lied about their type by overwriting the
5277   *    __class__ descriptor could lead to infinite recursion at C level
5278   *    and eventual segfault.
5279   *
5280   * Because of backwards compatibility, the two methods still have to
5281   * behave in the same way, even if this is not required by the pickle
5282   * protocol. This common functionality was moved to the _common_reduce
5283   * function.
5284   */
5285  static PyObject *
_common_reduce(PyObject * self,int proto)5286  _common_reduce(PyObject *self, int proto)
5287  {
5288      PyObject *copyreg, *res;
5289  
5290      if (proto >= 2)
5291          return reduce_newobj(self);
5292  
5293      copyreg = import_copyreg();
5294      if (!copyreg)
5295          return NULL;
5296  
5297      res = PyObject_CallMethod(copyreg, "_reduce_ex", "Oi", self, proto);
5298      Py_DECREF(copyreg);
5299  
5300      return res;
5301  }
5302  
5303  /*[clinic input]
5304  object.__reduce__
5305  
5306  Helper for pickle.
5307  [clinic start generated code]*/
5308  
5309  static PyObject *
object___reduce___impl(PyObject * self)5310  object___reduce___impl(PyObject *self)
5311  /*[clinic end generated code: output=d4ca691f891c6e2f input=11562e663947e18b]*/
5312  {
5313      return _common_reduce(self, 0);
5314  }
5315  
5316  /*[clinic input]
5317  object.__reduce_ex__
5318  
5319    protocol: int
5320    /
5321  
5322  Helper for pickle.
5323  [clinic start generated code]*/
5324  
5325  static PyObject *
object___reduce_ex___impl(PyObject * self,int protocol)5326  object___reduce_ex___impl(PyObject *self, int protocol)
5327  /*[clinic end generated code: output=2e157766f6b50094 input=f326b43fb8a4c5ff]*/
5328  {
5329      static PyObject *objreduce;
5330      PyObject *reduce, *res;
5331      _Py_IDENTIFIER(__reduce__);
5332  
5333      if (objreduce == NULL) {
5334          objreduce = _PyDict_GetItemIdWithError(PyBaseObject_Type.tp_dict,
5335                                                 &PyId___reduce__);
5336          if (objreduce == NULL && PyErr_Occurred()) {
5337              return NULL;
5338          }
5339      }
5340  
5341      if (_PyObject_LookupAttrId(self, &PyId___reduce__, &reduce) < 0) {
5342          return NULL;
5343      }
5344      if (reduce != NULL) {
5345          PyObject *cls, *clsreduce;
5346          int override;
5347  
5348          cls = (PyObject *) Py_TYPE(self);
5349          clsreduce = _PyObject_GetAttrId(cls, &PyId___reduce__);
5350          if (clsreduce == NULL) {
5351              Py_DECREF(reduce);
5352              return NULL;
5353          }
5354          override = (clsreduce != objreduce);
5355          Py_DECREF(clsreduce);
5356          if (override) {
5357              res = _PyObject_CallNoArg(reduce);
5358              Py_DECREF(reduce);
5359              return res;
5360          }
5361          else
5362              Py_DECREF(reduce);
5363      }
5364  
5365      return _common_reduce(self, protocol);
5366  }
5367  
5368  static PyObject *
object_subclasshook(PyObject * cls,PyObject * args)5369  object_subclasshook(PyObject *cls, PyObject *args)
5370  {
5371      Py_RETURN_NOTIMPLEMENTED;
5372  }
5373  
5374  PyDoc_STRVAR(object_subclasshook_doc,
5375  "Abstract classes can override this to customize issubclass().\n"
5376  "\n"
5377  "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n"
5378  "It should return True, False or NotImplemented.  If it returns\n"
5379  "NotImplemented, the normal algorithm is used.  Otherwise, it\n"
5380  "overrides the normal algorithm (and the outcome is cached).\n");
5381  
5382  static PyObject *
object_init_subclass(PyObject * cls,PyObject * arg)5383  object_init_subclass(PyObject *cls, PyObject *arg)
5384  {
5385      Py_RETURN_NONE;
5386  }
5387  
5388  PyDoc_STRVAR(object_init_subclass_doc,
5389  "This method is called when a class is subclassed.\n"
5390  "\n"
5391  "The default implementation does nothing. It may be\n"
5392  "overridden to extend subclasses.\n");
5393  
5394  /*[clinic input]
5395  object.__format__
5396  
5397    format_spec: unicode
5398    /
5399  
5400  Default object formatter.
5401  [clinic start generated code]*/
5402  
5403  static PyObject *
object___format___impl(PyObject * self,PyObject * format_spec)5404  object___format___impl(PyObject *self, PyObject *format_spec)
5405  /*[clinic end generated code: output=34897efb543a974b input=7c3b3bc53a6fb7fa]*/
5406  {
5407      /* Issue 7994: If we're converting to a string, we
5408         should reject format specifications */
5409      if (PyUnicode_GET_LENGTH(format_spec) > 0) {
5410          PyErr_Format(PyExc_TypeError,
5411                       "unsupported format string passed to %.200s.__format__",
5412                       Py_TYPE(self)->tp_name);
5413          return NULL;
5414      }
5415      return PyObject_Str(self);
5416  }
5417  
5418  /*[clinic input]
5419  object.__sizeof__
5420  
5421  Size of object in memory, in bytes.
5422  [clinic start generated code]*/
5423  
5424  static PyObject *
object___sizeof___impl(PyObject * self)5425  object___sizeof___impl(PyObject *self)
5426  /*[clinic end generated code: output=73edab332f97d550 input=1200ff3dfe485306]*/
5427  {
5428      Py_ssize_t res, isize;
5429  
5430      res = 0;
5431      isize = Py_TYPE(self)->tp_itemsize;
5432      if (isize > 0)
5433          res = Py_SIZE(self) * isize;
5434      res += Py_TYPE(self)->tp_basicsize;
5435  
5436      return PyLong_FromSsize_t(res);
5437  }
5438  
5439  /* __dir__ for generic objects: returns __dict__, __class__,
5440     and recursively up the __class__.__bases__ chain.
5441  */
5442  /*[clinic input]
5443  object.__dir__
5444  
5445  Default dir() implementation.
5446  [clinic start generated code]*/
5447  
5448  static PyObject *
object___dir___impl(PyObject * self)5449  object___dir___impl(PyObject *self)
5450  /*[clinic end generated code: output=66dd48ea62f26c90 input=0a89305bec669b10]*/
5451  {
5452      PyObject *result = NULL;
5453      PyObject *dict = NULL;
5454      PyObject *itsclass = NULL;
5455  
5456      /* Get __dict__ (which may or may not be a real dict...) */
5457      if (_PyObject_LookupAttrId(self, &PyId___dict__, &dict) < 0) {
5458          return NULL;
5459      }
5460      if (dict == NULL) {
5461          dict = PyDict_New();
5462      }
5463      else if (!PyDict_Check(dict)) {
5464          Py_DECREF(dict);
5465          dict = PyDict_New();
5466      }
5467      else {
5468          /* Copy __dict__ to avoid mutating it. */
5469          PyObject *temp = PyDict_Copy(dict);
5470          Py_DECREF(dict);
5471          dict = temp;
5472      }
5473  
5474      if (dict == NULL)
5475          goto error;
5476  
5477      /* Merge in attrs reachable from its class. */
5478      if (_PyObject_LookupAttrId(self, &PyId___class__, &itsclass) < 0) {
5479          goto error;
5480      }
5481      /* XXX(tomer): Perhaps fall back to Py_TYPE(obj) if no
5482                     __class__ exists? */
5483      if (itsclass != NULL && merge_class_dict(dict, itsclass) < 0)
5484          goto error;
5485  
5486      result = PyDict_Keys(dict);
5487      /* fall through */
5488  error:
5489      Py_XDECREF(itsclass);
5490      Py_XDECREF(dict);
5491      return result;
5492  }
5493  
5494  static PyMethodDef object_methods[] = {
5495      OBJECT___REDUCE_EX___METHODDEF
5496      OBJECT___REDUCE___METHODDEF
5497      {"__subclasshook__", object_subclasshook, METH_CLASS | METH_VARARGS,
5498       object_subclasshook_doc},
5499      {"__init_subclass__", object_init_subclass, METH_CLASS | METH_NOARGS,
5500       object_init_subclass_doc},
5501      OBJECT___FORMAT___METHODDEF
5502      OBJECT___SIZEOF___METHODDEF
5503      OBJECT___DIR___METHODDEF
5504      {0}
5505  };
5506  
5507  PyDoc_STRVAR(object_doc,
5508  "object()\n--\n\n"
5509  "The base class of the class hierarchy.\n\n"
5510  "When called, it accepts no arguments and returns a new featureless\n"
5511  "instance that has no instance attributes and cannot be given any.\n");
5512  
5513  PyTypeObject PyBaseObject_Type = {
5514      PyVarObject_HEAD_INIT(&PyType_Type, 0)
5515      "object",                                   /* tp_name */
5516      sizeof(PyObject),                           /* tp_basicsize */
5517      0,                                          /* tp_itemsize */
5518      object_dealloc,                             /* tp_dealloc */
5519      0,                                          /* tp_vectorcall_offset */
5520      0,                                          /* tp_getattr */
5521      0,                                          /* tp_setattr */
5522      0,                                          /* tp_as_async */
5523      object_repr,                                /* tp_repr */
5524      0,                                          /* tp_as_number */
5525      0,                                          /* tp_as_sequence */
5526      0,                                          /* tp_as_mapping */
5527      (hashfunc)_Py_HashPointer,                  /* tp_hash */
5528      0,                                          /* tp_call */
5529      object_str,                                 /* tp_str */
5530      PyObject_GenericGetAttr,                    /* tp_getattro */
5531      PyObject_GenericSetAttr,                    /* tp_setattro */
5532      0,                                          /* tp_as_buffer */
5533      Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,   /* tp_flags */
5534      object_doc,                                 /* tp_doc */
5535      0,                                          /* tp_traverse */
5536      0,                                          /* tp_clear */
5537      object_richcompare,                         /* tp_richcompare */
5538      0,                                          /* tp_weaklistoffset */
5539      0,                                          /* tp_iter */
5540      0,                                          /* tp_iternext */
5541      object_methods,                             /* tp_methods */
5542      0,                                          /* tp_members */
5543      object_getsets,                             /* tp_getset */
5544      0,                                          /* tp_base */
5545      0,                                          /* tp_dict */
5546      0,                                          /* tp_descr_get */
5547      0,                                          /* tp_descr_set */
5548      0,                                          /* tp_dictoffset */
5549      object_init,                                /* tp_init */
5550      PyType_GenericAlloc,                        /* tp_alloc */
5551      object_new,                                 /* tp_new */
5552      PyObject_Del,                               /* tp_free */
5553  };
5554  
5555  
5556  static int
type_add_method(PyTypeObject * type,PyMethodDef * meth)5557  type_add_method(PyTypeObject *type, PyMethodDef *meth)
5558  {
5559      PyObject *descr;
5560      int isdescr = 1;
5561      if (meth->ml_flags & METH_CLASS) {
5562          if (meth->ml_flags & METH_STATIC) {
5563              PyErr_SetString(PyExc_ValueError,
5564                      "method cannot be both class and static");
5565              return -1;
5566          }
5567          descr = PyDescr_NewClassMethod(type, meth);
5568      }
5569      else if (meth->ml_flags & METH_STATIC) {
5570          PyObject *cfunc = PyCFunction_NewEx(meth, (PyObject*)type, NULL);
5571          if (cfunc == NULL) {
5572              return -1;
5573          }
5574          descr = PyStaticMethod_New(cfunc);
5575          isdescr = 0;  // PyStaticMethod is not PyDescrObject
5576          Py_DECREF(cfunc);
5577      }
5578      else {
5579          descr = PyDescr_NewMethod(type, meth);
5580      }
5581      if (descr == NULL) {
5582          return -1;
5583      }
5584  
5585      PyObject *name;
5586      if (isdescr) {
5587          name = PyDescr_NAME(descr);
5588      }
5589      else {
5590          name = PyUnicode_FromString(meth->ml_name);
5591          if (name == NULL) {
5592              Py_DECREF(descr);
5593              return -1;
5594          }
5595      }
5596  
5597      int err;
5598      if (!(meth->ml_flags & METH_COEXIST)) {
5599          err = PyDict_SetDefault(type->tp_dict, name, descr) == NULL;
5600      }
5601      else {
5602          err = PyDict_SetItem(type->tp_dict, name, descr) < 0;
5603      }
5604      if (!isdescr) {
5605          Py_DECREF(name);
5606      }
5607      Py_DECREF(descr);
5608      if (err) {
5609          return -1;
5610      }
5611      return 0;
5612  }
5613  
5614  
5615  /* Add the methods from tp_methods to the __dict__ in a type object */
5616  static int
type_add_methods(PyTypeObject * type)5617  type_add_methods(PyTypeObject *type)
5618  {
5619      PyMethodDef *meth = type->tp_methods;
5620      if (meth == NULL) {
5621          return 0;
5622      }
5623  
5624      for (; meth->ml_name != NULL; meth++) {
5625          if (type_add_method(type, meth) < 0) {
5626              return -1;
5627          }
5628      }
5629      return 0;
5630  }
5631  
5632  
5633  static int
type_add_members(PyTypeObject * type)5634  type_add_members(PyTypeObject *type)
5635  {
5636      PyMemberDef *memb = type->tp_members;
5637      if (memb == NULL) {
5638          return 0;
5639      }
5640  
5641      PyObject *dict = type->tp_dict;
5642      for (; memb->name != NULL; memb++) {
5643          PyObject *descr = PyDescr_NewMember(type, memb);
5644          if (descr == NULL)
5645              return -1;
5646  
5647          if (PyDict_SetDefault(dict, PyDescr_NAME(descr), descr) == NULL) {
5648              Py_DECREF(descr);
5649              return -1;
5650          }
5651          Py_DECREF(descr);
5652      }
5653      return 0;
5654  }
5655  
5656  
5657  static int
type_add_getset(PyTypeObject * type)5658  type_add_getset(PyTypeObject *type)
5659  {
5660      PyGetSetDef *gsp = type->tp_getset;
5661      if (gsp == NULL) {
5662          return 0;
5663      }
5664  
5665      PyObject *dict = type->tp_dict;
5666      for (; gsp->name != NULL; gsp++) {
5667          PyObject *descr = PyDescr_NewGetSet(type, gsp);
5668          if (descr == NULL) {
5669              return -1;
5670          }
5671  
5672          if (PyDict_SetDefault(dict, PyDescr_NAME(descr), descr) == NULL) {
5673              Py_DECREF(descr);
5674              return -1;
5675          }
5676          Py_DECREF(descr);
5677      }
5678      return 0;
5679  }
5680  
5681  
5682  static void
inherit_special(PyTypeObject * type,PyTypeObject * base)5683  inherit_special(PyTypeObject *type, PyTypeObject *base)
5684  {
5685      /* Copying tp_traverse and tp_clear is connected to the GC flags */
5686      if (!(type->tp_flags & Py_TPFLAGS_HAVE_GC) &&
5687          (base->tp_flags & Py_TPFLAGS_HAVE_GC) &&
5688          (!type->tp_traverse && !type->tp_clear)) {
5689          type->tp_flags |= Py_TPFLAGS_HAVE_GC;
5690          if (type->tp_traverse == NULL)
5691              type->tp_traverse = base->tp_traverse;
5692          if (type->tp_clear == NULL)
5693              type->tp_clear = base->tp_clear;
5694      }
5695  
5696      if (type->tp_basicsize == 0)
5697          type->tp_basicsize = base->tp_basicsize;
5698  
5699      /* Copy other non-function slots */
5700  
5701  #define COPYVAL(SLOT) \
5702      if (type->SLOT == 0) { type->SLOT = base->SLOT; }
5703  
5704      COPYVAL(tp_itemsize);
5705      COPYVAL(tp_weaklistoffset);
5706      COPYVAL(tp_dictoffset);
5707  #undef COPYVAL
5708  
5709      /* Setup fast subclass flags */
5710      if (PyType_IsSubtype(base, (PyTypeObject*)PyExc_BaseException)) {
5711          type->tp_flags |= Py_TPFLAGS_BASE_EXC_SUBCLASS;
5712      }
5713      else if (PyType_IsSubtype(base, &PyType_Type)) {
5714          type->tp_flags |= Py_TPFLAGS_TYPE_SUBCLASS;
5715      }
5716      else if (PyType_IsSubtype(base, &PyLong_Type)) {
5717          type->tp_flags |= Py_TPFLAGS_LONG_SUBCLASS;
5718      }
5719      else if (PyType_IsSubtype(base, &PyBytes_Type)) {
5720          type->tp_flags |= Py_TPFLAGS_BYTES_SUBCLASS;
5721      }
5722      else if (PyType_IsSubtype(base, &PyUnicode_Type)) {
5723          type->tp_flags |= Py_TPFLAGS_UNICODE_SUBCLASS;
5724      }
5725      else if (PyType_IsSubtype(base, &PyTuple_Type)) {
5726          type->tp_flags |= Py_TPFLAGS_TUPLE_SUBCLASS;
5727      }
5728      else if (PyType_IsSubtype(base, &PyList_Type)) {
5729          type->tp_flags |= Py_TPFLAGS_LIST_SUBCLASS;
5730      }
5731      else if (PyType_IsSubtype(base, &PyDict_Type)) {
5732          type->tp_flags |= Py_TPFLAGS_DICT_SUBCLASS;
5733      }
5734      if (PyType_HasFeature(base, _Py_TPFLAGS_MATCH_SELF)) {
5735          type->tp_flags |= _Py_TPFLAGS_MATCH_SELF;
5736      }
5737  }
5738  
5739  static int
overrides_hash(PyTypeObject * type)5740  overrides_hash(PyTypeObject *type)
5741  {
5742      PyObject *dict = type->tp_dict;
5743      _Py_IDENTIFIER(__eq__);
5744  
5745      assert(dict != NULL);
5746      int r = _PyDict_ContainsId(dict, &PyId___eq__);
5747      if (r == 0) {
5748          r = _PyDict_ContainsId(dict, &PyId___hash__);
5749      }
5750      return r;
5751  }
5752  
5753  static int
inherit_slots(PyTypeObject * type,PyTypeObject * base)5754  inherit_slots(PyTypeObject *type, PyTypeObject *base)
5755  {
5756      PyTypeObject *basebase;
5757  
5758  #undef SLOTDEFINED
5759  #undef COPYSLOT
5760  #undef COPYNUM
5761  #undef COPYSEQ
5762  #undef COPYMAP
5763  #undef COPYBUF
5764  
5765  #define SLOTDEFINED(SLOT) \
5766      (base->SLOT != 0 && \
5767       (basebase == NULL || base->SLOT != basebase->SLOT))
5768  
5769  #define COPYSLOT(SLOT) \
5770      if (!type->SLOT && SLOTDEFINED(SLOT)) type->SLOT = base->SLOT
5771  
5772  #define COPYASYNC(SLOT) COPYSLOT(tp_as_async->SLOT)
5773  #define COPYNUM(SLOT) COPYSLOT(tp_as_number->SLOT)
5774  #define COPYSEQ(SLOT) COPYSLOT(tp_as_sequence->SLOT)
5775  #define COPYMAP(SLOT) COPYSLOT(tp_as_mapping->SLOT)
5776  #define COPYBUF(SLOT) COPYSLOT(tp_as_buffer->SLOT)
5777  
5778      /* This won't inherit indirect slots (from tp_as_number etc.)
5779         if type doesn't provide the space. */
5780  
5781      if (type->tp_as_number != NULL && base->tp_as_number != NULL) {
5782          basebase = base->tp_base;
5783          if (basebase->tp_as_number == NULL)
5784              basebase = NULL;
5785          COPYNUM(nb_add);
5786          COPYNUM(nb_subtract);
5787          COPYNUM(nb_multiply);
5788          COPYNUM(nb_remainder);
5789          COPYNUM(nb_divmod);
5790          COPYNUM(nb_power);
5791          COPYNUM(nb_negative);
5792          COPYNUM(nb_positive);
5793          COPYNUM(nb_absolute);
5794          COPYNUM(nb_bool);
5795          COPYNUM(nb_invert);
5796          COPYNUM(nb_lshift);
5797          COPYNUM(nb_rshift);
5798          COPYNUM(nb_and);
5799          COPYNUM(nb_xor);
5800          COPYNUM(nb_or);
5801          COPYNUM(nb_int);
5802          COPYNUM(nb_float);
5803          COPYNUM(nb_inplace_add);
5804          COPYNUM(nb_inplace_subtract);
5805          COPYNUM(nb_inplace_multiply);
5806          COPYNUM(nb_inplace_remainder);
5807          COPYNUM(nb_inplace_power);
5808          COPYNUM(nb_inplace_lshift);
5809          COPYNUM(nb_inplace_rshift);
5810          COPYNUM(nb_inplace_and);
5811          COPYNUM(nb_inplace_xor);
5812          COPYNUM(nb_inplace_or);
5813          COPYNUM(nb_true_divide);
5814          COPYNUM(nb_floor_divide);
5815          COPYNUM(nb_inplace_true_divide);
5816          COPYNUM(nb_inplace_floor_divide);
5817          COPYNUM(nb_index);
5818          COPYNUM(nb_matrix_multiply);
5819          COPYNUM(nb_inplace_matrix_multiply);
5820      }
5821  
5822      if (type->tp_as_async != NULL && base->tp_as_async != NULL) {
5823          basebase = base->tp_base;
5824          if (basebase->tp_as_async == NULL)
5825              basebase = NULL;
5826          COPYASYNC(am_await);
5827          COPYASYNC(am_aiter);
5828          COPYASYNC(am_anext);
5829      }
5830  
5831      if (type->tp_as_sequence != NULL && base->tp_as_sequence != NULL) {
5832          basebase = base->tp_base;
5833          if (basebase->tp_as_sequence == NULL)
5834              basebase = NULL;
5835          COPYSEQ(sq_length);
5836          COPYSEQ(sq_concat);
5837          COPYSEQ(sq_repeat);
5838          COPYSEQ(sq_item);
5839          COPYSEQ(sq_ass_item);
5840          COPYSEQ(sq_contains);
5841          COPYSEQ(sq_inplace_concat);
5842          COPYSEQ(sq_inplace_repeat);
5843      }
5844  
5845      if (type->tp_as_mapping != NULL && base->tp_as_mapping != NULL) {
5846          basebase = base->tp_base;
5847          if (basebase->tp_as_mapping == NULL)
5848              basebase = NULL;
5849          COPYMAP(mp_length);
5850          COPYMAP(mp_subscript);
5851          COPYMAP(mp_ass_subscript);
5852      }
5853  
5854      if (type->tp_as_buffer != NULL && base->tp_as_buffer != NULL) {
5855          basebase = base->tp_base;
5856          if (basebase->tp_as_buffer == NULL)
5857              basebase = NULL;
5858          COPYBUF(bf_getbuffer);
5859          COPYBUF(bf_releasebuffer);
5860      }
5861  
5862      basebase = base->tp_base;
5863  
5864      COPYSLOT(tp_dealloc);
5865      if (type->tp_getattr == NULL && type->tp_getattro == NULL) {
5866          type->tp_getattr = base->tp_getattr;
5867          type->tp_getattro = base->tp_getattro;
5868      }
5869      if (type->tp_setattr == NULL && type->tp_setattro == NULL) {
5870          type->tp_setattr = base->tp_setattr;
5871          type->tp_setattro = base->tp_setattro;
5872      }
5873      COPYSLOT(tp_repr);
5874      /* tp_hash see tp_richcompare */
5875      {
5876          /* Always inherit tp_vectorcall_offset to support PyVectorcall_Call().
5877           * If Py_TPFLAGS_HAVE_VECTORCALL is not inherited, then vectorcall
5878           * won't be used automatically. */
5879          COPYSLOT(tp_vectorcall_offset);
5880  
5881          /* Inherit Py_TPFLAGS_HAVE_VECTORCALL for non-heap types
5882          * if tp_call is not overridden */
5883          if (!type->tp_call &&
5884              (base->tp_flags & Py_TPFLAGS_HAVE_VECTORCALL) &&
5885              !(type->tp_flags & Py_TPFLAGS_HEAPTYPE))
5886          {
5887              type->tp_flags |= Py_TPFLAGS_HAVE_VECTORCALL;
5888          }
5889          COPYSLOT(tp_call);
5890      }
5891      COPYSLOT(tp_str);
5892      {
5893          /* Copy comparison-related slots only when
5894             not overriding them anywhere */
5895          if (type->tp_richcompare == NULL &&
5896              type->tp_hash == NULL)
5897          {
5898              int r = overrides_hash(type);
5899              if (r < 0) {
5900                  return -1;
5901              }
5902              if (!r) {
5903                  type->tp_richcompare = base->tp_richcompare;
5904                  type->tp_hash = base->tp_hash;
5905              }
5906          }
5907      }
5908      {
5909          COPYSLOT(tp_iter);
5910          COPYSLOT(tp_iternext);
5911      }
5912      {
5913          COPYSLOT(tp_descr_get);
5914          /* Inherit Py_TPFLAGS_METHOD_DESCRIPTOR if tp_descr_get was inherited,
5915           * but only for extension types */
5916          if (base->tp_descr_get &&
5917              type->tp_descr_get == base->tp_descr_get &&
5918              !(type->tp_flags & Py_TPFLAGS_HEAPTYPE) &&
5919              (base->tp_flags & Py_TPFLAGS_METHOD_DESCRIPTOR))
5920          {
5921              type->tp_flags |= Py_TPFLAGS_METHOD_DESCRIPTOR;
5922          }
5923          COPYSLOT(tp_descr_set);
5924          COPYSLOT(tp_dictoffset);
5925          COPYSLOT(tp_init);
5926          COPYSLOT(tp_alloc);
5927          COPYSLOT(tp_is_gc);
5928          COPYSLOT(tp_finalize);
5929          if ((type->tp_flags & Py_TPFLAGS_HAVE_GC) ==
5930              (base->tp_flags & Py_TPFLAGS_HAVE_GC)) {
5931              /* They agree about gc. */
5932              COPYSLOT(tp_free);
5933          }
5934          else if ((type->tp_flags & Py_TPFLAGS_HAVE_GC) &&
5935                   type->tp_free == NULL &&
5936                   base->tp_free == PyObject_Free) {
5937              /* A bit of magic to plug in the correct default
5938               * tp_free function when a derived class adds gc,
5939               * didn't define tp_free, and the base uses the
5940               * default non-gc tp_free.
5941               */
5942              type->tp_free = PyObject_GC_Del;
5943          }
5944          /* else they didn't agree about gc, and there isn't something
5945           * obvious to be done -- the type is on its own.
5946           */
5947      }
5948      return 0;
5949  }
5950  
5951  static int add_operators(PyTypeObject *);
5952  static int add_tp_new_wrapper(PyTypeObject *type);
5953  
5954  #define COLLECTION_FLAGS (Py_TPFLAGS_SEQUENCE | Py_TPFLAGS_MAPPING)
5955  
5956  static int
type_ready_checks(PyTypeObject * type)5957  type_ready_checks(PyTypeObject *type)
5958  {
5959      /* Consistency checks for PEP 590:
5960       * - Py_TPFLAGS_METHOD_DESCRIPTOR requires tp_descr_get
5961       * - Py_TPFLAGS_HAVE_VECTORCALL requires tp_call and
5962       *   tp_vectorcall_offset > 0
5963       * To avoid mistakes, we require this before inheriting.
5964       */
5965      if (type->tp_flags & Py_TPFLAGS_METHOD_DESCRIPTOR) {
5966          _PyObject_ASSERT((PyObject *)type, type->tp_descr_get != NULL);
5967      }
5968      if (type->tp_flags & Py_TPFLAGS_HAVE_VECTORCALL) {
5969          _PyObject_ASSERT((PyObject *)type, type->tp_vectorcall_offset > 0);
5970          _PyObject_ASSERT((PyObject *)type, type->tp_call != NULL);
5971      }
5972  
5973      /* Consistency checks for pattern matching
5974       * Py_TPFLAGS_SEQUENCE and Py_TPFLAGS_MAPPING are mutually exclusive */
5975      _PyObject_ASSERT((PyObject *)type, (type->tp_flags & COLLECTION_FLAGS) != COLLECTION_FLAGS);
5976  
5977      if (type->tp_name == NULL) {
5978          PyErr_Format(PyExc_SystemError,
5979                       "Type does not define the tp_name field.");
5980          return -1;
5981      }
5982      return 0;
5983  }
5984  
5985  
5986  static int
type_ready_set_bases(PyTypeObject * type)5987  type_ready_set_bases(PyTypeObject *type)
5988  {
5989      /* Initialize tp_base (defaults to BaseObject unless that's us) */
5990      PyTypeObject *base = type->tp_base;
5991      if (base == NULL && type != &PyBaseObject_Type) {
5992          base = &PyBaseObject_Type;
5993          if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
5994              type->tp_base = (PyTypeObject*)Py_NewRef((PyObject*)base);
5995          }
5996          else {
5997              type->tp_base = base;
5998          }
5999      }
6000      assert(type->tp_base != NULL || type == &PyBaseObject_Type);
6001  
6002      /* Now the only way base can still be NULL is if type is
6003       * &PyBaseObject_Type. */
6004  
6005      /* Initialize the base class */
6006      if (base != NULL && !_PyType_IsReady(base)) {
6007          if (PyType_Ready(base) < 0) {
6008              return -1;
6009          }
6010      }
6011  
6012      /* Initialize ob_type if NULL.      This means extensions that want to be
6013         compilable separately on Windows can call PyType_Ready() instead of
6014         initializing the ob_type field of their type objects. */
6015      /* The test for base != NULL is really unnecessary, since base is only
6016         NULL when type is &PyBaseObject_Type, and we know its ob_type is
6017         not NULL (it's initialized to &PyType_Type).      But coverity doesn't
6018         know that. */
6019      if (Py_IS_TYPE(type, NULL) && base != NULL) {
6020          Py_SET_TYPE(type, Py_TYPE(base));
6021      }
6022  
6023      /* Initialize tp_bases */
6024      PyObject *bases = type->tp_bases;
6025      if (bases == NULL) {
6026          PyTypeObject *base = type->tp_base;
6027          if (base == NULL) {
6028              bases = PyTuple_New(0);
6029          }
6030          else {
6031              bases = PyTuple_Pack(1, base);
6032          }
6033          if (bases == NULL) {
6034              return -1;
6035          }
6036          type->tp_bases = bases;
6037      }
6038      return 0;
6039  }
6040  
6041  
6042  static int
type_ready_set_dict(PyTypeObject * type)6043  type_ready_set_dict(PyTypeObject *type)
6044  {
6045      if (type->tp_dict != NULL) {
6046          return 0;
6047      }
6048  
6049      PyObject *dict = PyDict_New();
6050      if (dict == NULL) {
6051          return -1;
6052      }
6053      type->tp_dict = dict;
6054      return 0;
6055  }
6056  
6057  
6058  /* If the type dictionary doesn't contain a __doc__, set it from
6059     the tp_doc slot. */
6060  static int
type_dict_set_doc(PyTypeObject * type)6061  type_dict_set_doc(PyTypeObject *type)
6062  {
6063      int r = _PyDict_ContainsId(type->tp_dict, &PyId___doc__);
6064      if (r < 0) {
6065          return -1;
6066      }
6067      if (r > 0) {
6068          return 0;
6069      }
6070  
6071      if (type->tp_doc != NULL) {
6072          const char *doc_str;
6073          doc_str = _PyType_DocWithoutSignature(type->tp_name, type->tp_doc);
6074          PyObject *doc = PyUnicode_FromString(doc_str);
6075          if (doc == NULL) {
6076              return -1;
6077          }
6078  
6079          if (_PyDict_SetItemId(type->tp_dict, &PyId___doc__, doc) < 0) {
6080              Py_DECREF(doc);
6081              return -1;
6082          }
6083          Py_DECREF(doc);
6084      }
6085      else {
6086          if (_PyDict_SetItemId(type->tp_dict, &PyId___doc__, Py_None) < 0) {
6087              return -1;
6088          }
6089      }
6090      return 0;
6091  }
6092  
6093  
6094  static int
type_ready_fill_dict(PyTypeObject * type)6095  type_ready_fill_dict(PyTypeObject *type)
6096  {
6097      /* Add type-specific descriptors to tp_dict */
6098      if (add_operators(type) < 0) {
6099          return -1;
6100      }
6101      if (type_add_methods(type) < 0) {
6102          return -1;
6103      }
6104      if (type_add_members(type) < 0) {
6105          return -1;
6106      }
6107      if (type_add_getset(type) < 0) {
6108          return -1;
6109      }
6110      if (type_dict_set_doc(type) < 0) {
6111          return -1;
6112      }
6113      return 0;
6114  }
6115  
6116  
6117  static int
type_ready_mro(PyTypeObject * type)6118  type_ready_mro(PyTypeObject *type)
6119  {
6120      /* Calculate method resolution order */
6121      if (mro_internal(type, NULL) < 0) {
6122          return -1;
6123      }
6124      assert(type->tp_mro != NULL);
6125      assert(PyTuple_Check(type->tp_mro));
6126  
6127      /* All bases of statically allocated type should be statically allocated */
6128      if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
6129          PyObject *mro = type->tp_mro;
6130          Py_ssize_t n = PyTuple_GET_SIZE(mro);
6131          for (Py_ssize_t i = 0; i < n; i++) {
6132              PyTypeObject *base = (PyTypeObject *)PyTuple_GET_ITEM(mro, i);
6133              if (PyType_Check(base) && (base->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
6134                  PyErr_Format(PyExc_TypeError,
6135                               "type '%.100s' is not dynamically allocated but "
6136                               "its base type '%.100s' is dynamically allocated",
6137                               type->tp_name, base->tp_name);
6138                  return -1;
6139              }
6140          }
6141      }
6142      return 0;
6143  }
6144  
6145  
6146  // For static types, inherit tp_as_xxx structures from the base class
6147  // if it's NULL.
6148  //
6149  // For heap types, tp_as_xxx structures are not NULL: they are set to the
6150  // PyHeapTypeObject.as_xxx fields by type_new_alloc().
6151  static void
type_ready_inherit_as_structs(PyTypeObject * type,PyTypeObject * base)6152  type_ready_inherit_as_structs(PyTypeObject *type, PyTypeObject *base)
6153  {
6154      if (type->tp_as_async == NULL) {
6155          type->tp_as_async = base->tp_as_async;
6156      }
6157      if (type->tp_as_number == NULL) {
6158          type->tp_as_number = base->tp_as_number;
6159      }
6160      if (type->tp_as_sequence == NULL) {
6161          type->tp_as_sequence = base->tp_as_sequence;
6162      }
6163      if (type->tp_as_mapping == NULL) {
6164          type->tp_as_mapping = base->tp_as_mapping;
6165      }
6166      if (type->tp_as_buffer == NULL) {
6167          type->tp_as_buffer = base->tp_as_buffer;
6168      }
6169  }
6170  
6171  static void
inherit_patma_flags(PyTypeObject * type,PyTypeObject * base)6172  inherit_patma_flags(PyTypeObject *type, PyTypeObject *base) {
6173      if ((type->tp_flags & COLLECTION_FLAGS) == 0) {
6174          type->tp_flags |= base->tp_flags & COLLECTION_FLAGS;
6175      }
6176  }
6177  
6178  static int
type_ready_inherit(PyTypeObject * type)6179  type_ready_inherit(PyTypeObject *type)
6180  {
6181      /* Inherit special flags from dominant base */
6182      PyTypeObject *base = type->tp_base;
6183      if (base != NULL) {
6184          inherit_special(type, base);
6185      }
6186  
6187      // Inherit slots
6188      PyObject *mro = type->tp_mro;
6189      Py_ssize_t n = PyTuple_GET_SIZE(type->tp_mro);
6190      for (Py_ssize_t i = 1; i < n; i++) {
6191          PyObject *b = PyTuple_GET_ITEM(mro, i);
6192          if (PyType_Check(b)) {
6193              if (inherit_slots(type, (PyTypeObject *)b) < 0) {
6194                  return -1;
6195              }
6196              inherit_patma_flags(type, (PyTypeObject *)b);
6197          }
6198      }
6199  
6200      if (base != NULL) {
6201          type_ready_inherit_as_structs(type, base);
6202      }
6203  
6204      /* Sanity check for tp_free. */
6205      if (_PyType_IS_GC(type) && (type->tp_flags & Py_TPFLAGS_BASETYPE) &&
6206          (type->tp_free == NULL || type->tp_free == PyObject_Del))
6207      {
6208          /* This base class needs to call tp_free, but doesn't have
6209           * one, or its tp_free is for non-gc'ed objects.
6210           */
6211          PyErr_Format(PyExc_TypeError, "type '%.100s' participates in "
6212                       "gc and is a base type but has inappropriate "
6213                       "tp_free slot",
6214                       type->tp_name);
6215          return -1;
6216      }
6217  
6218      return 0;
6219  }
6220  
6221  
6222  /* Hack for tp_hash and __hash__.
6223     If after all that, tp_hash is still NULL, and __hash__ is not in
6224     tp_dict, set tp_hash to PyObject_HashNotImplemented and
6225     tp_dict['__hash__'] equal to None.
6226     This signals that __hash__ is not inherited. */
6227  static int
type_ready_set_hash(PyTypeObject * type)6228  type_ready_set_hash(PyTypeObject *type)
6229  {
6230      if (type->tp_hash != NULL) {
6231          return 0;
6232      }
6233  
6234      int r = _PyDict_ContainsId(type->tp_dict, &PyId___hash__);
6235      if (r < 0) {
6236          return -1;
6237      }
6238      if (r > 0) {
6239          return 0;
6240      }
6241  
6242      if (_PyDict_SetItemId(type->tp_dict, &PyId___hash__, Py_None) < 0) {
6243          return -1;
6244      }
6245      type->tp_hash = PyObject_HashNotImplemented;
6246      return 0;
6247  }
6248  
6249  
6250  /* Link into each base class's list of subclasses */
6251  static int
type_ready_add_subclasses(PyTypeObject * type)6252  type_ready_add_subclasses(PyTypeObject *type)
6253  {
6254      PyObject *bases = type->tp_bases;
6255      Py_ssize_t nbase = PyTuple_GET_SIZE(bases);
6256      for (Py_ssize_t i = 0; i < nbase; i++) {
6257          PyObject *b = PyTuple_GET_ITEM(bases, i);
6258          if (PyType_Check(b) && add_subclass((PyTypeObject *)b, type) < 0) {
6259              return -1;
6260          }
6261      }
6262      return 0;
6263  }
6264  
6265  
6266  // Set tp_new and the "__new__" key in the type dictionary.
6267  // Use the Py_TPFLAGS_DISALLOW_INSTANTIATION flag.
6268  static int
type_ready_set_new(PyTypeObject * type)6269  type_ready_set_new(PyTypeObject *type)
6270  {
6271      PyTypeObject *base = type->tp_base;
6272      /* The condition below could use some explanation.
6273  
6274         It appears that tp_new is not inherited for static types whose base
6275         class is 'object'; this seems to be a precaution so that old extension
6276         types don't suddenly become callable (object.__new__ wouldn't insure the
6277         invariants that the extension type's own factory function ensures).
6278  
6279         Heap types, of course, are under our control, so they do inherit tp_new;
6280         static extension types that specify some other built-in type as the
6281         default also inherit object.__new__. */
6282      if (type->tp_new == NULL
6283          && base == &PyBaseObject_Type
6284          && !(type->tp_flags & Py_TPFLAGS_HEAPTYPE))
6285      {
6286          type->tp_flags |= Py_TPFLAGS_DISALLOW_INSTANTIATION;
6287      }
6288  
6289      if (!(type->tp_flags & Py_TPFLAGS_DISALLOW_INSTANTIATION)) {
6290          if (type->tp_new != NULL) {
6291              // If "__new__" key does not exists in the type dictionary,
6292              // set it to tp_new_wrapper().
6293              if (add_tp_new_wrapper(type) < 0) {
6294                  return -1;
6295              }
6296          }
6297          else {
6298              // tp_new is NULL: inherit tp_new from base
6299              type->tp_new = base->tp_new;
6300          }
6301      }
6302      else {
6303          // Py_TPFLAGS_DISALLOW_INSTANTIATION sets tp_new to NULL
6304          type->tp_new = NULL;
6305      }
6306      return 0;
6307  }
6308  
6309  
6310  static int
type_ready(PyTypeObject * type)6311  type_ready(PyTypeObject *type)
6312  {
6313      if (type_ready_checks(type) < 0) {
6314          return -1;
6315      }
6316  
6317  #ifdef Py_TRACE_REFS
6318      /* PyType_Ready is the closest thing we have to a choke point
6319       * for type objects, so is the best place I can think of to try
6320       * to get type objects into the doubly-linked list of all objects.
6321       * Still, not all type objects go through PyType_Ready.
6322       */
6323      _Py_AddToAllObjects((PyObject *)type, 0);
6324  #endif
6325  
6326      /* Initialize tp_dict: _PyType_IsReady() tests if tp_dict != NULL */
6327      if (type_ready_set_dict(type) < 0) {
6328          return -1;
6329      }
6330      if (type_ready_set_bases(type) < 0) {
6331          return -1;
6332      }
6333      if (type_ready_mro(type) < 0) {
6334          return -1;
6335      }
6336      if (type_ready_set_new(type) < 0) {
6337          return -1;
6338      }
6339      if (type_ready_fill_dict(type) < 0) {
6340          return -1;
6341      }
6342      if (type_ready_inherit(type) < 0) {
6343          return -1;
6344      }
6345      if (type_ready_set_hash(type) < 0) {
6346          return -1;
6347      }
6348      if (type_ready_add_subclasses(type) < 0) {
6349          return -1;
6350      }
6351      return 0;
6352  }
6353  
6354  
6355  int
PyType_Ready(PyTypeObject * type)6356  PyType_Ready(PyTypeObject *type)
6357  {
6358      if (type->tp_flags & Py_TPFLAGS_READY) {
6359          assert(_PyType_CheckConsistency(type));
6360          return 0;
6361      }
6362      _PyObject_ASSERT((PyObject *)type,
6363                       (type->tp_flags & Py_TPFLAGS_READYING) == 0);
6364  
6365      type->tp_flags |= Py_TPFLAGS_READYING;
6366  
6367      /* Historically, all static types were immutable. See bpo-43908 */
6368      if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
6369          type->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE;
6370      }
6371  
6372      if (type_ready(type) < 0) {
6373          type->tp_flags &= ~Py_TPFLAGS_READYING;
6374          return -1;
6375      }
6376  
6377      /* All done -- set the ready flag */
6378      type->tp_flags = (type->tp_flags & ~Py_TPFLAGS_READYING) | Py_TPFLAGS_READY;
6379      assert(_PyType_CheckConsistency(type));
6380      return 0;
6381  }
6382  
6383  
6384  static int
add_subclass(PyTypeObject * base,PyTypeObject * type)6385  add_subclass(PyTypeObject *base, PyTypeObject *type)
6386  {
6387      int result = -1;
6388      PyObject *dict, *key, *newobj;
6389  
6390      dict = base->tp_subclasses;
6391      if (dict == NULL) {
6392          base->tp_subclasses = dict = PyDict_New();
6393          if (dict == NULL)
6394              return -1;
6395      }
6396      assert(PyDict_CheckExact(dict));
6397      key = PyLong_FromVoidPtr((void *) type);
6398      if (key == NULL)
6399          return -1;
6400      newobj = PyWeakref_NewRef((PyObject *)type, NULL);
6401      if (newobj != NULL) {
6402          result = PyDict_SetItem(dict, key, newobj);
6403          Py_DECREF(newobj);
6404      }
6405      Py_DECREF(key);
6406      return result;
6407  }
6408  
6409  static int
add_all_subclasses(PyTypeObject * type,PyObject * bases)6410  add_all_subclasses(PyTypeObject *type, PyObject *bases)
6411  {
6412      int res = 0;
6413  
6414      if (bases) {
6415          Py_ssize_t i;
6416          for (i = 0; i < PyTuple_GET_SIZE(bases); i++) {
6417              PyObject *base = PyTuple_GET_ITEM(bases, i);
6418              if (PyType_Check(base) &&
6419                  add_subclass((PyTypeObject*)base, type) < 0)
6420                  res = -1;
6421          }
6422      }
6423  
6424      return res;
6425  }
6426  
6427  static void
remove_subclass(PyTypeObject * base,PyTypeObject * type)6428  remove_subclass(PyTypeObject *base, PyTypeObject *type)
6429  {
6430      PyObject *dict, *key;
6431  
6432      dict = base->tp_subclasses;
6433      if (dict == NULL) {
6434          return;
6435      }
6436      assert(PyDict_CheckExact(dict));
6437      key = PyLong_FromVoidPtr((void *) type);
6438      if (key == NULL || PyDict_DelItem(dict, key)) {
6439          /* This can happen if the type initialization errored out before
6440             the base subclasses were updated (e.g. a non-str __qualname__
6441             was passed in the type dict). */
6442          PyErr_Clear();
6443      }
6444      Py_XDECREF(key);
6445  }
6446  
6447  static void
remove_all_subclasses(PyTypeObject * type,PyObject * bases)6448  remove_all_subclasses(PyTypeObject *type, PyObject *bases)
6449  {
6450      if (bases) {
6451          Py_ssize_t i;
6452          for (i = 0; i < PyTuple_GET_SIZE(bases); i++) {
6453              PyObject *base = PyTuple_GET_ITEM(bases, i);
6454              if (PyType_Check(base))
6455                  remove_subclass((PyTypeObject*) base, type);
6456          }
6457      }
6458  }
6459  
6460  static int
check_num_args(PyObject * ob,int n)6461  check_num_args(PyObject *ob, int n)
6462  {
6463      if (!PyTuple_CheckExact(ob)) {
6464          PyErr_SetString(PyExc_SystemError,
6465              "PyArg_UnpackTuple() argument list is not a tuple");
6466          return 0;
6467      }
6468      if (n == PyTuple_GET_SIZE(ob))
6469          return 1;
6470      PyErr_Format(
6471          PyExc_TypeError,
6472          "expected %d argument%s, got %zd", n, n == 1 ? "" : "s", PyTuple_GET_SIZE(ob));
6473      return 0;
6474  }
6475  
6476  /* Generic wrappers for overloadable 'operators' such as __getitem__ */
6477  
6478  /* There's a wrapper *function* for each distinct function typedef used
6479     for type object slots (e.g. binaryfunc, ternaryfunc, etc.).  There's a
6480     wrapper *table* for each distinct operation (e.g. __len__, __add__).
6481     Most tables have only one entry; the tables for binary operators have two
6482     entries, one regular and one with reversed arguments. */
6483  
6484  static PyObject *
wrap_lenfunc(PyObject * self,PyObject * args,void * wrapped)6485  wrap_lenfunc(PyObject *self, PyObject *args, void *wrapped)
6486  {
6487      lenfunc func = (lenfunc)wrapped;
6488      Py_ssize_t res;
6489  
6490      if (!check_num_args(args, 0))
6491          return NULL;
6492      res = (*func)(self);
6493      if (res == -1 && PyErr_Occurred())
6494          return NULL;
6495      return PyLong_FromSsize_t(res);
6496  }
6497  
6498  static PyObject *
wrap_inquirypred(PyObject * self,PyObject * args,void * wrapped)6499  wrap_inquirypred(PyObject *self, PyObject *args, void *wrapped)
6500  {
6501      inquiry func = (inquiry)wrapped;
6502      int res;
6503  
6504      if (!check_num_args(args, 0))
6505          return NULL;
6506      res = (*func)(self);
6507      if (res == -1 && PyErr_Occurred())
6508          return NULL;
6509      return PyBool_FromLong((long)res);
6510  }
6511  
6512  static PyObject *
wrap_binaryfunc(PyObject * self,PyObject * args,void * wrapped)6513  wrap_binaryfunc(PyObject *self, PyObject *args, void *wrapped)
6514  {
6515      binaryfunc func = (binaryfunc)wrapped;
6516      PyObject *other;
6517  
6518      if (!check_num_args(args, 1))
6519          return NULL;
6520      other = PyTuple_GET_ITEM(args, 0);
6521      return (*func)(self, other);
6522  }
6523  
6524  static PyObject *
wrap_binaryfunc_l(PyObject * self,PyObject * args,void * wrapped)6525  wrap_binaryfunc_l(PyObject *self, PyObject *args, void *wrapped)
6526  {
6527      binaryfunc func = (binaryfunc)wrapped;
6528      PyObject *other;
6529  
6530      if (!check_num_args(args, 1))
6531          return NULL;
6532      other = PyTuple_GET_ITEM(args, 0);
6533      return (*func)(self, other);
6534  }
6535  
6536  static PyObject *
wrap_binaryfunc_r(PyObject * self,PyObject * args,void * wrapped)6537  wrap_binaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
6538  {
6539      binaryfunc func = (binaryfunc)wrapped;
6540      PyObject *other;
6541  
6542      if (!check_num_args(args, 1))
6543          return NULL;
6544      other = PyTuple_GET_ITEM(args, 0);
6545      return (*func)(other, self);
6546  }
6547  
6548  static PyObject *
wrap_ternaryfunc(PyObject * self,PyObject * args,void * wrapped)6549  wrap_ternaryfunc(PyObject *self, PyObject *args, void *wrapped)
6550  {
6551      ternaryfunc func = (ternaryfunc)wrapped;
6552      PyObject *other;
6553      PyObject *third = Py_None;
6554  
6555      /* Note: This wrapper only works for __pow__() */
6556  
6557      if (!PyArg_UnpackTuple(args, "", 1, 2, &other, &third))
6558          return NULL;
6559      return (*func)(self, other, third);
6560  }
6561  
6562  static PyObject *
wrap_ternaryfunc_r(PyObject * self,PyObject * args,void * wrapped)6563  wrap_ternaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
6564  {
6565      ternaryfunc func = (ternaryfunc)wrapped;
6566      PyObject *other;
6567      PyObject *third = Py_None;
6568  
6569      /* Note: This wrapper only works for __pow__() */
6570  
6571      if (!PyArg_UnpackTuple(args, "", 1, 2, &other, &third))
6572          return NULL;
6573      return (*func)(other, self, third);
6574  }
6575  
6576  static PyObject *
wrap_unaryfunc(PyObject * self,PyObject * args,void * wrapped)6577  wrap_unaryfunc(PyObject *self, PyObject *args, void *wrapped)
6578  {
6579      unaryfunc func = (unaryfunc)wrapped;
6580  
6581      if (!check_num_args(args, 0))
6582          return NULL;
6583      return (*func)(self);
6584  }
6585  
6586  static PyObject *
wrap_indexargfunc(PyObject * self,PyObject * args,void * wrapped)6587  wrap_indexargfunc(PyObject *self, PyObject *args, void *wrapped)
6588  {
6589      ssizeargfunc func = (ssizeargfunc)wrapped;
6590      PyObject* o;
6591      Py_ssize_t i;
6592  
6593      if (!PyArg_UnpackTuple(args, "", 1, 1, &o))
6594          return NULL;
6595      i = PyNumber_AsSsize_t(o, PyExc_OverflowError);
6596      if (i == -1 && PyErr_Occurred())
6597          return NULL;
6598      return (*func)(self, i);
6599  }
6600  
6601  static Py_ssize_t
getindex(PyObject * self,PyObject * arg)6602  getindex(PyObject *self, PyObject *arg)
6603  {
6604      Py_ssize_t i;
6605  
6606      i = PyNumber_AsSsize_t(arg, PyExc_OverflowError);
6607      if (i == -1 && PyErr_Occurred())
6608          return -1;
6609      if (i < 0) {
6610          PySequenceMethods *sq = Py_TYPE(self)->tp_as_sequence;
6611          if (sq && sq->sq_length) {
6612              Py_ssize_t n = (*sq->sq_length)(self);
6613              if (n < 0) {
6614                  assert(PyErr_Occurred());
6615                  return -1;
6616              }
6617              i += n;
6618          }
6619      }
6620      return i;
6621  }
6622  
6623  static PyObject *
wrap_sq_item(PyObject * self,PyObject * args,void * wrapped)6624  wrap_sq_item(PyObject *self, PyObject *args, void *wrapped)
6625  {
6626      ssizeargfunc func = (ssizeargfunc)wrapped;
6627      PyObject *arg;
6628      Py_ssize_t i;
6629  
6630      if (PyTuple_GET_SIZE(args) == 1) {
6631          arg = PyTuple_GET_ITEM(args, 0);
6632          i = getindex(self, arg);
6633          if (i == -1 && PyErr_Occurred())
6634              return NULL;
6635          return (*func)(self, i);
6636      }
6637      check_num_args(args, 1);
6638      assert(PyErr_Occurred());
6639      return NULL;
6640  }
6641  
6642  static PyObject *
wrap_sq_setitem(PyObject * self,PyObject * args,void * wrapped)6643  wrap_sq_setitem(PyObject *self, PyObject *args, void *wrapped)
6644  {
6645      ssizeobjargproc func = (ssizeobjargproc)wrapped;
6646      Py_ssize_t i;
6647      int res;
6648      PyObject *arg, *value;
6649  
6650      if (!PyArg_UnpackTuple(args, "", 2, 2, &arg, &value))
6651          return NULL;
6652      i = getindex(self, arg);
6653      if (i == -1 && PyErr_Occurred())
6654          return NULL;
6655      res = (*func)(self, i, value);
6656      if (res == -1 && PyErr_Occurred())
6657          return NULL;
6658      Py_RETURN_NONE;
6659  }
6660  
6661  static PyObject *
wrap_sq_delitem(PyObject * self,PyObject * args,void * wrapped)6662  wrap_sq_delitem(PyObject *self, PyObject *args, void *wrapped)
6663  {
6664      ssizeobjargproc func = (ssizeobjargproc)wrapped;
6665      Py_ssize_t i;
6666      int res;
6667      PyObject *arg;
6668  
6669      if (!check_num_args(args, 1))
6670          return NULL;
6671      arg = PyTuple_GET_ITEM(args, 0);
6672      i = getindex(self, arg);
6673      if (i == -1 && PyErr_Occurred())
6674          return NULL;
6675      res = (*func)(self, i, NULL);
6676      if (res == -1 && PyErr_Occurred())
6677          return NULL;
6678      Py_RETURN_NONE;
6679  }
6680  
6681  /* XXX objobjproc is a misnomer; should be objargpred */
6682  static PyObject *
wrap_objobjproc(PyObject * self,PyObject * args,void * wrapped)6683  wrap_objobjproc(PyObject *self, PyObject *args, void *wrapped)
6684  {
6685      objobjproc func = (objobjproc)wrapped;
6686      int res;
6687      PyObject *value;
6688  
6689      if (!check_num_args(args, 1))
6690          return NULL;
6691      value = PyTuple_GET_ITEM(args, 0);
6692      res = (*func)(self, value);
6693      if (res == -1 && PyErr_Occurred())
6694          return NULL;
6695      else
6696          return PyBool_FromLong(res);
6697  }
6698  
6699  static PyObject *
wrap_objobjargproc(PyObject * self,PyObject * args,void * wrapped)6700  wrap_objobjargproc(PyObject *self, PyObject *args, void *wrapped)
6701  {
6702      objobjargproc func = (objobjargproc)wrapped;
6703      int res;
6704      PyObject *key, *value;
6705  
6706      if (!PyArg_UnpackTuple(args, "", 2, 2, &key, &value))
6707          return NULL;
6708      res = (*func)(self, key, value);
6709      if (res == -1 && PyErr_Occurred())
6710          return NULL;
6711      Py_RETURN_NONE;
6712  }
6713  
6714  static PyObject *
wrap_delitem(PyObject * self,PyObject * args,void * wrapped)6715  wrap_delitem(PyObject *self, PyObject *args, void *wrapped)
6716  {
6717      objobjargproc func = (objobjargproc)wrapped;
6718      int res;
6719      PyObject *key;
6720  
6721      if (!check_num_args(args, 1))
6722          return NULL;
6723      key = PyTuple_GET_ITEM(args, 0);
6724      res = (*func)(self, key, NULL);
6725      if (res == -1 && PyErr_Occurred())
6726          return NULL;
6727      Py_RETURN_NONE;
6728  }
6729  
6730  /* Helper to check for object.__setattr__ or __delattr__ applied to a type.
6731     This is called the Carlo Verre hack after its discoverer.  See
6732     https://mail.python.org/pipermail/python-dev/2003-April/034535.html
6733     */
6734  static int
hackcheck(PyObject * self,setattrofunc func,const char * what)6735  hackcheck(PyObject *self, setattrofunc func, const char *what)
6736  {
6737      PyTypeObject *type = Py_TYPE(self);
6738      PyObject *mro = type->tp_mro;
6739      if (!mro) {
6740          /* Probably ok not to check the call in this case. */
6741          return 1;
6742      }
6743      assert(PyTuple_Check(mro));
6744  
6745      /* Find the (base) type that defined the type's slot function. */
6746      PyTypeObject *defining_type = type;
6747      Py_ssize_t i;
6748      for (i = PyTuple_GET_SIZE(mro) - 1; i >= 0; i--) {
6749          PyTypeObject *base = (PyTypeObject*) PyTuple_GET_ITEM(mro, i);
6750          if (base->tp_setattro == slot_tp_setattro) {
6751              /* Ignore Python classes:
6752                 they never define their own C-level setattro. */
6753          }
6754          else if (base->tp_setattro == type->tp_setattro) {
6755              defining_type = base;
6756              break;
6757          }
6758      }
6759  
6760      /* Reject calls that jump over intermediate C-level overrides. */
6761      for (PyTypeObject *base = defining_type; base; base = base->tp_base) {
6762          if (base->tp_setattro == func) {
6763              /* 'func' is the right slot function to call. */
6764              break;
6765          }
6766          else if (base->tp_setattro != slot_tp_setattro) {
6767              /* 'base' is not a Python class and overrides 'func'.
6768                 Its tp_setattro should be called instead. */
6769              PyErr_Format(PyExc_TypeError,
6770                           "can't apply this %s to %s object",
6771                           what,
6772                           type->tp_name);
6773              return 0;
6774          }
6775      }
6776      return 1;
6777  }
6778  
6779  static PyObject *
wrap_setattr(PyObject * self,PyObject * args,void * wrapped)6780  wrap_setattr(PyObject *self, PyObject *args, void *wrapped)
6781  {
6782      setattrofunc func = (setattrofunc)wrapped;
6783      int res;
6784      PyObject *name, *value;
6785  
6786      if (!PyArg_UnpackTuple(args, "", 2, 2, &name, &value))
6787          return NULL;
6788      if (!hackcheck(self, func, "__setattr__"))
6789          return NULL;
6790      res = (*func)(self, name, value);
6791      if (res < 0)
6792          return NULL;
6793      Py_RETURN_NONE;
6794  }
6795  
6796  static PyObject *
wrap_delattr(PyObject * self,PyObject * args,void * wrapped)6797  wrap_delattr(PyObject *self, PyObject *args, void *wrapped)
6798  {
6799      setattrofunc func = (setattrofunc)wrapped;
6800      int res;
6801      PyObject *name;
6802  
6803      if (!check_num_args(args, 1))
6804          return NULL;
6805      name = PyTuple_GET_ITEM(args, 0);
6806      if (!hackcheck(self, func, "__delattr__"))
6807          return NULL;
6808      res = (*func)(self, name, NULL);
6809      if (res < 0)
6810          return NULL;
6811      Py_RETURN_NONE;
6812  }
6813  
6814  static PyObject *
wrap_hashfunc(PyObject * self,PyObject * args,void * wrapped)6815  wrap_hashfunc(PyObject *self, PyObject *args, void *wrapped)
6816  {
6817      hashfunc func = (hashfunc)wrapped;
6818      Py_hash_t res;
6819  
6820      if (!check_num_args(args, 0))
6821          return NULL;
6822      res = (*func)(self);
6823      if (res == -1 && PyErr_Occurred())
6824          return NULL;
6825      return PyLong_FromSsize_t(res);
6826  }
6827  
6828  static PyObject *
wrap_call(PyObject * self,PyObject * args,void * wrapped,PyObject * kwds)6829  wrap_call(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds)
6830  {
6831      ternaryfunc func = (ternaryfunc)wrapped;
6832  
6833      return (*func)(self, args, kwds);
6834  }
6835  
6836  static PyObject *
wrap_del(PyObject * self,PyObject * args,void * wrapped)6837  wrap_del(PyObject *self, PyObject *args, void *wrapped)
6838  {
6839      destructor func = (destructor)wrapped;
6840  
6841      if (!check_num_args(args, 0))
6842          return NULL;
6843  
6844      (*func)(self);
6845      Py_RETURN_NONE;
6846  }
6847  
6848  static PyObject *
wrap_richcmpfunc(PyObject * self,PyObject * args,void * wrapped,int op)6849  wrap_richcmpfunc(PyObject *self, PyObject *args, void *wrapped, int op)
6850  {
6851      richcmpfunc func = (richcmpfunc)wrapped;
6852      PyObject *other;
6853  
6854      if (!check_num_args(args, 1))
6855          return NULL;
6856      other = PyTuple_GET_ITEM(args, 0);
6857      return (*func)(self, other, op);
6858  }
6859  
6860  #undef RICHCMP_WRAPPER
6861  #define RICHCMP_WRAPPER(NAME, OP) \
6862  static PyObject * \
6863  richcmp_##NAME(PyObject *self, PyObject *args, void *wrapped) \
6864  { \
6865      return wrap_richcmpfunc(self, args, wrapped, OP); \
6866  }
6867  
RICHCMP_WRAPPER(lt,Py_LT)6868  RICHCMP_WRAPPER(lt, Py_LT)
6869  RICHCMP_WRAPPER(le, Py_LE)
6870  RICHCMP_WRAPPER(eq, Py_EQ)
6871  RICHCMP_WRAPPER(ne, Py_NE)
6872  RICHCMP_WRAPPER(gt, Py_GT)
6873  RICHCMP_WRAPPER(ge, Py_GE)
6874  
6875  static PyObject *
6876  wrap_next(PyObject *self, PyObject *args, void *wrapped)
6877  {
6878      unaryfunc func = (unaryfunc)wrapped;
6879      PyObject *res;
6880  
6881      if (!check_num_args(args, 0))
6882          return NULL;
6883      res = (*func)(self);
6884      if (res == NULL && !PyErr_Occurred())
6885          PyErr_SetNone(PyExc_StopIteration);
6886      return res;
6887  }
6888  
6889  static PyObject *
wrap_descr_get(PyObject * self,PyObject * args,void * wrapped)6890  wrap_descr_get(PyObject *self, PyObject *args, void *wrapped)
6891  {
6892      descrgetfunc func = (descrgetfunc)wrapped;
6893      PyObject *obj;
6894      PyObject *type = NULL;
6895  
6896      if (!PyArg_UnpackTuple(args, "", 1, 2, &obj, &type))
6897          return NULL;
6898      if (obj == Py_None)
6899          obj = NULL;
6900      if (type == Py_None)
6901          type = NULL;
6902      if (type == NULL &&obj == NULL) {
6903          PyErr_SetString(PyExc_TypeError,
6904                          "__get__(None, None) is invalid");
6905          return NULL;
6906      }
6907      return (*func)(self, obj, type);
6908  }
6909  
6910  static PyObject *
wrap_descr_set(PyObject * self,PyObject * args,void * wrapped)6911  wrap_descr_set(PyObject *self, PyObject *args, void *wrapped)
6912  {
6913      descrsetfunc func = (descrsetfunc)wrapped;
6914      PyObject *obj, *value;
6915      int ret;
6916  
6917      if (!PyArg_UnpackTuple(args, "", 2, 2, &obj, &value))
6918          return NULL;
6919      ret = (*func)(self, obj, value);
6920      if (ret < 0)
6921          return NULL;
6922      Py_RETURN_NONE;
6923  }
6924  
6925  static PyObject *
wrap_descr_delete(PyObject * self,PyObject * args,void * wrapped)6926  wrap_descr_delete(PyObject *self, PyObject *args, void *wrapped)
6927  {
6928      descrsetfunc func = (descrsetfunc)wrapped;
6929      PyObject *obj;
6930      int ret;
6931  
6932      if (!check_num_args(args, 1))
6933          return NULL;
6934      obj = PyTuple_GET_ITEM(args, 0);
6935      ret = (*func)(self, obj, NULL);
6936      if (ret < 0)
6937          return NULL;
6938      Py_RETURN_NONE;
6939  }
6940  
6941  static PyObject *
wrap_init(PyObject * self,PyObject * args,void * wrapped,PyObject * kwds)6942  wrap_init(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds)
6943  {
6944      initproc func = (initproc)wrapped;
6945  
6946      if (func(self, args, kwds) < 0)
6947          return NULL;
6948      Py_RETURN_NONE;
6949  }
6950  
6951  static PyObject *
tp_new_wrapper(PyObject * self,PyObject * args,PyObject * kwds)6952  tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds)
6953  {
6954      PyTypeObject *type, *subtype, *staticbase;
6955      PyObject *arg0, *res;
6956  
6957      if (self == NULL || !PyType_Check(self)) {
6958          PyErr_Format(PyExc_SystemError,
6959                       "__new__() called with non-type 'self'");
6960          return NULL;
6961      }
6962      type = (PyTypeObject *)self;
6963  
6964      if (!PyTuple_Check(args) || PyTuple_GET_SIZE(args) < 1) {
6965          PyErr_Format(PyExc_TypeError,
6966                       "%s.__new__(): not enough arguments",
6967                       type->tp_name);
6968          return NULL;
6969      }
6970      arg0 = PyTuple_GET_ITEM(args, 0);
6971      if (!PyType_Check(arg0)) {
6972          PyErr_Format(PyExc_TypeError,
6973                       "%s.__new__(X): X is not a type object (%s)",
6974                       type->tp_name,
6975                       Py_TYPE(arg0)->tp_name);
6976          return NULL;
6977      }
6978      subtype = (PyTypeObject *)arg0;
6979      if (!PyType_IsSubtype(subtype, type)) {
6980          PyErr_Format(PyExc_TypeError,
6981                       "%s.__new__(%s): %s is not a subtype of %s",
6982                       type->tp_name,
6983                       subtype->tp_name,
6984                       subtype->tp_name,
6985                       type->tp_name);
6986          return NULL;
6987      }
6988  
6989      /* Check that the use doesn't do something silly and unsafe like
6990         object.__new__(dict).  To do this, we check that the
6991         most derived base that's not a heap type is this type. */
6992      staticbase = subtype;
6993      while (staticbase && (staticbase->tp_new == slot_tp_new))
6994          staticbase = staticbase->tp_base;
6995      /* If staticbase is NULL now, it is a really weird type.
6996         In the spirit of backwards compatibility (?), just shut up. */
6997      if (staticbase && staticbase->tp_new != type->tp_new) {
6998          PyErr_Format(PyExc_TypeError,
6999                       "%s.__new__(%s) is not safe, use %s.__new__()",
7000                       type->tp_name,
7001                       subtype->tp_name,
7002                       staticbase->tp_name);
7003          return NULL;
7004      }
7005  
7006      args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args));
7007      if (args == NULL)
7008          return NULL;
7009      res = type->tp_new(subtype, args, kwds);
7010      Py_DECREF(args);
7011      return res;
7012  }
7013  
7014  static struct PyMethodDef tp_new_methoddef[] = {
7015      {"__new__", (PyCFunction)(void(*)(void))tp_new_wrapper, METH_VARARGS|METH_KEYWORDS,
7016       PyDoc_STR("__new__($type, *args, **kwargs)\n--\n\n"
7017                 "Create and return a new object.  "
7018                 "See help(type) for accurate signature.")},
7019      {0}
7020  };
7021  
7022  static int
add_tp_new_wrapper(PyTypeObject * type)7023  add_tp_new_wrapper(PyTypeObject *type)
7024  {
7025      int r = _PyDict_ContainsId(type->tp_dict, &PyId___new__);
7026      if (r > 0) {
7027          return 0;
7028      }
7029      if (r < 0) {
7030          return -1;
7031      }
7032  
7033      PyObject *func = PyCFunction_NewEx(tp_new_methoddef, (PyObject *)type, NULL);
7034      if (func == NULL) {
7035          return -1;
7036      }
7037      r = _PyDict_SetItemId(type->tp_dict, &PyId___new__, func);
7038      Py_DECREF(func);
7039      return r;
7040  }
7041  
7042  /* Slot wrappers that call the corresponding __foo__ slot.  See comments
7043     below at override_slots() for more explanation. */
7044  
7045  #define SLOT0(FUNCNAME, OPSTR) \
7046  static PyObject * \
7047  FUNCNAME(PyObject *self) \
7048  { \
7049      PyObject* stack[1] = {self}; \
7050      _Py_static_string(id, OPSTR); \
7051      return vectorcall_method(&id, stack, 1); \
7052  }
7053  
7054  #define SLOT1(FUNCNAME, OPSTR, ARG1TYPE) \
7055  static PyObject * \
7056  FUNCNAME(PyObject *self, ARG1TYPE arg1) \
7057  { \
7058      PyObject* stack[2] = {self, arg1}; \
7059      _Py_static_string(id, OPSTR); \
7060      return vectorcall_method(&id, stack, 2); \
7061  }
7062  
7063  /* Boolean helper for SLOT1BINFULL().
7064     right.__class__ is a nontrivial subclass of left.__class__. */
7065  static int
method_is_overloaded(PyObject * left,PyObject * right,struct _Py_Identifier * name)7066  method_is_overloaded(PyObject *left, PyObject *right, struct _Py_Identifier *name)
7067  {
7068      PyObject *a, *b;
7069      int ok;
7070  
7071      if (_PyObject_LookupAttrId((PyObject *)(Py_TYPE(right)), name, &b) < 0) {
7072          return -1;
7073      }
7074      if (b == NULL) {
7075          /* If right doesn't have it, it's not overloaded */
7076          return 0;
7077      }
7078  
7079      if (_PyObject_LookupAttrId((PyObject *)(Py_TYPE(left)), name, &a) < 0) {
7080          Py_DECREF(b);
7081          return -1;
7082      }
7083      if (a == NULL) {
7084          Py_DECREF(b);
7085          /* If right has it but left doesn't, it's overloaded */
7086          return 1;
7087      }
7088  
7089      ok = PyObject_RichCompareBool(a, b, Py_NE);
7090      Py_DECREF(a);
7091      Py_DECREF(b);
7092      return ok;
7093  }
7094  
7095  
7096  #define SLOT1BINFULL(FUNCNAME, TESTFUNC, SLOTNAME, OPSTR, ROPSTR) \
7097  static PyObject * \
7098  FUNCNAME(PyObject *self, PyObject *other) \
7099  { \
7100      PyObject* stack[2]; \
7101      PyThreadState *tstate = _PyThreadState_GET(); \
7102      _Py_static_string(op_id, OPSTR); \
7103      _Py_static_string(rop_id, ROPSTR); \
7104      int do_other = !Py_IS_TYPE(self, Py_TYPE(other)) && \
7105          Py_TYPE(other)->tp_as_number != NULL && \
7106          Py_TYPE(other)->tp_as_number->SLOTNAME == TESTFUNC; \
7107      if (Py_TYPE(self)->tp_as_number != NULL && \
7108          Py_TYPE(self)->tp_as_number->SLOTNAME == TESTFUNC) { \
7109          PyObject *r; \
7110          if (do_other && PyType_IsSubtype(Py_TYPE(other), Py_TYPE(self))) { \
7111              int ok = method_is_overloaded(self, other, &rop_id); \
7112              if (ok < 0) { \
7113                  return NULL; \
7114              } \
7115              if (ok) { \
7116                  stack[0] = other; \
7117                  stack[1] = self; \
7118                  r = vectorcall_maybe(tstate, &rop_id, stack, 2); \
7119                  if (r != Py_NotImplemented) \
7120                      return r; \
7121                  Py_DECREF(r); \
7122                  do_other = 0; \
7123              } \
7124          } \
7125          stack[0] = self; \
7126          stack[1] = other; \
7127          r = vectorcall_maybe(tstate, &op_id, stack, 2); \
7128          if (r != Py_NotImplemented || \
7129              Py_IS_TYPE(other, Py_TYPE(self))) \
7130              return r; \
7131          Py_DECREF(r); \
7132      } \
7133      if (do_other) { \
7134          stack[0] = other; \
7135          stack[1] = self; \
7136          return vectorcall_maybe(tstate, &rop_id, stack, 2); \
7137      } \
7138      Py_RETURN_NOTIMPLEMENTED; \
7139  }
7140  
7141  #define SLOT1BIN(FUNCNAME, SLOTNAME, OPSTR, ROPSTR) \
7142      SLOT1BINFULL(FUNCNAME, FUNCNAME, SLOTNAME, OPSTR, ROPSTR)
7143  
7144  static Py_ssize_t
slot_sq_length(PyObject * self)7145  slot_sq_length(PyObject *self)
7146  {
7147      PyObject* stack[1] = {self};
7148      PyObject *res = vectorcall_method(&PyId___len__, stack, 1);
7149      Py_ssize_t len;
7150  
7151      if (res == NULL)
7152          return -1;
7153  
7154      Py_SETREF(res, _PyNumber_Index(res));
7155      if (res == NULL)
7156          return -1;
7157  
7158      assert(PyLong_Check(res));
7159      if (Py_SIZE(res) < 0) {
7160          Py_DECREF(res);
7161          PyErr_SetString(PyExc_ValueError,
7162                          "__len__() should return >= 0");
7163          return -1;
7164      }
7165  
7166      len = PyNumber_AsSsize_t(res, PyExc_OverflowError);
7167      assert(len >= 0 || PyErr_ExceptionMatches(PyExc_OverflowError));
7168      Py_DECREF(res);
7169      return len;
7170  }
7171  
7172  static PyObject *
slot_sq_item(PyObject * self,Py_ssize_t i)7173  slot_sq_item(PyObject *self, Py_ssize_t i)
7174  {
7175      PyObject *ival = PyLong_FromSsize_t(i);
7176      if (ival == NULL) {
7177          return NULL;
7178      }
7179      PyObject *stack[2] = {self, ival};
7180      PyObject *retval = vectorcall_method(&PyId___getitem__, stack, 2);
7181      Py_DECREF(ival);
7182      return retval;
7183  }
7184  
7185  static int
slot_sq_ass_item(PyObject * self,Py_ssize_t index,PyObject * value)7186  slot_sq_ass_item(PyObject *self, Py_ssize_t index, PyObject *value)
7187  {
7188      PyObject *stack[3];
7189      PyObject *res;
7190      PyObject *index_obj;
7191  
7192      index_obj = PyLong_FromSsize_t(index);
7193      if (index_obj == NULL) {
7194          return -1;
7195      }
7196  
7197      stack[0] = self;
7198      stack[1] = index_obj;
7199      if (value == NULL) {
7200          res = vectorcall_method(&PyId___delitem__, stack, 2);
7201      }
7202      else {
7203          stack[2] = value;
7204          res = vectorcall_method(&PyId___setitem__, stack, 3);
7205      }
7206      Py_DECREF(index_obj);
7207  
7208      if (res == NULL) {
7209          return -1;
7210      }
7211      Py_DECREF(res);
7212      return 0;
7213  }
7214  
7215  static int
slot_sq_contains(PyObject * self,PyObject * value)7216  slot_sq_contains(PyObject *self, PyObject *value)
7217  {
7218      PyThreadState *tstate = _PyThreadState_GET();
7219      PyObject *func, *res;
7220      int result = -1, unbound;
7221      _Py_IDENTIFIER(__contains__);
7222  
7223      func = lookup_maybe_method(self, &PyId___contains__, &unbound);
7224      if (func == Py_None) {
7225          Py_DECREF(func);
7226          PyErr_Format(PyExc_TypeError,
7227                       "'%.200s' object is not a container",
7228                       Py_TYPE(self)->tp_name);
7229          return -1;
7230      }
7231      if (func != NULL) {
7232          PyObject *args[2] = {self, value};
7233          res = vectorcall_unbound(tstate, unbound, func, args, 2);
7234          Py_DECREF(func);
7235          if (res != NULL) {
7236              result = PyObject_IsTrue(res);
7237              Py_DECREF(res);
7238          }
7239      }
7240      else if (! PyErr_Occurred()) {
7241          /* Possible results: -1 and 1 */
7242          result = (int)_PySequence_IterSearch(self, value,
7243                                           PY_ITERSEARCH_CONTAINS);
7244      }
7245      return result;
7246  }
7247  
7248  #define slot_mp_length slot_sq_length
7249  
7250  SLOT1(slot_mp_subscript, "__getitem__", PyObject *)
7251  
7252  static int
slot_mp_ass_subscript(PyObject * self,PyObject * key,PyObject * value)7253  slot_mp_ass_subscript(PyObject *self, PyObject *key, PyObject *value)
7254  {
7255      PyObject *stack[3];
7256      PyObject *res;
7257  
7258      stack[0] = self;
7259      stack[1] = key;
7260      if (value == NULL) {
7261          res = vectorcall_method(&PyId___delitem__, stack, 2);
7262      }
7263      else {
7264          stack[2] = value;
7265          res = vectorcall_method(&PyId___setitem__, stack, 3);
7266      }
7267  
7268      if (res == NULL)
7269          return -1;
7270      Py_DECREF(res);
7271      return 0;
7272  }
7273  
7274  SLOT1BIN(slot_nb_add, nb_add, "__add__", "__radd__")
7275  SLOT1BIN(slot_nb_subtract, nb_subtract, "__sub__", "__rsub__")
7276  SLOT1BIN(slot_nb_multiply, nb_multiply, "__mul__", "__rmul__")
7277  SLOT1BIN(slot_nb_matrix_multiply, nb_matrix_multiply, "__matmul__", "__rmatmul__")
7278  SLOT1BIN(slot_nb_remainder, nb_remainder, "__mod__", "__rmod__")
7279  SLOT1BIN(slot_nb_divmod, nb_divmod, "__divmod__", "__rdivmod__")
7280  
7281  static PyObject *slot_nb_power(PyObject *, PyObject *, PyObject *);
7282  
7283  SLOT1BINFULL(slot_nb_power_binary, slot_nb_power,
7284               nb_power, "__pow__", "__rpow__")
7285  
7286  static PyObject *
slot_nb_power(PyObject * self,PyObject * other,PyObject * modulus)7287  slot_nb_power(PyObject *self, PyObject *other, PyObject *modulus)
7288  {
7289      _Py_IDENTIFIER(__pow__);
7290  
7291      if (modulus == Py_None)
7292          return slot_nb_power_binary(self, other);
7293      /* Three-arg power doesn't use __rpow__.  But ternary_op
7294         can call this when the second argument's type uses
7295         slot_nb_power, so check before calling self.__pow__. */
7296      if (Py_TYPE(self)->tp_as_number != NULL &&
7297          Py_TYPE(self)->tp_as_number->nb_power == slot_nb_power) {
7298          PyObject* stack[3] = {self, other, modulus};
7299          return vectorcall_method(&PyId___pow__, stack, 3);
7300      }
7301      Py_RETURN_NOTIMPLEMENTED;
7302  }
7303  
7304  SLOT0(slot_nb_negative, "__neg__")
7305  SLOT0(slot_nb_positive, "__pos__")
7306  SLOT0(slot_nb_absolute, "__abs__")
7307  
7308  static int
slot_nb_bool(PyObject * self)7309  slot_nb_bool(PyObject *self)
7310  {
7311      PyObject *func, *value;
7312      int result, unbound;
7313      int using_len = 0;
7314      _Py_IDENTIFIER(__bool__);
7315  
7316      func = lookup_maybe_method(self, &PyId___bool__, &unbound);
7317      if (func == NULL) {
7318          if (PyErr_Occurred()) {
7319              return -1;
7320          }
7321  
7322          func = lookup_maybe_method(self, &PyId___len__, &unbound);
7323          if (func == NULL) {
7324              if (PyErr_Occurred()) {
7325                  return -1;
7326              }
7327              return 1;
7328          }
7329          using_len = 1;
7330      }
7331  
7332      value = call_unbound_noarg(unbound, func, self);
7333      if (value == NULL) {
7334          goto error;
7335      }
7336  
7337      if (using_len) {
7338          /* bool type enforced by slot_nb_len */
7339          result = PyObject_IsTrue(value);
7340      }
7341      else if (PyBool_Check(value)) {
7342          result = PyObject_IsTrue(value);
7343      }
7344      else {
7345          PyErr_Format(PyExc_TypeError,
7346                       "__bool__ should return "
7347                       "bool, returned %s",
7348                       Py_TYPE(value)->tp_name);
7349          result = -1;
7350      }
7351  
7352      Py_DECREF(value);
7353      Py_DECREF(func);
7354      return result;
7355  
7356  error:
7357      Py_DECREF(func);
7358      return -1;
7359  }
7360  
7361  
7362  static PyObject *
slot_nb_index(PyObject * self)7363  slot_nb_index(PyObject *self)
7364  {
7365      _Py_IDENTIFIER(__index__);
7366      PyObject *stack[1] = {self};
7367      return vectorcall_method(&PyId___index__, stack, 1);
7368  }
7369  
7370  
7371  SLOT0(slot_nb_invert, "__invert__")
7372  SLOT1BIN(slot_nb_lshift, nb_lshift, "__lshift__", "__rlshift__")
7373  SLOT1BIN(slot_nb_rshift, nb_rshift, "__rshift__", "__rrshift__")
7374  SLOT1BIN(slot_nb_and, nb_and, "__and__", "__rand__")
7375  SLOT1BIN(slot_nb_xor, nb_xor, "__xor__", "__rxor__")
7376  SLOT1BIN(slot_nb_or, nb_or, "__or__", "__ror__")
7377  
7378  SLOT0(slot_nb_int, "__int__")
7379  SLOT0(slot_nb_float, "__float__")
7380  SLOT1(slot_nb_inplace_add, "__iadd__", PyObject *)
7381  SLOT1(slot_nb_inplace_subtract, "__isub__", PyObject *)
7382  SLOT1(slot_nb_inplace_multiply, "__imul__", PyObject *)
7383  SLOT1(slot_nb_inplace_matrix_multiply, "__imatmul__", PyObject *)
7384  SLOT1(slot_nb_inplace_remainder, "__imod__", PyObject *)
7385  /* Can't use SLOT1 here, because nb_inplace_power is ternary */
7386  static PyObject *
slot_nb_inplace_power(PyObject * self,PyObject * arg1,PyObject * arg2)7387  slot_nb_inplace_power(PyObject *self, PyObject * arg1, PyObject *arg2)
7388  {
7389      PyObject *stack[2] = {self, arg1};
7390      _Py_IDENTIFIER(__ipow__);
7391      return vectorcall_method(&PyId___ipow__, stack, 2);
7392  }
7393  SLOT1(slot_nb_inplace_lshift, "__ilshift__", PyObject *)
7394  SLOT1(slot_nb_inplace_rshift, "__irshift__", PyObject *)
7395  SLOT1(slot_nb_inplace_and, "__iand__", PyObject *)
7396  SLOT1(slot_nb_inplace_xor, "__ixor__", PyObject *)
7397  SLOT1(slot_nb_inplace_or, "__ior__", PyObject *)
7398  SLOT1BIN(slot_nb_floor_divide, nb_floor_divide,
7399           "__floordiv__", "__rfloordiv__")
7400  SLOT1BIN(slot_nb_true_divide, nb_true_divide, "__truediv__", "__rtruediv__")
7401  SLOT1(slot_nb_inplace_floor_divide, "__ifloordiv__", PyObject *)
7402  SLOT1(slot_nb_inplace_true_divide, "__itruediv__", PyObject *)
7403  
7404  static PyObject *
slot_tp_repr(PyObject * self)7405  slot_tp_repr(PyObject *self)
7406  {
7407      PyObject *func, *res;
7408      _Py_IDENTIFIER(__repr__);
7409      int unbound;
7410  
7411      func = lookup_maybe_method(self, &PyId___repr__, &unbound);
7412      if (func != NULL) {
7413          res = call_unbound_noarg(unbound, func, self);
7414          Py_DECREF(func);
7415          return res;
7416      }
7417      PyErr_Clear();
7418      return PyUnicode_FromFormat("<%s object at %p>",
7419                                 Py_TYPE(self)->tp_name, self);
7420  }
7421  
7422  SLOT0(slot_tp_str, "__str__")
7423  
7424  static Py_hash_t
slot_tp_hash(PyObject * self)7425  slot_tp_hash(PyObject *self)
7426  {
7427      PyObject *func, *res;
7428      Py_ssize_t h;
7429      int unbound;
7430  
7431      func = lookup_maybe_method(self, &PyId___hash__, &unbound);
7432  
7433      if (func == Py_None) {
7434          Py_DECREF(func);
7435          func = NULL;
7436      }
7437  
7438      if (func == NULL) {
7439          return PyObject_HashNotImplemented(self);
7440      }
7441  
7442      res = call_unbound_noarg(unbound, func, self);
7443      Py_DECREF(func);
7444      if (res == NULL)
7445          return -1;
7446  
7447      if (!PyLong_Check(res)) {
7448          PyErr_SetString(PyExc_TypeError,
7449                          "__hash__ method should return an integer");
7450          return -1;
7451      }
7452      /* Transform the PyLong `res` to a Py_hash_t `h`.  For an existing
7453         hashable Python object x, hash(x) will always lie within the range of
7454         Py_hash_t.  Therefore our transformation must preserve values that
7455         already lie within this range, to ensure that if x.__hash__() returns
7456         hash(y) then hash(x) == hash(y). */
7457      h = PyLong_AsSsize_t(res);
7458      if (h == -1 && PyErr_Occurred()) {
7459          /* res was not within the range of a Py_hash_t, so we're free to
7460             use any sufficiently bit-mixing transformation;
7461             long.__hash__ will do nicely. */
7462          PyErr_Clear();
7463          h = PyLong_Type.tp_hash(res);
7464      }
7465      /* -1 is reserved for errors. */
7466      if (h == -1)
7467          h = -2;
7468      Py_DECREF(res);
7469      return h;
7470  }
7471  
7472  static PyObject *
slot_tp_call(PyObject * self,PyObject * args,PyObject * kwds)7473  slot_tp_call(PyObject *self, PyObject *args, PyObject *kwds)
7474  {
7475      PyThreadState *tstate = _PyThreadState_GET();
7476      _Py_IDENTIFIER(__call__);
7477      int unbound;
7478  
7479      PyObject *meth = lookup_method(self, &PyId___call__, &unbound);
7480      if (meth == NULL) {
7481          return NULL;
7482      }
7483  
7484      PyObject *res;
7485      if (unbound) {
7486          res = _PyObject_Call_Prepend(tstate, meth, self, args, kwds);
7487      }
7488      else {
7489          res = _PyObject_Call(tstate, meth, args, kwds);
7490      }
7491  
7492      Py_DECREF(meth);
7493      return res;
7494  }
7495  
7496  /* There are two slot dispatch functions for tp_getattro.
7497  
7498     - slot_tp_getattro() is used when __getattribute__ is overridden
7499       but no __getattr__ hook is present;
7500  
7501     - slot_tp_getattr_hook() is used when a __getattr__ hook is present.
7502  
7503     The code in update_one_slot() always installs slot_tp_getattr_hook(); this
7504     detects the absence of __getattr__ and then installs the simpler slot if
7505     necessary. */
7506  
7507  static PyObject *
slot_tp_getattro(PyObject * self,PyObject * name)7508  slot_tp_getattro(PyObject *self, PyObject *name)
7509  {
7510      PyObject *stack[2] = {self, name};
7511      return vectorcall_method(&PyId___getattribute__, stack, 2);
7512  }
7513  
7514  static PyObject *
call_attribute(PyObject * self,PyObject * attr,PyObject * name)7515  call_attribute(PyObject *self, PyObject *attr, PyObject *name)
7516  {
7517      PyObject *res, *descr = NULL;
7518      descrgetfunc f = Py_TYPE(attr)->tp_descr_get;
7519  
7520      if (f != NULL) {
7521          descr = f(attr, self, (PyObject *)(Py_TYPE(self)));
7522          if (descr == NULL)
7523              return NULL;
7524          else
7525              attr = descr;
7526      }
7527      res = PyObject_CallOneArg(attr, name);
7528      Py_XDECREF(descr);
7529      return res;
7530  }
7531  
7532  static PyObject *
slot_tp_getattr_hook(PyObject * self,PyObject * name)7533  slot_tp_getattr_hook(PyObject *self, PyObject *name)
7534  {
7535      PyTypeObject *tp = Py_TYPE(self);
7536      PyObject *getattr, *getattribute, *res;
7537      _Py_IDENTIFIER(__getattr__);
7538  
7539      /* speed hack: we could use lookup_maybe, but that would resolve the
7540         method fully for each attribute lookup for classes with
7541         __getattr__, even when the attribute is present. So we use
7542         _PyType_Lookup and create the method only when needed, with
7543         call_attribute. */
7544      getattr = _PyType_LookupId(tp, &PyId___getattr__);
7545      if (getattr == NULL) {
7546          /* No __getattr__ hook: use a simpler dispatcher */
7547          tp->tp_getattro = slot_tp_getattro;
7548          return slot_tp_getattro(self, name);
7549      }
7550      Py_INCREF(getattr);
7551      /* speed hack: we could use lookup_maybe, but that would resolve the
7552         method fully for each attribute lookup for classes with
7553         __getattr__, even when self has the default __getattribute__
7554         method. So we use _PyType_Lookup and create the method only when
7555         needed, with call_attribute. */
7556      getattribute = _PyType_LookupId(tp, &PyId___getattribute__);
7557      if (getattribute == NULL ||
7558          (Py_IS_TYPE(getattribute, &PyWrapperDescr_Type) &&
7559           ((PyWrapperDescrObject *)getattribute)->d_wrapped ==
7560           (void *)PyObject_GenericGetAttr))
7561          res = PyObject_GenericGetAttr(self, name);
7562      else {
7563          Py_INCREF(getattribute);
7564          res = call_attribute(self, getattribute, name);
7565          Py_DECREF(getattribute);
7566      }
7567      if (res == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
7568          PyErr_Clear();
7569          res = call_attribute(self, getattr, name);
7570      }
7571      Py_DECREF(getattr);
7572      return res;
7573  }
7574  
7575  static int
slot_tp_setattro(PyObject * self,PyObject * name,PyObject * value)7576  slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value)
7577  {
7578      PyObject *stack[3];
7579      PyObject *res;
7580      _Py_IDENTIFIER(__delattr__);
7581      _Py_IDENTIFIER(__setattr__);
7582  
7583      stack[0] = self;
7584      stack[1] = name;
7585      if (value == NULL) {
7586          res = vectorcall_method(&PyId___delattr__, stack, 2);
7587      }
7588      else {
7589          stack[2] = value;
7590          res = vectorcall_method(&PyId___setattr__, stack, 3);
7591      }
7592      if (res == NULL)
7593          return -1;
7594      Py_DECREF(res);
7595      return 0;
7596  }
7597  
7598  static _Py_Identifier name_op[] = {
7599      _Py_static_string_init("__lt__"),
7600      _Py_static_string_init("__le__"),
7601      _Py_static_string_init("__eq__"),
7602      _Py_static_string_init("__ne__"),
7603      _Py_static_string_init("__gt__"),
7604      _Py_static_string_init("__ge__"),
7605  };
7606  
7607  static PyObject *
slot_tp_richcompare(PyObject * self,PyObject * other,int op)7608  slot_tp_richcompare(PyObject *self, PyObject *other, int op)
7609  {
7610      PyThreadState *tstate = _PyThreadState_GET();
7611  
7612      int unbound;
7613      PyObject *func = lookup_maybe_method(self, &name_op[op], &unbound);
7614      if (func == NULL) {
7615          PyErr_Clear();
7616          Py_RETURN_NOTIMPLEMENTED;
7617      }
7618  
7619      PyObject *stack[2] = {self, other};
7620      PyObject *res = vectorcall_unbound(tstate, unbound, func, stack, 2);
7621      Py_DECREF(func);
7622      return res;
7623  }
7624  
7625  static PyObject *
slot_tp_iter(PyObject * self)7626  slot_tp_iter(PyObject *self)
7627  {
7628      int unbound;
7629      PyObject *func, *res;
7630      _Py_IDENTIFIER(__iter__);
7631  
7632      func = lookup_maybe_method(self, &PyId___iter__, &unbound);
7633      if (func == Py_None) {
7634          Py_DECREF(func);
7635          PyErr_Format(PyExc_TypeError,
7636                       "'%.200s' object is not iterable",
7637                       Py_TYPE(self)->tp_name);
7638          return NULL;
7639      }
7640  
7641      if (func != NULL) {
7642          res = call_unbound_noarg(unbound, func, self);
7643          Py_DECREF(func);
7644          return res;
7645      }
7646  
7647      PyErr_Clear();
7648      func = lookup_maybe_method(self, &PyId___getitem__, &unbound);
7649      if (func == NULL) {
7650          PyErr_Format(PyExc_TypeError,
7651                       "'%.200s' object is not iterable",
7652                       Py_TYPE(self)->tp_name);
7653          return NULL;
7654      }
7655      Py_DECREF(func);
7656      return PySeqIter_New(self);
7657  }
7658  
7659  static PyObject *
slot_tp_iternext(PyObject * self)7660  slot_tp_iternext(PyObject *self)
7661  {
7662      _Py_IDENTIFIER(__next__);
7663      PyObject *stack[1] = {self};
7664      return vectorcall_method(&PyId___next__, stack, 1);
7665  }
7666  
7667  static PyObject *
slot_tp_descr_get(PyObject * self,PyObject * obj,PyObject * type)7668  slot_tp_descr_get(PyObject *self, PyObject *obj, PyObject *type)
7669  {
7670      PyTypeObject *tp = Py_TYPE(self);
7671      PyObject *get;
7672      _Py_IDENTIFIER(__get__);
7673  
7674      get = _PyType_LookupId(tp, &PyId___get__);
7675      if (get == NULL) {
7676          /* Avoid further slowdowns */
7677          if (tp->tp_descr_get == slot_tp_descr_get)
7678              tp->tp_descr_get = NULL;
7679          Py_INCREF(self);
7680          return self;
7681      }
7682      if (obj == NULL)
7683          obj = Py_None;
7684      if (type == NULL)
7685          type = Py_None;
7686      return PyObject_CallFunctionObjArgs(get, self, obj, type, NULL);
7687  }
7688  
7689  static int
slot_tp_descr_set(PyObject * self,PyObject * target,PyObject * value)7690  slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value)
7691  {
7692      PyObject* stack[3];
7693      PyObject *res;
7694      _Py_IDENTIFIER(__delete__);
7695      _Py_IDENTIFIER(__set__);
7696  
7697      stack[0] = self;
7698      stack[1] = target;
7699      if (value == NULL) {
7700          res = vectorcall_method(&PyId___delete__, stack, 2);
7701      }
7702      else {
7703          stack[2] = value;
7704          res = vectorcall_method(&PyId___set__, stack, 3);
7705      }
7706      if (res == NULL)
7707          return -1;
7708      Py_DECREF(res);
7709      return 0;
7710  }
7711  
7712  static int
slot_tp_init(PyObject * self,PyObject * args,PyObject * kwds)7713  slot_tp_init(PyObject *self, PyObject *args, PyObject *kwds)
7714  {
7715      PyThreadState *tstate = _PyThreadState_GET();
7716  
7717      _Py_IDENTIFIER(__init__);
7718      int unbound;
7719      PyObject *meth = lookup_method(self, &PyId___init__, &unbound);
7720      if (meth == NULL) {
7721          return -1;
7722      }
7723  
7724      PyObject *res;
7725      if (unbound) {
7726          res = _PyObject_Call_Prepend(tstate, meth, self, args, kwds);
7727      }
7728      else {
7729          res = _PyObject_Call(tstate, meth, args, kwds);
7730      }
7731      Py_DECREF(meth);
7732      if (res == NULL)
7733          return -1;
7734      if (res != Py_None) {
7735          PyErr_Format(PyExc_TypeError,
7736                       "__init__() should return None, not '%.200s'",
7737                       Py_TYPE(res)->tp_name);
7738          Py_DECREF(res);
7739          return -1;
7740      }
7741      Py_DECREF(res);
7742      return 0;
7743  }
7744  
7745  static PyObject *
slot_tp_new(PyTypeObject * type,PyObject * args,PyObject * kwds)7746  slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
7747  {
7748      PyThreadState *tstate = _PyThreadState_GET();
7749      PyObject *func, *result;
7750  
7751      func = _PyObject_GetAttrId((PyObject *)type, &PyId___new__);
7752      if (func == NULL) {
7753          return NULL;
7754      }
7755  
7756      result = _PyObject_Call_Prepend(tstate, func, (PyObject *)type, args, kwds);
7757      Py_DECREF(func);
7758      return result;
7759  }
7760  
7761  static void
slot_tp_finalize(PyObject * self)7762  slot_tp_finalize(PyObject *self)
7763  {
7764      _Py_IDENTIFIER(__del__);
7765      int unbound;
7766      PyObject *del, *res;
7767      PyObject *error_type, *error_value, *error_traceback;
7768  
7769      /* Save the current exception, if any. */
7770      PyErr_Fetch(&error_type, &error_value, &error_traceback);
7771  
7772      /* Execute __del__ method, if any. */
7773      del = lookup_maybe_method(self, &PyId___del__, &unbound);
7774      if (del != NULL) {
7775          res = call_unbound_noarg(unbound, del, self);
7776          if (res == NULL)
7777              PyErr_WriteUnraisable(del);
7778          else
7779              Py_DECREF(res);
7780          Py_DECREF(del);
7781      }
7782  
7783      /* Restore the saved exception. */
7784      PyErr_Restore(error_type, error_value, error_traceback);
7785  }
7786  
7787  static PyObject *
slot_am_await(PyObject * self)7788  slot_am_await(PyObject *self)
7789  {
7790      int unbound;
7791      PyObject *func, *res;
7792      _Py_IDENTIFIER(__await__);
7793  
7794      func = lookup_maybe_method(self, &PyId___await__, &unbound);
7795      if (func != NULL) {
7796          res = call_unbound_noarg(unbound, func, self);
7797          Py_DECREF(func);
7798          return res;
7799      }
7800      PyErr_Format(PyExc_AttributeError,
7801                   "object %.50s does not have __await__ method",
7802                   Py_TYPE(self)->tp_name);
7803      return NULL;
7804  }
7805  
7806  static PyObject *
slot_am_aiter(PyObject * self)7807  slot_am_aiter(PyObject *self)
7808  {
7809      int unbound;
7810      PyObject *func, *res;
7811      _Py_IDENTIFIER(__aiter__);
7812  
7813      func = lookup_maybe_method(self, &PyId___aiter__, &unbound);
7814      if (func != NULL) {
7815          res = call_unbound_noarg(unbound, func, self);
7816          Py_DECREF(func);
7817          return res;
7818      }
7819      PyErr_Format(PyExc_AttributeError,
7820                   "object %.50s does not have __aiter__ method",
7821                   Py_TYPE(self)->tp_name);
7822      return NULL;
7823  }
7824  
7825  static PyObject *
slot_am_anext(PyObject * self)7826  slot_am_anext(PyObject *self)
7827  {
7828      int unbound;
7829      PyObject *func, *res;
7830      _Py_IDENTIFIER(__anext__);
7831  
7832      func = lookup_maybe_method(self, &PyId___anext__, &unbound);
7833      if (func != NULL) {
7834          res = call_unbound_noarg(unbound, func, self);
7835          Py_DECREF(func);
7836          return res;
7837      }
7838      PyErr_Format(PyExc_AttributeError,
7839                   "object %.50s does not have __anext__ method",
7840                   Py_TYPE(self)->tp_name);
7841      return NULL;
7842  }
7843  
7844  /*
7845  Table mapping __foo__ names to tp_foo offsets and slot_tp_foo wrapper functions.
7846  
7847  The table is ordered by offsets relative to the 'PyHeapTypeObject' structure,
7848  which incorporates the additional structures used for numbers, sequences and
7849  mappings.  Note that multiple names may map to the same slot (e.g. __eq__,
7850  __ne__ etc. all map to tp_richcompare) and one name may map to multiple slots
7851  (e.g. __str__ affects tp_str as well as tp_repr). The table is terminated with
7852  an all-zero entry.  (This table is further initialized in
7853  _PyTypes_InitSlotDefs().)
7854  */
7855  
7856  typedef struct wrapperbase slotdef;
7857  
7858  #undef TPSLOT
7859  #undef FLSLOT
7860  #undef AMSLOT
7861  #undef ETSLOT
7862  #undef SQSLOT
7863  #undef MPSLOT
7864  #undef NBSLOT
7865  #undef UNSLOT
7866  #undef IBSLOT
7867  #undef BINSLOT
7868  #undef RBINSLOT
7869  
7870  #define TPSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
7871      {NAME, offsetof(PyTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
7872       PyDoc_STR(DOC)}
7873  #define FLSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC, FLAGS) \
7874      {NAME, offsetof(PyTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
7875       PyDoc_STR(DOC), FLAGS}
7876  #define ETSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
7877      {NAME, offsetof(PyHeapTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
7878       PyDoc_STR(DOC)}
7879  #define AMSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
7880      ETSLOT(NAME, as_async.SLOT, FUNCTION, WRAPPER, DOC)
7881  #define SQSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
7882      ETSLOT(NAME, as_sequence.SLOT, FUNCTION, WRAPPER, DOC)
7883  #define MPSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
7884      ETSLOT(NAME, as_mapping.SLOT, FUNCTION, WRAPPER, DOC)
7885  #define NBSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
7886      ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, DOC)
7887  #define UNSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
7888      ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, \
7889             NAME "($self, /)\n--\n\n" DOC)
7890  #define IBSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
7891      ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, \
7892             NAME "($self, value, /)\n--\n\nReturn self" DOC "value.")
7893  #define BINSLOT(NAME, SLOT, FUNCTION, DOC) \
7894      ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_l, \
7895             NAME "($self, value, /)\n--\n\nReturn self" DOC "value.")
7896  #define RBINSLOT(NAME, SLOT, FUNCTION, DOC) \
7897      ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_r, \
7898             NAME "($self, value, /)\n--\n\nReturn value" DOC "self.")
7899  #define BINSLOTNOTINFIX(NAME, SLOT, FUNCTION, DOC) \
7900      ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_l, \
7901             NAME "($self, value, /)\n--\n\n" DOC)
7902  #define RBINSLOTNOTINFIX(NAME, SLOT, FUNCTION, DOC) \
7903      ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_r, \
7904             NAME "($self, value, /)\n--\n\n" DOC)
7905  
7906  static slotdef slotdefs[] = {
7907      TPSLOT("__getattribute__", tp_getattr, NULL, NULL, ""),
7908      TPSLOT("__getattr__", tp_getattr, NULL, NULL, ""),
7909      TPSLOT("__setattr__", tp_setattr, NULL, NULL, ""),
7910      TPSLOT("__delattr__", tp_setattr, NULL, NULL, ""),
7911      TPSLOT("__repr__", tp_repr, slot_tp_repr, wrap_unaryfunc,
7912             "__repr__($self, /)\n--\n\nReturn repr(self)."),
7913      TPSLOT("__hash__", tp_hash, slot_tp_hash, wrap_hashfunc,
7914             "__hash__($self, /)\n--\n\nReturn hash(self)."),
7915      FLSLOT("__call__", tp_call, slot_tp_call, (wrapperfunc)(void(*)(void))wrap_call,
7916             "__call__($self, /, *args, **kwargs)\n--\n\nCall self as a function.",
7917             PyWrapperFlag_KEYWORDS),
7918      TPSLOT("__str__", tp_str, slot_tp_str, wrap_unaryfunc,
7919             "__str__($self, /)\n--\n\nReturn str(self)."),
7920      TPSLOT("__getattribute__", tp_getattro, slot_tp_getattr_hook,
7921             wrap_binaryfunc,
7922             "__getattribute__($self, name, /)\n--\n\nReturn getattr(self, name)."),
7923      TPSLOT("__getattr__", tp_getattro, slot_tp_getattr_hook, NULL, ""),
7924      TPSLOT("__setattr__", tp_setattro, slot_tp_setattro, wrap_setattr,
7925             "__setattr__($self, name, value, /)\n--\n\nImplement setattr(self, name, value)."),
7926      TPSLOT("__delattr__", tp_setattro, slot_tp_setattro, wrap_delattr,
7927             "__delattr__($self, name, /)\n--\n\nImplement delattr(self, name)."),
7928      TPSLOT("__lt__", tp_richcompare, slot_tp_richcompare, richcmp_lt,
7929             "__lt__($self, value, /)\n--\n\nReturn self<value."),
7930      TPSLOT("__le__", tp_richcompare, slot_tp_richcompare, richcmp_le,
7931             "__le__($self, value, /)\n--\n\nReturn self<=value."),
7932      TPSLOT("__eq__", tp_richcompare, slot_tp_richcompare, richcmp_eq,
7933             "__eq__($self, value, /)\n--\n\nReturn self==value."),
7934      TPSLOT("__ne__", tp_richcompare, slot_tp_richcompare, richcmp_ne,
7935             "__ne__($self, value, /)\n--\n\nReturn self!=value."),
7936      TPSLOT("__gt__", tp_richcompare, slot_tp_richcompare, richcmp_gt,
7937             "__gt__($self, value, /)\n--\n\nReturn self>value."),
7938      TPSLOT("__ge__", tp_richcompare, slot_tp_richcompare, richcmp_ge,
7939             "__ge__($self, value, /)\n--\n\nReturn self>=value."),
7940      TPSLOT("__iter__", tp_iter, slot_tp_iter, wrap_unaryfunc,
7941             "__iter__($self, /)\n--\n\nImplement iter(self)."),
7942      TPSLOT("__next__", tp_iternext, slot_tp_iternext, wrap_next,
7943             "__next__($self, /)\n--\n\nImplement next(self)."),
7944      TPSLOT("__get__", tp_descr_get, slot_tp_descr_get, wrap_descr_get,
7945             "__get__($self, instance, owner, /)\n--\n\nReturn an attribute of instance, which is of type owner."),
7946      TPSLOT("__set__", tp_descr_set, slot_tp_descr_set, wrap_descr_set,
7947             "__set__($self, instance, value, /)\n--\n\nSet an attribute of instance to value."),
7948      TPSLOT("__delete__", tp_descr_set, slot_tp_descr_set,
7949             wrap_descr_delete,
7950             "__delete__($self, instance, /)\n--\n\nDelete an attribute of instance."),
7951      FLSLOT("__init__", tp_init, slot_tp_init, (wrapperfunc)(void(*)(void))wrap_init,
7952             "__init__($self, /, *args, **kwargs)\n--\n\n"
7953             "Initialize self.  See help(type(self)) for accurate signature.",
7954             PyWrapperFlag_KEYWORDS),
7955      TPSLOT("__new__", tp_new, slot_tp_new, NULL,
7956             "__new__(type, /, *args, **kwargs)\n--\n\n"
7957             "Create and return new object.  See help(type) for accurate signature."),
7958      TPSLOT("__del__", tp_finalize, slot_tp_finalize, (wrapperfunc)wrap_del, ""),
7959  
7960      AMSLOT("__await__", am_await, slot_am_await, wrap_unaryfunc,
7961             "__await__($self, /)\n--\n\nReturn an iterator to be used in await expression."),
7962      AMSLOT("__aiter__", am_aiter, slot_am_aiter, wrap_unaryfunc,
7963             "__aiter__($self, /)\n--\n\nReturn an awaitable, that resolves in asynchronous iterator."),
7964      AMSLOT("__anext__", am_anext, slot_am_anext, wrap_unaryfunc,
7965             "__anext__($self, /)\n--\n\nReturn a value or raise StopAsyncIteration."),
7966  
7967      BINSLOT("__add__", nb_add, slot_nb_add,
7968             "+"),
7969      RBINSLOT("__radd__", nb_add, slot_nb_add,
7970             "+"),
7971      BINSLOT("__sub__", nb_subtract, slot_nb_subtract,
7972             "-"),
7973      RBINSLOT("__rsub__", nb_subtract, slot_nb_subtract,
7974             "-"),
7975      BINSLOT("__mul__", nb_multiply, slot_nb_multiply,
7976             "*"),
7977      RBINSLOT("__rmul__", nb_multiply, slot_nb_multiply,
7978             "*"),
7979      BINSLOT("__mod__", nb_remainder, slot_nb_remainder,
7980             "%"),
7981      RBINSLOT("__rmod__", nb_remainder, slot_nb_remainder,
7982             "%"),
7983      BINSLOTNOTINFIX("__divmod__", nb_divmod, slot_nb_divmod,
7984             "Return divmod(self, value)."),
7985      RBINSLOTNOTINFIX("__rdivmod__", nb_divmod, slot_nb_divmod,
7986             "Return divmod(value, self)."),
7987      NBSLOT("__pow__", nb_power, slot_nb_power, wrap_ternaryfunc,
7988             "__pow__($self, value, mod=None, /)\n--\n\nReturn pow(self, value, mod)."),
7989      NBSLOT("__rpow__", nb_power, slot_nb_power, wrap_ternaryfunc_r,
7990             "__rpow__($self, value, mod=None, /)\n--\n\nReturn pow(value, self, mod)."),
7991      UNSLOT("__neg__", nb_negative, slot_nb_negative, wrap_unaryfunc, "-self"),
7992      UNSLOT("__pos__", nb_positive, slot_nb_positive, wrap_unaryfunc, "+self"),
7993      UNSLOT("__abs__", nb_absolute, slot_nb_absolute, wrap_unaryfunc,
7994             "abs(self)"),
7995      UNSLOT("__bool__", nb_bool, slot_nb_bool, wrap_inquirypred,
7996             "self != 0"),
7997      UNSLOT("__invert__", nb_invert, slot_nb_invert, wrap_unaryfunc, "~self"),
7998      BINSLOT("__lshift__", nb_lshift, slot_nb_lshift, "<<"),
7999      RBINSLOT("__rlshift__", nb_lshift, slot_nb_lshift, "<<"),
8000      BINSLOT("__rshift__", nb_rshift, slot_nb_rshift, ">>"),
8001      RBINSLOT("__rrshift__", nb_rshift, slot_nb_rshift, ">>"),
8002      BINSLOT("__and__", nb_and, slot_nb_and, "&"),
8003      RBINSLOT("__rand__", nb_and, slot_nb_and, "&"),
8004      BINSLOT("__xor__", nb_xor, slot_nb_xor, "^"),
8005      RBINSLOT("__rxor__", nb_xor, slot_nb_xor, "^"),
8006      BINSLOT("__or__", nb_or, slot_nb_or, "|"),
8007      RBINSLOT("__ror__", nb_or, slot_nb_or, "|"),
8008      UNSLOT("__int__", nb_int, slot_nb_int, wrap_unaryfunc,
8009             "int(self)"),
8010      UNSLOT("__float__", nb_float, slot_nb_float, wrap_unaryfunc,
8011             "float(self)"),
8012      IBSLOT("__iadd__", nb_inplace_add, slot_nb_inplace_add,
8013             wrap_binaryfunc, "+="),
8014      IBSLOT("__isub__", nb_inplace_subtract, slot_nb_inplace_subtract,
8015             wrap_binaryfunc, "-="),
8016      IBSLOT("__imul__", nb_inplace_multiply, slot_nb_inplace_multiply,
8017             wrap_binaryfunc, "*="),
8018      IBSLOT("__imod__", nb_inplace_remainder, slot_nb_inplace_remainder,
8019             wrap_binaryfunc, "%="),
8020      IBSLOT("__ipow__", nb_inplace_power, slot_nb_inplace_power,
8021             wrap_ternaryfunc, "**="),
8022      IBSLOT("__ilshift__", nb_inplace_lshift, slot_nb_inplace_lshift,
8023             wrap_binaryfunc, "<<="),
8024      IBSLOT("__irshift__", nb_inplace_rshift, slot_nb_inplace_rshift,
8025             wrap_binaryfunc, ">>="),
8026      IBSLOT("__iand__", nb_inplace_and, slot_nb_inplace_and,
8027             wrap_binaryfunc, "&="),
8028      IBSLOT("__ixor__", nb_inplace_xor, slot_nb_inplace_xor,
8029             wrap_binaryfunc, "^="),
8030      IBSLOT("__ior__", nb_inplace_or, slot_nb_inplace_or,
8031             wrap_binaryfunc, "|="),
8032      BINSLOT("__floordiv__", nb_floor_divide, slot_nb_floor_divide, "//"),
8033      RBINSLOT("__rfloordiv__", nb_floor_divide, slot_nb_floor_divide, "//"),
8034      BINSLOT("__truediv__", nb_true_divide, slot_nb_true_divide, "/"),
8035      RBINSLOT("__rtruediv__", nb_true_divide, slot_nb_true_divide, "/"),
8036      IBSLOT("__ifloordiv__", nb_inplace_floor_divide,
8037             slot_nb_inplace_floor_divide, wrap_binaryfunc, "//="),
8038      IBSLOT("__itruediv__", nb_inplace_true_divide,
8039             slot_nb_inplace_true_divide, wrap_binaryfunc, "/="),
8040      NBSLOT("__index__", nb_index, slot_nb_index, wrap_unaryfunc,
8041             "__index__($self, /)\n--\n\n"
8042             "Return self converted to an integer, if self is suitable "
8043             "for use as an index into a list."),
8044      BINSLOT("__matmul__", nb_matrix_multiply, slot_nb_matrix_multiply,
8045              "@"),
8046      RBINSLOT("__rmatmul__", nb_matrix_multiply, slot_nb_matrix_multiply,
8047               "@"),
8048      IBSLOT("__imatmul__", nb_inplace_matrix_multiply, slot_nb_inplace_matrix_multiply,
8049             wrap_binaryfunc, "@="),
8050      MPSLOT("__len__", mp_length, slot_mp_length, wrap_lenfunc,
8051             "__len__($self, /)\n--\n\nReturn len(self)."),
8052      MPSLOT("__getitem__", mp_subscript, slot_mp_subscript,
8053             wrap_binaryfunc,
8054             "__getitem__($self, key, /)\n--\n\nReturn self[key]."),
8055      MPSLOT("__setitem__", mp_ass_subscript, slot_mp_ass_subscript,
8056             wrap_objobjargproc,
8057             "__setitem__($self, key, value, /)\n--\n\nSet self[key] to value."),
8058      MPSLOT("__delitem__", mp_ass_subscript, slot_mp_ass_subscript,
8059             wrap_delitem,
8060             "__delitem__($self, key, /)\n--\n\nDelete self[key]."),
8061  
8062      SQSLOT("__len__", sq_length, slot_sq_length, wrap_lenfunc,
8063             "__len__($self, /)\n--\n\nReturn len(self)."),
8064      /* Heap types defining __add__/__mul__ have sq_concat/sq_repeat == NULL.
8065         The logic in abstract.c always falls back to nb_add/nb_multiply in
8066         this case.  Defining both the nb_* and the sq_* slots to call the
8067         user-defined methods has unexpected side-effects, as shown by
8068         test_descr.notimplemented() */
8069      SQSLOT("__add__", sq_concat, NULL, wrap_binaryfunc,
8070             "__add__($self, value, /)\n--\n\nReturn self+value."),
8071      SQSLOT("__mul__", sq_repeat, NULL, wrap_indexargfunc,
8072             "__mul__($self, value, /)\n--\n\nReturn self*value."),
8073      SQSLOT("__rmul__", sq_repeat, NULL, wrap_indexargfunc,
8074             "__rmul__($self, value, /)\n--\n\nReturn value*self."),
8075      SQSLOT("__getitem__", sq_item, slot_sq_item, wrap_sq_item,
8076             "__getitem__($self, key, /)\n--\n\nReturn self[key]."),
8077      SQSLOT("__setitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_setitem,
8078             "__setitem__($self, key, value, /)\n--\n\nSet self[key] to value."),
8079      SQSLOT("__delitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_delitem,
8080             "__delitem__($self, key, /)\n--\n\nDelete self[key]."),
8081      SQSLOT("__contains__", sq_contains, slot_sq_contains, wrap_objobjproc,
8082             "__contains__($self, key, /)\n--\n\nReturn key in self."),
8083      SQSLOT("__iadd__", sq_inplace_concat, NULL,
8084             wrap_binaryfunc,
8085             "__iadd__($self, value, /)\n--\n\nImplement self+=value."),
8086      SQSLOT("__imul__", sq_inplace_repeat, NULL,
8087             wrap_indexargfunc,
8088             "__imul__($self, value, /)\n--\n\nImplement self*=value."),
8089  
8090      {NULL}
8091  };
8092  
8093  /* Given a type pointer and an offset gotten from a slotdef entry, return a
8094     pointer to the actual slot.  This is not quite the same as simply adding
8095     the offset to the type pointer, since it takes care to indirect through the
8096     proper indirection pointer (as_buffer, etc.); it returns NULL if the
8097     indirection pointer is NULL. */
8098  static void **
slotptr(PyTypeObject * type,int ioffset)8099  slotptr(PyTypeObject *type, int ioffset)
8100  {
8101      char *ptr;
8102      long offset = ioffset;
8103  
8104      /* Note: this depends on the order of the members of PyHeapTypeObject! */
8105      assert(offset >= 0);
8106      assert((size_t)offset < offsetof(PyHeapTypeObject, as_buffer));
8107      if ((size_t)offset >= offsetof(PyHeapTypeObject, as_sequence)) {
8108          ptr = (char *)type->tp_as_sequence;
8109          offset -= offsetof(PyHeapTypeObject, as_sequence);
8110      }
8111      else if ((size_t)offset >= offsetof(PyHeapTypeObject, as_mapping)) {
8112          ptr = (char *)type->tp_as_mapping;
8113          offset -= offsetof(PyHeapTypeObject, as_mapping);
8114      }
8115      else if ((size_t)offset >= offsetof(PyHeapTypeObject, as_number)) {
8116          ptr = (char *)type->tp_as_number;
8117          offset -= offsetof(PyHeapTypeObject, as_number);
8118      }
8119      else if ((size_t)offset >= offsetof(PyHeapTypeObject, as_async)) {
8120          ptr = (char *)type->tp_as_async;
8121          offset -= offsetof(PyHeapTypeObject, as_async);
8122      }
8123      else {
8124          ptr = (char *)type;
8125      }
8126      if (ptr != NULL)
8127          ptr += offset;
8128      return (void **)ptr;
8129  }
8130  
8131  /* Length of array of slotdef pointers used to store slots with the
8132     same __name__.  There should be at most MAX_EQUIV-1 slotdef entries with
8133     the same __name__, for any __name__. Since that's a static property, it is
8134     appropriate to declare fixed-size arrays for this. */
8135  #define MAX_EQUIV 10
8136  
8137  /* Return a slot pointer for a given name, but ONLY if the attribute has
8138     exactly one slot function.  The name must be an interned string. */
8139  static void **
resolve_slotdups(PyTypeObject * type,PyObject * name)8140  resolve_slotdups(PyTypeObject *type, PyObject *name)
8141  {
8142      /* XXX Maybe this could be optimized more -- but is it worth it? */
8143  
8144      /* pname and ptrs act as a little cache */
8145      static PyObject *pname;
8146      static slotdef *ptrs[MAX_EQUIV];
8147      slotdef *p, **pp;
8148      void **res, **ptr;
8149  
8150      if (pname != name) {
8151          /* Collect all slotdefs that match name into ptrs. */
8152          pname = name;
8153          pp = ptrs;
8154          for (p = slotdefs; p->name_strobj; p++) {
8155              if (p->name_strobj == name)
8156                  *pp++ = p;
8157          }
8158          *pp = NULL;
8159      }
8160  
8161      /* Look in all slots of the type matching the name. If exactly one of these
8162         has a filled-in slot, return a pointer to that slot.
8163         Otherwise, return NULL. */
8164      res = NULL;
8165      for (pp = ptrs; *pp; pp++) {
8166          ptr = slotptr(type, (*pp)->offset);
8167          if (ptr == NULL || *ptr == NULL)
8168              continue;
8169          if (res != NULL)
8170              return NULL;
8171          res = ptr;
8172      }
8173      return res;
8174  }
8175  
8176  
8177  /* Common code for update_slots_callback() and fixup_slot_dispatchers().
8178   *
8179   * This is meant to set a "slot" like type->tp_repr or
8180   * type->tp_as_sequence->sq_concat by looking up special methods like
8181   * __repr__ or __add__. The opposite (adding special methods from slots) is
8182   * done by add_operators(), called from PyType_Ready(). Since update_one_slot()
8183   * calls PyType_Ready() if needed, the special methods are already in place.
8184   *
8185   * The special methods corresponding to each slot are defined in the "slotdef"
8186   * array. Note that one slot may correspond to multiple special methods and vice
8187   * versa. For example, tp_richcompare uses 6 methods __lt__, ..., __ge__ and
8188   * tp_as_number->nb_add uses __add__ and __radd__. In the other direction,
8189   * __add__ is used by the number and sequence protocols and __getitem__ by the
8190   * sequence and mapping protocols. This causes a lot of complications.
8191   *
8192   * In detail, update_one_slot() does the following:
8193   *
8194   * First of all, if the slot in question does not exist, return immediately.
8195   * This can happen for example if it's tp_as_number->nb_add but tp_as_number
8196   * is NULL.
8197   *
8198   * For the given slot, we loop over all the special methods with a name
8199   * corresponding to that slot (for example, for tp_descr_set, this would be
8200   * __set__ and __delete__) and we look up these names in the MRO of the type.
8201   * If we don't find any special method, the slot is set to NULL (regardless of
8202   * what was in the slot before).
8203   *
8204   * Suppose that we find exactly one special method. If it's a wrapper_descriptor
8205   * (i.e. a special method calling a slot, for example str.__repr__ which calls
8206   * the tp_repr for the 'str' class) with the correct name ("__repr__" for
8207   * tp_repr), for the right class, calling the right wrapper C function (like
8208   * wrap_unaryfunc for tp_repr), then the slot is set to the slot that the
8209   * wrapper_descriptor originally wrapped. For example, a class inheriting
8210   * from 'str' and not redefining __repr__ will have tp_repr set to the tp_repr
8211   * of 'str'.
8212   * In all other cases where the special method exists, the slot is set to a
8213   * wrapper calling the special method. There is one exception: if the special
8214   * method is a wrapper_descriptor with the correct name but the type has
8215   * precisely one slot set for that name and that slot is not the one that we
8216   * are updating, then NULL is put in the slot (this exception is the only place
8217   * in update_one_slot() where the *existing* slots matter).
8218   *
8219   * When there are multiple special methods for the same slot, the above is
8220   * applied for each special method. As long as the results agree, the common
8221   * resulting slot is applied. If the results disagree, then a wrapper for
8222   * the special methods is installed. This is always safe, but less efficient
8223   * because it uses method lookup instead of direct C calls.
8224   *
8225   * There are some further special cases for specific slots, like supporting
8226   * __hash__ = None for tp_hash and special code for tp_new.
8227   *
8228   * When done, return a pointer to the next slotdef with a different offset,
8229   * because that's convenient for fixup_slot_dispatchers(). This function never
8230   * sets an exception: if an internal error happens (unlikely), it's ignored. */
8231  static slotdef *
update_one_slot(PyTypeObject * type,slotdef * p)8232  update_one_slot(PyTypeObject *type, slotdef *p)
8233  {
8234      PyObject *descr;
8235      PyWrapperDescrObject *d;
8236      void *generic = NULL, *specific = NULL;
8237      int use_generic = 0;
8238      int offset = p->offset;
8239      int error;
8240      void **ptr = slotptr(type, offset);
8241  
8242      if (ptr == NULL) {
8243          do {
8244              ++p;
8245          } while (p->offset == offset);
8246          return p;
8247      }
8248      /* We may end up clearing live exceptions below, so make sure it's ours. */
8249      assert(!PyErr_Occurred());
8250      do {
8251          /* Use faster uncached lookup as we won't get any cache hits during type setup. */
8252          descr = find_name_in_mro(type, p->name_strobj, &error);
8253          if (descr == NULL) {
8254              if (error == -1) {
8255                  /* It is unlikely but not impossible that there has been an exception
8256                     during lookup. Since this function originally expected no errors,
8257                     we ignore them here in order to keep up the interface. */
8258                  PyErr_Clear();
8259              }
8260              if (ptr == (void**)&type->tp_iternext) {
8261                  specific = (void *)_PyObject_NextNotImplemented;
8262              }
8263              continue;
8264          }
8265          if (Py_IS_TYPE(descr, &PyWrapperDescr_Type) &&
8266              ((PyWrapperDescrObject *)descr)->d_base->name_strobj == p->name_strobj) {
8267              void **tptr = resolve_slotdups(type, p->name_strobj);
8268              if (tptr == NULL || tptr == ptr)
8269                  generic = p->function;
8270              d = (PyWrapperDescrObject *)descr;
8271              if ((specific == NULL || specific == d->d_wrapped) &&
8272                  d->d_base->wrapper == p->wrapper &&
8273                  PyType_IsSubtype(type, PyDescr_TYPE(d)))
8274              {
8275                  specific = d->d_wrapped;
8276              }
8277              else {
8278                  /* We cannot use the specific slot function because either
8279                     - it is not unique: there are multiple methods for this
8280                       slot and they conflict
8281                     - the signature is wrong (as checked by the ->wrapper
8282                       comparison above)
8283                     - it's wrapping the wrong class
8284                   */
8285                  use_generic = 1;
8286              }
8287          }
8288          else if (Py_IS_TYPE(descr, &PyCFunction_Type) &&
8289                   PyCFunction_GET_FUNCTION(descr) ==
8290                   (PyCFunction)(void(*)(void))tp_new_wrapper &&
8291                   ptr == (void**)&type->tp_new)
8292          {
8293              /* The __new__ wrapper is not a wrapper descriptor,
8294                 so must be special-cased differently.
8295                 If we don't do this, creating an instance will
8296                 always use slot_tp_new which will look up
8297                 __new__ in the MRO which will call tp_new_wrapper
8298                 which will look through the base classes looking
8299                 for a static base and call its tp_new (usually
8300                 PyType_GenericNew), after performing various
8301                 sanity checks and constructing a new argument
8302                 list.  Cut all that nonsense short -- this speeds
8303                 up instance creation tremendously. */
8304              specific = (void *)type->tp_new;
8305              /* XXX I'm not 100% sure that there isn't a hole
8306                 in this reasoning that requires additional
8307                 sanity checks.  I'll buy the first person to
8308                 point out a bug in this reasoning a beer. */
8309          }
8310          else if (descr == Py_None &&
8311                   ptr == (void**)&type->tp_hash) {
8312              /* We specifically allow __hash__ to be set to None
8313                 to prevent inheritance of the default
8314                 implementation from object.__hash__ */
8315              specific = (void *)PyObject_HashNotImplemented;
8316          }
8317          else {
8318              use_generic = 1;
8319              generic = p->function;
8320          }
8321      } while ((++p)->offset == offset);
8322      if (specific && !use_generic)
8323          *ptr = specific;
8324      else
8325          *ptr = generic;
8326      return p;
8327  }
8328  
8329  /* In the type, update the slots whose slotdefs are gathered in the pp array.
8330     This is a callback for update_subclasses(). */
8331  static int
update_slots_callback(PyTypeObject * type,void * data)8332  update_slots_callback(PyTypeObject *type, void *data)
8333  {
8334      slotdef **pp = (slotdef **)data;
8335  
8336      for (; *pp; pp++)
8337          update_one_slot(type, *pp);
8338      return 0;
8339  }
8340  
8341  static int slotdefs_initialized = 0;
8342  /* Initialize the slotdefs table by adding interned string objects for the
8343     names. */
8344  PyStatus
_PyTypes_InitSlotDefs(void)8345  _PyTypes_InitSlotDefs(void)
8346  {
8347      if (slotdefs_initialized) {
8348          return _PyStatus_OK();
8349      }
8350  
8351      for (slotdef *p = slotdefs; p->name; p++) {
8352          /* Slots must be ordered by their offset in the PyHeapTypeObject. */
8353          assert(!p[1].name || p->offset <= p[1].offset);
8354  #ifdef INTERN_NAME_STRINGS
8355          p->name_strobj = PyUnicode_InternFromString(p->name);
8356          if (!p->name_strobj || !PyUnicode_CHECK_INTERNED(p->name_strobj)) {
8357              return _PyStatus_NO_MEMORY();
8358          }
8359  #else
8360          p->name_strobj = PyUnicode_FromString(p->name);
8361          if (!p->name_strobj) {
8362              return _PyStatus_NO_MEMORY();
8363          }
8364  #endif
8365      }
8366      slotdefs_initialized = 1;
8367      return _PyStatus_OK();
8368  }
8369  
8370  /* Undo _PyTypes_InitSlotDefs(), releasing the interned strings. */
clear_slotdefs(void)8371  static void clear_slotdefs(void)
8372  {
8373      for (slotdef *p = slotdefs; p->name; p++) {
8374          Py_CLEAR(p->name_strobj);
8375      }
8376      slotdefs_initialized = 0;
8377  }
8378  
8379  /* Update the slots after assignment to a class (type) attribute. */
8380  static int
update_slot(PyTypeObject * type,PyObject * name)8381  update_slot(PyTypeObject *type, PyObject *name)
8382  {
8383      slotdef *ptrs[MAX_EQUIV];
8384      slotdef *p;
8385      slotdef **pp;
8386      int offset;
8387  
8388      assert(PyUnicode_CheckExact(name));
8389  #ifdef INTERN_NAME_STRINGS
8390      assert(PyUnicode_CHECK_INTERNED(name));
8391  #endif
8392  
8393      assert(slotdefs_initialized);
8394      pp = ptrs;
8395      for (p = slotdefs; p->name; p++) {
8396          assert(PyUnicode_CheckExact(p->name_strobj));
8397          assert(PyUnicode_CheckExact(name));
8398  #ifdef INTERN_NAME_STRINGS
8399          if (p->name_strobj == name) {
8400              *pp++ = p;
8401          }
8402  #else
8403          if (p->name_strobj == name || _PyUnicode_EQ(p->name_strobj, name)) {
8404              *pp++ = p;
8405          }
8406  #endif
8407      }
8408      *pp = NULL;
8409      for (pp = ptrs; *pp; pp++) {
8410          p = *pp;
8411          offset = p->offset;
8412          while (p > slotdefs && (p-1)->offset == offset)
8413              --p;
8414          *pp = p;
8415      }
8416      if (ptrs[0] == NULL)
8417          return 0; /* Not an attribute that affects any slots */
8418      return update_subclasses(type, name,
8419                               update_slots_callback, (void *)ptrs);
8420  }
8421  
8422  /* Store the proper functions in the slot dispatches at class (type)
8423     definition time, based upon which operations the class overrides in its
8424     dict. */
8425  static void
fixup_slot_dispatchers(PyTypeObject * type)8426  fixup_slot_dispatchers(PyTypeObject *type)
8427  {
8428      assert(!PyErr_Occurred());
8429      assert(slotdefs_initialized);
8430      for (slotdef *p = slotdefs; p->name; ) {
8431          p = update_one_slot(type, p);
8432      }
8433  }
8434  
8435  static void
update_all_slots(PyTypeObject * type)8436  update_all_slots(PyTypeObject* type)
8437  {
8438      slotdef *p;
8439  
8440      /* Clear the VALID_VERSION flag of 'type' and all its subclasses. */
8441      PyType_Modified(type);
8442  
8443      assert(slotdefs_initialized);
8444      for (p = slotdefs; p->name; p++) {
8445          /* update_slot returns int but can't actually fail */
8446          update_slot(type, p->name_strobj);
8447      }
8448  }
8449  
8450  
8451  /* Call __set_name__ on all attributes (including descriptors)
8452    in a newly generated type */
8453  static int
type_new_set_names(PyTypeObject * type)8454  type_new_set_names(PyTypeObject *type)
8455  {
8456      PyObject *names_to_set = PyDict_Copy(type->tp_dict);
8457      if (names_to_set == NULL) {
8458          return -1;
8459      }
8460  
8461      Py_ssize_t i = 0;
8462      PyObject *key, *value;
8463      while (PyDict_Next(names_to_set, &i, &key, &value)) {
8464          PyObject *set_name = _PyObject_LookupSpecial(value, &PyId___set_name__);
8465          if (set_name == NULL) {
8466              if (PyErr_Occurred()) {
8467                  goto error;
8468              }
8469              continue;
8470          }
8471  
8472          PyObject *res = PyObject_CallFunctionObjArgs(set_name, type, key, NULL);
8473          Py_DECREF(set_name);
8474  
8475          if (res == NULL) {
8476              _PyErr_FormatFromCause(PyExc_RuntimeError,
8477                  "Error calling __set_name__ on '%.100s' instance %R "
8478                  "in '%.100s'",
8479                  Py_TYPE(value)->tp_name, key, type->tp_name);
8480              goto error;
8481          }
8482          Py_DECREF(res);
8483      }
8484  
8485      Py_DECREF(names_to_set);
8486      return 0;
8487  
8488  error:
8489      Py_DECREF(names_to_set);
8490      return -1;
8491  }
8492  
8493  
8494  /* Call __init_subclass__ on the parent of a newly generated type */
8495  static int
type_new_init_subclass(PyTypeObject * type,PyObject * kwds)8496  type_new_init_subclass(PyTypeObject *type, PyObject *kwds)
8497  {
8498      PyObject *args[2] = {(PyObject *)type, (PyObject *)type};
8499      PyObject *super = _PyObject_FastCall((PyObject *)&PySuper_Type, args, 2);
8500      if (super == NULL) {
8501          return -1;
8502      }
8503  
8504      PyObject *func = _PyObject_GetAttrId(super, &PyId___init_subclass__);
8505      Py_DECREF(super);
8506      if (func == NULL) {
8507          return -1;
8508      }
8509  
8510      PyObject *result = PyObject_VectorcallDict(func, NULL, 0, kwds);
8511      Py_DECREF(func);
8512      if (result == NULL) {
8513          return -1;
8514      }
8515  
8516      Py_DECREF(result);
8517      return 0;
8518  }
8519  
8520  
8521  /* recurse_down_subclasses() and update_subclasses() are mutually
8522     recursive functions to call a callback for all subclasses,
8523     but refraining from recursing into subclasses that define 'name'. */
8524  
8525  static int
update_subclasses(PyTypeObject * type,PyObject * name,update_callback callback,void * data)8526  update_subclasses(PyTypeObject *type, PyObject *name,
8527                    update_callback callback, void *data)
8528  {
8529      if (callback(type, data) < 0)
8530          return -1;
8531      return recurse_down_subclasses(type, name, callback, data);
8532  }
8533  
8534  static int
recurse_down_subclasses(PyTypeObject * type,PyObject * name,update_callback callback,void * data)8535  recurse_down_subclasses(PyTypeObject *type, PyObject *name,
8536                          update_callback callback, void *data)
8537  {
8538      PyTypeObject *subclass;
8539      PyObject *ref, *subclasses, *dict;
8540      Py_ssize_t i;
8541  
8542      subclasses = type->tp_subclasses;
8543      if (subclasses == NULL)
8544          return 0;
8545      assert(PyDict_CheckExact(subclasses));
8546      i = 0;
8547      while (PyDict_Next(subclasses, &i, NULL, &ref)) {
8548          assert(PyWeakref_CheckRef(ref));
8549          subclass = (PyTypeObject *)PyWeakref_GET_OBJECT(ref);
8550          assert(subclass != NULL);
8551          if ((PyObject *)subclass == Py_None)
8552              continue;
8553          assert(PyType_Check(subclass));
8554          /* Avoid recursing down into unaffected classes */
8555          dict = subclass->tp_dict;
8556          if (dict != NULL && PyDict_Check(dict)) {
8557              int r = PyDict_Contains(dict, name);
8558              if (r > 0) {
8559                  continue;
8560              }
8561              if (r < 0) {
8562                  return -1;
8563              }
8564          }
8565          if (update_subclasses(subclass, name, callback, data) < 0)
8566              return -1;
8567      }
8568      return 0;
8569  }
8570  
8571  /* This function is called by PyType_Ready() to populate the type's
8572     dictionary with method descriptors for function slots.  For each
8573     function slot (like tp_repr) that's defined in the type, one or more
8574     corresponding descriptors are added in the type's tp_dict dictionary
8575     under the appropriate name (like __repr__).  Some function slots
8576     cause more than one descriptor to be added (for example, the nb_add
8577     slot adds both __add__ and __radd__ descriptors) and some function
8578     slots compete for the same descriptor (for example both sq_item and
8579     mp_subscript generate a __getitem__ descriptor).
8580  
8581     In the latter case, the first slotdef entry encountered wins.  Since
8582     slotdef entries are sorted by the offset of the slot in the
8583     PyHeapTypeObject, this gives us some control over disambiguating
8584     between competing slots: the members of PyHeapTypeObject are listed
8585     from most general to least general, so the most general slot is
8586     preferred.  In particular, because as_mapping comes before as_sequence,
8587     for a type that defines both mp_subscript and sq_item, mp_subscript
8588     wins.
8589  
8590     This only adds new descriptors and doesn't overwrite entries in
8591     tp_dict that were previously defined.  The descriptors contain a
8592     reference to the C function they must call, so that it's safe if they
8593     are copied into a subtype's __dict__ and the subtype has a different
8594     C function in its slot -- calling the method defined by the
8595     descriptor will call the C function that was used to create it,
8596     rather than the C function present in the slot when it is called.
8597     (This is important because a subtype may have a C function in the
8598     slot that calls the method from the dictionary, and we want to avoid
8599     infinite recursion here.) */
8600  
8601  static int
add_operators(PyTypeObject * type)8602  add_operators(PyTypeObject *type)
8603  {
8604      PyObject *dict = type->tp_dict;
8605      slotdef *p;
8606      PyObject *descr;
8607      void **ptr;
8608  
8609      assert(slotdefs_initialized);
8610      for (p = slotdefs; p->name; p++) {
8611          if (p->wrapper == NULL)
8612              continue;
8613          ptr = slotptr(type, p->offset);
8614          if (!ptr || !*ptr)
8615              continue;
8616          int r = PyDict_Contains(dict, p->name_strobj);
8617          if (r > 0)
8618              continue;
8619          if (r < 0) {
8620              return -1;
8621          }
8622          if (*ptr == (void *)PyObject_HashNotImplemented) {
8623              /* Classes may prevent the inheritance of the tp_hash
8624                 slot by storing PyObject_HashNotImplemented in it. Make it
8625                 visible as a None value for the __hash__ attribute. */
8626              if (PyDict_SetItem(dict, p->name_strobj, Py_None) < 0)
8627                  return -1;
8628          }
8629          else {
8630              descr = PyDescr_NewWrapper(type, p, *ptr);
8631              if (descr == NULL)
8632                  return -1;
8633              if (PyDict_SetItem(dict, p->name_strobj, descr) < 0) {
8634                  Py_DECREF(descr);
8635                  return -1;
8636              }
8637              Py_DECREF(descr);
8638          }
8639      }
8640      return 0;
8641  }
8642  
8643  
8644  /* Cooperative 'super' */
8645  
8646  typedef struct {
8647      PyObject_HEAD
8648      PyTypeObject *type;
8649      PyObject *obj;
8650      PyTypeObject *obj_type;
8651  } superobject;
8652  
8653  static PyMemberDef super_members[] = {
8654      {"__thisclass__", T_OBJECT, offsetof(superobject, type), READONLY,
8655       "the class invoking super()"},
8656      {"__self__",  T_OBJECT, offsetof(superobject, obj), READONLY,
8657       "the instance invoking super(); may be None"},
8658      {"__self_class__", T_OBJECT, offsetof(superobject, obj_type), READONLY,
8659       "the type of the instance invoking super(); may be None"},
8660      {0}
8661  };
8662  
8663  static void
super_dealloc(PyObject * self)8664  super_dealloc(PyObject *self)
8665  {
8666      superobject *su = (superobject *)self;
8667  
8668      _PyObject_GC_UNTRACK(self);
8669      Py_XDECREF(su->obj);
8670      Py_XDECREF(su->type);
8671      Py_XDECREF(su->obj_type);
8672      Py_TYPE(self)->tp_free(self);
8673  }
8674  
8675  static PyObject *
super_repr(PyObject * self)8676  super_repr(PyObject *self)
8677  {
8678      superobject *su = (superobject *)self;
8679  
8680      if (su->obj_type)
8681          return PyUnicode_FromFormat(
8682              "<super: <class '%s'>, <%s object>>",
8683              su->type ? su->type->tp_name : "NULL",
8684              su->obj_type->tp_name);
8685      else
8686          return PyUnicode_FromFormat(
8687              "<super: <class '%s'>, NULL>",
8688              su->type ? su->type->tp_name : "NULL");
8689  }
8690  
8691  static PyObject *
super_getattro(PyObject * self,PyObject * name)8692  super_getattro(PyObject *self, PyObject *name)
8693  {
8694      superobject *su = (superobject *)self;
8695      PyTypeObject *starttype;
8696      PyObject *mro;
8697      Py_ssize_t i, n;
8698  
8699      starttype = su->obj_type;
8700      if (starttype == NULL)
8701          goto skip;
8702  
8703      /* We want __class__ to return the class of the super object
8704         (i.e. super, or a subclass), not the class of su->obj. */
8705      if (PyUnicode_Check(name) &&
8706          PyUnicode_GET_LENGTH(name) == 9 &&
8707          _PyUnicode_EqualToASCIIId(name, &PyId___class__))
8708          goto skip;
8709  
8710      mro = starttype->tp_mro;
8711      if (mro == NULL)
8712          goto skip;
8713  
8714      assert(PyTuple_Check(mro));
8715      n = PyTuple_GET_SIZE(mro);
8716  
8717      /* No need to check the last one: it's gonna be skipped anyway.  */
8718      for (i = 0; i+1 < n; i++) {
8719          if ((PyObject *)(su->type) == PyTuple_GET_ITEM(mro, i))
8720              break;
8721      }
8722      i++;  /* skip su->type (if any)  */
8723      if (i >= n)
8724          goto skip;
8725  
8726      /* keep a strong reference to mro because starttype->tp_mro can be
8727         replaced during PyDict_GetItemWithError(dict, name)  */
8728      Py_INCREF(mro);
8729      do {
8730          PyObject *res, *tmp, *dict;
8731          descrgetfunc f;
8732  
8733          tmp = PyTuple_GET_ITEM(mro, i);
8734          assert(PyType_Check(tmp));
8735  
8736          dict = ((PyTypeObject *)tmp)->tp_dict;
8737          assert(dict != NULL && PyDict_Check(dict));
8738  
8739          res = PyDict_GetItemWithError(dict, name);
8740          if (res != NULL) {
8741              Py_INCREF(res);
8742  
8743              f = Py_TYPE(res)->tp_descr_get;
8744              if (f != NULL) {
8745                  tmp = f(res,
8746                      /* Only pass 'obj' param if this is instance-mode super
8747                         (See SF ID #743627)  */
8748                      (su->obj == (PyObject *)starttype) ? NULL : su->obj,
8749                      (PyObject *)starttype);
8750                  Py_DECREF(res);
8751                  res = tmp;
8752              }
8753  
8754              Py_DECREF(mro);
8755              return res;
8756          }
8757          else if (PyErr_Occurred()) {
8758              Py_DECREF(mro);
8759              return NULL;
8760          }
8761  
8762          i++;
8763      } while (i < n);
8764      Py_DECREF(mro);
8765  
8766    skip:
8767      return PyObject_GenericGetAttr(self, name);
8768  }
8769  
8770  static PyTypeObject *
supercheck(PyTypeObject * type,PyObject * obj)8771  supercheck(PyTypeObject *type, PyObject *obj)
8772  {
8773      /* Check that a super() call makes sense.  Return a type object.
8774  
8775         obj can be a class, or an instance of one:
8776  
8777         - If it is a class, it must be a subclass of 'type'.      This case is
8778           used for class methods; the return value is obj.
8779  
8780         - If it is an instance, it must be an instance of 'type'.  This is
8781           the normal case; the return value is obj.__class__.
8782  
8783         But... when obj is an instance, we want to allow for the case where
8784         Py_TYPE(obj) is not a subclass of type, but obj.__class__ is!
8785         This will allow using super() with a proxy for obj.
8786      */
8787  
8788      /* Check for first bullet above (special case) */
8789      if (PyType_Check(obj) && PyType_IsSubtype((PyTypeObject *)obj, type)) {
8790          Py_INCREF(obj);
8791          return (PyTypeObject *)obj;
8792      }
8793  
8794      /* Normal case */
8795      if (PyType_IsSubtype(Py_TYPE(obj), type)) {
8796          Py_INCREF(Py_TYPE(obj));
8797          return Py_TYPE(obj);
8798      }
8799      else {
8800          /* Try the slow way */
8801          PyObject *class_attr;
8802  
8803          if (_PyObject_LookupAttrId(obj, &PyId___class__, &class_attr) < 0) {
8804              return NULL;
8805          }
8806          if (class_attr != NULL &&
8807              PyType_Check(class_attr) &&
8808              (PyTypeObject *)class_attr != Py_TYPE(obj))
8809          {
8810              int ok = PyType_IsSubtype(
8811                  (PyTypeObject *)class_attr, type);
8812              if (ok)
8813                  return (PyTypeObject *)class_attr;
8814          }
8815          Py_XDECREF(class_attr);
8816      }
8817  
8818      PyErr_SetString(PyExc_TypeError,
8819                      "super(type, obj): "
8820                      "obj must be an instance or subtype of type");
8821      return NULL;
8822  }
8823  
8824  static PyObject *
super_descr_get(PyObject * self,PyObject * obj,PyObject * type)8825  super_descr_get(PyObject *self, PyObject *obj, PyObject *type)
8826  {
8827      superobject *su = (superobject *)self;
8828      superobject *newobj;
8829  
8830      if (obj == NULL || obj == Py_None || su->obj != NULL) {
8831          /* Not binding to an object, or already bound */
8832          Py_INCREF(self);
8833          return self;
8834      }
8835      if (!Py_IS_TYPE(su, &PySuper_Type))
8836          /* If su is an instance of a (strict) subclass of super,
8837             call its type */
8838          return PyObject_CallFunctionObjArgs((PyObject *)Py_TYPE(su),
8839                                              su->type, obj, NULL);
8840      else {
8841          /* Inline the common case */
8842          PyTypeObject *obj_type = supercheck(su->type, obj);
8843          if (obj_type == NULL)
8844              return NULL;
8845          newobj = (superobject *)PySuper_Type.tp_new(&PySuper_Type,
8846                                                   NULL, NULL);
8847          if (newobj == NULL)
8848              return NULL;
8849          Py_INCREF(su->type);
8850          Py_INCREF(obj);
8851          newobj->type = su->type;
8852          newobj->obj = obj;
8853          newobj->obj_type = obj_type;
8854          return (PyObject *)newobj;
8855      }
8856  }
8857  
8858  static int
super_init_without_args(PyFrameObject * f,PyCodeObject * co,PyTypeObject ** type_p,PyObject ** obj_p)8859  super_init_without_args(PyFrameObject *f, PyCodeObject *co,
8860                          PyTypeObject **type_p, PyObject **obj_p)
8861  {
8862      if (co->co_argcount == 0) {
8863          PyErr_SetString(PyExc_RuntimeError,
8864                          "super(): no arguments");
8865          return -1;
8866      }
8867  
8868      PyObject *obj = f->f_localsplus[0];
8869      Py_ssize_t i, n;
8870      if (obj == NULL && co->co_cell2arg) {
8871          /* The first argument might be a cell. */
8872          n = PyTuple_GET_SIZE(co->co_cellvars);
8873          for (i = 0; i < n; i++) {
8874              if (co->co_cell2arg[i] == 0) {
8875                  PyObject *cell = f->f_localsplus[co->co_nlocals + i];
8876                  assert(PyCell_Check(cell));
8877                  obj = PyCell_GET(cell);
8878                  break;
8879              }
8880          }
8881      }
8882      if (obj == NULL) {
8883          PyErr_SetString(PyExc_RuntimeError,
8884                          "super(): arg[0] deleted");
8885          return -1;
8886      }
8887  
8888      if (co->co_freevars == NULL) {
8889          n = 0;
8890      }
8891      else {
8892          assert(PyTuple_Check(co->co_freevars));
8893          n = PyTuple_GET_SIZE(co->co_freevars);
8894      }
8895  
8896      PyTypeObject *type = NULL;
8897      for (i = 0; i < n; i++) {
8898          PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
8899          assert(PyUnicode_Check(name));
8900          if (_PyUnicode_EqualToASCIIId(name, &PyId___class__)) {
8901              Py_ssize_t index = co->co_nlocals +
8902                  PyTuple_GET_SIZE(co->co_cellvars) + i;
8903              PyObject *cell = f->f_localsplus[index];
8904              if (cell == NULL || !PyCell_Check(cell)) {
8905                  PyErr_SetString(PyExc_RuntimeError,
8906                    "super(): bad __class__ cell");
8907                  return -1;
8908              }
8909              type = (PyTypeObject *) PyCell_GET(cell);
8910              if (type == NULL) {
8911                  PyErr_SetString(PyExc_RuntimeError,
8912                    "super(): empty __class__ cell");
8913                  return -1;
8914              }
8915              if (!PyType_Check(type)) {
8916                  PyErr_Format(PyExc_RuntimeError,
8917                    "super(): __class__ is not a type (%s)",
8918                    Py_TYPE(type)->tp_name);
8919                  return -1;
8920              }
8921              break;
8922          }
8923      }
8924      if (type == NULL) {
8925          PyErr_SetString(PyExc_RuntimeError,
8926                          "super(): __class__ cell not found");
8927          return -1;
8928      }
8929  
8930      *type_p = type;
8931      *obj_p = obj;
8932      return 0;
8933  }
8934  
8935  static int
super_init(PyObject * self,PyObject * args,PyObject * kwds)8936  super_init(PyObject *self, PyObject *args, PyObject *kwds)
8937  {
8938      superobject *su = (superobject *)self;
8939      PyTypeObject *type = NULL;
8940      PyObject *obj = NULL;
8941      PyTypeObject *obj_type = NULL;
8942  
8943      if (!_PyArg_NoKeywords("super", kwds))
8944          return -1;
8945      if (!PyArg_ParseTuple(args, "|O!O:super", &PyType_Type, &type, &obj))
8946          return -1;
8947  
8948      if (type == NULL) {
8949          /* Call super(), without args -- fill in from __class__
8950             and first local variable on the stack. */
8951          PyThreadState *tstate = _PyThreadState_GET();
8952          PyFrameObject *frame = PyThreadState_GetFrame(tstate);
8953          if (frame == NULL) {
8954              PyErr_SetString(PyExc_RuntimeError,
8955                              "super(): no current frame");
8956              return -1;
8957          }
8958  
8959          PyCodeObject *code = PyFrame_GetCode(frame);
8960          int res = super_init_without_args(frame, code, &type, &obj);
8961          Py_DECREF(frame);
8962          Py_DECREF(code);
8963  
8964          if (res < 0) {
8965              return -1;
8966          }
8967      }
8968  
8969      if (obj == Py_None)
8970          obj = NULL;
8971      if (obj != NULL) {
8972          obj_type = supercheck(type, obj);
8973          if (obj_type == NULL)
8974              return -1;
8975          Py_INCREF(obj);
8976      }
8977      Py_INCREF(type);
8978      Py_XSETREF(su->type, type);
8979      Py_XSETREF(su->obj, obj);
8980      Py_XSETREF(su->obj_type, obj_type);
8981      return 0;
8982  }
8983  
8984  PyDoc_STRVAR(super_doc,
8985  "super() -> same as super(__class__, <first argument>)\n"
8986  "super(type) -> unbound super object\n"
8987  "super(type, obj) -> bound super object; requires isinstance(obj, type)\n"
8988  "super(type, type2) -> bound super object; requires issubclass(type2, type)\n"
8989  "Typical use to call a cooperative superclass method:\n"
8990  "class C(B):\n"
8991  "    def meth(self, arg):\n"
8992  "        super().meth(arg)\n"
8993  "This works for class methods too:\n"
8994  "class C(B):\n"
8995  "    @classmethod\n"
8996  "    def cmeth(cls, arg):\n"
8997  "        super().cmeth(arg)\n");
8998  
8999  static int
super_traverse(PyObject * self,visitproc visit,void * arg)9000  super_traverse(PyObject *self, visitproc visit, void *arg)
9001  {
9002      superobject *su = (superobject *)self;
9003  
9004      Py_VISIT(su->obj);
9005      Py_VISIT(su->type);
9006      Py_VISIT(su->obj_type);
9007  
9008      return 0;
9009  }
9010  
9011  PyTypeObject PySuper_Type = {
9012      PyVarObject_HEAD_INIT(&PyType_Type, 0)
9013      "super",                                    /* tp_name */
9014      sizeof(superobject),                        /* tp_basicsize */
9015      0,                                          /* tp_itemsize */
9016      /* methods */
9017      super_dealloc,                              /* tp_dealloc */
9018      0,                                          /* tp_vectorcall_offset */
9019      0,                                          /* tp_getattr */
9020      0,                                          /* tp_setattr */
9021      0,                                          /* tp_as_async */
9022      super_repr,                                 /* tp_repr */
9023      0,                                          /* tp_as_number */
9024      0,                                          /* tp_as_sequence */
9025      0,                                          /* tp_as_mapping */
9026      0,                                          /* tp_hash */
9027      0,                                          /* tp_call */
9028      0,                                          /* tp_str */
9029      super_getattro,                             /* tp_getattro */
9030      0,                                          /* tp_setattro */
9031      0,                                          /* tp_as_buffer */
9032      Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
9033          Py_TPFLAGS_BASETYPE,                    /* tp_flags */
9034      super_doc,                                  /* tp_doc */
9035      super_traverse,                             /* tp_traverse */
9036      0,                                          /* tp_clear */
9037      0,                                          /* tp_richcompare */
9038      0,                                          /* tp_weaklistoffset */
9039      0,                                          /* tp_iter */
9040      0,                                          /* tp_iternext */
9041      0,                                          /* tp_methods */
9042      super_members,                              /* tp_members */
9043      0,                                          /* tp_getset */
9044      0,                                          /* tp_base */
9045      0,                                          /* tp_dict */
9046      super_descr_get,                            /* tp_descr_get */
9047      0,                                          /* tp_descr_set */
9048      0,                                          /* tp_dictoffset */
9049      super_init,                                 /* tp_init */
9050      PyType_GenericAlloc,                        /* tp_alloc */
9051      PyType_GenericNew,                          /* tp_new */
9052      PyObject_GC_Del,                            /* tp_free */
9053  };
9054