Home | History | Annotate | Download | only in Objects
      1 /* Type object implementation */
      2 
      3 #include "Python.h"
      4 #include "structmember.h"
      5 
      6 #include <ctype.h>
      7 
      8 
      9 /* Support type attribute cache */
     10 
     11 /* The cache can keep references to the names alive for longer than
     12    they normally would.  This is why the maximum size is limited to
     13    MCACHE_MAX_ATTR_SIZE, since it might be a problem if very large
     14    strings are used as attribute names. */
     15 #define MCACHE_MAX_ATTR_SIZE    100
     16 #define MCACHE_SIZE_EXP         10
     17 #define MCACHE_HASH(version, name_hash)                                 \
     18         (((unsigned int)(version) * (unsigned int)(name_hash))          \
     19          >> (8*sizeof(unsigned int) - MCACHE_SIZE_EXP))
     20 #define MCACHE_HASH_METHOD(type, name)                                  \
     21         MCACHE_HASH((type)->tp_version_tag,                     \
     22                     ((PyStringObject *)(name))->ob_shash)
     23 #define MCACHE_CACHEABLE_NAME(name)                                     \
     24         PyString_CheckExact(name) &&                            \
     25         PyString_GET_SIZE(name) <= MCACHE_MAX_ATTR_SIZE
     26 
     27 struct method_cache_entry {
     28     unsigned int version;
     29     PyObject *name;             /* reference to exactly a str or None */
     30     PyObject *value;            /* borrowed */
     31 };
     32 
     33 static struct method_cache_entry method_cache[1 << MCACHE_SIZE_EXP];
     34 static unsigned int next_version_tag = 0;
     35 
     36 unsigned int
     37 PyType_ClearCache(void)
     38 {
     39     Py_ssize_t i;
     40     unsigned int cur_version_tag = next_version_tag - 1;
     41 
     42     for (i = 0; i < (1 << MCACHE_SIZE_EXP); i++) {
     43         method_cache[i].version = 0;
     44         Py_CLEAR(method_cache[i].name);
     45         method_cache[i].value = NULL;
     46     }
     47     next_version_tag = 0;
     48     /* mark all version tags as invalid */
     49     PyType_Modified(&PyBaseObject_Type);
     50     return cur_version_tag;
     51 }
     52 
     53 void
     54 PyType_Modified(PyTypeObject *type)
     55 {
     56     /* Invalidate any cached data for the specified type and all
     57        subclasses.  This function is called after the base
     58        classes, mro, or attributes of the type are altered.
     59 
     60        Invariants:
     61 
     62        - Py_TPFLAGS_VALID_VERSION_TAG is never set if
     63          Py_TPFLAGS_HAVE_VERSION_TAG is not set (e.g. on type
     64          objects coming from non-recompiled extension modules)
     65 
     66        - before Py_TPFLAGS_VALID_VERSION_TAG can be set on a type,
     67          it must first be set on all super types.
     68 
     69        This function clears the Py_TPFLAGS_VALID_VERSION_TAG of a
     70        type (so it must first clear it on all subclasses).  The
     71        tp_version_tag value is meaningless unless this flag is set.
     72        We don't assign new version tags eagerly, but only as
     73        needed.
     74      */
     75     PyObject *raw, *ref;
     76     Py_ssize_t i, n;
     77 
     78     if (!PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG))
     79         return;
     80 
     81     raw = type->tp_subclasses;
     82     if (raw != NULL) {
     83         n = PyList_GET_SIZE(raw);
     84         for (i = 0; i < n; i++) {
     85             ref = PyList_GET_ITEM(raw, i);
     86             ref = PyWeakref_GET_OBJECT(ref);
     87             if (ref != Py_None) {
     88                 PyType_Modified((PyTypeObject *)ref);
     89             }
     90         }
     91     }
     92     type->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG;
     93 }
     94 
     95 static void
     96 type_mro_modified(PyTypeObject *type, PyObject *bases) {
     97     /*
     98        Check that all base classes or elements of the mro of type are
     99        able to be cached.  This function is called after the base
    100        classes or mro of the type are altered.
    101 
    102        Unset HAVE_VERSION_TAG and VALID_VERSION_TAG if the type
    103        inherits from an old-style class, either directly or if it
    104        appears in the MRO of a new-style class.  No support either for
    105        custom MROs that include types that are not officially super
    106        types.
    107 
    108        Called from mro_internal, which will subsequently be called on
    109        each subclass when their mro is recursively updated.
    110      */
    111     Py_ssize_t i, n;
    112     int clear = 0;
    113 
    114     if (!PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG))
    115         return;
    116 
    117     n = PyTuple_GET_SIZE(bases);
    118     for (i = 0; i < n; i++) {
    119         PyObject *b = PyTuple_GET_ITEM(bases, i);
    120         PyTypeObject *cls;
    121 
    122         if (!PyType_Check(b) ) {
    123             clear = 1;
    124             break;
    125         }
    126 
    127         cls = (PyTypeObject *)b;
    128 
    129         if (!PyType_HasFeature(cls, Py_TPFLAGS_HAVE_VERSION_TAG) ||
    130             !PyType_IsSubtype(type, cls)) {
    131             clear = 1;
    132             break;
    133         }
    134     }
    135 
    136     if (clear)
    137         type->tp_flags &= ~(Py_TPFLAGS_HAVE_VERSION_TAG|
    138                             Py_TPFLAGS_VALID_VERSION_TAG);
    139 }
    140 
    141 static int
    142 assign_version_tag(PyTypeObject *type)
    143 {
    144     /* Ensure that the tp_version_tag is valid and set
    145        Py_TPFLAGS_VALID_VERSION_TAG.  To respect the invariant, this
    146        must first be done on all super classes.  Return 0 if this
    147        cannot be done, 1 if Py_TPFLAGS_VALID_VERSION_TAG.
    148     */
    149     Py_ssize_t i, n;
    150     PyObject *bases;
    151 
    152     if (PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG))
    153         return 1;
    154     if (!PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG))
    155         return 0;
    156     if (!PyType_HasFeature(type, Py_TPFLAGS_READY))
    157         return 0;
    158 
    159     type->tp_version_tag = next_version_tag++;
    160     /* for stress-testing: next_version_tag &= 0xFF; */
    161 
    162     if (type->tp_version_tag == 0) {
    163         /* wrap-around or just starting Python - clear the whole
    164            cache by filling names with references to Py_None.
    165            Values are also set to NULL for added protection, as they
    166            are borrowed reference */
    167         for (i = 0; i < (1 << MCACHE_SIZE_EXP); i++) {
    168             method_cache[i].value = NULL;
    169             Py_XDECREF(method_cache[i].name);
    170             method_cache[i].name = Py_None;
    171             Py_INCREF(Py_None);
    172         }
    173         /* mark all version tags as invalid */
    174         PyType_Modified(&PyBaseObject_Type);
    175         return 1;
    176     }
    177     bases = type->tp_bases;
    178     n = PyTuple_GET_SIZE(bases);
    179     for (i = 0; i < n; i++) {
    180         PyObject *b = PyTuple_GET_ITEM(bases, i);
    181         assert(PyType_Check(b));
    182         if (!assign_version_tag((PyTypeObject *)b))
    183             return 0;
    184     }
    185     type->tp_flags |= Py_TPFLAGS_VALID_VERSION_TAG;
    186     return 1;
    187 }
    188 
    189 
    190 static PyMemberDef type_members[] = {
    191     {"__basicsize__", T_PYSSIZET, offsetof(PyTypeObject,tp_basicsize),READONLY},
    192     {"__itemsize__", T_PYSSIZET, offsetof(PyTypeObject, tp_itemsize), READONLY},
    193     {"__flags__", T_LONG, offsetof(PyTypeObject, tp_flags), READONLY},
    194     {"__weakrefoffset__", T_LONG,
    195      offsetof(PyTypeObject, tp_weaklistoffset), READONLY},
    196     {"__base__", T_OBJECT, offsetof(PyTypeObject, tp_base), READONLY},
    197     {"__dictoffset__", T_LONG,
    198      offsetof(PyTypeObject, tp_dictoffset), READONLY},
    199     {"__mro__", T_OBJECT, offsetof(PyTypeObject, tp_mro), READONLY},
    200     {0}
    201 };
    202 
    203 static PyObject *
    204 type_name(PyTypeObject *type, void *context)
    205 {
    206     const char *s;
    207 
    208     if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
    209         PyHeapTypeObject* et = (PyHeapTypeObject*)type;
    210 
    211         Py_INCREF(et->ht_name);
    212         return et->ht_name;
    213     }
    214     else {
    215         s = strrchr(type->tp_name, '.');
    216         if (s == NULL)
    217             s = type->tp_name;
    218         else
    219             s++;
    220         return PyString_FromString(s);
    221     }
    222 }
    223 
    224 static int
    225 type_set_name(PyTypeObject *type, PyObject *value, void *context)
    226 {
    227     PyHeapTypeObject* et;
    228     PyObject *tmp;
    229 
    230     if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
    231         PyErr_Format(PyExc_TypeError,
    232                      "can't set %s.__name__", type->tp_name);
    233         return -1;
    234     }
    235     if (!value) {
    236         PyErr_Format(PyExc_TypeError,
    237                      "can't delete %s.__name__", type->tp_name);
    238         return -1;
    239     }
    240     if (!PyString_Check(value)) {
    241         PyErr_Format(PyExc_TypeError,
    242                      "can only assign string to %s.__name__, not '%s'",
    243                      type->tp_name, Py_TYPE(value)->tp_name);
    244         return -1;
    245     }
    246     if (strlen(PyString_AS_STRING(value))
    247         != (size_t)PyString_GET_SIZE(value)) {
    248         PyErr_Format(PyExc_ValueError,
    249                      "__name__ must not contain null bytes");
    250         return -1;
    251     }
    252 
    253     et = (PyHeapTypeObject*)type;
    254 
    255     Py_INCREF(value);
    256 
    257     /* Wait until et is a sane state before Py_DECREF'ing the old et->ht_name
    258        value.  (Bug #16447.)  */
    259     tmp = et->ht_name;
    260     et->ht_name = value;
    261 
    262     type->tp_name = PyString_AS_STRING(value);
    263     Py_DECREF(tmp);
    264 
    265     return 0;
    266 }
    267 
    268 static PyObject *
    269 type_module(PyTypeObject *type, void *context)
    270 {
    271     PyObject *mod;
    272     char *s;
    273 
    274     if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
    275         mod = PyDict_GetItemString(type->tp_dict, "__module__");
    276         if (!mod) {
    277             PyErr_Format(PyExc_AttributeError, "__module__");
    278             return 0;
    279         }
    280         Py_XINCREF(mod);
    281         return mod;
    282     }
    283     else {
    284         s = strrchr(type->tp_name, '.');
    285         if (s != NULL)
    286             return PyString_FromStringAndSize(
    287                 type->tp_name, (Py_ssize_t)(s - type->tp_name));
    288         return PyString_FromString("__builtin__");
    289     }
    290 }
    291 
    292 static int
    293 type_set_module(PyTypeObject *type, PyObject *value, void *context)
    294 {
    295     if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
    296         PyErr_Format(PyExc_TypeError,
    297                      "can't set %s.__module__", type->tp_name);
    298         return -1;
    299     }
    300     if (!value) {
    301         PyErr_Format(PyExc_TypeError,
    302                      "can't delete %s.__module__", type->tp_name);
    303         return -1;
    304     }
    305 
    306     PyType_Modified(type);
    307 
    308     return PyDict_SetItemString(type->tp_dict, "__module__", value);
    309 }
    310 
    311 static PyObject *
    312 type_abstractmethods(PyTypeObject *type, void *context)
    313 {
    314     PyObject *mod = NULL;
    315     /* type itself has an __abstractmethods__ descriptor (this). Don't return
    316        that. */
    317     if (type != &PyType_Type)
    318         mod = PyDict_GetItemString(type->tp_dict, "__abstractmethods__");
    319     if (!mod) {
    320         PyErr_SetString(PyExc_AttributeError, "__abstractmethods__");
    321         return NULL;
    322     }
    323     Py_XINCREF(mod);
    324     return mod;
    325 }
    326 
    327 static int
    328 type_set_abstractmethods(PyTypeObject *type, PyObject *value, void *context)
    329 {
    330     /* __abstractmethods__ should only be set once on a type, in
    331        abc.ABCMeta.__new__, so this function doesn't do anything
    332        special to update subclasses.
    333     */
    334     int abstract, res;
    335     if (value != NULL) {
    336         abstract = PyObject_IsTrue(value);
    337         if (abstract < 0)
    338             return -1;
    339         res = PyDict_SetItemString(type->tp_dict, "__abstractmethods__", value);
    340     }
    341     else {
    342         abstract = 0;
    343         res = PyDict_DelItemString(type->tp_dict, "__abstractmethods__");
    344         if (res && PyErr_ExceptionMatches(PyExc_KeyError)) {
    345             PyErr_SetString(PyExc_AttributeError, "__abstractmethods__");
    346             return -1;
    347         }
    348     }
    349     if (res == 0) {
    350         PyType_Modified(type);
    351         if (abstract)
    352             type->tp_flags |= Py_TPFLAGS_IS_ABSTRACT;
    353         else
    354             type->tp_flags &= ~Py_TPFLAGS_IS_ABSTRACT;
    355     }
    356     return res;
    357 }
    358 
    359 static PyObject *
    360 type_get_bases(PyTypeObject *type, void *context)
    361 {
    362     Py_INCREF(type->tp_bases);
    363     return type->tp_bases;
    364 }
    365 
    366 static PyTypeObject *best_base(PyObject *);
    367 static int mro_internal(PyTypeObject *);
    368 static int compatible_for_assignment(PyTypeObject *, PyTypeObject *, char *);
    369 static int add_subclass(PyTypeObject*, PyTypeObject*);
    370 static void remove_subclass(PyTypeObject *, PyTypeObject *);
    371 static void update_all_slots(PyTypeObject *);
    372 
    373 typedef int (*update_callback)(PyTypeObject *, void *);
    374 static int update_subclasses(PyTypeObject *type, PyObject *name,
    375                              update_callback callback, void *data);
    376 static int recurse_down_subclasses(PyTypeObject *type, PyObject *name,
    377                                    update_callback callback, void *data);
    378 
    379 static int
    380 mro_subclasses(PyTypeObject *type, PyObject* temp)
    381 {
    382     PyTypeObject *subclass;
    383     PyObject *ref, *subclasses, *old_mro;
    384     Py_ssize_t i, n;
    385 
    386     subclasses = type->tp_subclasses;
    387     if (subclasses == NULL)
    388         return 0;
    389     assert(PyList_Check(subclasses));
    390     n = PyList_GET_SIZE(subclasses);
    391     for (i = 0; i < n; i++) {
    392         ref = PyList_GET_ITEM(subclasses, i);
    393         assert(PyWeakref_CheckRef(ref));
    394         subclass = (PyTypeObject *)PyWeakref_GET_OBJECT(ref);
    395         assert(subclass != NULL);
    396         if ((PyObject *)subclass == Py_None)
    397             continue;
    398         assert(PyType_Check(subclass));
    399         old_mro = subclass->tp_mro;
    400         if (mro_internal(subclass) < 0) {
    401             subclass->tp_mro = old_mro;
    402             return -1;
    403         }
    404         else {
    405             PyObject* tuple;
    406             tuple = PyTuple_Pack(2, subclass, old_mro);
    407             Py_DECREF(old_mro);
    408             if (!tuple)
    409                 return -1;
    410             if (PyList_Append(temp, tuple) < 0)
    411                 return -1;
    412             Py_DECREF(tuple);
    413         }
    414         if (mro_subclasses(subclass, temp) < 0)
    415             return -1;
    416     }
    417     return 0;
    418 }
    419 
    420 static int
    421 type_set_bases(PyTypeObject *type, PyObject *value, void *context)
    422 {
    423     Py_ssize_t i;
    424     int r = 0;
    425     PyObject *ob, *temp;
    426     PyTypeObject *new_base, *old_base;
    427     PyObject *old_bases, *old_mro;
    428 
    429     if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
    430         PyErr_Format(PyExc_TypeError,
    431                      "can't set %s.__bases__", type->tp_name);
    432         return -1;
    433     }
    434     if (!value) {
    435         PyErr_Format(PyExc_TypeError,
    436                      "can't delete %s.__bases__", type->tp_name);
    437         return -1;
    438     }
    439     if (!PyTuple_Check(value)) {
    440         PyErr_Format(PyExc_TypeError,
    441              "can only assign tuple to %s.__bases__, not %s",
    442                  type->tp_name, Py_TYPE(value)->tp_name);
    443         return -1;
    444     }
    445     if (PyTuple_GET_SIZE(value) == 0) {
    446         PyErr_Format(PyExc_TypeError,
    447              "can only assign non-empty tuple to %s.__bases__, not ()",
    448                  type->tp_name);
    449         return -1;
    450     }
    451     for (i = 0; i < PyTuple_GET_SIZE(value); i++) {
    452         ob = PyTuple_GET_ITEM(value, i);
    453         if (!PyClass_Check(ob) && !PyType_Check(ob)) {
    454             PyErr_Format(
    455                 PyExc_TypeError,
    456     "%s.__bases__ must be tuple of old- or new-style classes, not '%s'",
    457                             type->tp_name, Py_TYPE(ob)->tp_name);
    458                     return -1;
    459         }
    460         if (PyType_Check(ob)) {
    461             if (PyType_IsSubtype((PyTypeObject*)ob, type)) {
    462                 PyErr_SetString(PyExc_TypeError,
    463             "a __bases__ item causes an inheritance cycle");
    464                 return -1;
    465             }
    466         }
    467     }
    468 
    469     new_base = best_base(value);
    470 
    471     if (!new_base) {
    472         return -1;
    473     }
    474 
    475     if (!compatible_for_assignment(type->tp_base, new_base, "__bases__"))
    476         return -1;
    477 
    478     Py_INCREF(new_base);
    479     Py_INCREF(value);
    480 
    481     old_bases = type->tp_bases;
    482     old_base = type->tp_base;
    483     old_mro = type->tp_mro;
    484 
    485     type->tp_bases = value;
    486     type->tp_base = new_base;
    487 
    488     if (mro_internal(type) < 0) {
    489         goto bail;
    490     }
    491 
    492     temp = PyList_New(0);
    493     if (!temp)
    494         goto bail;
    495 
    496     r = mro_subclasses(type, temp);
    497 
    498     if (r < 0) {
    499         for (i = 0; i < PyList_Size(temp); i++) {
    500             PyTypeObject* cls;
    501             PyObject* mro;
    502             PyArg_UnpackTuple(PyList_GET_ITEM(temp, i),
    503                              "", 2, 2, &cls, &mro);
    504             Py_INCREF(mro);
    505             ob = cls->tp_mro;
    506             cls->tp_mro = mro;
    507             Py_DECREF(ob);
    508         }
    509         Py_DECREF(temp);
    510         goto bail;
    511     }
    512 
    513     Py_DECREF(temp);
    514 
    515     /* any base that was in __bases__ but now isn't, we
    516        need to remove |type| from its tp_subclasses.
    517        conversely, any class now in __bases__ that wasn't
    518        needs to have |type| added to its subclasses. */
    519 
    520     /* for now, sod that: just remove from all old_bases,
    521        add to all new_bases */
    522 
    523     for (i = PyTuple_GET_SIZE(old_bases) - 1; i >= 0; i--) {
    524         ob = PyTuple_GET_ITEM(old_bases, i);
    525         if (PyType_Check(ob)) {
    526             remove_subclass(
    527                 (PyTypeObject*)ob, type);
    528         }
    529     }
    530 
    531     for (i = PyTuple_GET_SIZE(value) - 1; i >= 0; i--) {
    532         ob = PyTuple_GET_ITEM(value, i);
    533         if (PyType_Check(ob)) {
    534             if (add_subclass((PyTypeObject*)ob, type) < 0)
    535                 r = -1;
    536         }
    537     }
    538 
    539     update_all_slots(type);
    540 
    541     Py_DECREF(old_bases);
    542     Py_DECREF(old_base);
    543     Py_DECREF(old_mro);
    544 
    545     return r;
    546 
    547   bail:
    548     Py_DECREF(type->tp_bases);
    549     Py_DECREF(type->tp_base);
    550     if (type->tp_mro != old_mro) {
    551         Py_DECREF(type->tp_mro);
    552     }
    553 
    554     type->tp_bases = old_bases;
    555     type->tp_base = old_base;
    556     type->tp_mro = old_mro;
    557 
    558     return -1;
    559 }
    560 
    561 static PyObject *
    562 type_dict(PyTypeObject *type, void *context)
    563 {
    564     if (type->tp_dict == NULL) {
    565         Py_INCREF(Py_None);
    566         return Py_None;
    567     }
    568     return PyDictProxy_New(type->tp_dict);
    569 }
    570 
    571 static PyObject *
    572 type_get_doc(PyTypeObject *type, void *context)
    573 {
    574     PyObject *result;
    575     if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE) && type->tp_doc != NULL)
    576         return PyString_FromString(type->tp_doc);
    577     result = PyDict_GetItemString(type->tp_dict, "__doc__");
    578     if (result == NULL) {
    579         result = Py_None;
    580         Py_INCREF(result);
    581     }
    582     else if (Py_TYPE(result)->tp_descr_get) {
    583         result = Py_TYPE(result)->tp_descr_get(result, NULL,
    584                                                (PyObject *)type);
    585     }
    586     else {
    587         Py_INCREF(result);
    588     }
    589     return result;
    590 }
    591 
    592 static PyObject *
    593 type___instancecheck__(PyObject *type, PyObject *inst)
    594 {
    595     switch (_PyObject_RealIsInstance(inst, type)) {
    596     case -1:
    597         return NULL;
    598     case 0:
    599         Py_RETURN_FALSE;
    600     default:
    601         Py_RETURN_TRUE;
    602     }
    603 }
    604 
    605 
    606 static PyObject *
    607 type___subclasscheck__(PyObject *type, PyObject *inst)
    608 {
    609     switch (_PyObject_RealIsSubclass(inst, type)) {
    610     case -1:
    611         return NULL;
    612     case 0:
    613         Py_RETURN_FALSE;
    614     default:
    615         Py_RETURN_TRUE;
    616     }
    617 }
    618 
    619 
    620 static PyGetSetDef type_getsets[] = {
    621     {"__name__", (getter)type_name, (setter)type_set_name, NULL},
    622     {"__bases__", (getter)type_get_bases, (setter)type_set_bases, NULL},
    623     {"__module__", (getter)type_module, (setter)type_set_module, NULL},
    624     {"__abstractmethods__", (getter)type_abstractmethods,
    625      (setter)type_set_abstractmethods, NULL},
    626     {"__dict__",  (getter)type_dict,  NULL, NULL},
    627     {"__doc__", (getter)type_get_doc, NULL, NULL},
    628     {0}
    629 };
    630 
    631 
    632 static PyObject*
    633 type_richcompare(PyObject *v, PyObject *w, int op)
    634 {
    635     PyObject *result;
    636     Py_uintptr_t vv, ww;
    637     int c;
    638 
    639     /* Make sure both arguments are types. */
    640     if (!PyType_Check(v) || !PyType_Check(w) ||
    641         /* If there is a __cmp__ method defined, let it be called instead
    642            of our dumb function designed merely to warn.  See bug
    643            #7491. */
    644         Py_TYPE(v)->tp_compare || Py_TYPE(w)->tp_compare) {
    645         result = Py_NotImplemented;
    646         goto out;
    647     }
    648 
    649     /* Py3K warning if comparison isn't == or !=  */
    650     if (Py_Py3kWarningFlag && op != Py_EQ && op != Py_NE &&
    651         PyErr_WarnEx(PyExc_DeprecationWarning,
    652                    "type inequality comparisons not supported "
    653                    "in 3.x", 1) < 0) {
    654         return NULL;
    655     }
    656 
    657     /* Compare addresses */
    658     vv = (Py_uintptr_t)v;
    659     ww = (Py_uintptr_t)w;
    660     switch (op) {
    661     case Py_LT: c = vv <  ww; break;
    662     case Py_LE: c = vv <= ww; break;
    663     case Py_EQ: c = vv == ww; break;
    664     case Py_NE: c = vv != ww; break;
    665     case Py_GT: c = vv >  ww; break;
    666     case Py_GE: c = vv >= ww; break;
    667     default:
    668         result = Py_NotImplemented;
    669         goto out;
    670     }
    671     result = c ? Py_True : Py_False;
    672 
    673   /* incref and return */
    674   out:
    675     Py_INCREF(result);
    676     return result;
    677 }
    678 
    679 static PyObject *
    680 type_repr(PyTypeObject *type)
    681 {
    682     PyObject *mod, *name, *rtn;
    683     char *kind;
    684 
    685     mod = type_module(type, NULL);
    686     if (mod == NULL)
    687         PyErr_Clear();
    688     else if (!PyString_Check(mod)) {
    689         Py_DECREF(mod);
    690         mod = NULL;
    691     }
    692     name = type_name(type, NULL);
    693     if (name == NULL) {
    694         Py_XDECREF(mod);
    695         return NULL;
    696     }
    697 
    698     if (type->tp_flags & Py_TPFLAGS_HEAPTYPE)
    699         kind = "class";
    700     else
    701         kind = "type";
    702 
    703     if (mod != NULL && strcmp(PyString_AS_STRING(mod), "__builtin__")) {
    704         rtn = PyString_FromFormat("<%s '%s.%s'>",
    705                                   kind,
    706                                   PyString_AS_STRING(mod),
    707                                   PyString_AS_STRING(name));
    708     }
    709     else
    710         rtn = PyString_FromFormat("<%s '%s'>", kind, type->tp_name);
    711 
    712     Py_XDECREF(mod);
    713     Py_DECREF(name);
    714     return rtn;
    715 }
    716 
    717 static PyObject *
    718 type_call(PyTypeObject *type, PyObject *args, PyObject *kwds)
    719 {
    720     PyObject *obj;
    721 
    722     if (type->tp_new == NULL) {
    723         PyErr_Format(PyExc_TypeError,
    724                      "cannot create '%.100s' instances",
    725                      type->tp_name);
    726         return NULL;
    727     }
    728 
    729     obj = type->tp_new(type, args, kwds);
    730     if (obj != NULL) {
    731         /* Ugly exception: when the call was type(something),
    732            don't call tp_init on the result. */
    733         if (type == &PyType_Type &&
    734             PyTuple_Check(args) && PyTuple_GET_SIZE(args) == 1 &&
    735             (kwds == NULL ||
    736              (PyDict_Check(kwds) && PyDict_Size(kwds) == 0)))
    737             return obj;
    738         /* If the returned object is not an instance of type,
    739            it won't be initialized. */
    740         if (!PyType_IsSubtype(obj->ob_type, type))
    741             return obj;
    742         type = obj->ob_type;
    743         if (PyType_HasFeature(type, Py_TPFLAGS_HAVE_CLASS) &&
    744             type->tp_init != NULL &&
    745             type->tp_init(obj, args, kwds) < 0) {
    746             Py_DECREF(obj);
    747             obj = NULL;
    748         }
    749     }
    750     return obj;
    751 }
    752 
    753 PyObject *
    754 PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
    755 {
    756     PyObject *obj;
    757     const size_t size = _PyObject_VAR_SIZE(type, nitems+1);
    758     /* note that we need to add one, for the sentinel */
    759 
    760     if (PyType_IS_GC(type))
    761         obj = _PyObject_GC_Malloc(size);
    762     else
    763         obj = (PyObject *)PyObject_MALLOC(size);
    764 
    765     if (obj == NULL)
    766         return PyErr_NoMemory();
    767 
    768     memset(obj, '\0', size);
    769 
    770     if (type->tp_flags & Py_TPFLAGS_HEAPTYPE)
    771         Py_INCREF(type);
    772 
    773     if (type->tp_itemsize == 0)
    774         PyObject_INIT(obj, type);
    775     else
    776         (void) PyObject_INIT_VAR((PyVarObject *)obj, type, nitems);
    777 
    778     if (PyType_IS_GC(type))
    779         _PyObject_GC_TRACK(obj);
    780     return obj;
    781 }
    782 
    783 PyObject *
    784 PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
    785 {
    786     return type->tp_alloc(type, 0);
    787 }
    788 
    789 /* Helpers for subtyping */
    790 
    791 static int
    792 traverse_slots(PyTypeObject *type, PyObject *self, visitproc visit, void *arg)
    793 {
    794     Py_ssize_t i, n;
    795     PyMemberDef *mp;
    796 
    797     n = Py_SIZE(type);
    798     mp = PyHeapType_GET_MEMBERS((PyHeapTypeObject *)type);
    799     for (i = 0; i < n; i++, mp++) {
    800         if (mp->type == T_OBJECT_EX) {
    801             char *addr = (char *)self + mp->offset;
    802             PyObject *obj = *(PyObject **)addr;
    803             if (obj != NULL) {
    804                 int err = visit(obj, arg);
    805                 if (err)
    806                     return err;
    807             }
    808         }
    809     }
    810     return 0;
    811 }
    812 
    813 static int
    814 subtype_traverse(PyObject *self, visitproc visit, void *arg)
    815 {
    816     PyTypeObject *type, *base;
    817     traverseproc basetraverse;
    818 
    819     /* Find the nearest base with a different tp_traverse,
    820        and traverse slots while we're at it */
    821     type = Py_TYPE(self);
    822     base = type;
    823     while ((basetraverse = base->tp_traverse) == subtype_traverse) {
    824         if (Py_SIZE(base)) {
    825             int err = traverse_slots(base, self, visit, arg);
    826             if (err)
    827                 return err;
    828         }
    829         base = base->tp_base;
    830         assert(base);
    831     }
    832 
    833     if (type->tp_dictoffset != base->tp_dictoffset) {
    834         PyObject **dictptr = _PyObject_GetDictPtr(self);
    835         if (dictptr && *dictptr)
    836             Py_VISIT(*dictptr);
    837     }
    838 
    839     if (type->tp_flags & Py_TPFLAGS_HEAPTYPE)
    840         /* For a heaptype, the instances count as references
    841            to the type.          Traverse the type so the collector
    842            can find cycles involving this link. */
    843         Py_VISIT(type);
    844 
    845     if (basetraverse)
    846         return basetraverse(self, visit, arg);
    847     return 0;
    848 }
    849 
    850 static void
    851 clear_slots(PyTypeObject *type, PyObject *self)
    852 {
    853     Py_ssize_t i, n;
    854     PyMemberDef *mp;
    855 
    856     n = Py_SIZE(type);
    857     mp = PyHeapType_GET_MEMBERS((PyHeapTypeObject *)type);
    858     for (i = 0; i < n; i++, mp++) {
    859         if (mp->type == T_OBJECT_EX && !(mp->flags & READONLY)) {
    860             char *addr = (char *)self + mp->offset;
    861             PyObject *obj = *(PyObject **)addr;
    862             if (obj != NULL) {
    863                 *(PyObject **)addr = NULL;
    864                 Py_DECREF(obj);
    865             }
    866         }
    867     }
    868 }
    869 
    870 static int
    871 subtype_clear(PyObject *self)
    872 {
    873     PyTypeObject *type, *base;
    874     inquiry baseclear;
    875 
    876     /* Find the nearest base with a different tp_clear
    877        and clear slots while we're at it */
    878     type = Py_TYPE(self);
    879     base = type;
    880     while ((baseclear = base->tp_clear) == subtype_clear) {
    881         if (Py_SIZE(base))
    882             clear_slots(base, self);
    883         base = base->tp_base;
    884         assert(base);
    885     }
    886 
    887     /* Clear the instance dict (if any), to break cycles involving only
    888        __dict__ slots (as in the case 'self.__dict__ is self'). */
    889     if (type->tp_dictoffset != base->tp_dictoffset) {
    890         PyObject **dictptr = _PyObject_GetDictPtr(self);
    891         if (dictptr && *dictptr)
    892             Py_CLEAR(*dictptr);
    893     }
    894 
    895     if (baseclear)
    896         return baseclear(self);
    897     return 0;
    898 }
    899 
    900 static void
    901 subtype_dealloc(PyObject *self)
    902 {
    903     PyTypeObject *type, *base;
    904     destructor basedealloc;
    905     PyThreadState *tstate = PyThreadState_GET();
    906 
    907     /* Extract the type; we expect it to be a heap type */
    908     type = Py_TYPE(self);
    909     assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
    910 
    911     /* Test whether the type has GC exactly once */
    912 
    913     if (!PyType_IS_GC(type)) {
    914         /* It's really rare to find a dynamic type that doesn't have
    915            GC; it can only happen when deriving from 'object' and not
    916            adding any slots or instance variables.  This allows
    917            certain simplifications: there's no need to call
    918            clear_slots(), or DECREF the dict, or clear weakrefs. */
    919 
    920         /* Maybe call finalizer; exit early if resurrected */
    921         if (type->tp_del) {
    922             type->tp_del(self);
    923             if (self->ob_refcnt > 0)
    924                 return;
    925         }
    926 
    927         /* Find the nearest base with a different tp_dealloc */
    928         base = type;
    929         while ((basedealloc = base->tp_dealloc) == subtype_dealloc) {
    930             assert(Py_SIZE(base) == 0);
    931             base = base->tp_base;
    932             assert(base);
    933         }
    934 
    935         /* Extract the type again; tp_del may have changed it */
    936         type = Py_TYPE(self);
    937 
    938         /* Call the base tp_dealloc() */
    939         assert(basedealloc);
    940         basedealloc(self);
    941 
    942         /* Can't reference self beyond this point */
    943         Py_DECREF(type);
    944 
    945         /* Done */
    946         return;
    947     }
    948 
    949     /* We get here only if the type has GC */
    950 
    951     /* UnTrack and re-Track around the trashcan macro, alas */
    952     /* See explanation at end of function for full disclosure */
    953     PyObject_GC_UnTrack(self);
    954     ++_PyTrash_delete_nesting;
    955     ++ tstate->trash_delete_nesting;
    956     Py_TRASHCAN_SAFE_BEGIN(self);
    957     --_PyTrash_delete_nesting;
    958     -- tstate->trash_delete_nesting;
    959     /* DO NOT restore GC tracking at this point.  weakref callbacks
    960      * (if any, and whether directly here or indirectly in something we
    961      * call) may trigger GC, and if self is tracked at that point, it
    962      * will look like trash to GC and GC will try to delete self again.
    963      */
    964 
    965     /* Find the nearest base with a different tp_dealloc */
    966     base = type;
    967     while ((basedealloc = base->tp_dealloc) == subtype_dealloc) {
    968         base = base->tp_base;
    969         assert(base);
    970     }
    971 
    972     /* If we added a weaklist, we clear it.      Do this *before* calling
    973        the finalizer (__del__), clearing slots, or clearing the instance
    974        dict. */
    975 
    976     if (type->tp_weaklistoffset && !base->tp_weaklistoffset)
    977         PyObject_ClearWeakRefs(self);
    978 
    979     /* Maybe call finalizer; exit early if resurrected */
    980     if (type->tp_del) {
    981         _PyObject_GC_TRACK(self);
    982         type->tp_del(self);
    983         if (self->ob_refcnt > 0)
    984             goto endlabel;              /* resurrected */
    985         else
    986             _PyObject_GC_UNTRACK(self);
    987         /* New weakrefs could be created during the finalizer call.
    988             If this occurs, clear them out without calling their
    989             finalizers since they might rely on part of the object
    990             being finalized that has already been destroyed. */
    991         if (type->tp_weaklistoffset && !base->tp_weaklistoffset) {
    992             /* Modeled after GET_WEAKREFS_LISTPTR() */
    993             PyWeakReference **list = (PyWeakReference **) \
    994                 PyObject_GET_WEAKREFS_LISTPTR(self);
    995             while (*list)
    996                 _PyWeakref_ClearRef(*list);
    997         }
    998     }
    999 
   1000     /*  Clear slots up to the nearest base with a different tp_dealloc */
   1001     base = type;
   1002     while (base->tp_dealloc == subtype_dealloc) {
   1003         if (Py_SIZE(base))
   1004             clear_slots(base, self);
   1005         base = base->tp_base;
   1006         assert(base);
   1007     }
   1008 
   1009     /* If we added a dict, DECREF it */
   1010     if (type->tp_dictoffset && !base->tp_dictoffset) {
   1011         PyObject **dictptr = _PyObject_GetDictPtr(self);
   1012         if (dictptr != NULL) {
   1013             PyObject *dict = *dictptr;
   1014             if (dict != NULL) {
   1015                 Py_DECREF(dict);
   1016                 *dictptr = NULL;
   1017             }
   1018         }
   1019     }
   1020 
   1021     /* Extract the type again; tp_del may have changed it */
   1022     type = Py_TYPE(self);
   1023 
   1024     /* Call the base tp_dealloc(); first retrack self if
   1025      * basedealloc knows about gc.
   1026      */
   1027     if (PyType_IS_GC(base))
   1028         _PyObject_GC_TRACK(self);
   1029     assert(basedealloc);
   1030     basedealloc(self);
   1031 
   1032     /* Can't reference self beyond this point */
   1033     Py_DECREF(type);
   1034 
   1035   endlabel:
   1036     ++_PyTrash_delete_nesting;
   1037     ++ tstate->trash_delete_nesting;
   1038     Py_TRASHCAN_SAFE_END(self);
   1039     --_PyTrash_delete_nesting;
   1040     -- tstate->trash_delete_nesting;
   1041 
   1042     /* Explanation of the weirdness around the trashcan macros:
   1043 
   1044        Q. What do the trashcan macros do?
   1045 
   1046        A. Read the comment titled "Trashcan mechanism" in object.h.
   1047           For one, this explains why there must be a call to GC-untrack
   1048           before the trashcan begin macro.      Without understanding the
   1049           trashcan code, the answers to the following questions don't make
   1050           sense.
   1051 
   1052        Q. Why do we GC-untrack before the trashcan and then immediately
   1053           GC-track again afterward?
   1054 
   1055        A. In the case that the base class is GC-aware, the base class
   1056           probably GC-untracks the object.      If it does that using the
   1057           UNTRACK macro, this will crash when the object is already
   1058           untracked.  Because we don't know what the base class does, the
   1059           only safe thing is to make sure the object is tracked when we
   1060           call the base class dealloc.  But...  The trashcan begin macro
   1061           requires that the object is *untracked* before it is called.  So
   1062           the dance becomes:
   1063 
   1064          GC untrack
   1065          trashcan begin
   1066          GC track
   1067 
   1068        Q. Why did the last question say "immediately GC-track again"?
   1069           It's nowhere near immediately.
   1070 
   1071        A. Because the code *used* to re-track immediately.      Bad Idea.
   1072           self has a refcount of 0, and if gc ever gets its hands on it
   1073           (which can happen if any weakref callback gets invoked), it
   1074           looks like trash to gc too, and gc also tries to delete self
   1075           then.  But we're already deleting self.  Double deallocation is
   1076           a subtle disaster.
   1077 
   1078        Q. Why the bizarre (net-zero) manipulation of
   1079           _PyTrash_delete_nesting around the trashcan macros?
   1080 
   1081        A. Some base classes (e.g. list) also use the trashcan mechanism.
   1082           The following scenario used to be possible:
   1083 
   1084           - suppose the trashcan level is one below the trashcan limit
   1085 
   1086           - subtype_dealloc() is called
   1087 
   1088           - the trashcan limit is not yet reached, so the trashcan level
   1089         is incremented and the code between trashcan begin and end is
   1090         executed
   1091 
   1092           - this destroys much of the object's contents, including its
   1093         slots and __dict__
   1094 
   1095           - basedealloc() is called; this is really list_dealloc(), or
   1096         some other type which also uses the trashcan macros
   1097 
   1098           - the trashcan limit is now reached, so the object is put on the
   1099         trashcan's to-be-deleted-later list
   1100 
   1101           - basedealloc() returns
   1102 
   1103           - subtype_dealloc() decrefs the object's type
   1104 
   1105           - subtype_dealloc() returns
   1106 
   1107           - later, the trashcan code starts deleting the objects from its
   1108         to-be-deleted-later list
   1109 
   1110           - subtype_dealloc() is called *AGAIN* for the same object
   1111 
   1112           - at the very least (if the destroyed slots and __dict__ don't
   1113         cause problems) the object's type gets decref'ed a second
   1114         time, which is *BAD*!!!
   1115 
   1116           The remedy is to make sure that if the code between trashcan
   1117           begin and end in subtype_dealloc() is called, the code between
   1118           trashcan begin and end in basedealloc() will also be called.
   1119           This is done by decrementing the level after passing into the
   1120           trashcan block, and incrementing it just before leaving the
   1121           block.
   1122 
   1123           But now it's possible that a chain of objects consisting solely
   1124           of objects whose deallocator is subtype_dealloc() will defeat
   1125           the trashcan mechanism completely: the decremented level means
   1126           that the effective level never reaches the limit.      Therefore, we
   1127           *increment* the level *before* entering the trashcan block, and
   1128           matchingly decrement it after leaving.  This means the trashcan
   1129           code will trigger a little early, but that's no big deal.
   1130 
   1131        Q. Are there any live examples of code in need of all this
   1132           complexity?
   1133 
   1134        A. Yes.  See SF bug 668433 for code that crashed (when Python was
   1135           compiled in debug mode) before the trashcan level manipulations
   1136           were added.  For more discussion, see SF patches 581742, 575073
   1137           and bug 574207.
   1138     */
   1139 }
   1140 
   1141 static PyTypeObject *solid_base(PyTypeObject *type);
   1142 
   1143 /* type test with subclassing support */
   1144 
   1145 int
   1146 PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
   1147 {
   1148     PyObject *mro;
   1149 
   1150     if (!(a->tp_flags & Py_TPFLAGS_HAVE_CLASS))
   1151         return b == a || b == &PyBaseObject_Type;
   1152 
   1153     mro = a->tp_mro;
   1154     if (mro != NULL) {
   1155         /* Deal with multiple inheritance without recursion
   1156            by walking the MRO tuple */
   1157         Py_ssize_t i, n;
   1158         assert(PyTuple_Check(mro));
   1159         n = PyTuple_GET_SIZE(mro);
   1160         for (i = 0; i < n; i++) {
   1161             if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b)
   1162                 return 1;
   1163         }
   1164         return 0;
   1165     }
   1166     else {
   1167         /* a is not completely initilized yet; follow tp_base */
   1168         do {
   1169             if (a == b)
   1170                 return 1;
   1171             a = a->tp_base;
   1172         } while (a != NULL);
   1173         return b == &PyBaseObject_Type;
   1174     }
   1175 }
   1176 
   1177 /* Internal routines to do a method lookup in the type
   1178    without looking in the instance dictionary
   1179    (so we can't use PyObject_GetAttr) but still binding
   1180    it to the instance.  The arguments are the object,
   1181    the method name as a C string, and the address of a
   1182    static variable used to cache the interned Python string.
   1183 
   1184    Two variants:
   1185 
   1186    - lookup_maybe() returns NULL without raising an exception
   1187      when the _PyType_Lookup() call fails;
   1188 
   1189    - lookup_method() always raises an exception upon errors.
   1190 
   1191    - _PyObject_LookupSpecial() exported for the benefit of other places.
   1192 */
   1193 
   1194 static PyObject *
   1195 lookup_maybe(PyObject *self, char *attrstr, PyObject **attrobj)
   1196 {
   1197     PyObject *res;
   1198 
   1199     if (*attrobj == NULL) {
   1200         *attrobj = PyString_InternFromString(attrstr);
   1201         if (*attrobj == NULL)
   1202             return NULL;
   1203     }
   1204     res = _PyType_Lookup(Py_TYPE(self), *attrobj);
   1205     if (res != NULL) {
   1206         descrgetfunc f;
   1207         if ((f = Py_TYPE(res)->tp_descr_get) == NULL)
   1208             Py_INCREF(res);
   1209         else
   1210             res = f(res, self, (PyObject *)(Py_TYPE(self)));
   1211     }
   1212     return res;
   1213 }
   1214 
   1215 static PyObject *
   1216 lookup_method(PyObject *self, char *attrstr, PyObject **attrobj)
   1217 {
   1218     PyObject *res = lookup_maybe(self, attrstr, attrobj);
   1219     if (res == NULL && !PyErr_Occurred())
   1220         PyErr_SetObject(PyExc_AttributeError, *attrobj);
   1221     return res;
   1222 }
   1223 
   1224 PyObject *
   1225 _PyObject_LookupSpecial(PyObject *self, char *attrstr, PyObject **attrobj)
   1226 {
   1227     assert(!PyInstance_Check(self));
   1228     return lookup_maybe(self, attrstr, attrobj);
   1229 }
   1230 
   1231 /* A variation of PyObject_CallMethod that uses lookup_method()
   1232    instead of PyObject_GetAttrString().  This uses the same convention
   1233    as lookup_method to cache the interned name string object. */
   1234 
   1235 static PyObject *
   1236 call_method(PyObject *o, char *name, PyObject **nameobj, char *format, ...)
   1237 {
   1238     va_list va;
   1239     PyObject *args, *func = 0, *retval;
   1240     va_start(va, format);
   1241 
   1242     func = lookup_maybe(o, name, nameobj);
   1243     if (func == NULL) {
   1244         va_end(va);
   1245         if (!PyErr_Occurred())
   1246             PyErr_SetObject(PyExc_AttributeError, *nameobj);
   1247         return NULL;
   1248     }
   1249 
   1250     if (format && *format)
   1251         args = Py_VaBuildValue(format, va);
   1252     else
   1253         args = PyTuple_New(0);
   1254 
   1255     va_end(va);
   1256 
   1257     if (args == NULL)
   1258         return NULL;
   1259 
   1260     assert(PyTuple_Check(args));
   1261     retval = PyObject_Call(func, args, NULL);
   1262 
   1263     Py_DECREF(args);
   1264     Py_DECREF(func);
   1265 
   1266     return retval;
   1267 }
   1268 
   1269 /* Clone of call_method() that returns NotImplemented when the lookup fails. */
   1270 
   1271 static PyObject *
   1272 call_maybe(PyObject *o, char *name, PyObject **nameobj, char *format, ...)
   1273 {
   1274     va_list va;
   1275     PyObject *args, *func = 0, *retval;
   1276     va_start(va, format);
   1277 
   1278     func = lookup_maybe(o, name, nameobj);
   1279     if (func == NULL) {
   1280         va_end(va);
   1281         if (!PyErr_Occurred()) {
   1282             Py_INCREF(Py_NotImplemented);
   1283             return Py_NotImplemented;
   1284         }
   1285         return NULL;
   1286     }
   1287 
   1288     if (format && *format)
   1289         args = Py_VaBuildValue(format, va);
   1290     else
   1291         args = PyTuple_New(0);
   1292 
   1293     va_end(va);
   1294 
   1295     if (args == NULL)
   1296         return NULL;
   1297 
   1298     assert(PyTuple_Check(args));
   1299     retval = PyObject_Call(func, args, NULL);
   1300 
   1301     Py_DECREF(args);
   1302     Py_DECREF(func);
   1303 
   1304     return retval;
   1305 }
   1306 
   1307 static int
   1308 fill_classic_mro(PyObject *mro, PyObject *cls)
   1309 {
   1310     PyObject *bases, *base;
   1311     Py_ssize_t i, n;
   1312 
   1313     assert(PyList_Check(mro));
   1314     assert(PyClass_Check(cls));
   1315     i = PySequence_Contains(mro, cls);
   1316     if (i < 0)
   1317         return -1;
   1318     if (!i) {
   1319         if (PyList_Append(mro, cls) < 0)
   1320             return -1;
   1321     }
   1322     bases = ((PyClassObject *)cls)->cl_bases;
   1323     assert(bases && PyTuple_Check(bases));
   1324     n = PyTuple_GET_SIZE(bases);
   1325     for (i = 0; i < n; i++) {
   1326         base = PyTuple_GET_ITEM(bases, i);
   1327         if (fill_classic_mro(mro, base) < 0)
   1328             return -1;
   1329     }
   1330     return 0;
   1331 }
   1332 
   1333 static PyObject *
   1334 classic_mro(PyObject *cls)
   1335 {
   1336     PyObject *mro;
   1337 
   1338     assert(PyClass_Check(cls));
   1339     mro = PyList_New(0);
   1340     if (mro != NULL) {
   1341         if (fill_classic_mro(mro, cls) == 0)
   1342             return mro;
   1343         Py_DECREF(mro);
   1344     }
   1345     return NULL;
   1346 }
   1347 
   1348 /*
   1349     Method resolution order algorithm C3 described in
   1350     "A Monotonic Superclass Linearization for Dylan",
   1351     by Kim Barrett, Bob Cassel, Paul Haahr,
   1352     David A. Moon, Keith Playford, and P. Tucker Withington.
   1353     (OOPSLA 1996)
   1354 
   1355     Some notes about the rules implied by C3:
   1356 
   1357     No duplicate bases.
   1358     It isn't legal to repeat a class in a list of base classes.
   1359 
   1360     The next three properties are the 3 constraints in "C3".
   1361 
   1362     Local precendece order.
   1363     If A precedes B in C's MRO, then A will precede B in the MRO of all
   1364     subclasses of C.
   1365 
   1366     Monotonicity.
   1367     The MRO of a class must be an extension without reordering of the
   1368     MRO of each of its superclasses.
   1369 
   1370     Extended Precedence Graph (EPG).
   1371     Linearization is consistent if there is a path in the EPG from
   1372     each class to all its successors in the linearization.  See
   1373     the paper for definition of EPG.
   1374  */
   1375 
   1376 static int
   1377 tail_contains(PyObject *list, int whence, PyObject *o) {
   1378     Py_ssize_t j, size;
   1379     size = PyList_GET_SIZE(list);
   1380 
   1381     for (j = whence+1; j < size; j++) {
   1382         if (PyList_GET_ITEM(list, j) == o)
   1383             return 1;
   1384     }
   1385     return 0;
   1386 }
   1387 
   1388 static PyObject *
   1389 class_name(PyObject *cls)
   1390 {
   1391     PyObject *name = PyObject_GetAttrString(cls, "__name__");
   1392     if (name == NULL) {
   1393         PyErr_Clear();
   1394         Py_XDECREF(name);
   1395         name = PyObject_Repr(cls);
   1396     }
   1397     if (name == NULL)
   1398         return NULL;
   1399     if (!PyString_Check(name)) {
   1400         Py_DECREF(name);
   1401         return NULL;
   1402     }
   1403     return name;
   1404 }
   1405 
   1406 static int
   1407 check_duplicates(PyObject *list)
   1408 {
   1409     Py_ssize_t i, j, n;
   1410     /* Let's use a quadratic time algorithm,
   1411        assuming that the bases lists is short.
   1412     */
   1413     n = PyList_GET_SIZE(list);
   1414     for (i = 0; i < n; i++) {
   1415         PyObject *o = PyList_GET_ITEM(list, i);
   1416         for (j = i + 1; j < n; j++) {
   1417             if (PyList_GET_ITEM(list, j) == o) {
   1418                 o = class_name(o);
   1419                 PyErr_Format(PyExc_TypeError,
   1420                              "duplicate base class %s",
   1421                              o ? PyString_AS_STRING(o) : "?");
   1422                 Py_XDECREF(o);
   1423                 return -1;
   1424             }
   1425         }
   1426     }
   1427     return 0;
   1428 }
   1429 
   1430 /* Raise a TypeError for an MRO order disagreement.
   1431 
   1432    It's hard to produce a good error message.  In the absence of better
   1433    insight into error reporting, report the classes that were candidates
   1434    to be put next into the MRO.  There is some conflict between the
   1435    order in which they should be put in the MRO, but it's hard to
   1436    diagnose what constraint can't be satisfied.
   1437 */
   1438 
   1439 static void
   1440 set_mro_error(PyObject *to_merge, int *remain)
   1441 {
   1442     Py_ssize_t i, n, off, to_merge_size;
   1443     char buf[1000];
   1444     PyObject *k, *v;
   1445     PyObject *set = PyDict_New();
   1446     if (!set) return;
   1447 
   1448     to_merge_size = PyList_GET_SIZE(to_merge);
   1449     for (i = 0; i < to_merge_size; i++) {
   1450         PyObject *L = PyList_GET_ITEM(to_merge, i);
   1451         if (remain[i] < PyList_GET_SIZE(L)) {
   1452             PyObject *c = PyList_GET_ITEM(L, remain[i]);
   1453             if (PyDict_SetItem(set, c, Py_None) < 0) {
   1454                 Py_DECREF(set);
   1455                 return;
   1456             }
   1457         }
   1458     }
   1459     n = PyDict_Size(set);
   1460 
   1461     off = PyOS_snprintf(buf, sizeof(buf), "Cannot create a \
   1462 consistent method resolution\norder (MRO) for bases");
   1463     i = 0;
   1464     while (PyDict_Next(set, &i, &k, &v) && (size_t)off < sizeof(buf)) {
   1465         PyObject *name = class_name(k);
   1466         off += PyOS_snprintf(buf + off, sizeof(buf) - off, " %s",
   1467                              name ? PyString_AS_STRING(name) : "?");
   1468         Py_XDECREF(name);
   1469         if (--n && (size_t)(off+1) < sizeof(buf)) {
   1470             buf[off++] = ',';
   1471             buf[off] = '\0';
   1472         }
   1473     }
   1474     PyErr_SetString(PyExc_TypeError, buf);
   1475     Py_DECREF(set);
   1476 }
   1477 
   1478 static int
   1479 pmerge(PyObject *acc, PyObject* to_merge) {
   1480     Py_ssize_t i, j, to_merge_size, empty_cnt;
   1481     int *remain;
   1482     int ok;
   1483 
   1484     to_merge_size = PyList_GET_SIZE(to_merge);
   1485 
   1486     /* remain stores an index into each sublist of to_merge.
   1487        remain[i] is the index of the next base in to_merge[i]
   1488        that is not included in acc.
   1489     */
   1490     remain = (int *)PyMem_MALLOC(SIZEOF_INT*to_merge_size);
   1491     if (remain == NULL)
   1492         return -1;
   1493     for (i = 0; i < to_merge_size; i++)
   1494         remain[i] = 0;
   1495 
   1496   again:
   1497     empty_cnt = 0;
   1498     for (i = 0; i < to_merge_size; i++) {
   1499         PyObject *candidate;
   1500 
   1501         PyObject *cur_list = PyList_GET_ITEM(to_merge, i);
   1502 
   1503         if (remain[i] >= PyList_GET_SIZE(cur_list)) {
   1504             empty_cnt++;
   1505             continue;
   1506         }
   1507 
   1508         /* Choose next candidate for MRO.
   1509 
   1510            The input sequences alone can determine the choice.
   1511            If not, choose the class which appears in the MRO
   1512            of the earliest direct superclass of the new class.
   1513         */
   1514 
   1515         candidate = PyList_GET_ITEM(cur_list, remain[i]);
   1516         for (j = 0; j < to_merge_size; j++) {
   1517             PyObject *j_lst = PyList_GET_ITEM(to_merge, j);
   1518             if (tail_contains(j_lst, remain[j], candidate)) {
   1519                 goto skip; /* continue outer loop */
   1520             }
   1521         }
   1522         ok = PyList_Append(acc, candidate);
   1523         if (ok < 0) {
   1524             PyMem_Free(remain);
   1525             return -1;
   1526         }
   1527         for (j = 0; j < to_merge_size; j++) {
   1528             PyObject *j_lst = PyList_GET_ITEM(to_merge, j);
   1529             if (remain[j] < PyList_GET_SIZE(j_lst) &&
   1530                 PyList_GET_ITEM(j_lst, remain[j]) == candidate) {
   1531                 remain[j]++;
   1532             }
   1533         }
   1534         goto again;
   1535       skip: ;
   1536     }
   1537 
   1538     if (empty_cnt == to_merge_size) {
   1539         PyMem_FREE(remain);
   1540         return 0;
   1541     }
   1542     set_mro_error(to_merge, remain);
   1543     PyMem_FREE(remain);
   1544     return -1;
   1545 }
   1546 
   1547 static PyObject *
   1548 mro_implementation(PyTypeObject *type)
   1549 {
   1550     Py_ssize_t i, n;
   1551     int ok;
   1552     PyObject *bases, *result;
   1553     PyObject *to_merge, *bases_aslist;
   1554 
   1555     if (type->tp_dict == NULL) {
   1556         if (PyType_Ready(type) < 0)
   1557             return NULL;
   1558     }
   1559 
   1560     /* Find a superclass linearization that honors the constraints
   1561        of the explicit lists of bases and the constraints implied by
   1562        each base class.
   1563 
   1564        to_merge is a list of lists, where each list is a superclass
   1565        linearization implied by a base class.  The last element of
   1566        to_merge is the declared list of bases.
   1567     */
   1568 
   1569     bases = type->tp_bases;
   1570     n = PyTuple_GET_SIZE(bases);
   1571 
   1572     to_merge = PyList_New(n+1);
   1573     if (to_merge == NULL)
   1574         return NULL;
   1575 
   1576     for (i = 0; i < n; i++) {
   1577         PyObject *base = PyTuple_GET_ITEM(bases, i);
   1578         PyObject *parentMRO;
   1579         if (PyType_Check(base))
   1580             parentMRO = PySequence_List(
   1581                 ((PyTypeObject*)base)->tp_mro);
   1582         else
   1583             parentMRO = classic_mro(base);
   1584         if (parentMRO == NULL) {
   1585             Py_DECREF(to_merge);
   1586             return NULL;
   1587         }
   1588 
   1589         PyList_SET_ITEM(to_merge, i, parentMRO);
   1590     }
   1591 
   1592     bases_aslist = PySequence_List(bases);
   1593     if (bases_aslist == NULL) {
   1594         Py_DECREF(to_merge);
   1595         return NULL;
   1596     }
   1597     /* This is just a basic sanity check. */
   1598     if (check_duplicates(bases_aslist) < 0) {
   1599         Py_DECREF(to_merge);
   1600         Py_DECREF(bases_aslist);
   1601         return NULL;
   1602     }
   1603     PyList_SET_ITEM(to_merge, n, bases_aslist);
   1604 
   1605     result = Py_BuildValue("[O]", (PyObject *)type);
   1606     if (result == NULL) {
   1607         Py_DECREF(to_merge);
   1608         return NULL;
   1609     }
   1610 
   1611     ok = pmerge(result, to_merge);
   1612     Py_DECREF(to_merge);
   1613     if (ok < 0) {
   1614         Py_DECREF(result);
   1615         return NULL;
   1616     }
   1617 
   1618     return result;
   1619 }
   1620 
   1621 static PyObject *
   1622 mro_external(PyObject *self)
   1623 {
   1624     PyTypeObject *type = (PyTypeObject *)self;
   1625 
   1626     return mro_implementation(type);
   1627 }
   1628 
   1629 static int
   1630 mro_internal(PyTypeObject *type)
   1631 {
   1632     PyObject *mro, *result, *tuple;
   1633     int checkit = 0;
   1634 
   1635     if (Py_TYPE(type) == &PyType_Type) {
   1636         result = mro_implementation(type);
   1637     }
   1638     else {
   1639         static PyObject *mro_str;
   1640         checkit = 1;
   1641         mro = lookup_method((PyObject *)type, "mro", &mro_str);
   1642         if (mro == NULL)
   1643             return -1;
   1644         result = PyObject_CallObject(mro, NULL);
   1645         Py_DECREF(mro);
   1646     }
   1647     if (result == NULL)
   1648         return -1;
   1649     tuple = PySequence_Tuple(result);
   1650     Py_DECREF(result);
   1651     if (tuple == NULL)
   1652         return -1;
   1653     if (checkit) {
   1654         Py_ssize_t i, len;
   1655         PyObject *cls;
   1656         PyTypeObject *solid;
   1657 
   1658         solid = solid_base(type);
   1659 
   1660         len = PyTuple_GET_SIZE(tuple);
   1661 
   1662         for (i = 0; i < len; i++) {
   1663             PyTypeObject *t;
   1664             cls = PyTuple_GET_ITEM(tuple, i);
   1665             if (PyClass_Check(cls))
   1666                 continue;
   1667             else if (!PyType_Check(cls)) {
   1668                 PyErr_Format(PyExc_TypeError,
   1669                  "mro() returned a non-class ('%.500s')",
   1670                                  Py_TYPE(cls)->tp_name);
   1671                 Py_DECREF(tuple);
   1672                 return -1;
   1673             }
   1674             t = (PyTypeObject*)cls;
   1675             if (!PyType_IsSubtype(solid, solid_base(t))) {
   1676                 PyErr_Format(PyExc_TypeError,
   1677              "mro() returned base with unsuitable layout ('%.500s')",
   1678                                      t->tp_name);
   1679                         Py_DECREF(tuple);
   1680                         return -1;
   1681             }
   1682         }
   1683     }
   1684     type->tp_mro = tuple;
   1685 
   1686     type_mro_modified(type, type->tp_mro);
   1687     /* corner case: the old-style super class might have been hidden
   1688        from the custom MRO */
   1689     type_mro_modified(type, type->tp_bases);
   1690 
   1691     PyType_Modified(type);
   1692 
   1693     return 0;
   1694 }
   1695 
   1696 
   1697 /* Calculate the best base amongst multiple base classes.
   1698    This is the first one that's on the path to the "solid base". */
   1699 
   1700 static PyTypeObject *
   1701 best_base(PyObject *bases)
   1702 {
   1703     Py_ssize_t i, n;
   1704     PyTypeObject *base, *winner, *candidate, *base_i;
   1705     PyObject *base_proto;
   1706 
   1707     assert(PyTuple_Check(bases));
   1708     n = PyTuple_GET_SIZE(bases);
   1709     assert(n > 0);
   1710     base = NULL;
   1711     winner = NULL;
   1712     for (i = 0; i < n; i++) {
   1713         base_proto = PyTuple_GET_ITEM(bases, i);
   1714         if (PyClass_Check(base_proto))
   1715             continue;
   1716         if (!PyType_Check(base_proto)) {
   1717             PyErr_SetString(
   1718                 PyExc_TypeError,
   1719                 "bases must be types");
   1720             return NULL;
   1721         }
   1722         base_i = (PyTypeObject *)base_proto;
   1723         if (base_i->tp_dict == NULL) {
   1724             if (PyType_Ready(base_i) < 0)
   1725                 return NULL;
   1726         }
   1727         candidate = solid_base(base_i);
   1728         if (winner == NULL) {
   1729             winner = candidate;
   1730             base = base_i;
   1731         }
   1732         else if (PyType_IsSubtype(winner, candidate))
   1733             ;
   1734         else if (PyType_IsSubtype(candidate, winner)) {
   1735             winner = candidate;
   1736             base = base_i;
   1737         }
   1738         else {
   1739             PyErr_SetString(
   1740                 PyExc_TypeError,
   1741                 "multiple bases have "
   1742                 "instance lay-out conflict");
   1743             return NULL;
   1744         }
   1745     }
   1746     if (base == NULL)
   1747         PyErr_SetString(PyExc_TypeError,
   1748             "a new-style class can't have only classic bases");
   1749     return base;
   1750 }
   1751 
   1752 static int
   1753 extra_ivars(PyTypeObject *type, PyTypeObject *base)
   1754 {
   1755     size_t t_size = type->tp_basicsize;
   1756     size_t b_size = base->tp_basicsize;
   1757 
   1758     assert(t_size >= b_size); /* Else type smaller than base! */
   1759     if (type->tp_itemsize || base->tp_itemsize) {
   1760         /* If itemsize is involved, stricter rules */
   1761         return t_size != b_size ||
   1762             type->tp_itemsize != base->tp_itemsize;
   1763     }
   1764     if (type->tp_weaklistoffset && base->tp_weaklistoffset == 0 &&
   1765         type->tp_weaklistoffset + sizeof(PyObject *) == t_size &&
   1766         type->tp_flags & Py_TPFLAGS_HEAPTYPE)
   1767         t_size -= sizeof(PyObject *);
   1768     if (type->tp_dictoffset && base->tp_dictoffset == 0 &&
   1769         type->tp_dictoffset + sizeof(PyObject *) == t_size &&
   1770         type->tp_flags & Py_TPFLAGS_HEAPTYPE)
   1771         t_size -= sizeof(PyObject *);
   1772 
   1773     return t_size != b_size;
   1774 }
   1775 
   1776 static PyTypeObject *
   1777 solid_base(PyTypeObject *type)
   1778 {
   1779     PyTypeObject *base;
   1780 
   1781     if (type->tp_base)
   1782         base = solid_base(type->tp_base);
   1783     else
   1784         base = &PyBaseObject_Type;
   1785     if (extra_ivars(type, base))
   1786         return type;
   1787     else
   1788         return base;
   1789 }
   1790 
   1791 static void object_dealloc(PyObject *);
   1792 static int object_init(PyObject *, PyObject *, PyObject *);
   1793 static int update_slot(PyTypeObject *, PyObject *);
   1794 static void fixup_slot_dispatchers(PyTypeObject *);
   1795 
   1796 /*
   1797  * Helpers for  __dict__ descriptor.  We don't want to expose the dicts
   1798  * inherited from various builtin types.  The builtin base usually provides
   1799  * its own __dict__ descriptor, so we use that when we can.
   1800  */
   1801 static PyTypeObject *
   1802 get_builtin_base_with_dict(PyTypeObject *type)
   1803 {
   1804     while (type->tp_base != NULL) {
   1805         if (type->tp_dictoffset != 0 &&
   1806             !(type->tp_flags & Py_TPFLAGS_HEAPTYPE))
   1807             return type;
   1808         type = type->tp_base;
   1809     }
   1810     return NULL;
   1811 }
   1812 
   1813 static PyObject *
   1814 get_dict_descriptor(PyTypeObject *type)
   1815 {
   1816     static PyObject *dict_str;
   1817     PyObject *descr;
   1818 
   1819     if (dict_str == NULL) {
   1820         dict_str = PyString_InternFromString("__dict__");
   1821         if (dict_str == NULL)
   1822             return NULL;
   1823     }
   1824     descr = _PyType_Lookup(type, dict_str);
   1825     if (descr == NULL || !PyDescr_IsData(descr))
   1826         return NULL;
   1827 
   1828     return descr;
   1829 }
   1830 
   1831 static void
   1832 raise_dict_descr_error(PyObject *obj)
   1833 {
   1834     PyErr_Format(PyExc_TypeError,
   1835                  "this __dict__ descriptor does not support "
   1836                  "'%.200s' objects", obj->ob_type->tp_name);
   1837 }
   1838 
   1839 static PyObject *
   1840 subtype_dict(PyObject *obj, void *context)
   1841 {
   1842     PyObject **dictptr;
   1843     PyObject *dict;
   1844     PyTypeObject *base;
   1845 
   1846     base = get_builtin_base_with_dict(obj->ob_type);
   1847     if (base != NULL) {
   1848         descrgetfunc func;
   1849         PyObject *descr = get_dict_descriptor(base);
   1850         if (descr == NULL) {
   1851             raise_dict_descr_error(obj);
   1852             return NULL;
   1853         }
   1854         func = descr->ob_type->tp_descr_get;
   1855         if (func == NULL) {
   1856             raise_dict_descr_error(obj);
   1857             return NULL;
   1858         }
   1859         return func(descr, obj, (PyObject *)(obj->ob_type));
   1860     }
   1861 
   1862     dictptr = _PyObject_GetDictPtr(obj);
   1863     if (dictptr == NULL) {
   1864         PyErr_SetString(PyExc_AttributeError,
   1865                         "This object has no __dict__");
   1866         return NULL;
   1867     }
   1868     dict = *dictptr;
   1869     if (dict == NULL)
   1870         *dictptr = dict = PyDict_New();
   1871     Py_XINCREF(dict);
   1872     return dict;
   1873 }
   1874 
   1875 static int
   1876 subtype_setdict(PyObject *obj, PyObject *value, void *context)
   1877 {
   1878     PyObject **dictptr;
   1879     PyObject *dict;
   1880     PyTypeObject *base;
   1881 
   1882     base = get_builtin_base_with_dict(obj->ob_type);
   1883     if (base != NULL) {
   1884         descrsetfunc func;
   1885         PyObject *descr = get_dict_descriptor(base);
   1886         if (descr == NULL) {
   1887             raise_dict_descr_error(obj);
   1888             return -1;
   1889         }
   1890         func = descr->ob_type->tp_descr_set;
   1891         if (func == NULL) {
   1892             raise_dict_descr_error(obj);
   1893             return -1;
   1894         }
   1895         return func(descr, obj, value);
   1896     }
   1897 
   1898     dictptr = _PyObject_GetDictPtr(obj);
   1899     if (dictptr == NULL) {
   1900         PyErr_SetString(PyExc_AttributeError,
   1901                         "This object has no __dict__");
   1902         return -1;
   1903     }
   1904     if (value != NULL && !PyDict_Check(value)) {
   1905         PyErr_Format(PyExc_TypeError,
   1906                      "__dict__ must be set to a dictionary, "
   1907                      "not a '%.200s'", Py_TYPE(value)->tp_name);
   1908         return -1;
   1909     }
   1910     dict = *dictptr;
   1911     Py_XINCREF(value);
   1912     *dictptr = value;
   1913     Py_XDECREF(dict);
   1914     return 0;
   1915 }
   1916 
   1917 static PyObject *
   1918 subtype_getweakref(PyObject *obj, void *context)
   1919 {
   1920     PyObject **weaklistptr;
   1921     PyObject *result;
   1922 
   1923     if (Py_TYPE(obj)->tp_weaklistoffset == 0) {
   1924         PyErr_SetString(PyExc_AttributeError,
   1925                         "This object has no __weakref__");
   1926         return NULL;
   1927     }
   1928     assert(Py_TYPE(obj)->tp_weaklistoffset > 0);
   1929     assert(Py_TYPE(obj)->tp_weaklistoffset + sizeof(PyObject *) <=
   1930            (size_t)(Py_TYPE(obj)->tp_basicsize));
   1931     weaklistptr = (PyObject **)
   1932         ((char *)obj + Py_TYPE(obj)->tp_weaklistoffset);
   1933     if (*weaklistptr == NULL)
   1934         result = Py_None;
   1935     else
   1936         result = *weaklistptr;
   1937     Py_INCREF(result);
   1938     return result;
   1939 }
   1940 
   1941 /* Three variants on the subtype_getsets list. */
   1942 
   1943 static PyGetSetDef subtype_getsets_full[] = {
   1944     {"__dict__", subtype_dict, subtype_setdict,
   1945      PyDoc_STR("dictionary for instance variables (if defined)")},
   1946     {"__weakref__", subtype_getweakref, NULL,
   1947      PyDoc_STR("list of weak references to the object (if defined)")},
   1948     {0}
   1949 };
   1950 
   1951 static PyGetSetDef subtype_getsets_dict_only[] = {
   1952     {"__dict__", subtype_dict, subtype_setdict,
   1953      PyDoc_STR("dictionary for instance variables (if defined)")},
   1954     {0}
   1955 };
   1956 
   1957 static PyGetSetDef subtype_getsets_weakref_only[] = {
   1958     {"__weakref__", subtype_getweakref, NULL,
   1959      PyDoc_STR("list of weak references to the object (if defined)")},
   1960     {0}
   1961 };
   1962 
   1963 static int
   1964 valid_identifier(PyObject *s)
   1965 {
   1966     unsigned char *p;
   1967     Py_ssize_t i, n;
   1968 
   1969     if (!PyString_Check(s)) {
   1970         PyErr_Format(PyExc_TypeError,
   1971                      "__slots__ items must be strings, not '%.200s'",
   1972                      Py_TYPE(s)->tp_name);
   1973         return 0;
   1974     }
   1975     p = (unsigned char *) PyString_AS_STRING(s);
   1976     n = PyString_GET_SIZE(s);
   1977     /* We must reject an empty name.  As a hack, we bump the
   1978        length to 1 so that the loop will balk on the trailing \0. */
   1979     if (n == 0)
   1980         n = 1;
   1981     for (i = 0; i < n; i++, p++) {
   1982         if (!(i == 0 ? isalpha(*p) : isalnum(*p)) && *p != '_') {
   1983             PyErr_SetString(PyExc_TypeError,
   1984                             "__slots__ must be identifiers");
   1985             return 0;
   1986         }
   1987     }
   1988     return 1;
   1989 }
   1990 
   1991 #ifdef Py_USING_UNICODE
   1992 /* Replace Unicode objects in slots.  */
   1993 
   1994 static PyObject *
   1995 _unicode_to_string(PyObject *slots, Py_ssize_t nslots)
   1996 {
   1997     PyObject *tmp = NULL;
   1998     PyObject *slot_name, *new_name;
   1999     Py_ssize_t i;
   2000 
   2001     for (i = 0; i < nslots; i++) {
   2002         if (PyUnicode_Check(slot_name = PyTuple_GET_ITEM(slots, i))) {
   2003             if (tmp == NULL) {
   2004                 tmp = PySequence_List(slots);
   2005                 if (tmp == NULL)
   2006                     return NULL;
   2007             }
   2008             new_name = _PyUnicode_AsDefaultEncodedString(slot_name,
   2009                                                          NULL);
   2010             if (new_name == NULL) {
   2011                 Py_DECREF(tmp);
   2012                 return NULL;
   2013             }
   2014             Py_INCREF(new_name);
   2015             PyList_SET_ITEM(tmp, i, new_name);
   2016             Py_DECREF(slot_name);
   2017         }
   2018     }
   2019     if (tmp != NULL) {
   2020         slots = PyList_AsTuple(tmp);
   2021         Py_DECREF(tmp);
   2022     }
   2023     return slots;
   2024 }
   2025 #endif
   2026 
   2027 /* Forward */
   2028 static int
   2029 object_init(PyObject *self, PyObject *args, PyObject *kwds);
   2030 
   2031 static int
   2032 type_init(PyObject *cls, PyObject *args, PyObject *kwds)
   2033 {
   2034     int res;
   2035 
   2036     assert(args != NULL && PyTuple_Check(args));
   2037     assert(kwds == NULL || PyDict_Check(kwds));
   2038 
   2039     if (kwds != NULL && PyDict_Check(kwds) && PyDict_Size(kwds) != 0) {
   2040         PyErr_SetString(PyExc_TypeError,
   2041                         "type.__init__() takes no keyword arguments");
   2042         return -1;
   2043     }
   2044 
   2045     if (args != NULL && PyTuple_Check(args) &&
   2046         (PyTuple_GET_SIZE(args) != 1 && PyTuple_GET_SIZE(args) != 3)) {
   2047         PyErr_SetString(PyExc_TypeError,
   2048                         "type.__init__() takes 1 or 3 arguments");
   2049         return -1;
   2050     }
   2051 
   2052     /* Call object.__init__(self) now. */
   2053     /* XXX Could call super(type, cls).__init__() but what's the point? */
   2054     args = PyTuple_GetSlice(args, 0, 0);
   2055     res = object_init(cls, args, NULL);
   2056     Py_DECREF(args);
   2057     return res;
   2058 }
   2059 
   2060 static PyObject *
   2061 type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
   2062 {
   2063     PyObject *name, *bases, *dict;
   2064     static char *kwlist[] = {"name", "bases", "dict", 0};
   2065     PyObject *slots, *tmp, *newslots;
   2066     PyTypeObject *type, *base, *tmptype, *winner;
   2067     PyHeapTypeObject *et;
   2068     PyMemberDef *mp;
   2069     Py_ssize_t i, nbases, nslots, slotoffset, add_dict, add_weak;
   2070     int j, may_add_dict, may_add_weak;
   2071 
   2072     assert(args != NULL && PyTuple_Check(args));
   2073     assert(kwds == NULL || PyDict_Check(kwds));
   2074 
   2075     /* Special case: type(x) should return x->ob_type */
   2076     {
   2077         const Py_ssize_t nargs = PyTuple_GET_SIZE(args);
   2078         const Py_ssize_t nkwds = kwds == NULL ? 0 : PyDict_Size(kwds);
   2079 
   2080         if (PyType_CheckExact(metatype) && nargs == 1 && nkwds == 0) {
   2081             PyObject *x = PyTuple_GET_ITEM(args, 0);
   2082             Py_INCREF(Py_TYPE(x));
   2083             return (PyObject *) Py_TYPE(x);
   2084         }
   2085 
   2086         /* SF bug 475327 -- if that didn't trigger, we need 3
   2087            arguments. but PyArg_ParseTupleAndKeywords below may give
   2088            a msg saying type() needs exactly 3. */
   2089         if (nargs + nkwds != 3) {
   2090             PyErr_SetString(PyExc_TypeError,
   2091                             "type() takes 1 or 3 arguments");
   2092             return NULL;
   2093         }
   2094     }
   2095 
   2096     /* Check arguments: (name, bases, dict) */
   2097     if (!PyArg_ParseTupleAndKeywords(args, kwds, "SO!O!:type", kwlist,
   2098                                      &name,
   2099                                      &PyTuple_Type, &bases,
   2100                                      &PyDict_Type, &dict))
   2101         return NULL;
   2102 
   2103     /* Determine the proper metatype to deal with this,
   2104        and check for metatype conflicts while we're at it.
   2105        Note that if some other metatype wins to contract,
   2106        it's possible that its instances are not types. */
   2107     nbases = PyTuple_GET_SIZE(bases);
   2108     winner = metatype;
   2109     for (i = 0; i < nbases; i++) {
   2110         tmp = PyTuple_GET_ITEM(bases, i);
   2111         tmptype = tmp->ob_type;
   2112         if (tmptype == &PyClass_Type)
   2113             continue; /* Special case classic classes */
   2114         if (PyType_IsSubtype(winner, tmptype))
   2115             continue;
   2116         if (PyType_IsSubtype(tmptype, winner)) {
   2117             winner = tmptype;
   2118             continue;
   2119         }
   2120         PyErr_SetString(PyExc_TypeError,
   2121                         "metaclass conflict: "
   2122                         "the metaclass of a derived class "
   2123                         "must be a (non-strict) subclass "
   2124                         "of the metaclasses of all its bases");
   2125         return NULL;
   2126     }
   2127     if (winner != metatype) {
   2128         if (winner->tp_new != type_new) /* Pass it to the winner */
   2129             return winner->tp_new(winner, args, kwds);
   2130         metatype = winner;
   2131     }
   2132 
   2133     /* Adjust for empty tuple bases */
   2134     if (nbases == 0) {
   2135         bases = PyTuple_Pack(1, &PyBaseObject_Type);
   2136         if (bases == NULL)
   2137             return NULL;
   2138         nbases = 1;
   2139     }
   2140     else
   2141         Py_INCREF(bases);
   2142 
   2143     /* XXX From here until type is allocated, "return NULL" leaks bases! */
   2144 
   2145     /* Calculate best base, and check that all bases are type objects */
   2146     base = best_base(bases);
   2147     if (base == NULL) {
   2148         Py_DECREF(bases);
   2149         return NULL;
   2150     }
   2151     if (!PyType_HasFeature(base, Py_TPFLAGS_BASETYPE)) {
   2152         PyErr_Format(PyExc_TypeError,
   2153                      "type '%.100s' is not an acceptable base type",
   2154                      base->tp_name);
   2155         Py_DECREF(bases);
   2156         return NULL;
   2157     }
   2158 
   2159     /* Check for a __slots__ sequence variable in dict, and count it */
   2160     slots = PyDict_GetItemString(dict, "__slots__");
   2161     nslots = 0;
   2162     add_dict = 0;
   2163     add_weak = 0;
   2164     may_add_dict = base->tp_dictoffset == 0;
   2165     may_add_weak = base->tp_weaklistoffset == 0 && base->tp_itemsize == 0;
   2166     if (slots == NULL) {
   2167         if (may_add_dict) {
   2168             add_dict++;
   2169         }
   2170         if (may_add_weak) {
   2171             add_weak++;
   2172         }
   2173     }
   2174     else {
   2175         /* Have slots */
   2176 
   2177         /* Make it into a tuple */
   2178         if (PyString_Check(slots) || PyUnicode_Check(slots))
   2179             slots = PyTuple_Pack(1, slots);
   2180         else
   2181             slots = PySequence_Tuple(slots);
   2182         if (slots == NULL) {
   2183             Py_DECREF(bases);
   2184             return NULL;
   2185         }
   2186         assert(PyTuple_Check(slots));
   2187 
   2188         /* Are slots allowed? */
   2189         nslots = PyTuple_GET_SIZE(slots);
   2190         if (nslots > 0 && base->tp_itemsize != 0) {
   2191             PyErr_Format(PyExc_TypeError,
   2192                          "nonempty __slots__ "
   2193                          "not supported for subtype of '%s'",
   2194                          base->tp_name);
   2195           bad_slots:
   2196             Py_DECREF(bases);
   2197             Py_DECREF(slots);
   2198             return NULL;
   2199         }
   2200 
   2201 #ifdef Py_USING_UNICODE
   2202         tmp = _unicode_to_string(slots, nslots);
   2203         if (tmp == NULL)
   2204             goto bad_slots;
   2205         if (tmp != slots) {
   2206             Py_DECREF(slots);
   2207             slots = tmp;
   2208         }
   2209 #endif
   2210         /* Check for valid slot names and two special cases */
   2211         for (i = 0; i < nslots; i++) {
   2212             PyObject *tmp = PyTuple_GET_ITEM(slots, i);
   2213             char *s;
   2214             if (!valid_identifier(tmp))
   2215                 goto bad_slots;
   2216             assert(PyString_Check(tmp));
   2217             s = PyString_AS_STRING(tmp);
   2218             if (strcmp(s, "__dict__") == 0) {
   2219                 if (!may_add_dict || add_dict) {
   2220                     PyErr_SetString(PyExc_TypeError,
   2221                         "__dict__ slot disallowed: "
   2222                         "we already got one");
   2223                     goto bad_slots;
   2224                 }
   2225                 add_dict++;
   2226             }
   2227             if (strcmp(s, "__weakref__") == 0) {
   2228                 if (!may_add_weak || add_weak) {
   2229                     PyErr_SetString(PyExc_TypeError,
   2230                         "__weakref__ slot disallowed: "
   2231                         "either we already got one, "
   2232                         "or __itemsize__ != 0");
   2233                     goto bad_slots;
   2234                 }
   2235                 add_weak++;
   2236             }
   2237         }
   2238 
   2239         /* Copy slots into a list, mangle names and sort them.
   2240            Sorted names are needed for __class__ assignment.
   2241            Convert them back to tuple at the end.
   2242         */
   2243         newslots = PyList_New(nslots - add_dict - add_weak);
   2244         if (newslots == NULL)
   2245             goto bad_slots;
   2246         for (i = j = 0; i < nslots; i++) {
   2247             char *s;
   2248             tmp = PyTuple_GET_ITEM(slots, i);
   2249             s = PyString_AS_STRING(tmp);
   2250             if ((add_dict && strcmp(s, "__dict__") == 0) ||
   2251                 (add_weak && strcmp(s, "__weakref__") == 0))
   2252                 continue;
   2253             tmp =_Py_Mangle(name, tmp);
   2254             if (!tmp) {
   2255                 Py_DECREF(newslots);
   2256                 goto bad_slots;
   2257             }
   2258             PyList_SET_ITEM(newslots, j, tmp);
   2259             j++;
   2260         }
   2261         assert(j == nslots - add_dict - add_weak);
   2262         nslots = j;
   2263         Py_DECREF(slots);
   2264         if (PyList_Sort(newslots) == -1) {
   2265             Py_DECREF(bases);
   2266             Py_DECREF(newslots);
   2267             return NULL;
   2268         }
   2269         slots = PyList_AsTuple(newslots);
   2270         Py_DECREF(newslots);
   2271         if (slots == NULL) {
   2272             Py_DECREF(bases);
   2273             return NULL;
   2274         }
   2275 
   2276         /* Secondary bases may provide weakrefs or dict */
   2277         if (nbases > 1 &&
   2278             ((may_add_dict && !add_dict) ||
   2279              (may_add_weak && !add_weak))) {
   2280             for (i = 0; i < nbases; i++) {
   2281                 tmp = PyTuple_GET_ITEM(bases, i);
   2282                 if (tmp == (PyObject *)base)
   2283                     continue; /* Skip primary base */
   2284                 if (PyClass_Check(tmp)) {
   2285                     /* Classic base class provides both */
   2286                     if (may_add_dict && !add_dict)
   2287                         add_dict++;
   2288                     if (may_add_weak && !add_weak)
   2289                         add_weak++;
   2290                     break;
   2291                 }
   2292                 assert(PyType_Check(tmp));
   2293                 tmptype = (PyTypeObject *)tmp;
   2294                 if (may_add_dict && !add_dict &&
   2295                     tmptype->tp_dictoffset != 0)
   2296                     add_dict++;
   2297                 if (may_add_weak && !add_weak &&
   2298                     tmptype->tp_weaklistoffset != 0)
   2299                     add_weak++;
   2300                 if (may_add_dict && !add_dict)
   2301                     continue;
   2302                 if (may_add_weak && !add_weak)
   2303                     continue;
   2304                 /* Nothing more to check */
   2305                 break;
   2306             }
   2307         }
   2308     }
   2309 
   2310     /* XXX From here until type is safely allocated,
   2311        "return NULL" may leak slots! */
   2312 
   2313     /* Allocate the type object */
   2314     type = (PyTypeObject *)metatype->tp_alloc(metatype, nslots);
   2315     if (type == NULL) {
   2316         Py_XDECREF(slots);
   2317         Py_DECREF(bases);
   2318         return NULL;
   2319     }
   2320 
   2321     /* Keep name and slots alive in the extended type object */
   2322     et = (PyHeapTypeObject *)type;
   2323     Py_INCREF(name);
   2324     et->ht_name = name;
   2325     et->ht_slots = slots;
   2326 
   2327     /* Initialize tp_flags */
   2328     type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE |
   2329         Py_TPFLAGS_BASETYPE;
   2330     if (base->tp_flags & Py_TPFLAGS_HAVE_GC)
   2331         type->tp_flags |= Py_TPFLAGS_HAVE_GC;
   2332     if (base->tp_flags & Py_TPFLAGS_HAVE_NEWBUFFER)
   2333         type->tp_flags |= Py_TPFLAGS_HAVE_NEWBUFFER;
   2334 
   2335     /* It's a new-style number unless it specifically inherits any
   2336        old-style numeric behavior */
   2337     if ((base->tp_flags & Py_TPFLAGS_CHECKTYPES) ||
   2338         (base->tp_as_number == NULL))
   2339         type->tp_flags |= Py_TPFLAGS_CHECKTYPES;
   2340 
   2341     /* Initialize essential fields */
   2342     type->tp_as_number = &et->as_number;
   2343     type->tp_as_sequence = &et->as_sequence;
   2344     type->tp_as_mapping = &et->as_mapping;
   2345     type->tp_as_buffer = &et->as_buffer;
   2346     type->tp_name = PyString_AS_STRING(name);
   2347 
   2348     /* Set tp_base and tp_bases */
   2349     type->tp_bases = bases;
   2350     Py_INCREF(base);
   2351     type->tp_base = base;
   2352 
   2353     /* Initialize tp_dict from passed-in dict */
   2354     type->tp_dict = dict = PyDict_Copy(dict);
   2355     if (dict == NULL) {
   2356         Py_DECREF(type);
   2357         return NULL;
   2358     }
   2359 
   2360     /* Set __module__ in the dict */
   2361     if (PyDict_GetItemString(dict, "__module__") == NULL) {
   2362         tmp = PyEval_GetGlobals();
   2363         if (tmp != NULL) {
   2364             tmp = PyDict_GetItemString(tmp, "__name__");
   2365             if (tmp != NULL) {
   2366                 if (PyDict_SetItemString(dict, "__module__",
   2367                                          tmp) < 0)
   2368                     return NULL;
   2369             }
   2370         }
   2371     }
   2372 
   2373     /* Set tp_doc to a copy of dict['__doc__'], if the latter is there
   2374        and is a string.  The __doc__ accessor will first look for tp_doc;
   2375        if that fails, it will still look into __dict__.
   2376     */
   2377     {
   2378         PyObject *doc = PyDict_GetItemString(dict, "__doc__");
   2379         if (doc != NULL && PyString_Check(doc)) {
   2380             const size_t n = (size_t)PyString_GET_SIZE(doc);
   2381             char *tp_doc = (char *)PyObject_MALLOC(n+1);
   2382             if (tp_doc == NULL) {
   2383                 Py_DECREF(type);
   2384                 return NULL;
   2385             }
   2386             memcpy(tp_doc, PyString_AS_STRING(doc), n+1);
   2387             type->tp_doc = tp_doc;
   2388         }
   2389     }
   2390 
   2391     /* Special-case __new__: if it's a plain function,
   2392        make it a static function */
   2393     tmp = PyDict_GetItemString(dict, "__new__");
   2394     if (tmp != NULL && PyFunction_Check(tmp)) {
   2395         tmp = PyStaticMethod_New(tmp);
   2396         if (tmp == NULL) {
   2397             Py_DECREF(type);
   2398             return NULL;
   2399         }
   2400         PyDict_SetItemString(dict, "__new__", tmp);
   2401         Py_DECREF(tmp);
   2402     }
   2403 
   2404     /* Add descriptors for custom slots from __slots__, or for __dict__ */
   2405     mp = PyHeapType_GET_MEMBERS(et);
   2406     slotoffset = base->tp_basicsize;
   2407     if (slots != NULL) {
   2408         for (i = 0; i < nslots; i++, mp++) {
   2409             mp->name = PyString_AS_STRING(
   2410                 PyTuple_GET_ITEM(slots, i));
   2411             mp->type = T_OBJECT_EX;
   2412             mp->offset = slotoffset;
   2413 
   2414             /* __dict__ and __weakref__ are already filtered out */
   2415             assert(strcmp(mp->name, "__dict__") != 0);
   2416             assert(strcmp(mp->name, "__weakref__") != 0);
   2417 
   2418             slotoffset += sizeof(PyObject *);
   2419         }
   2420     }
   2421     if (add_dict) {
   2422         if (base->tp_itemsize)
   2423             type->tp_dictoffset = -(long)sizeof(PyObject *);
   2424         else
   2425             type->tp_dictoffset = slotoffset;
   2426         slotoffset += sizeof(PyObject *);
   2427     }
   2428     if (add_weak) {
   2429         assert(!base->tp_itemsize);
   2430         type->tp_weaklistoffset = slotoffset;
   2431         slotoffset += sizeof(PyObject *);
   2432     }
   2433     type->tp_basicsize = slotoffset;
   2434     type->tp_itemsize = base->tp_itemsize;
   2435     type->tp_members = PyHeapType_GET_MEMBERS(et);
   2436 
   2437     if (type->tp_weaklistoffset && type->tp_dictoffset)
   2438         type->tp_getset = subtype_getsets_full;
   2439     else if (type->tp_weaklistoffset && !type->tp_dictoffset)
   2440         type->tp_getset = subtype_getsets_weakref_only;
   2441     else if (!type->tp_weaklistoffset && type->tp_dictoffset)
   2442         type->tp_getset = subtype_getsets_dict_only;
   2443     else
   2444         type->tp_getset = NULL;
   2445 
   2446     /* Special case some slots */
   2447     if (type->tp_dictoffset != 0 || nslots > 0) {
   2448         if (base->tp_getattr == NULL && base->tp_getattro == NULL)
   2449             type->tp_getattro = PyObject_GenericGetAttr;
   2450         if (base->tp_setattr == NULL && base->tp_setattro == NULL)
   2451             type->tp_setattro = PyObject_GenericSetAttr;
   2452     }
   2453     type->tp_dealloc = subtype_dealloc;
   2454 
   2455     /* Enable GC unless there are really no instance variables possible */
   2456     if (!(type->tp_basicsize == sizeof(PyObject) &&
   2457           type->tp_itemsize == 0))
   2458         type->tp_flags |= Py_TPFLAGS_HAVE_GC;
   2459 
   2460     /* Always override allocation strategy to use regular heap */
   2461     type->tp_alloc = PyType_GenericAlloc;
   2462     if (type->tp_flags & Py_TPFLAGS_HAVE_GC) {
   2463         type->tp_free = PyObject_GC_Del;
   2464         type->tp_traverse = subtype_traverse;
   2465         type->tp_clear = subtype_clear;
   2466     }
   2467     else
   2468         type->tp_free = PyObject_Del;
   2469 
   2470     /* Initialize the rest */
   2471     if (PyType_Ready(type) < 0) {
   2472         Py_DECREF(type);
   2473         return NULL;
   2474     }
   2475 
   2476     /* Put the proper slots in place */
   2477     fixup_slot_dispatchers(type);
   2478 
   2479     return (PyObject *)type;
   2480 }
   2481 
   2482 /* Internal API to look for a name through the MRO.
   2483    This returns a borrowed reference, and doesn't set an exception! */
   2484 PyObject *
   2485 _PyType_Lookup(PyTypeObject *type, PyObject *name)
   2486 {
   2487     Py_ssize_t i, n;
   2488     PyObject *mro, *res, *base, *dict;
   2489     unsigned int h;
   2490 
   2491     if (MCACHE_CACHEABLE_NAME(name) &&
   2492         PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) {
   2493         /* fast path */
   2494         h = MCACHE_HASH_METHOD(type, name);
   2495         if (method_cache[h].version == type->tp_version_tag &&
   2496             method_cache[h].name == name)
   2497             return method_cache[h].value;
   2498     }
   2499 
   2500     /* Look in tp_dict of types in MRO */
   2501     mro = type->tp_mro;
   2502 
   2503     /* If mro is NULL, the type is either not yet initialized
   2504        by PyType_Ready(), or already cleared by type_clear().
   2505        Either way the safest thing to do is to return NULL. */
   2506     if (mro == NULL)
   2507         return NULL;
   2508 
   2509     res = NULL;
   2510     assert(PyTuple_Check(mro));
   2511     n = PyTuple_GET_SIZE(mro);
   2512     for (i = 0; i < n; i++) {
   2513         base = PyTuple_GET_ITEM(mro, i);
   2514         if (PyClass_Check(base))
   2515             dict = ((PyClassObject *)base)->cl_dict;
   2516         else {
   2517             assert(PyType_Check(base));
   2518             dict = ((PyTypeObject *)base)->tp_dict;
   2519         }
   2520         assert(dict && PyDict_Check(dict));
   2521         res = PyDict_GetItem(dict, name);
   2522         if (res != NULL)
   2523             break;
   2524     }
   2525 
   2526     if (MCACHE_CACHEABLE_NAME(name) && assign_version_tag(type)) {
   2527         h = MCACHE_HASH_METHOD(type, name);
   2528         method_cache[h].version = type->tp_version_tag;
   2529         method_cache[h].value = res;  /* borrowed */
   2530         Py_INCREF(name);
   2531         Py_DECREF(method_cache[h].name);
   2532         method_cache[h].name = name;
   2533     }
   2534     return res;
   2535 }
   2536 
   2537 /* This is similar to PyObject_GenericGetAttr(),
   2538    but uses _PyType_Lookup() instead of just looking in type->tp_dict. */
   2539 static PyObject *
   2540 type_getattro(PyTypeObject *type, PyObject *name)
   2541 {
   2542     PyTypeObject *metatype = Py_TYPE(type);
   2543     PyObject *meta_attribute, *attribute;
   2544     descrgetfunc meta_get;
   2545 
   2546     if (!PyString_Check(name)) {
   2547         PyErr_Format(PyExc_TypeError,
   2548                      "attribute name must be string, not '%.200s'",
   2549                      name->ob_type->tp_name);
   2550         return NULL;
   2551     }
   2552 
   2553     /* Initialize this type (we'll assume the metatype is initialized) */
   2554     if (type->tp_dict == NULL) {
   2555         if (PyType_Ready(type) < 0)
   2556             return NULL;
   2557     }
   2558 
   2559     /* No readable descriptor found yet */
   2560     meta_get = NULL;
   2561 
   2562     /* Look for the attribute in the metatype */
   2563     meta_attribute = _PyType_Lookup(metatype, name);
   2564 
   2565     if (meta_attribute != NULL) {
   2566         meta_get = Py_TYPE(meta_attribute)->tp_descr_get;
   2567 
   2568         if (meta_get != NULL && PyDescr_IsData(meta_attribute)) {
   2569             /* Data descriptors implement tp_descr_set to intercept
   2570              * writes. Assume the attribute is not overridden in
   2571              * type's tp_dict (and bases): call the descriptor now.
   2572              */
   2573             return meta_get(meta_attribute, (PyObject *)type,
   2574                             (PyObject *)metatype);
   2575         }
   2576         Py_INCREF(meta_attribute);
   2577     }
   2578 
   2579     /* No data descriptor found on metatype. Look in tp_dict of this
   2580      * type and its bases */
   2581     attribute = _PyType_Lookup(type, name);
   2582     if (attribute != NULL) {
   2583         /* Implement descriptor functionality, if any */
   2584         descrgetfunc local_get = Py_TYPE(attribute)->tp_descr_get;
   2585 
   2586         Py_XDECREF(meta_attribute);
   2587 
   2588         if (local_get != NULL) {
   2589             /* NULL 2nd argument indicates the descriptor was
   2590              * found on the target object itself (or a base)  */
   2591             return local_get(attribute, (PyObject *)NULL,
   2592                              (PyObject *)type);
   2593         }
   2594 
   2595         Py_INCREF(attribute);
   2596         return attribute;
   2597     }
   2598 
   2599     /* No attribute found in local __dict__ (or bases): use the
   2600      * descriptor from the metatype, if any */
   2601     if (meta_get != NULL) {
   2602         PyObject *res;
   2603         res = meta_get(meta_attribute, (PyObject *)type,
   2604                        (PyObject *)metatype);
   2605         Py_DECREF(meta_attribute);
   2606         return res;
   2607     }
   2608 
   2609     /* If an ordinary attribute was found on the metatype, return it now */
   2610     if (meta_attribute != NULL) {
   2611         return meta_attribute;
   2612     }
   2613 
   2614     /* Give up */
   2615     PyErr_Format(PyExc_AttributeError,
   2616                      "type object '%.50s' has no attribute '%.400s'",
   2617                      type->tp_name, PyString_AS_STRING(name));
   2618     return NULL;
   2619 }
   2620 
   2621 static int
   2622 type_setattro(PyTypeObject *type, PyObject *name, PyObject *value)
   2623 {
   2624     if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
   2625         PyErr_Format(
   2626             PyExc_TypeError,
   2627             "can't set attributes of built-in/extension type '%s'",
   2628             type->tp_name);
   2629         return -1;
   2630     }
   2631     if (PyObject_GenericSetAttr((PyObject *)type, name, value) < 0)
   2632         return -1;
   2633     return update_slot(type, name);
   2634 }
   2635 
   2636 static void
   2637 type_dealloc(PyTypeObject *type)
   2638 {
   2639     PyHeapTypeObject *et;
   2640 
   2641     /* Assert this is a heap-allocated type object */
   2642     assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
   2643     _PyObject_GC_UNTRACK(type);
   2644     PyObject_ClearWeakRefs((PyObject *)type);
   2645     et = (PyHeapTypeObject *)type;
   2646     Py_XDECREF(type->tp_base);
   2647     Py_XDECREF(type->tp_dict);
   2648     Py_XDECREF(type->tp_bases);
   2649     Py_XDECREF(type->tp_mro);
   2650     Py_XDECREF(type->tp_cache);
   2651     Py_XDECREF(type->tp_subclasses);
   2652     /* A type's tp_doc is heap allocated, unlike the tp_doc slots
   2653      * of most other objects.  It's okay to cast it to char *.
   2654      */
   2655     PyObject_Free((char *)type->tp_doc);
   2656     Py_XDECREF(et->ht_name);
   2657     Py_XDECREF(et->ht_slots);
   2658     Py_TYPE(type)->tp_free((PyObject *)type);
   2659 }
   2660 
   2661 static PyObject *
   2662 type_subclasses(PyTypeObject *type, PyObject *args_ignored)
   2663 {
   2664     PyObject *list, *raw, *ref;
   2665     Py_ssize_t i, n;
   2666 
   2667     list = PyList_New(0);
   2668     if (list == NULL)
   2669         return NULL;
   2670     raw = type->tp_subclasses;
   2671     if (raw == NULL)
   2672         return list;
   2673     assert(PyList_Check(raw));
   2674     n = PyList_GET_SIZE(raw);
   2675     for (i = 0; i < n; i++) {
   2676         ref = PyList_GET_ITEM(raw, i);
   2677         assert(PyWeakref_CheckRef(ref));
   2678         ref = PyWeakref_GET_OBJECT(ref);
   2679         if (ref != Py_None) {
   2680             if (PyList_Append(list, ref) < 0) {
   2681                 Py_DECREF(list);
   2682                 return NULL;
   2683             }
   2684         }
   2685     }
   2686     return list;
   2687 }
   2688 
   2689 static PyMethodDef type_methods[] = {
   2690     {"mro", (PyCFunction)mro_external, METH_NOARGS,
   2691      PyDoc_STR("mro() -> list\nreturn a type's method resolution order")},
   2692     {"__subclasses__", (PyCFunction)type_subclasses, METH_NOARGS,
   2693      PyDoc_STR("__subclasses__() -> list of immediate subclasses")},
   2694     {"__instancecheck__", type___instancecheck__, METH_O,
   2695      PyDoc_STR("__instancecheck__() -> bool\ncheck if an object is an instance")},
   2696     {"__subclasscheck__", type___subclasscheck__, METH_O,
   2697      PyDoc_STR("__subclasscheck__() -> bool\ncheck if a class is a subclass")},
   2698     {0}
   2699 };
   2700 
   2701 PyDoc_STRVAR(type_doc,
   2702 "type(object) -> the object's type\n"
   2703 "type(name, bases, dict) -> a new type");
   2704 
   2705 static int
   2706 type_traverse(PyTypeObject *type, visitproc visit, void *arg)
   2707 {
   2708     /* Because of type_is_gc(), the collector only calls this
   2709        for heaptypes. */
   2710     assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
   2711 
   2712     Py_VISIT(type->tp_dict);
   2713     Py_VISIT(type->tp_cache);
   2714     Py_VISIT(type->tp_mro);
   2715     Py_VISIT(type->tp_bases);
   2716     Py_VISIT(type->tp_base);
   2717 
   2718     /* There's no need to visit type->tp_subclasses or
   2719        ((PyHeapTypeObject *)type)->ht_slots, because they can't be involved
   2720        in cycles; tp_subclasses is a list of weak references,
   2721        and slots is a tuple of strings. */
   2722 
   2723     return 0;
   2724 }
   2725 
   2726 static int
   2727 type_clear(PyTypeObject *type)
   2728 {
   2729     /* Because of type_is_gc(), the collector only calls this
   2730        for heaptypes. */
   2731     assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
   2732 
   2733     /* We need to invalidate the method cache carefully before clearing
   2734        the dict, so that other objects caught in a reference cycle
   2735        don't start calling destroyed methods.
   2736 
   2737        Otherwise, the only field we need to clear is tp_mro, which is
   2738        part of a hard cycle (its first element is the class itself) that
   2739        won't be broken otherwise (it's a tuple and tuples don't have a
   2740        tp_clear handler).  None of the other fields need to be
   2741        cleared, and here's why:
   2742 
   2743        tp_cache:
   2744            Not used; if it were, it would be a dict.
   2745 
   2746        tp_bases, tp_base:
   2747            If these are involved in a cycle, there must be at least
   2748            one other, mutable object in the cycle, e.g. a base
   2749            class's dict; the cycle will be broken that way.
   2750 
   2751        tp_subclasses:
   2752            A list of weak references can't be part of a cycle; and
   2753            lists have their own tp_clear.
   2754 
   2755        slots (in PyHeapTypeObject):
   2756            A tuple of strings can't be part of a cycle.
   2757     */
   2758 
   2759     PyType_Modified(type);
   2760     if (type->tp_dict)
   2761         PyDict_Clear(type->tp_dict);
   2762     Py_CLEAR(type->tp_mro);
   2763 
   2764     return 0;
   2765 }
   2766 
   2767 static int
   2768 type_is_gc(PyTypeObject *type)
   2769 {
   2770     return type->tp_flags & Py_TPFLAGS_HEAPTYPE;
   2771 }
   2772 
   2773 PyTypeObject PyType_Type = {
   2774     PyVarObject_HEAD_INIT(&PyType_Type, 0)
   2775     "type",                                     /* tp_name */
   2776     sizeof(PyHeapTypeObject),                   /* tp_basicsize */
   2777     sizeof(PyMemberDef),                        /* tp_itemsize */
   2778     (destructor)type_dealloc,                   /* tp_dealloc */
   2779     0,                                          /* tp_print */
   2780     0,                                          /* tp_getattr */
   2781     0,                                          /* tp_setattr */
   2782     0,                                  /* tp_compare */
   2783     (reprfunc)type_repr,                        /* tp_repr */
   2784     0,                                          /* tp_as_number */
   2785     0,                                          /* tp_as_sequence */
   2786     0,                                          /* tp_as_mapping */
   2787     (hashfunc)_Py_HashPointer,                  /* tp_hash */
   2788     (ternaryfunc)type_call,                     /* tp_call */
   2789     0,                                          /* tp_str */
   2790     (getattrofunc)type_getattro,                /* tp_getattro */
   2791     (setattrofunc)type_setattro,                /* tp_setattro */
   2792     0,                                          /* tp_as_buffer */
   2793     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
   2794         Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TYPE_SUBCLASS,         /* tp_flags */
   2795     type_doc,                                   /* tp_doc */
   2796     (traverseproc)type_traverse,                /* tp_traverse */
   2797     (inquiry)type_clear,                        /* tp_clear */
   2798     type_richcompare,                                           /* tp_richcompare */
   2799     offsetof(PyTypeObject, tp_weaklist),        /* tp_weaklistoffset */
   2800     0,                                          /* tp_iter */
   2801     0,                                          /* tp_iternext */
   2802     type_methods,                               /* tp_methods */
   2803     type_members,                               /* tp_members */
   2804     type_getsets,                               /* tp_getset */
   2805     0,                                          /* tp_base */
   2806     0,                                          /* tp_dict */
   2807     0,                                          /* tp_descr_get */
   2808     0,                                          /* tp_descr_set */
   2809     offsetof(PyTypeObject, tp_dict),            /* tp_dictoffset */
   2810     type_init,                                  /* tp_init */
   2811     0,                                          /* tp_alloc */
   2812     type_new,                                   /* tp_new */
   2813     PyObject_GC_Del,                            /* tp_free */
   2814     (inquiry)type_is_gc,                        /* tp_is_gc */
   2815 };
   2816 
   2817 
   2818 /* The base type of all types (eventually)... except itself. */
   2819 
   2820 /* You may wonder why object.__new__() only complains about arguments
   2821    when object.__init__() is not overridden, and vice versa.
   2822 
   2823    Consider the use cases:
   2824 
   2825    1. When neither is overridden, we want to hear complaints about
   2826       excess (i.e., any) arguments, since their presence could
   2827       indicate there's a bug.
   2828 
   2829    2. When defining an Immutable type, we are likely to override only
   2830       __new__(), since __init__() is called too late to initialize an
   2831       Immutable object.  Since __new__() defines the signature for the
   2832       type, it would be a pain to have to override __init__() just to
   2833       stop it from complaining about excess arguments.
   2834 
   2835    3. When defining a Mutable type, we are likely to override only
   2836       __init__().  So here the converse reasoning applies: we don't
   2837       want to have to override __new__() just to stop it from
   2838       complaining.
   2839 
   2840    4. When __init__() is overridden, and the subclass __init__() calls
   2841       object.__init__(), the latter should complain about excess
   2842       arguments; ditto for __new__().
   2843 
   2844    Use cases 2 and 3 make it unattractive to unconditionally check for
   2845    excess arguments.  The best solution that addresses all four use
   2846    cases is as follows: __init__() complains about excess arguments
   2847    unless __new__() is overridden and __init__() is not overridden
   2848    (IOW, if __init__() is overridden or __new__() is not overridden);
   2849    symmetrically, __new__() complains about excess arguments unless
   2850    __init__() is overridden and __new__() is not overridden
   2851    (IOW, if __new__() is overridden or __init__() is not overridden).
   2852 
   2853    However, for backwards compatibility, this breaks too much code.
   2854    Therefore, in 2.6, we'll *warn* about excess arguments when both
   2855    methods are overridden; for all other cases we'll use the above
   2856    rules.
   2857 
   2858 */
   2859 
   2860 /* Forward */
   2861 static PyObject *
   2862 object_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
   2863 
   2864 static int
   2865 excess_args(PyObject *args, PyObject *kwds)
   2866 {
   2867     return PyTuple_GET_SIZE(args) ||
   2868         (kwds && PyDict_Check(kwds) && PyDict_Size(kwds));
   2869 }
   2870 
   2871 static int
   2872 object_init(PyObject *self, PyObject *args, PyObject *kwds)
   2873 {
   2874     int err = 0;
   2875     if (excess_args(args, kwds)) {
   2876         PyTypeObject *type = Py_TYPE(self);
   2877         if (type->tp_init != object_init &&
   2878             type->tp_new != object_new)
   2879         {
   2880             err = PyErr_WarnEx(PyExc_DeprecationWarning,
   2881                        "object.__init__() takes no parameters",
   2882                        1);
   2883         }
   2884         else if (type->tp_init != object_init ||
   2885                  type->tp_new == object_new)
   2886         {
   2887             PyErr_SetString(PyExc_TypeError,
   2888                 "object.__init__() takes no parameters");
   2889             err = -1;
   2890         }
   2891     }
   2892     return err;
   2893 }
   2894 
   2895 static PyObject *
   2896 object_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
   2897 {
   2898     int err = 0;
   2899     if (excess_args(args, kwds)) {
   2900         if (type->tp_new != object_new &&
   2901             type->tp_init != object_init)
   2902         {
   2903             err = PyErr_WarnEx(PyExc_DeprecationWarning,
   2904                        "object() takes no parameters",
   2905                        1);
   2906         }
   2907         else if (type->tp_new != object_new ||
   2908                  type->tp_init == object_init)
   2909         {
   2910             PyErr_SetString(PyExc_TypeError,
   2911                 "object() takes no parameters");
   2912             err = -1;
   2913         }
   2914     }
   2915     if (err < 0)
   2916         return NULL;
   2917 
   2918     if (type->tp_flags & Py_TPFLAGS_IS_ABSTRACT) {
   2919         static PyObject *comma = NULL;
   2920         PyObject *abstract_methods = NULL;
   2921         PyObject *builtins;
   2922         PyObject *sorted;
   2923         PyObject *sorted_methods = NULL;
   2924         PyObject *joined = NULL;
   2925         const char *joined_str;
   2926 
   2927         /* Compute ", ".join(sorted(type.__abstractmethods__))
   2928            into joined. */
   2929         abstract_methods = type_abstractmethods(type, NULL);
   2930         if (abstract_methods == NULL)
   2931             goto error;
   2932         builtins = PyEval_GetBuiltins();
   2933         if (builtins == NULL)
   2934             goto error;
   2935         sorted = PyDict_GetItemString(builtins, "sorted");
   2936         if (sorted == NULL)
   2937             goto error;
   2938         sorted_methods = PyObject_CallFunctionObjArgs(sorted,
   2939                                                       abstract_methods,
   2940                                                       NULL);
   2941         if (sorted_methods == NULL)
   2942             goto error;
   2943         if (comma == NULL) {
   2944             comma = PyString_InternFromString(", ");
   2945             if (comma == NULL)
   2946                 goto error;
   2947         }
   2948         joined = PyObject_CallMethod(comma, "join",
   2949                                      "O",  sorted_methods);
   2950         if (joined == NULL)
   2951             goto error;
   2952         joined_str = PyString_AsString(joined);
   2953         if (joined_str == NULL)
   2954             goto error;
   2955 
   2956         PyErr_Format(PyExc_TypeError,
   2957                      "Can't instantiate abstract class %s "
   2958                      "with abstract methods %s",
   2959                      type->tp_name,
   2960                      joined_str);
   2961     error:
   2962         Py_XDECREF(joined);
   2963         Py_XDECREF(sorted_methods);
   2964         Py_XDECREF(abstract_methods);
   2965         return NULL;
   2966     }
   2967     return type->tp_alloc(type, 0);
   2968 }
   2969 
   2970 static void
   2971 object_dealloc(PyObject *self)
   2972 {
   2973     Py_TYPE(self)->tp_free(self);
   2974 }
   2975 
   2976 static PyObject *
   2977 object_repr(PyObject *self)
   2978 {
   2979     PyTypeObject *type;
   2980     PyObject *mod, *name, *rtn;
   2981 
   2982     type = Py_TYPE(self);
   2983     mod = type_module(type, NULL);
   2984     if (mod == NULL)
   2985         PyErr_Clear();
   2986     else if (!PyString_Check(mod)) {
   2987         Py_DECREF(mod);
   2988         mod = NULL;
   2989     }
   2990     name = type_name(type, NULL);
   2991     if (name == NULL) {
   2992         Py_XDECREF(mod);
   2993         return NULL;
   2994     }
   2995     if (mod != NULL && strcmp(PyString_AS_STRING(mod), "__builtin__"))
   2996         rtn = PyString_FromFormat("<%s.%s object at %p>",
   2997                                   PyString_AS_STRING(mod),
   2998                                   PyString_AS_STRING(name),
   2999                                   self);
   3000     else
   3001         rtn = PyString_FromFormat("<%s object at %p>",
   3002                                   type->tp_name, self);
   3003     Py_XDECREF(mod);
   3004     Py_DECREF(name);
   3005     return rtn;
   3006 }
   3007 
   3008 static PyObject *
   3009 object_str(PyObject *self)
   3010 {
   3011     unaryfunc f;
   3012 
   3013     f = Py_TYPE(self)->tp_repr;
   3014     if (f == NULL)
   3015         f = object_repr;
   3016     return f(self);
   3017 }
   3018 
   3019 static PyObject *
   3020 object_get_class(PyObject *self, void *closure)
   3021 {
   3022     Py_INCREF(Py_TYPE(self));
   3023     return (PyObject *)(Py_TYPE(self));
   3024 }
   3025 
   3026 static int
   3027 equiv_structs(PyTypeObject *a, PyTypeObject *b)
   3028 {
   3029     return a == b ||
   3030            (a != NULL &&
   3031         b != NULL &&
   3032         a->tp_basicsize == b->tp_basicsize &&
   3033         a->tp_itemsize == b->tp_itemsize &&
   3034         a->tp_dictoffset == b->tp_dictoffset &&
   3035         a->tp_weaklistoffset == b->tp_weaklistoffset &&
   3036         ((a->tp_flags & Py_TPFLAGS_HAVE_GC) ==
   3037          (b->tp_flags & Py_TPFLAGS_HAVE_GC)));
   3038 }
   3039 
   3040 static int
   3041 same_slots_added(PyTypeObject *a, PyTypeObject *b)
   3042 {
   3043     PyTypeObject *base = a->tp_base;
   3044     Py_ssize_t size;
   3045     PyObject *slots_a, *slots_b;
   3046 
   3047     assert(base == b->tp_base);
   3048     size = base->tp_basicsize;
   3049     if (a->tp_dictoffset == size && b->tp_dictoffset == size)
   3050         size += sizeof(PyObject *);
   3051     if (a->tp_weaklistoffset == size && b->tp_weaklistoffset == size)
   3052         size += sizeof(PyObject *);
   3053 
   3054     /* Check slots compliance */
   3055     slots_a = ((PyHeapTypeObject *)a)->ht_slots;
   3056     slots_b = ((PyHeapTypeObject *)b)->ht_slots;
   3057     if (slots_a && slots_b) {
   3058         if (PyObject_Compare(slots_a, slots_b) != 0)
   3059             return 0;
   3060         size += sizeof(PyObject *) * PyTuple_GET_SIZE(slots_a);
   3061     }
   3062     return size == a->tp_basicsize && size == b->tp_basicsize;
   3063 }
   3064 
   3065 static int
   3066 compatible_for_assignment(PyTypeObject* oldto, PyTypeObject* newto, char* attr)
   3067 {
   3068     PyTypeObject *newbase, *oldbase;
   3069 
   3070     if (newto->tp_dealloc != oldto->tp_dealloc ||
   3071         newto->tp_free != oldto->tp_free)
   3072     {
   3073         PyErr_Format(PyExc_TypeError,
   3074                      "%s assignment: "
   3075                      "'%s' deallocator differs from '%s'",
   3076                      attr,
   3077                      newto->tp_name,
   3078                      oldto->tp_name);
   3079         return 0;
   3080     }
   3081     newbase = newto;
   3082     oldbase = oldto;
   3083     while (equiv_structs(newbase, newbase->tp_base))
   3084         newbase = newbase->tp_base;
   3085     while (equiv_structs(oldbase, oldbase->tp_base))
   3086         oldbase = oldbase->tp_base;
   3087     if (newbase != oldbase &&
   3088         (newbase->tp_base != oldbase->tp_base ||
   3089          !same_slots_added(newbase, oldbase))) {
   3090         PyErr_Format(PyExc_TypeError,
   3091                      "%s assignment: "
   3092                      "'%s' object layout differs from '%s'",
   3093                      attr,
   3094                      newto->tp_name,
   3095                      oldto->tp_name);
   3096         return 0;
   3097     }
   3098 
   3099     return 1;
   3100 }
   3101 
   3102 static int
   3103 object_set_class(PyObject *self, PyObject *value, void *closure)
   3104 {
   3105     PyTypeObject *oldto = Py_TYPE(self);
   3106     PyTypeObject *newto;
   3107 
   3108     if (value == NULL) {
   3109         PyErr_SetString(PyExc_TypeError,
   3110                         "can't delete __class__ attribute");
   3111         return -1;
   3112     }
   3113     if (!PyType_Check(value)) {
   3114         PyErr_Format(PyExc_TypeError,
   3115           "__class__ must be set to new-style class, not '%s' object",
   3116           Py_TYPE(value)->tp_name);
   3117         return -1;
   3118     }
   3119     newto = (PyTypeObject *)value;
   3120     if (!(newto->tp_flags & Py_TPFLAGS_HEAPTYPE) ||
   3121         !(oldto->tp_flags & Py_TPFLAGS_HEAPTYPE))
   3122     {
   3123         PyErr_Format(PyExc_TypeError,
   3124                      "__class__ assignment: only for heap types");
   3125         return -1;
   3126     }
   3127     if (compatible_for_assignment(newto, oldto, "__class__")) {
   3128         Py_INCREF(newto);
   3129         Py_TYPE(self) = newto;
   3130         Py_DECREF(oldto);
   3131         return 0;
   3132     }
   3133     else {
   3134         return -1;
   3135     }
   3136 }
   3137 
   3138 static PyGetSetDef object_getsets[] = {
   3139     {"__class__", object_get_class, object_set_class,
   3140      PyDoc_STR("the object's class")},
   3141     {0}
   3142 };
   3143 
   3144 
   3145 /* Stuff to implement __reduce_ex__ for pickle protocols >= 2.
   3146    We fall back to helpers in copy_reg for:
   3147    - pickle protocols < 2
   3148    - calculating the list of slot names (done only once per class)
   3149    - the __newobj__ function (which is used as a token but never called)
   3150 */
   3151 
   3152 static PyObject *
   3153 import_copyreg(void)
   3154 {
   3155     static PyObject *copyreg_str;
   3156 
   3157     if (!copyreg_str) {
   3158         copyreg_str = PyString_InternFromString("copy_reg");
   3159         if (copyreg_str == NULL)
   3160             return NULL;
   3161     }
   3162 
   3163     return PyImport_Import(copyreg_str);
   3164 }
   3165 
   3166 static PyObject *
   3167 slotnames(PyObject *cls)
   3168 {
   3169     PyObject *clsdict;
   3170     PyObject *copyreg;
   3171     PyObject *slotnames;
   3172 
   3173     if (!PyType_Check(cls)) {
   3174         Py_INCREF(Py_None);
   3175         return Py_None;
   3176     }
   3177 
   3178     clsdict = ((PyTypeObject *)cls)->tp_dict;
   3179     slotnames = PyDict_GetItemString(clsdict, "__slotnames__");
   3180     if (slotnames != NULL && PyList_Check(slotnames)) {
   3181         Py_INCREF(slotnames);
   3182         return slotnames;
   3183     }
   3184 
   3185     copyreg = import_copyreg();
   3186     if (copyreg == NULL)
   3187         return NULL;
   3188 
   3189     slotnames = PyObject_CallMethod(copyreg, "_slotnames", "O", cls);
   3190     Py_DECREF(copyreg);
   3191     if (slotnames != NULL &&
   3192         slotnames != Py_None &&
   3193         !PyList_Check(slotnames))
   3194     {
   3195         PyErr_SetString(PyExc_TypeError,
   3196             "copy_reg._slotnames didn't return a list or None");
   3197         Py_DECREF(slotnames);
   3198         slotnames = NULL;
   3199     }
   3200 
   3201     return slotnames;
   3202 }
   3203 
   3204 static PyObject *
   3205 reduce_2(PyObject *obj)
   3206 {
   3207     PyObject *cls, *getnewargs;
   3208     PyObject *args = NULL, *args2 = NULL;
   3209     PyObject *getstate = NULL, *state = NULL, *names = NULL;
   3210     PyObject *slots = NULL, *listitems = NULL, *dictitems = NULL;
   3211     PyObject *copyreg = NULL, *newobj = NULL, *res = NULL;
   3212     Py_ssize_t i, n;
   3213 
   3214     cls = PyObject_GetAttrString(obj, "__class__");
   3215     if (cls == NULL)
   3216         return NULL;
   3217 
   3218     getnewargs = PyObject_GetAttrString(obj, "__getnewargs__");
   3219     if (getnewargs != NULL) {
   3220         args = PyObject_CallObject(getnewargs, NULL);
   3221         Py_DECREF(getnewargs);
   3222         if (args != NULL && !PyTuple_Check(args)) {
   3223             PyErr_Format(PyExc_TypeError,
   3224                 "__getnewargs__ should return a tuple, "
   3225                 "not '%.200s'", Py_TYPE(args)->tp_name);
   3226             goto end;
   3227         }
   3228     }
   3229     else {
   3230         PyErr_Clear();
   3231         args = PyTuple_New(0);
   3232     }
   3233     if (args == NULL)
   3234         goto end;
   3235 
   3236     getstate = PyObject_GetAttrString(obj, "__getstate__");
   3237     if (getstate != NULL) {
   3238         state = PyObject_CallObject(getstate, NULL);
   3239         Py_DECREF(getstate);
   3240         if (state == NULL)
   3241             goto end;
   3242     }
   3243     else {
   3244         PyErr_Clear();
   3245         state = PyObject_GetAttrString(obj, "__dict__");
   3246         if (state == NULL) {
   3247             PyErr_Clear();
   3248             state = Py_None;
   3249             Py_INCREF(state);
   3250         }
   3251         names = slotnames(cls);
   3252         if (names == NULL)
   3253             goto end;
   3254         if (names != Py_None) {
   3255             assert(PyList_Check(names));
   3256             slots = PyDict_New();
   3257             if (slots == NULL)
   3258                 goto end;
   3259             n = 0;
   3260             /* Can't pre-compute the list size; the list
   3261                is stored on the class so accessible to other
   3262                threads, which may be run by DECREF */
   3263             for (i = 0; i < PyList_GET_SIZE(names); i++) {
   3264                 PyObject *name, *value;
   3265                 name = PyList_GET_ITEM(names, i);
   3266                 value = PyObject_GetAttr(obj, name);
   3267                 if (value == NULL)
   3268                     PyErr_Clear();
   3269                 else {
   3270                     int err = PyDict_SetItem(slots, name,
   3271                                              value);
   3272                     Py_DECREF(value);
   3273                     if (err)
   3274                         goto end;
   3275                     n++;
   3276                 }
   3277             }
   3278             if (n) {
   3279                 state = Py_BuildValue("(NO)", state, slots);
   3280                 if (state == NULL)
   3281                     goto end;
   3282             }
   3283         }
   3284     }
   3285 
   3286     if (!PyList_Check(obj)) {
   3287         listitems = Py_None;
   3288         Py_INCREF(listitems);
   3289     }
   3290     else {
   3291         listitems = PyObject_GetIter(obj);
   3292         if (listitems == NULL)
   3293             goto end;
   3294     }
   3295 
   3296     if (!PyDict_Check(obj)) {
   3297         dictitems = Py_None;
   3298         Py_INCREF(dictitems);
   3299     }
   3300     else {
   3301         dictitems = PyObject_CallMethod(obj, "iteritems", "");
   3302         if (dictitems == NULL)
   3303             goto end;
   3304     }
   3305 
   3306     copyreg = import_copyreg();
   3307     if (copyreg == NULL)
   3308         goto end;
   3309     newobj = PyObject_GetAttrString(copyreg, "__newobj__");
   3310     if (newobj == NULL)
   3311         goto end;
   3312 
   3313     n = PyTuple_GET_SIZE(args);
   3314     args2 = PyTuple_New(n+1);
   3315     if (args2 == NULL)
   3316         goto end;
   3317     PyTuple_SET_ITEM(args2, 0, cls);
   3318     cls = NULL;
   3319     for (i = 0; i < n; i++) {
   3320         PyObject *v = PyTuple_GET_ITEM(args, i);
   3321         Py_INCREF(v);
   3322         PyTuple_SET_ITEM(args2, i+1, v);
   3323     }
   3324 
   3325     res = PyTuple_Pack(5, newobj, args2, state, listitems, dictitems);
   3326 
   3327   end:
   3328     Py_XDECREF(cls);
   3329     Py_XDECREF(args);
   3330     Py_XDECREF(args2);
   3331     Py_XDECREF(slots);
   3332     Py_XDECREF(state);
   3333     Py_XDECREF(names);
   3334     Py_XDECREF(listitems);
   3335     Py_XDECREF(dictitems);
   3336     Py_XDECREF(copyreg);
   3337     Py_XDECREF(newobj);
   3338     return res;
   3339 }
   3340 
   3341 /*
   3342  * There were two problems when object.__reduce__ and object.__reduce_ex__
   3343  * were implemented in the same function:
   3344  *  - trying to pickle an object with a custom __reduce__ method that
   3345  *    fell back to object.__reduce__ in certain circumstances led to
   3346  *    infinite recursion at Python level and eventual RuntimeError.
   3347  *  - Pickling objects that lied about their type by overwriting the
   3348  *    __class__ descriptor could lead to infinite recursion at C level
   3349  *    and eventual segfault.
   3350  *
   3351  * Because of backwards compatibility, the two methods still have to
   3352  * behave in the same way, even if this is not required by the pickle
   3353  * protocol. This common functionality was moved to the _common_reduce
   3354  * function.
   3355  */
   3356 static PyObject *
   3357 _common_reduce(PyObject *self, int proto)
   3358 {
   3359     PyObject *copyreg, *res;
   3360 
   3361     if (proto >= 2)
   3362         return reduce_2(self);
   3363 
   3364     copyreg = import_copyreg();
   3365     if (!copyreg)
   3366         return NULL;
   3367 
   3368     res = PyEval_CallMethod(copyreg, "_reduce_ex", "(Oi)", self, proto);
   3369     Py_DECREF(copyreg);
   3370 
   3371     return res;
   3372 }
   3373 
   3374 static PyObject *
   3375 object_reduce(PyObject *self, PyObject *args)
   3376 {
   3377     int proto = 0;
   3378 
   3379     if (!PyArg_ParseTuple(args, "|i:__reduce__", &proto))
   3380         return NULL;
   3381 
   3382     return _common_reduce(self, proto);
   3383 }
   3384 
   3385 static PyObject *
   3386 object_reduce_ex(PyObject *self, PyObject *args)
   3387 {
   3388     PyObject *reduce, *res;
   3389     int proto = 0;
   3390 
   3391     if (!PyArg_ParseTuple(args, "|i:__reduce_ex__", &proto))
   3392         return NULL;
   3393 
   3394     reduce = PyObject_GetAttrString(self, "__reduce__");
   3395     if (reduce == NULL)
   3396         PyErr_Clear();
   3397     else {
   3398         PyObject *cls, *clsreduce, *objreduce;
   3399         int override;
   3400         cls = PyObject_GetAttrString(self, "__class__");
   3401         if (cls == NULL) {
   3402             Py_DECREF(reduce);
   3403             return NULL;
   3404         }
   3405         clsreduce = PyObject_GetAttrString(cls, "__reduce__");
   3406         Py_DECREF(cls);
   3407         if (clsreduce == NULL) {
   3408             Py_DECREF(reduce);
   3409             return NULL;
   3410         }
   3411         objreduce = PyDict_GetItemString(PyBaseObject_Type.tp_dict,
   3412                                          "__reduce__");
   3413         override = (clsreduce != objreduce);
   3414         Py_DECREF(clsreduce);
   3415         if (override) {
   3416             res = PyObject_CallObject(reduce, NULL);
   3417             Py_DECREF(reduce);
   3418             return res;
   3419         }
   3420         else
   3421             Py_DECREF(reduce);
   3422     }
   3423 
   3424     return _common_reduce(self, proto);
   3425 }
   3426 
   3427 static PyObject *
   3428 object_subclasshook(PyObject *cls, PyObject *args)
   3429 {
   3430     Py_INCREF(Py_NotImplemented);
   3431     return Py_NotImplemented;
   3432 }
   3433 
   3434 PyDoc_STRVAR(object_subclasshook_doc,
   3435 "Abstract classes can override this to customize issubclass().\n"
   3436 "\n"
   3437 "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n"
   3438 "It should return True, False or NotImplemented.  If it returns\n"
   3439 "NotImplemented, the normal algorithm is used.  Otherwise, it\n"
   3440 "overrides the normal algorithm (and the outcome is cached).\n");
   3441 
   3442 /*
   3443    from PEP 3101, this code implements:
   3444 
   3445    class object:
   3446        def __format__(self, format_spec):
   3447        if isinstance(format_spec, str):
   3448            return format(str(self), format_spec)
   3449        elif isinstance(format_spec, unicode):
   3450            return format(unicode(self), format_spec)
   3451 */
   3452 static PyObject *
   3453 object_format(PyObject *self, PyObject *args)
   3454 {
   3455     PyObject *format_spec;
   3456     PyObject *self_as_str = NULL;
   3457     PyObject *result = NULL;
   3458     Py_ssize_t format_len;
   3459 
   3460     if (!PyArg_ParseTuple(args, "O:__format__", &format_spec))
   3461         return NULL;
   3462 #ifdef Py_USING_UNICODE
   3463     if (PyUnicode_Check(format_spec)) {
   3464         format_len = PyUnicode_GET_SIZE(format_spec);
   3465         self_as_str = PyObject_Unicode(self);
   3466     } else if (PyString_Check(format_spec)) {
   3467 #else
   3468     if (PyString_Check(format_spec)) {
   3469 #endif
   3470         format_len = PyString_GET_SIZE(format_spec);
   3471         self_as_str = PyObject_Str(self);
   3472     } else {
   3473         PyErr_SetString(PyExc_TypeError,
   3474                  "argument to __format__ must be unicode or str");
   3475         return NULL;
   3476     }
   3477 
   3478     if (self_as_str != NULL) {
   3479         /* Issue 7994: If we're converting to a string, we
   3480            should reject format specifications */
   3481         if (format_len > 0) {
   3482             if (PyErr_WarnEx(PyExc_PendingDeprecationWarning,
   3483              "object.__format__ with a non-empty format "
   3484              "string is deprecated", 1) < 0) {
   3485                 goto done;
   3486             }
   3487             /* Eventually this will become an error:
   3488             PyErr_Format(PyExc_TypeError,
   3489                "non-empty format string passed to object.__format__");
   3490             goto done;
   3491             */
   3492         }
   3493         result = PyObject_Format(self_as_str, format_spec);
   3494     }
   3495 
   3496 done:
   3497     Py_XDECREF(self_as_str);
   3498 
   3499     return result;
   3500 }
   3501 
   3502 static PyObject *
   3503 object_sizeof(PyObject *self, PyObject *args)
   3504 {
   3505     Py_ssize_t res, isize;
   3506 
   3507     res = 0;
   3508     isize = self->ob_type->tp_itemsize;
   3509     if (isize > 0)
   3510         res = Py_SIZE(self) * isize;
   3511     res += self->ob_type->tp_basicsize;
   3512 
   3513     return PyInt_FromSsize_t(res);
   3514 }
   3515 
   3516 static PyMethodDef object_methods[] = {
   3517     {"__reduce_ex__", object_reduce_ex, METH_VARARGS,
   3518      PyDoc_STR("helper for pickle")},
   3519     {"__reduce__", object_reduce, METH_VARARGS,
   3520      PyDoc_STR("helper for pickle")},
   3521     {"__subclasshook__", object_subclasshook, METH_CLASS | METH_VARARGS,
   3522      object_subclasshook_doc},
   3523     {"__format__", object_format, METH_VARARGS,
   3524      PyDoc_STR("default object formatter")},
   3525     {"__sizeof__", object_sizeof, METH_NOARGS,
   3526      PyDoc_STR("__sizeof__() -> int\nsize of object in memory, in bytes")},
   3527     {0}
   3528 };
   3529 
   3530 
   3531 PyTypeObject PyBaseObject_Type = {
   3532     PyVarObject_HEAD_INIT(&PyType_Type, 0)
   3533     "object",                                   /* tp_name */
   3534     sizeof(PyObject),                           /* tp_basicsize */
   3535     0,                                          /* tp_itemsize */
   3536     object_dealloc,                             /* tp_dealloc */
   3537     0,                                          /* tp_print */
   3538     0,                                          /* tp_getattr */
   3539     0,                                          /* tp_setattr */
   3540     0,                                          /* tp_compare */
   3541     object_repr,                                /* tp_repr */
   3542     0,                                          /* tp_as_number */
   3543     0,                                          /* tp_as_sequence */
   3544     0,                                          /* tp_as_mapping */
   3545     (hashfunc)_Py_HashPointer,                  /* tp_hash */
   3546     0,                                          /* tp_call */
   3547     object_str,                                 /* tp_str */
   3548     PyObject_GenericGetAttr,                    /* tp_getattro */
   3549     PyObject_GenericSetAttr,                    /* tp_setattro */
   3550     0,                                          /* tp_as_buffer */
   3551     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
   3552     PyDoc_STR("The most base type"),            /* tp_doc */
   3553     0,                                          /* tp_traverse */
   3554     0,                                          /* tp_clear */
   3555     0,                                          /* tp_richcompare */
   3556     0,                                          /* tp_weaklistoffset */
   3557     0,                                          /* tp_iter */
   3558     0,                                          /* tp_iternext */
   3559     object_methods,                             /* tp_methods */
   3560     0,                                          /* tp_members */
   3561     object_getsets,                             /* tp_getset */
   3562     0,                                          /* tp_base */
   3563     0,                                          /* tp_dict */
   3564     0,                                          /* tp_descr_get */
   3565     0,                                          /* tp_descr_set */
   3566     0,                                          /* tp_dictoffset */
   3567     object_init,                                /* tp_init */
   3568     PyType_GenericAlloc,                        /* tp_alloc */
   3569     object_new,                                 /* tp_new */
   3570     PyObject_Del,                               /* tp_free */
   3571 };
   3572 
   3573 
   3574 /* Initialize the __dict__ in a type object */
   3575 
   3576 static int
   3577 add_methods(PyTypeObject *type, PyMethodDef *meth)
   3578 {
   3579     PyObject *dict = type->tp_dict;
   3580 
   3581     for (; meth->ml_name != NULL; meth++) {
   3582         PyObject *descr;
   3583         int err;
   3584         if (PyDict_GetItemString(dict, meth->ml_name) &&
   3585             !(meth->ml_flags & METH_COEXIST))
   3586                 continue;
   3587         if (meth->ml_flags & METH_CLASS) {
   3588             if (meth->ml_flags & METH_STATIC) {
   3589                 PyErr_SetString(PyExc_ValueError,
   3590                      "method cannot be both class and static");
   3591                 return -1;
   3592             }
   3593             descr = PyDescr_NewClassMethod(type, meth);
   3594         }
   3595         else if (meth->ml_flags & METH_STATIC) {
   3596             PyObject *cfunc = PyCFunction_New(meth, NULL);
   3597             if (cfunc == NULL)
   3598                 return -1;
   3599             descr = PyStaticMethod_New(cfunc);
   3600             Py_DECREF(cfunc);
   3601         }
   3602         else {
   3603             descr = PyDescr_NewMethod(type, meth);
   3604         }
   3605         if (descr == NULL)
   3606             return -1;
   3607         err = PyDict_SetItemString(dict, meth->ml_name, descr);
   3608         Py_DECREF(descr);
   3609         if (err < 0)
   3610             return -1;
   3611     }
   3612     return 0;
   3613 }
   3614 
   3615 static int
   3616 add_members(PyTypeObject *type, PyMemberDef *memb)
   3617 {
   3618     PyObject *dict = type->tp_dict;
   3619 
   3620     for (; memb->name != NULL; memb++) {
   3621         PyObject *descr;
   3622         if (PyDict_GetItemString(dict, memb->name))
   3623             continue;
   3624         descr = PyDescr_NewMember(type, memb);
   3625         if (descr == NULL)
   3626             return -1;
   3627         if (PyDict_SetItemString(dict, memb->name, descr) < 0)
   3628             return -1;
   3629         Py_DECREF(descr);
   3630     }
   3631     return 0;
   3632 }
   3633 
   3634 static int
   3635 add_getset(PyTypeObject *type, PyGetSetDef *gsp)
   3636 {
   3637     PyObject *dict = type->tp_dict;
   3638 
   3639     for (; gsp->name != NULL; gsp++) {
   3640         PyObject *descr;
   3641         if (PyDict_GetItemString(dict, gsp->name))
   3642             continue;
   3643         descr = PyDescr_NewGetSet(type, gsp);
   3644 
   3645         if (descr == NULL)
   3646             return -1;
   3647         if (PyDict_SetItemString(dict, gsp->name, descr) < 0)
   3648             return -1;
   3649         Py_DECREF(descr);
   3650     }
   3651     return 0;
   3652 }
   3653 
   3654 #define BUFFER_FLAGS (Py_TPFLAGS_HAVE_GETCHARBUFFER | Py_TPFLAGS_HAVE_NEWBUFFER)
   3655 
   3656 static void
   3657 inherit_special(PyTypeObject *type, PyTypeObject *base)
   3658 {
   3659     Py_ssize_t oldsize, newsize;
   3660 
   3661     /* Special flag magic */
   3662     if (!type->tp_as_buffer && base->tp_as_buffer) {
   3663         type->tp_flags &= ~BUFFER_FLAGS;
   3664         type->tp_flags |=
   3665             base->tp_flags & BUFFER_FLAGS;
   3666     }
   3667     if (!type->tp_as_sequence && base->tp_as_sequence) {
   3668         type->tp_flags &= ~Py_TPFLAGS_HAVE_SEQUENCE_IN;
   3669         type->tp_flags |= base->tp_flags & Py_TPFLAGS_HAVE_SEQUENCE_IN;
   3670     }
   3671     if ((type->tp_flags & Py_TPFLAGS_HAVE_INPLACEOPS) !=
   3672         (base->tp_flags & Py_TPFLAGS_HAVE_INPLACEOPS)) {
   3673         if ((!type->tp_as_number && base->tp_as_number) ||
   3674             (!type->tp_as_sequence && base->tp_as_sequence)) {
   3675             type->tp_flags &= ~Py_TPFLAGS_HAVE_INPLACEOPS;
   3676             if (!type->tp_as_number && !type->tp_as_sequence) {
   3677                 type->tp_flags |= base->tp_flags &
   3678                     Py_TPFLAGS_HAVE_INPLACEOPS;
   3679             }
   3680         }
   3681         /* Wow */
   3682     }
   3683     if (!type->tp_as_number && base->tp_as_number) {
   3684         type->tp_flags &= ~Py_TPFLAGS_CHECKTYPES;
   3685         type->tp_flags |= base->tp_flags & Py_TPFLAGS_CHECKTYPES;
   3686     }
   3687 
   3688     /* Copying basicsize is connected to the GC flags */
   3689     oldsize = base->tp_basicsize;
   3690     newsize = type->tp_basicsize ? type->tp_basicsize : oldsize;
   3691     if (!(type->tp_flags & Py_TPFLAGS_HAVE_GC) &&
   3692         (base->tp_flags & Py_TPFLAGS_HAVE_GC) &&
   3693         (type->tp_flags & Py_TPFLAGS_HAVE_RICHCOMPARE/*GC slots exist*/) &&
   3694         (!type->tp_traverse && !type->tp_clear)) {
   3695         type->tp_flags |= Py_TPFLAGS_HAVE_GC;
   3696         if (type->tp_traverse == NULL)
   3697             type->tp_traverse = base->tp_traverse;
   3698         if (type->tp_clear == NULL)
   3699             type->tp_clear = base->tp_clear;
   3700     }
   3701     if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
   3702         /* The condition below could use some explanation.
   3703            It appears that tp_new is not inherited for static types
   3704            whose base class is 'object'; this seems to be a precaution
   3705            so that old extension types don't suddenly become
   3706            callable (object.__new__ wouldn't insure the invariants
   3707            that the extension type's own factory function ensures).
   3708            Heap types, of course, are under our control, so they do
   3709            inherit tp_new; static extension types that specify some
   3710            other built-in type as the default are considered
   3711            new-style-aware so they also inherit object.__new__. */
   3712         if (base != &PyBaseObject_Type ||
   3713             (type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
   3714             if (type->tp_new == NULL)
   3715                 type->tp_new = base->tp_new;
   3716         }
   3717     }
   3718     type->tp_basicsize = newsize;
   3719 
   3720     /* Copy other non-function slots */
   3721 
   3722 #undef COPYVAL
   3723 #define COPYVAL(SLOT) \
   3724     if (type->SLOT == 0) type->SLOT = base->SLOT
   3725 
   3726     COPYVAL(tp_itemsize);
   3727     if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_WEAKREFS) {
   3728         COPYVAL(tp_weaklistoffset);
   3729     }
   3730     if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
   3731         COPYVAL(tp_dictoffset);
   3732     }
   3733 
   3734     /* Setup fast subclass flags */
   3735     if (PyType_IsSubtype(base, (PyTypeObject*)PyExc_BaseException))
   3736         type->tp_flags |= Py_TPFLAGS_BASE_EXC_SUBCLASS;
   3737     else if (PyType_IsSubtype(base, &PyType_Type))
   3738         type->tp_flags |= Py_TPFLAGS_TYPE_SUBCLASS;
   3739     else if (PyType_IsSubtype(base, &PyInt_Type))
   3740         type->tp_flags |= Py_TPFLAGS_INT_SUBCLASS;
   3741     else if (PyType_IsSubtype(base, &PyLong_Type))
   3742         type->tp_flags |= Py_TPFLAGS_LONG_SUBCLASS;
   3743     else if (PyType_IsSubtype(base, &PyString_Type))
   3744         type->tp_flags |= Py_TPFLAGS_STRING_SUBCLASS;
   3745 #ifdef Py_USING_UNICODE
   3746     else if (PyType_IsSubtype(base, &PyUnicode_Type))
   3747         type->tp_flags |= Py_TPFLAGS_UNICODE_SUBCLASS;
   3748 #endif
   3749     else if (PyType_IsSubtype(base, &PyTuple_Type))
   3750         type->tp_flags |= Py_TPFLAGS_TUPLE_SUBCLASS;
   3751     else if (PyType_IsSubtype(base, &PyList_Type))
   3752         type->tp_flags |= Py_TPFLAGS_LIST_SUBCLASS;
   3753     else if (PyType_IsSubtype(base, &PyDict_Type))
   3754         type->tp_flags |= Py_TPFLAGS_DICT_SUBCLASS;
   3755 }
   3756 
   3757 static int
   3758 overrides_name(PyTypeObject *type, char *name)
   3759 {
   3760     PyObject *dict = type->tp_dict;
   3761 
   3762     assert(dict != NULL);
   3763     if (PyDict_GetItemString(dict, name) != NULL) {
   3764         return 1;
   3765     }
   3766     return 0;
   3767 }
   3768 
   3769 #define OVERRIDES_HASH(x)       overrides_name(x, "__hash__")
   3770 #define OVERRIDES_EQ(x)         overrides_name(x, "__eq__")
   3771 
   3772 static void
   3773 inherit_slots(PyTypeObject *type, PyTypeObject *base)
   3774 {
   3775     PyTypeObject *basebase;
   3776 
   3777 #undef SLOTDEFINED
   3778 #undef COPYSLOT
   3779 #undef COPYNUM
   3780 #undef COPYSEQ
   3781 #undef COPYMAP
   3782 #undef COPYBUF
   3783 
   3784 #define SLOTDEFINED(SLOT) \
   3785     (base->SLOT != 0 && \
   3786      (basebase == NULL || base->SLOT != basebase->SLOT))
   3787 
   3788 #define COPYSLOT(SLOT) \
   3789     if (!type->SLOT && SLOTDEFINED(SLOT)) type->SLOT = base->SLOT
   3790 
   3791 #define COPYNUM(SLOT) COPYSLOT(tp_as_number->SLOT)
   3792 #define COPYSEQ(SLOT) COPYSLOT(tp_as_sequence->SLOT)
   3793 #define COPYMAP(SLOT) COPYSLOT(tp_as_mapping->SLOT)
   3794 #define COPYBUF(SLOT) COPYSLOT(tp_as_buffer->SLOT)
   3795 
   3796     /* This won't inherit indirect slots (from tp_as_number etc.)
   3797        if type doesn't provide the space. */
   3798 
   3799     if (type->tp_as_number != NULL && base->tp_as_number != NULL) {
   3800         basebase = base->tp_base;
   3801         if (basebase->tp_as_number == NULL)
   3802             basebase = NULL;
   3803         COPYNUM(nb_add);
   3804         COPYNUM(nb_subtract);
   3805         COPYNUM(nb_multiply);
   3806         COPYNUM(nb_divide);
   3807         COPYNUM(nb_remainder);
   3808         COPYNUM(nb_divmod);
   3809         COPYNUM(nb_power);
   3810         COPYNUM(nb_negative);
   3811         COPYNUM(nb_positive);
   3812         COPYNUM(nb_absolute);
   3813         COPYNUM(nb_nonzero);
   3814         COPYNUM(nb_invert);
   3815         COPYNUM(nb_lshift);
   3816         COPYNUM(nb_rshift);
   3817         COPYNUM(nb_and);
   3818         COPYNUM(nb_xor);
   3819         COPYNUM(nb_or);
   3820         COPYNUM(nb_coerce);
   3821         COPYNUM(nb_int);
   3822         COPYNUM(nb_long);
   3823         COPYNUM(nb_float);
   3824         COPYNUM(nb_oct);
   3825         COPYNUM(nb_hex);
   3826         COPYNUM(nb_inplace_add);
   3827         COPYNUM(nb_inplace_subtract);
   3828         COPYNUM(nb_inplace_multiply);
   3829         COPYNUM(nb_inplace_divide);
   3830         COPYNUM(nb_inplace_remainder);
   3831         COPYNUM(nb_inplace_power);
   3832         COPYNUM(nb_inplace_lshift);
   3833         COPYNUM(nb_inplace_rshift);
   3834         COPYNUM(nb_inplace_and);
   3835         COPYNUM(nb_inplace_xor);
   3836         COPYNUM(nb_inplace_or);
   3837         if (base->tp_flags & Py_TPFLAGS_CHECKTYPES) {
   3838             COPYNUM(nb_true_divide);
   3839             COPYNUM(nb_floor_divide);
   3840             COPYNUM(nb_inplace_true_divide);
   3841             COPYNUM(nb_inplace_floor_divide);
   3842         }
   3843         if (base->tp_flags & Py_TPFLAGS_HAVE_INDEX) {
   3844             COPYNUM(nb_index);
   3845         }
   3846     }
   3847 
   3848     if (type->tp_as_sequence != NULL && base->tp_as_sequence != NULL) {
   3849         basebase = base->tp_base;
   3850         if (basebase->tp_as_sequence == NULL)
   3851             basebase = NULL;
   3852         COPYSEQ(sq_length);
   3853         COPYSEQ(sq_concat);
   3854         COPYSEQ(sq_repeat);
   3855         COPYSEQ(sq_item);
   3856         COPYSEQ(sq_slice);
   3857         COPYSEQ(sq_ass_item);
   3858         COPYSEQ(sq_ass_slice);
   3859         COPYSEQ(sq_contains);
   3860         COPYSEQ(sq_inplace_concat);
   3861         COPYSEQ(sq_inplace_repeat);
   3862     }
   3863 
   3864     if (type->tp_as_mapping != NULL && base->tp_as_mapping != NULL) {
   3865         basebase = base->tp_base;
   3866         if (basebase->tp_as_mapping == NULL)
   3867             basebase = NULL;
   3868         COPYMAP(mp_length);
   3869         COPYMAP(mp_subscript);
   3870         COPYMAP(mp_ass_subscript);
   3871     }
   3872 
   3873     if (type->tp_as_buffer != NULL && base->tp_as_buffer != NULL) {
   3874         basebase = base->tp_base;
   3875         if (basebase->tp_as_buffer == NULL)
   3876             basebase = NULL;
   3877         COPYBUF(bf_getreadbuffer);
   3878         COPYBUF(bf_getwritebuffer);
   3879         COPYBUF(bf_getsegcount);
   3880         COPYBUF(bf_getcharbuffer);
   3881         COPYBUF(bf_getbuffer);
   3882         COPYBUF(bf_releasebuffer);
   3883     }
   3884 
   3885     basebase = base->tp_base;
   3886 
   3887     COPYSLOT(tp_dealloc);
   3888     COPYSLOT(tp_print);
   3889     if (type->tp_getattr == NULL && type->tp_getattro == NULL) {
   3890         type->tp_getattr = base->tp_getattr;
   3891         type->tp_getattro = base->tp_getattro;
   3892     }
   3893     if (type->tp_setattr == NULL && type->tp_setattro == NULL) {
   3894         type->tp_setattr = base->tp_setattr;
   3895         type->tp_setattro = base->tp_setattro;
   3896     }
   3897     /* tp_compare see tp_richcompare */
   3898     COPYSLOT(tp_repr);
   3899     /* tp_hash see tp_richcompare */
   3900     COPYSLOT(tp_call);
   3901     COPYSLOT(tp_str);
   3902     if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_RICHCOMPARE) {
   3903         if (type->tp_compare == NULL &&
   3904             type->tp_richcompare == NULL &&
   3905             type->tp_hash == NULL)
   3906         {
   3907             type->tp_compare = base->tp_compare;
   3908             type->tp_richcompare = base->tp_richcompare;
   3909             type->tp_hash = base->tp_hash;
   3910             /* Check for changes to inherited methods in Py3k*/
   3911             if (Py_Py3kWarningFlag) {
   3912                 if (base->tp_hash &&
   3913                                 (base->tp_hash != PyObject_HashNotImplemented) &&
   3914                                 !OVERRIDES_HASH(type)) {
   3915                     if (OVERRIDES_EQ(type)) {
   3916                         if (PyErr_WarnPy3k("Overriding "
   3917                                            "__eq__ blocks inheritance "
   3918                                            "of __hash__ in 3.x",
   3919                                            1) < 0)
   3920                             /* XXX This isn't right.  If the warning is turned
   3921                                into an exception, we should be communicating
   3922                                the error back to the caller, but figuring out
   3923                                how to clean up in that case is tricky.  See
   3924                                issue 8627 for more. */
   3925                             PyErr_Clear();
   3926                     }
   3927                 }
   3928             }
   3929         }
   3930     }
   3931     else {
   3932         COPYSLOT(tp_compare);
   3933     }
   3934     if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_ITER) {
   3935         COPYSLOT(tp_iter);
   3936         COPYSLOT(tp_iternext);
   3937     }
   3938     if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
   3939         COPYSLOT(tp_descr_get);
   3940         COPYSLOT(tp_descr_set);
   3941         COPYSLOT(tp_dictoffset);
   3942         COPYSLOT(tp_init);
   3943         COPYSLOT(tp_alloc);
   3944         COPYSLOT(tp_is_gc);
   3945         if ((type->tp_flags & Py_TPFLAGS_HAVE_GC) ==
   3946             (base->tp_flags & Py_TPFLAGS_HAVE_GC)) {
   3947             /* They agree about gc. */
   3948             COPYSLOT(tp_free);
   3949         }
   3950         else if ((type->tp_flags & Py_TPFLAGS_HAVE_GC) &&
   3951                  type->tp_free == NULL &&
   3952                  base->tp_free == _PyObject_Del) {
   3953             /* A bit of magic to plug in the correct default
   3954              * tp_free function when a derived class adds gc,
   3955              * didn't define tp_free, and the base uses the
   3956              * default non-gc tp_free.
   3957              */
   3958             type->tp_free = PyObject_GC_Del;
   3959         }
   3960         /* else they didn't agree about gc, and there isn't something
   3961          * obvious to be done -- the type is on its own.
   3962          */
   3963     }
   3964 }
   3965 
   3966 static int add_operators(PyTypeObject *);
   3967 
   3968 int
   3969 PyType_Ready(PyTypeObject *type)
   3970 {
   3971     PyObject *dict, *bases;
   3972     PyTypeObject *base;
   3973     Py_ssize_t i, n;
   3974 
   3975     if (type->tp_flags & Py_TPFLAGS_READY) {
   3976         assert(type->tp_dict != NULL);
   3977         return 0;
   3978     }
   3979     assert((type->tp_flags & Py_TPFLAGS_READYING) == 0);
   3980 
   3981     type->tp_flags |= Py_TPFLAGS_READYING;
   3982 
   3983 #ifdef Py_TRACE_REFS
   3984     /* PyType_Ready is the closest thing we have to a choke point
   3985      * for type objects, so is the best place I can think of to try
   3986      * to get type objects into the doubly-linked list of all objects.
   3987      * Still, not all type objects go thru PyType_Ready.
   3988      */
   3989     _Py_AddToAllObjects((PyObject *)type, 0);
   3990 #endif
   3991 
   3992     /* Initialize tp_base (defaults to BaseObject unless that's us) */
   3993     base = type->tp_base;
   3994     if (base == NULL && type != &PyBaseObject_Type) {
   3995         base = type->tp_base = &PyBaseObject_Type;
   3996         Py_INCREF(base);
   3997     }
   3998 
   3999     /* Now the only way base can still be NULL is if type is
   4000      * &PyBaseObject_Type.
   4001      */
   4002 
   4003     /* Initialize the base class */
   4004     if (base && base->tp_dict == NULL) {
   4005         if (PyType_Ready(base) < 0)
   4006             goto error;
   4007     }
   4008 
   4009     /* Initialize ob_type if NULL.      This means extensions that want to be
   4010        compilable separately on Windows can call PyType_Ready() instead of
   4011        initializing the ob_type field of their type objects. */
   4012     /* The test for base != NULL is really unnecessary, since base is only
   4013        NULL when type is &PyBaseObject_Type, and we know its ob_type is
   4014        not NULL (it's initialized to &PyType_Type).      But coverity doesn't
   4015        know that. */
   4016     if (Py_TYPE(type) == NULL && base != NULL)
   4017         Py_TYPE(type) = Py_TYPE(base);
   4018 
   4019     /* Initialize tp_bases */
   4020     bases = type->tp_bases;
   4021     if (bases == NULL) {
   4022         if (base == NULL)
   4023             bases = PyTuple_New(0);
   4024         else
   4025             bases = PyTuple_Pack(1, base);
   4026         if (bases == NULL)
   4027             goto error;
   4028         type->tp_bases = bases;
   4029     }
   4030 
   4031     /* Initialize tp_dict */
   4032     dict = type->tp_dict;
   4033     if (dict == NULL) {
   4034         dict = PyDict_New();
   4035         if (dict == NULL)
   4036             goto error;
   4037         type->tp_dict = dict;
   4038     }
   4039 
   4040     /* Add type-specific descriptors to tp_dict */
   4041     if (add_operators(type) < 0)
   4042         goto error;
   4043     if (type->tp_methods != NULL) {
   4044         if (add_methods(type, type->tp_methods) < 0)
   4045             goto error;
   4046     }
   4047     if (type->tp_members != NULL) {
   4048         if (add_members(type, type->tp_members) < 0)
   4049             goto error;
   4050     }
   4051     if (type->tp_getset != NULL) {
   4052         if (add_getset(type, type->tp_getset) < 0)
   4053             goto error;
   4054     }
   4055 
   4056     /* Calculate method resolution order */
   4057     if (mro_internal(type) < 0) {
   4058         goto error;
   4059     }
   4060 
   4061     /* Inherit special flags from dominant base */
   4062     if (type->tp_base != NULL)
   4063         inherit_special(type, type->tp_base);
   4064 
   4065     /* Initialize tp_dict properly */
   4066     bases = type->tp_mro;
   4067     assert(bases != NULL);
   4068     assert(PyTuple_Check(bases));
   4069     n = PyTuple_GET_SIZE(bases);
   4070     for (i = 1; i < n; i++) {
   4071         PyObject *b = PyTuple_GET_ITEM(bases, i);
   4072         if (PyType_Check(b))
   4073             inherit_slots(type, (PyTypeObject *)b);
   4074     }
   4075 
   4076     /* All bases of statically allocated type should be statically allocated */
   4077     if (Py_Py3kWarningFlag && !(type->tp_flags & Py_TPFLAGS_HEAPTYPE))
   4078         for (i = 0; i < n; i++) {
   4079             PyObject *b = PyTuple_GET_ITEM(bases, i);
   4080             if (PyType_Check(b) &&
   4081                 (((PyTypeObject *)b)->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
   4082                 char buf[300];
   4083                 PyOS_snprintf(buf, sizeof(buf),
   4084                               "type '%.100s' is not dynamically allocated but "
   4085                               "its base type '%.100s' is dynamically allocated",
   4086                               type->tp_name, ((PyTypeObject *)b)->tp_name);
   4087                 if (PyErr_WarnPy3k(buf, 1) < 0)
   4088                     goto error;
   4089                 break;
   4090             }
   4091         }
   4092 
   4093     /* Sanity check for tp_free. */
   4094     if (PyType_IS_GC(type) && (type->tp_flags & Py_TPFLAGS_BASETYPE) &&
   4095         (type->tp_free == NULL || type->tp_free == PyObject_Del)) {
   4096         /* This base class needs to call tp_free, but doesn't have
   4097          * one, or its tp_free is for non-gc'ed objects.
   4098          */
   4099         PyErr_Format(PyExc_TypeError, "type '%.100s' participates in "
   4100                      "gc and is a base type but has inappropriate "
   4101                      "tp_free slot",
   4102                      type->tp_name);
   4103         goto error;
   4104     }
   4105 
   4106     /* if the type dictionary doesn't contain a __doc__, set it from
   4107        the tp_doc slot.
   4108      */
   4109     if (PyDict_GetItemString(type->tp_dict, "__doc__") == NULL) {
   4110         if (type->tp_doc != NULL) {
   4111             PyObject *doc = PyString_FromString(type->tp_doc);
   4112             if (doc == NULL)
   4113                 goto error;
   4114             PyDict_SetItemString(type->tp_dict, "__doc__", doc);
   4115             Py_DECREF(doc);
   4116         } else {
   4117             PyDict_SetItemString(type->tp_dict,
   4118                                  "__doc__", Py_None);
   4119         }
   4120     }
   4121 
   4122     /* Some more special stuff */
   4123     base = type->tp_base;
   4124     if (base != NULL) {
   4125         if (type->tp_as_number == NULL)
   4126             type->tp_as_number = base->tp_as_number;
   4127         if (type->tp_as_sequence == NULL)
   4128             type->tp_as_sequence = base->tp_as_sequence;
   4129         if (type->tp_as_mapping == NULL)
   4130             type->tp_as_mapping = base->tp_as_mapping;
   4131         if (type->tp_as_buffer == NULL)
   4132             type->tp_as_buffer = base->tp_as_buffer;
   4133     }
   4134 
   4135     /* Link into each base class's list of subclasses */
   4136     bases = type->tp_bases;
   4137     n = PyTuple_GET_SIZE(bases);
   4138     for (i = 0; i < n; i++) {
   4139         PyObject *b = PyTuple_GET_ITEM(bases, i);
   4140         if (PyType_Check(b) &&
   4141             add_subclass((PyTypeObject *)b, type) < 0)
   4142             goto error;
   4143     }
   4144 
   4145     /* All done -- set the ready flag */
   4146     assert(type->tp_dict != NULL);
   4147     type->tp_flags =
   4148         (type->tp_flags & ~Py_TPFLAGS_READYING) | Py_TPFLAGS_READY;
   4149     return 0;
   4150 
   4151   error:
   4152     type->tp_flags &= ~Py_TPFLAGS_READYING;
   4153     return -1;
   4154 }
   4155 
   4156 static int
   4157 add_subclass(PyTypeObject *base, PyTypeObject *type)
   4158 {
   4159     Py_ssize_t i;
   4160     int result;
   4161     PyObject *list, *ref, *newobj;
   4162 
   4163     list = base->tp_subclasses;
   4164     if (list == NULL) {
   4165         base->tp_subclasses = list = PyList_New(0);
   4166         if (list == NULL)
   4167             return -1;
   4168     }
   4169     assert(PyList_Check(list));
   4170     newobj = PyWeakref_NewRef((PyObject *)type, NULL);
   4171     i = PyList_GET_SIZE(list);
   4172     while (--i >= 0) {
   4173         ref = PyList_GET_ITEM(list, i);
   4174         assert(PyWeakref_CheckRef(ref));
   4175         if (PyWeakref_GET_OBJECT(ref) == Py_None)
   4176             return PyList_SetItem(list, i, newobj);
   4177     }
   4178     result = PyList_Append(list, newobj);
   4179     Py_DECREF(newobj);
   4180     return result;
   4181 }
   4182 
   4183 static void
   4184 remove_subclass(PyTypeObject *base, PyTypeObject *type)
   4185 {
   4186     Py_ssize_t i;
   4187     PyObject *list, *ref;
   4188 
   4189     list = base->tp_subclasses;
   4190     if (list == NULL) {
   4191         return;
   4192     }
   4193     assert(PyList_Check(list));
   4194     i = PyList_GET_SIZE(list);
   4195     while (--i >= 0) {
   4196         ref = PyList_GET_ITEM(list, i);
   4197         assert(PyWeakref_CheckRef(ref));
   4198         if (PyWeakref_GET_OBJECT(ref) == (PyObject*)type) {
   4199             /* this can't fail, right? */
   4200             PySequence_DelItem(list, i);
   4201             return;
   4202         }
   4203     }
   4204 }
   4205 
   4206 static int
   4207 check_num_args(PyObject *ob, int n)
   4208 {
   4209     if (!PyTuple_CheckExact(ob)) {
   4210         PyErr_SetString(PyExc_SystemError,
   4211             "PyArg_UnpackTuple() argument list is not a tuple");
   4212         return 0;
   4213     }
   4214     if (n == PyTuple_GET_SIZE(ob))
   4215         return 1;
   4216     PyErr_Format(
   4217         PyExc_TypeError,
   4218         "expected %d arguments, got %zd", n, PyTuple_GET_SIZE(ob));
   4219     return 0;
   4220 }
   4221 
   4222 /* Generic wrappers for overloadable 'operators' such as __getitem__ */
   4223 
   4224 /* There's a wrapper *function* for each distinct function typedef used
   4225    for type object slots (e.g. binaryfunc, ternaryfunc, etc.).  There's a
   4226    wrapper *table* for each distinct operation (e.g. __len__, __add__).
   4227    Most tables have only one entry; the tables for binary operators have two
   4228    entries, one regular and one with reversed arguments. */
   4229 
   4230 static PyObject *
   4231 wrap_lenfunc(PyObject *self, PyObject *args, void *wrapped)
   4232 {
   4233     lenfunc func = (lenfunc)wrapped;
   4234     Py_ssize_t res;
   4235 
   4236     if (!check_num_args(args, 0))
   4237         return NULL;
   4238     res = (*func)(self);
   4239     if (res == -1 && PyErr_Occurred())
   4240         return NULL;
   4241     return PyInt_FromLong((long)res);
   4242 }
   4243 
   4244 static PyObject *
   4245 wrap_inquirypred(PyObject *self, PyObject *args, void *wrapped)
   4246 {
   4247     inquiry func = (inquiry)wrapped;
   4248     int res;
   4249 
   4250     if (!check_num_args(args, 0))
   4251         return NULL;
   4252     res = (*func)(self);
   4253     if (res == -1 && PyErr_Occurred())
   4254         return NULL;
   4255     return PyBool_FromLong((long)res);
   4256 }
   4257 
   4258 static PyObject *
   4259 wrap_binaryfunc(PyObject *self, PyObject *args, void *wrapped)
   4260 {
   4261     binaryfunc func = (binaryfunc)wrapped;
   4262     PyObject *other;
   4263 
   4264     if (!check_num_args(args, 1))
   4265         return NULL;
   4266     other = PyTuple_GET_ITEM(args, 0);
   4267     return (*func)(self, other);
   4268 }
   4269 
   4270 static PyObject *
   4271 wrap_binaryfunc_l(PyObject *self, PyObject *args, void *wrapped)
   4272 {
   4273     binaryfunc func = (binaryfunc)wrapped;
   4274     PyObject *other;
   4275 
   4276     if (!check_num_args(args, 1))
   4277         return NULL;
   4278     other = PyTuple_GET_ITEM(args, 0);
   4279     if (!(self->ob_type->tp_flags & Py_TPFLAGS_CHECKTYPES) &&
   4280         !PyType_IsSubtype(other->ob_type, self->ob_type)) {
   4281         Py_INCREF(Py_NotImplemented);
   4282         return Py_NotImplemented;
   4283     }
   4284     return (*func)(self, other);
   4285 }
   4286 
   4287 static PyObject *
   4288 wrap_binaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
   4289 {
   4290     binaryfunc func = (binaryfunc)wrapped;
   4291     PyObject *other;
   4292 
   4293     if (!check_num_args(args, 1))
   4294         return NULL;
   4295     other = PyTuple_GET_ITEM(args, 0);
   4296     if (!(self->ob_type->tp_flags & Py_TPFLAGS_CHECKTYPES) &&
   4297         !PyType_IsSubtype(other->ob_type, self->ob_type)) {
   4298         Py_INCREF(Py_NotImplemented);
   4299         return Py_NotImplemented;
   4300     }
   4301     return (*func)(other, self);
   4302 }
   4303 
   4304 static PyObject *
   4305 wrap_coercefunc(PyObject *self, PyObject *args, void *wrapped)
   4306 {
   4307     coercion func = (coercion)wrapped;
   4308     PyObject *other, *res;
   4309     int ok;
   4310 
   4311     if (!check_num_args(args, 1))
   4312         return NULL;
   4313     other = PyTuple_GET_ITEM(args, 0);
   4314     ok = func(&self, &other);
   4315     if (ok < 0)
   4316         return NULL;
   4317     if (ok > 0) {
   4318         Py_INCREF(Py_NotImplemented);
   4319         return Py_NotImplemented;
   4320     }
   4321     res = PyTuple_New(2);
   4322     if (res == NULL) {
   4323         Py_DECREF(self);
   4324         Py_DECREF(other);
   4325         return NULL;
   4326     }
   4327     PyTuple_SET_ITEM(res, 0, self);
   4328     PyTuple_SET_ITEM(res, 1, other);
   4329     return res;
   4330 }
   4331 
   4332 static PyObject *
   4333 wrap_ternaryfunc(PyObject *self, PyObject *args, void *wrapped)
   4334 {
   4335     ternaryfunc func = (ternaryfunc)wrapped;
   4336     PyObject *other;
   4337     PyObject *third = Py_None;
   4338 
   4339     /* Note: This wrapper only works for __pow__() */
   4340 
   4341     if (!PyArg_UnpackTuple(args, "", 1, 2, &other, &third))
   4342         return NULL;
   4343     return (*func)(self, other, third);
   4344 }
   4345 
   4346 static PyObject *
   4347 wrap_ternaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
   4348 {
   4349     ternaryfunc func = (ternaryfunc)wrapped;
   4350     PyObject *other;
   4351     PyObject *third = Py_None;
   4352 
   4353     /* Note: This wrapper only works for __pow__() */
   4354 
   4355     if (!PyArg_UnpackTuple(args, "", 1, 2, &other, &third))
   4356         return NULL;
   4357     return (*func)(other, self, third);
   4358 }
   4359 
   4360 static PyObject *
   4361 wrap_unaryfunc(PyObject *self, PyObject *args, void *wrapped)
   4362 {
   4363     unaryfunc func = (unaryfunc)wrapped;
   4364 
   4365     if (!check_num_args(args, 0))
   4366         return NULL;
   4367     return (*func)(self);
   4368 }
   4369 
   4370 static PyObject *
   4371 wrap_indexargfunc(PyObject *self, PyObject *args, void *wrapped)
   4372 {
   4373     ssizeargfunc func = (ssizeargfunc)wrapped;
   4374     PyObject* o;
   4375     Py_ssize_t i;
   4376 
   4377     if (!PyArg_UnpackTuple(args, "", 1, 1, &o))
   4378         return NULL;
   4379     i = PyNumber_AsSsize_t(o, PyExc_OverflowError);
   4380     if (i == -1 && PyErr_Occurred())
   4381         return NULL;
   4382     return (*func)(self, i);
   4383 }
   4384 
   4385 static Py_ssize_t
   4386 getindex(PyObject *self, PyObject *arg)
   4387 {
   4388     Py_ssize_t i;
   4389 
   4390     i = PyNumber_AsSsize_t(arg, PyExc_OverflowError);
   4391     if (i == -1 && PyErr_Occurred())
   4392         return -1;
   4393     if (i < 0) {
   4394         PySequenceMethods *sq = Py_TYPE(self)->tp_as_sequence;
   4395         if (sq && sq->sq_length) {
   4396             Py_ssize_t n = (*sq->sq_length)(self);
   4397             if (n < 0)
   4398                 return -1;
   4399             i += n;
   4400         }
   4401     }
   4402     return i;
   4403 }
   4404 
   4405 static PyObject *
   4406 wrap_sq_item(PyObject *self, PyObject *args, void *wrapped)
   4407 {
   4408     ssizeargfunc func = (ssizeargfunc)wrapped;
   4409     PyObject *arg;
   4410     Py_ssize_t i;
   4411 
   4412     if (PyTuple_GET_SIZE(args) == 1) {
   4413         arg = PyTuple_GET_ITEM(args, 0);
   4414         i = getindex(self, arg);
   4415         if (i == -1 && PyErr_Occurred())
   4416             return NULL;
   4417         return (*func)(self, i);
   4418     }
   4419     check_num_args(args, 1);
   4420     assert(PyErr_Occurred());
   4421     return NULL;
   4422 }
   4423 
   4424 static PyObject *
   4425 wrap_ssizessizeargfunc(PyObject *self, PyObject *args, void *wrapped)
   4426 {
   4427     ssizessizeargfunc func = (ssizessizeargfunc)wrapped;
   4428     Py_ssize_t i, j;
   4429 
   4430     if (!PyArg_ParseTuple(args, "nn", &i, &j))
   4431         return NULL;
   4432     return (*func)(self, i, j);
   4433 }
   4434 
   4435 static PyObject *
   4436 wrap_sq_setitem(PyObject *self, PyObject *args, void *wrapped)
   4437 {
   4438     ssizeobjargproc func = (ssizeobjargproc)wrapped;
   4439     Py_ssize_t i;
   4440     int res;
   4441     PyObject *arg, *value;
   4442 
   4443     if (!PyArg_UnpackTuple(args, "", 2, 2, &arg, &value))
   4444         return NULL;
   4445     i = getindex(self, arg);
   4446     if (i == -1 && PyErr_Occurred())
   4447         return NULL;
   4448     res = (*func)(self, i, value);
   4449     if (res == -1 && PyErr_Occurred())
   4450         return NULL;
   4451     Py_INCREF(Py_None);
   4452     return Py_None;
   4453 }
   4454 
   4455 static PyObject *
   4456 wrap_sq_delitem(PyObject *self, PyObject *args, void *wrapped)
   4457 {
   4458     ssizeobjargproc func = (ssizeobjargproc)wrapped;
   4459     Py_ssize_t i;
   4460     int res;
   4461     PyObject *arg;
   4462 
   4463     if (!check_num_args(args, 1))
   4464         return NULL;
   4465     arg = PyTuple_GET_ITEM(args, 0);
   4466     i = getindex(self, arg);
   4467     if (i == -1 && PyErr_Occurred())
   4468         return NULL;
   4469     res = (*func)(self, i, NULL);
   4470     if (res == -1 && PyErr_Occurred())
   4471         return NULL;
   4472     Py_INCREF(Py_None);
   4473     return Py_None;
   4474 }
   4475 
   4476 static PyObject *
   4477 wrap_ssizessizeobjargproc(PyObject *self, PyObject *args, void *wrapped)
   4478 {
   4479     ssizessizeobjargproc func = (ssizessizeobjargproc)wrapped;
   4480     Py_ssize_t i, j;
   4481     int res;
   4482     PyObject *value;
   4483 
   4484     if (!PyArg_ParseTuple(args, "nnO", &i, &j, &value))
   4485         return NULL;
   4486     res = (*func)(self, i, j, value);
   4487     if (res == -1 && PyErr_Occurred())
   4488         return NULL;
   4489     Py_INCREF(Py_None);
   4490     return Py_None;
   4491 }
   4492 
   4493 static PyObject *
   4494 wrap_delslice(PyObject *self, PyObject *args, void *wrapped)
   4495 {
   4496     ssizessizeobjargproc func = (ssizessizeobjargproc)wrapped;
   4497     Py_ssize_t i, j;
   4498     int res;
   4499 
   4500     if (!PyArg_ParseTuple(args, "nn", &i, &j))
   4501         return NULL;
   4502     res = (*func)(self, i, j, NULL);
   4503     if (res == -1 && PyErr_Occurred())
   4504         return NULL;
   4505     Py_INCREF(Py_None);
   4506     return Py_None;
   4507 }
   4508 
   4509 /* XXX objobjproc is a misnomer; should be objargpred */
   4510 static PyObject *
   4511 wrap_objobjproc(PyObject *self, PyObject *args, void *wrapped)
   4512 {
   4513     objobjproc func = (objobjproc)wrapped;
   4514     int res;
   4515     PyObject *value;
   4516 
   4517     if (!check_num_args(args, 1))
   4518         return NULL;
   4519     value = PyTuple_GET_ITEM(args, 0);
   4520     res = (*func)(self, value);
   4521     if (res == -1 && PyErr_Occurred())
   4522         return NULL;
   4523     else
   4524         return PyBool_FromLong(res);
   4525 }
   4526 
   4527 static PyObject *
   4528 wrap_objobjargproc(PyObject *self, PyObject *args, void *wrapped)
   4529 {
   4530     objobjargproc func = (objobjargproc)wrapped;
   4531     int res;
   4532     PyObject *key, *value;
   4533 
   4534     if (!PyArg_UnpackTuple(args, "", 2, 2, &key, &value))
   4535         return NULL;
   4536     res = (*func)(self, key, value);
   4537     if (res == -1 && PyErr_Occurred())
   4538         return NULL;
   4539     Py_INCREF(Py_None);
   4540     return Py_None;
   4541 }
   4542 
   4543 static PyObject *
   4544 wrap_delitem(PyObject *self, PyObject *args, void *wrapped)
   4545 {
   4546     objobjargproc func = (objobjargproc)wrapped;
   4547     int res;
   4548     PyObject *key;
   4549 
   4550     if (!check_num_args(args, 1))
   4551         return NULL;
   4552     key = PyTuple_GET_ITEM(args, 0);
   4553     res = (*func)(self, key, NULL);
   4554     if (res == -1 && PyErr_Occurred())
   4555         return NULL;
   4556     Py_INCREF(Py_None);
   4557     return Py_None;
   4558 }
   4559 
   4560 static PyObject *
   4561 wrap_cmpfunc(PyObject *self, PyObject *args, void *wrapped)
   4562 {
   4563     cmpfunc func = (cmpfunc)wrapped;
   4564     int res;
   4565     PyObject *other;
   4566 
   4567     if (!check_num_args(args, 1))
   4568         return NULL;
   4569     other = PyTuple_GET_ITEM(args, 0);
   4570     if (Py_TYPE(other)->tp_compare != func &&
   4571         !PyType_IsSubtype(Py_TYPE(other), Py_TYPE(self))) {
   4572         PyErr_Format(
   4573             PyExc_TypeError,
   4574             "%s.__cmp__(x,y) requires y to be a '%s', not a '%s'",
   4575             Py_TYPE(self)->tp_name,
   4576             Py_TYPE(self)->tp_name,
   4577             Py_TYPE(other)->tp_name);
   4578         return NULL;
   4579     }
   4580     res = (*func)(self, other);
   4581     if (PyErr_Occurred())
   4582         return NULL;
   4583     return PyInt_FromLong((long)res);
   4584 }
   4585 
   4586 /* Helper to check for object.__setattr__ or __delattr__ applied to a type.
   4587    This is called the Carlo Verre hack after its discoverer. */
   4588 static int
   4589 hackcheck(PyObject *self, setattrofunc func, char *what)
   4590 {
   4591     PyTypeObject *type = Py_TYPE(self);
   4592     while (type && type->tp_flags & Py_TPFLAGS_HEAPTYPE)
   4593         type = type->tp_base;
   4594     /* If type is NULL now, this is a really weird type.
   4595        In the spirit of backwards compatibility (?), just shut up. */
   4596     if (type && type->tp_setattro != func) {
   4597         PyErr_Format(PyExc_TypeError,
   4598                      "can't apply this %s to %s object",
   4599                      what,
   4600                      type->tp_name);
   4601         return 0;
   4602     }
   4603     return 1;
   4604 }
   4605 
   4606 static PyObject *
   4607 wrap_setattr(PyObject *self, PyObject *args, void *wrapped)
   4608 {
   4609     setattrofunc func = (setattrofunc)wrapped;
   4610     int res;
   4611     PyObject *name, *value;
   4612 
   4613     if (!PyArg_UnpackTuple(args, "", 2, 2, &name, &value))
   4614         return NULL;
   4615     if (!hackcheck(self, func, "__setattr__"))
   4616         return NULL;
   4617     res = (*func)(self, name, value);
   4618     if (res < 0)
   4619         return NULL;
   4620     Py_INCREF(Py_None);
   4621     return Py_None;
   4622 }
   4623 
   4624 static PyObject *
   4625 wrap_delattr(PyObject *self, PyObject *args, void *wrapped)
   4626 {
   4627     setattrofunc func = (setattrofunc)wrapped;
   4628     int res;
   4629     PyObject *name;
   4630 
   4631     if (!check_num_args(args, 1))
   4632         return NULL;
   4633     name = PyTuple_GET_ITEM(args, 0);
   4634     if (!hackcheck(self, func, "__delattr__"))
   4635         return NULL;
   4636     res = (*func)(self, name, NULL);
   4637     if (res < 0)
   4638         return NULL;
   4639     Py_INCREF(Py_None);
   4640     return Py_None;
   4641 }
   4642 
   4643 static PyObject *
   4644 wrap_hashfunc(PyObject *self, PyObject *args, void *wrapped)
   4645 {
   4646     hashfunc func = (hashfunc)wrapped;
   4647     long res;
   4648 
   4649     if (!check_num_args(args, 0))
   4650         return NULL;
   4651     res = (*func)(self);
   4652     if (res == -1 && PyErr_Occurred())
   4653         return NULL;
   4654     return PyInt_FromLong(res);
   4655 }
   4656 
   4657 static PyObject *
   4658 wrap_call(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds)
   4659 {
   4660     ternaryfunc func = (ternaryfunc)wrapped;
   4661 
   4662     return (*func)(self, args, kwds);
   4663 }
   4664 
   4665 static PyObject *
   4666 wrap_richcmpfunc(PyObject *self, PyObject *args, void *wrapped, int op)
   4667 {
   4668     richcmpfunc func = (richcmpfunc)wrapped;
   4669     PyObject *other;
   4670 
   4671     if (!check_num_args(args, 1))
   4672         return NULL;
   4673     other = PyTuple_GET_ITEM(args, 0);
   4674     return (*func)(self, other, op);
   4675 }
   4676 
   4677 #undef RICHCMP_WRAPPER
   4678 #define RICHCMP_WRAPPER(NAME, OP) \
   4679 static PyObject * \
   4680 richcmp_##NAME(PyObject *self, PyObject *args, void *wrapped) \
   4681 { \
   4682     return wrap_richcmpfunc(self, args, wrapped, OP); \
   4683 }
   4684 
   4685 RICHCMP_WRAPPER(lt, Py_LT)
   4686 RICHCMP_WRAPPER(le, Py_LE)
   4687 RICHCMP_WRAPPER(eq, Py_EQ)
   4688 RICHCMP_WRAPPER(ne, Py_NE)
   4689 RICHCMP_WRAPPER(gt, Py_GT)
   4690 RICHCMP_WRAPPER(ge, Py_GE)
   4691 
   4692 static PyObject *
   4693 wrap_next(PyObject *self, PyObject *args, void *wrapped)
   4694 {
   4695     unaryfunc func = (unaryfunc)wrapped;
   4696     PyObject *res;
   4697 
   4698     if (!check_num_args(args, 0))
   4699         return NULL;
   4700     res = (*func)(self);
   4701     if (res == NULL && !PyErr_Occurred())
   4702         PyErr_SetNone(PyExc_StopIteration);
   4703     return res;
   4704 }
   4705 
   4706 static PyObject *
   4707 wrap_descr_get(PyObject *self, PyObject *args, void *wrapped)
   4708 {
   4709     descrgetfunc func = (descrgetfunc)wrapped;
   4710     PyObject *obj;
   4711     PyObject *type = NULL;
   4712 
   4713     if (!PyArg_UnpackTuple(args, "", 1, 2, &obj, &type))
   4714         return NULL;
   4715     if (obj == Py_None)
   4716         obj = NULL;
   4717     if (type == Py_None)
   4718         type = NULL;
   4719     if (type == NULL &&obj == NULL) {
   4720         PyErr_SetString(PyExc_TypeError,
   4721                         "__get__(None, None) is invalid");
   4722         return NULL;
   4723     }
   4724     return (*func)(self, obj, type);
   4725 }
   4726 
   4727 static PyObject *
   4728 wrap_descr_set(PyObject *self, PyObject *args, void *wrapped)
   4729 {
   4730     descrsetfunc func = (descrsetfunc)wrapped;
   4731     PyObject *obj, *value;
   4732     int ret;
   4733 
   4734     if (!PyArg_UnpackTuple(args, "", 2, 2, &obj, &value))
   4735         return NULL;
   4736     ret = (*func)(self, obj, value);
   4737     if (ret < 0)
   4738         return NULL;
   4739     Py_INCREF(Py_None);
   4740     return Py_None;
   4741 }
   4742 
   4743 static PyObject *
   4744 wrap_descr_delete(PyObject *self, PyObject *args, void *wrapped)
   4745 {
   4746     descrsetfunc func = (descrsetfunc)wrapped;
   4747     PyObject *obj;
   4748     int ret;
   4749 
   4750     if (!check_num_args(args, 1))
   4751         return NULL;
   4752     obj = PyTuple_GET_ITEM(args, 0);
   4753     ret = (*func)(self, obj, NULL);
   4754     if (ret < 0)
   4755         return NULL;
   4756     Py_INCREF(Py_None);
   4757     return Py_None;
   4758 }
   4759 
   4760 static PyObject *
   4761 wrap_init(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds)
   4762 {
   4763     initproc func = (initproc)wrapped;
   4764 
   4765     if (func(self, args, kwds) < 0)
   4766         return NULL;
   4767     Py_INCREF(Py_None);
   4768     return Py_None;
   4769 }
   4770 
   4771 static PyObject *
   4772 tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds)
   4773 {
   4774     PyTypeObject *type, *subtype, *staticbase;
   4775     PyObject *arg0, *res;
   4776 
   4777     if (self == NULL || !PyType_Check(self))
   4778         Py_FatalError("__new__() called with non-type 'self'");
   4779     type = (PyTypeObject *)self;
   4780     if (!PyTuple_Check(args) || PyTuple_GET_SIZE(args) < 1) {
   4781         PyErr_Format(PyExc_TypeError,
   4782                      "%s.__new__(): not enough arguments",
   4783                      type->tp_name);
   4784         return NULL;
   4785     }
   4786     arg0 = PyTuple_GET_ITEM(args, 0);
   4787     if (!PyType_Check(arg0)) {
   4788         PyErr_Format(PyExc_TypeError,
   4789                      "%s.__new__(X): X is not a type object (%s)",
   4790                      type->tp_name,
   4791                      Py_TYPE(arg0)->tp_name);
   4792         return NULL;
   4793     }
   4794     subtype = (PyTypeObject *)arg0;
   4795     if (!PyType_IsSubtype(subtype, type)) {
   4796         PyErr_Format(PyExc_TypeError,
   4797                      "%s.__new__(%s): %s is not a subtype of %s",
   4798                      type->tp_name,
   4799                      subtype->tp_name,
   4800                      subtype->tp_name,
   4801                      type->tp_name);
   4802         return NULL;
   4803     }
   4804 
   4805     /* Check that the use doesn't do something silly and unsafe like
   4806        object.__new__(dict).  To do this, we check that the
   4807        most derived base that's not a heap type is this type. */
   4808     staticbase = subtype;
   4809     while (staticbase && (staticbase->tp_flags & Py_TPFLAGS_HEAPTYPE))
   4810         staticbase = staticbase->tp_base;
   4811     /* If staticbase is NULL now, it is a really weird type.
   4812        In the spirit of backwards compatibility (?), just shut up. */
   4813     if (staticbase && staticbase->tp_new != type->tp_new) {
   4814         PyErr_Format(PyExc_TypeError,
   4815                      "%s.__new__(%s) is not safe, use %s.__new__()",
   4816                      type->tp_name,
   4817                      subtype->tp_name,
   4818                      staticbase->tp_name);
   4819         return NULL;
   4820     }
   4821 
   4822     args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args));
   4823     if (args == NULL)
   4824         return NULL;
   4825     res = type->tp_new(subtype, args, kwds);
   4826     Py_DECREF(args);
   4827     return res;
   4828 }
   4829 
   4830 static struct PyMethodDef tp_new_methoddef[] = {
   4831     {"__new__", (PyCFunction)tp_new_wrapper, METH_VARARGS|METH_KEYWORDS,
   4832      PyDoc_STR("T.__new__(S, ...) -> "
   4833                "a new object with type S, a subtype of T")},
   4834     {0}
   4835 };
   4836 
   4837 static int
   4838 add_tp_new_wrapper(PyTypeObject *type)
   4839 {
   4840     PyObject *func;
   4841 
   4842     if (PyDict_GetItemString(type->tp_dict, "__new__") != NULL)
   4843         return 0;
   4844     func = PyCFunction_New(tp_new_methoddef, (PyObject *)type);
   4845     if (func == NULL)
   4846         return -1;
   4847     if (PyDict_SetItemString(type->tp_dict, "__new__", func)) {
   4848         Py_DECREF(func);
   4849         return -1;
   4850     }
   4851     Py_DECREF(func);
   4852     return 0;
   4853 }
   4854 
   4855 /* Slot wrappers that call the corresponding __foo__ slot.  See comments
   4856    below at override_slots() for more explanation. */
   4857 
   4858 #define SLOT0(FUNCNAME, OPSTR) \
   4859 static PyObject * \
   4860 FUNCNAME(PyObject *self) \
   4861 { \
   4862     static PyObject *cache_str; \
   4863     return call_method(self, OPSTR, &cache_str, "()"); \
   4864 }
   4865 
   4866 #define SLOT1(FUNCNAME, OPSTR, ARG1TYPE, ARGCODES) \
   4867 static PyObject * \
   4868 FUNCNAME(PyObject *self, ARG1TYPE arg1) \
   4869 { \
   4870     static PyObject *cache_str; \
   4871     return call_method(self, OPSTR, &cache_str, "(" ARGCODES ")", arg1); \
   4872 }
   4873 
   4874 /* Boolean helper for SLOT1BINFULL().
   4875    right.__class__ is a nontrivial subclass of left.__class__. */
   4876 static int
   4877 method_is_overloaded(PyObject *left, PyObject *right, char *name)
   4878 {
   4879     PyObject *a, *b;
   4880     int ok;
   4881 
   4882     b = PyObject_GetAttrString((PyObject *)(Py_TYPE(right)), name);
   4883     if (b == NULL) {
   4884         PyErr_Clear();
   4885         /* If right doesn't have it, it's not overloaded */
   4886         return 0;
   4887     }
   4888 
   4889     a = PyObject_GetAttrString((PyObject *)(Py_TYPE(left)), name);
   4890     if (a == NULL) {
   4891         PyErr_Clear();
   4892         Py_DECREF(b);
   4893         /* If right has it but left doesn't, it's overloaded */
   4894         return 1;
   4895     }
   4896 
   4897     ok = PyObject_RichCompareBool(a, b, Py_NE);
   4898     Py_DECREF(a);
   4899     Py_DECREF(b);
   4900     if (ok < 0) {
   4901         PyErr_Clear();
   4902         return 0;
   4903     }
   4904 
   4905     return ok;
   4906 }
   4907 
   4908 
   4909 #define SLOT1BINFULL(FUNCNAME, TESTFUNC, SLOTNAME, OPSTR, ROPSTR) \
   4910 static PyObject * \
   4911 FUNCNAME(PyObject *self, PyObject *other) \
   4912 { \
   4913     static PyObject *cache_str, *rcache_str; \
   4914     int do_other = Py_TYPE(self) != Py_TYPE(other) && \
   4915         Py_TYPE(other)->tp_as_number != NULL && \
   4916         Py_TYPE(other)->tp_as_number->SLOTNAME == TESTFUNC; \
   4917     if (Py_TYPE(self)->tp_as_number != NULL && \
   4918         Py_TYPE(self)->tp_as_number->SLOTNAME == TESTFUNC) { \
   4919         PyObject *r; \
   4920         if (do_other && \
   4921             PyType_IsSubtype(Py_TYPE(other), Py_TYPE(self)) && \
   4922             method_is_overloaded(self, other, ROPSTR)) { \
   4923             r = call_maybe( \
   4924                 other, ROPSTR, &rcache_str, "(O)", self); \
   4925             if (r != Py_NotImplemented) \
   4926                 return r; \
   4927             Py_DECREF(r); \
   4928             do_other = 0; \
   4929         } \
   4930         r = call_maybe( \
   4931             self, OPSTR, &cache_str, "(O)", other); \
   4932         if (r != Py_NotImplemented || \
   4933             Py_TYPE(other) == Py_TYPE(self)) \
   4934             return r; \
   4935         Py_DECREF(r); \
   4936     } \
   4937     if (do_other) { \
   4938         return call_maybe( \
   4939             other, ROPSTR, &rcache_str, "(O)", self); \
   4940     } \
   4941     Py_INCREF(Py_NotImplemented); \
   4942     return Py_NotImplemented; \
   4943 }
   4944 
   4945 #define SLOT1BIN(FUNCNAME, SLOTNAME, OPSTR, ROPSTR) \
   4946     SLOT1BINFULL(FUNCNAME, FUNCNAME, SLOTNAME, OPSTR, ROPSTR)
   4947 
   4948 #define SLOT2(FUNCNAME, OPSTR, ARG1TYPE, ARG2TYPE, ARGCODES) \
   4949 static PyObject * \
   4950 FUNCNAME(PyObject *self, ARG1TYPE arg1, ARG2TYPE arg2) \
   4951 { \
   4952     static PyObject *cache_str; \
   4953     return call_method(self, OPSTR, &cache_str, \
   4954                        "(" ARGCODES ")", arg1, arg2); \
   4955 }
   4956 
   4957 static Py_ssize_t
   4958 slot_sq_length(PyObject *self)
   4959 {
   4960     static PyObject *len_str;
   4961     PyObject *res = call_method(self, "__len__", &len_str, "()");
   4962     Py_ssize_t len;
   4963 
   4964     if (res == NULL)
   4965         return -1;
   4966     len = PyInt_AsSsize_t(res);
   4967     Py_DECREF(res);
   4968     if (len < 0) {
   4969         if (!PyErr_Occurred())
   4970             PyErr_SetString(PyExc_ValueError,
   4971                             "__len__() should return >= 0");
   4972         return -1;
   4973     }
   4974     return len;
   4975 }
   4976 
   4977 /* Super-optimized version of slot_sq_item.
   4978    Other slots could do the same... */
   4979 static PyObject *
   4980 slot_sq_item(PyObject *self, Py_ssize_t i)
   4981 {
   4982     static PyObject *getitem_str;
   4983     PyObject *func, *args = NULL, *ival = NULL, *retval = NULL;
   4984     descrgetfunc f;
   4985 
   4986     if (getitem_str == NULL) {
   4987         getitem_str = PyString_InternFromString("__getitem__");
   4988         if (getitem_str == NULL)
   4989             return NULL;
   4990     }
   4991     func = _PyType_Lookup(Py_TYPE(self), getitem_str);
   4992     if (func != NULL) {
   4993         if ((f = Py_TYPE(func)->tp_descr_get) == NULL)
   4994             Py_INCREF(func);
   4995         else {
   4996             func = f(func, self, (PyObject *)(Py_TYPE(self)));
   4997             if (func == NULL) {
   4998                 return NULL;
   4999             }
   5000         }
   5001         ival = PyInt_FromSsize_t(i);
   5002         if (ival != NULL) {
   5003             args = PyTuple_New(1);
   5004             if (args != NULL) {
   5005                 PyTuple_SET_ITEM(args, 0, ival);
   5006                 retval = PyObject_Call(func, args, NULL);
   5007                 Py_XDECREF(args);
   5008                 Py_XDECREF(func);
   5009                 return retval;
   5010             }
   5011         }
   5012     }
   5013     else {
   5014         PyErr_SetObject(PyExc_AttributeError, getitem_str);
   5015     }
   5016     Py_XDECREF(args);
   5017     Py_XDECREF(ival);
   5018     Py_XDECREF(func);
   5019     return NULL;
   5020 }
   5021 
   5022 static PyObject*
   5023 slot_sq_slice(PyObject *self, Py_ssize_t i, Py_ssize_t j)
   5024 {
   5025     static PyObject *getslice_str;
   5026 
   5027     if (PyErr_WarnPy3k("in 3.x, __getslice__ has been removed; "
   5028                         "use __getitem__", 1) < 0)
   5029         return NULL;
   5030     return call_method(self, "__getslice__", &getslice_str,
   5031         "nn", i, j);
   5032 }
   5033 
   5034 static int
   5035 slot_sq_ass_item(PyObject *self, Py_ssize_t index, PyObject *value)
   5036 {
   5037     PyObject *res;
   5038     static PyObject *delitem_str, *setitem_str;
   5039 
   5040     if (value == NULL)
   5041         res = call_method(self, "__delitem__", &delitem_str,
   5042                           "(n)", index);
   5043     else
   5044         res = call_method(self, "__setitem__", &setitem_str,
   5045                           "(nO)", index, value);
   5046     if (res == NULL)
   5047         return -1;
   5048     Py_DECREF(res);
   5049     return 0;
   5050 }
   5051 
   5052 static int
   5053 slot_sq_ass_slice(PyObject *self, Py_ssize_t i, Py_ssize_t j, PyObject *value)
   5054 {
   5055     PyObject *res;
   5056     static PyObject *delslice_str, *setslice_str;
   5057 
   5058     if (value == NULL) {
   5059         if (PyErr_WarnPy3k("in 3.x, __delslice__ has been removed; "
   5060                            "use __delitem__", 1) < 0)
   5061             return -1;
   5062         res = call_method(self, "__delslice__", &delslice_str,
   5063                           "(nn)", i, j);
   5064     }
   5065     else {
   5066         if (PyErr_WarnPy3k("in 3.x, __setslice__ has been removed; "
   5067                                 "use __setitem__", 1) < 0)
   5068             return -1;
   5069         res = call_method(self, "__setslice__", &setslice_str,
   5070                   "(nnO)", i, j, value);
   5071     }
   5072     if (res == NULL)
   5073         return -1;
   5074     Py_DECREF(res);
   5075     return 0;
   5076 }
   5077 
   5078 static int
   5079 slot_sq_contains(PyObject *self, PyObject *value)
   5080 {
   5081     PyObject *func, *res, *args;
   5082     int result = -1;
   5083 
   5084     static PyObject *contains_str;
   5085 
   5086     func = lookup_maybe(self, "__contains__", &contains_str);
   5087     if (func != NULL) {
   5088         args = PyTuple_Pack(1, value);
   5089         if (args == NULL)
   5090             res = NULL;
   5091         else {
   5092             res = PyObject_Call(func, args, NULL);
   5093             Py_DECREF(args);
   5094         }
   5095         Py_DECREF(func);
   5096         if (res != NULL) {
   5097             result = PyObject_IsTrue(res);
   5098             Py_DECREF(res);
   5099         }
   5100     }
   5101     else if (! PyErr_Occurred()) {
   5102         /* Possible results: -1 and 1 */
   5103         result = (int)_PySequence_IterSearch(self, value,
   5104                                          PY_ITERSEARCH_CONTAINS);
   5105     }
   5106     return result;
   5107 }
   5108 
   5109 #define slot_mp_length slot_sq_length
   5110 
   5111 SLOT1(slot_mp_subscript, "__getitem__", PyObject *, "O")
   5112 
   5113 static int
   5114 slot_mp_ass_subscript(PyObject *self, PyObject *key, PyObject *value)
   5115 {
   5116     PyObject *res;
   5117     static PyObject *delitem_str, *setitem_str;
   5118 
   5119     if (value == NULL)
   5120         res = call_method(self, "__delitem__", &delitem_str,
   5121                           "(O)", key);
   5122     else
   5123         res = call_method(self, "__setitem__", &setitem_str,
   5124                          "(OO)", key, value);
   5125     if (res == NULL)
   5126         return -1;
   5127     Py_DECREF(res);
   5128     return 0;
   5129 }
   5130 
   5131 SLOT1BIN(slot_nb_add, nb_add, "__add__", "__radd__")
   5132 SLOT1BIN(slot_nb_subtract, nb_subtract, "__sub__", "__rsub__")
   5133 SLOT1BIN(slot_nb_multiply, nb_multiply, "__mul__", "__rmul__")
   5134 SLOT1BIN(slot_nb_divide, nb_divide, "__div__", "__rdiv__")
   5135 SLOT1BIN(slot_nb_remainder, nb_remainder, "__mod__", "__rmod__")
   5136 SLOT1BIN(slot_nb_divmod, nb_divmod, "__divmod__", "__rdivmod__")
   5137 
   5138 static PyObject *slot_nb_power(PyObject *, PyObject *, PyObject *);
   5139 
   5140 SLOT1BINFULL(slot_nb_power_binary, slot_nb_power,
   5141              nb_power, "__pow__", "__rpow__")
   5142 
   5143 static PyObject *
   5144 slot_nb_power(PyObject *self, PyObject *other, PyObject *modulus)
   5145 {
   5146     static PyObject *pow_str;
   5147 
   5148     if (modulus == Py_None)
   5149         return slot_nb_power_binary(self, other);
   5150     /* Three-arg power doesn't use __rpow__.  But ternary_op
   5151        can call this when the second argument's type uses
   5152        slot_nb_power, so check before calling self.__pow__. */
   5153     if (Py_TYPE(self)->tp_as_number != NULL &&
   5154         Py_TYPE(self)->tp_as_number->nb_power == slot_nb_power) {
   5155         return call_method(self, "__pow__", &pow_str,
   5156                            "(OO)", other, modulus);
   5157     }
   5158     Py_INCREF(Py_NotImplemented);
   5159     return Py_NotImplemented;
   5160 }
   5161 
   5162 SLOT0(slot_nb_negative, "__neg__")
   5163 SLOT0(slot_nb_positive, "__pos__")
   5164 SLOT0(slot_nb_absolute, "__abs__")
   5165 
   5166 static int
   5167 slot_nb_nonzero(PyObject *self)
   5168 {
   5169     PyObject *func, *args;
   5170     static PyObject *nonzero_str, *len_str;
   5171     int result = -1;
   5172     int using_len = 0;
   5173 
   5174     func = lookup_maybe(self, "__nonzero__", &nonzero_str);
   5175     if (func == NULL) {
   5176         if (PyErr_Occurred())
   5177             return -1;
   5178         func = lookup_maybe(self, "__len__", &len_str);
   5179         if (func == NULL)
   5180             return PyErr_Occurred() ? -1 : 1;
   5181         using_len = 1;
   5182     }
   5183     args = PyTuple_New(0);
   5184     if (args != NULL) {
   5185         PyObject *temp = PyObject_Call(func, args, NULL);
   5186         Py_DECREF(args);
   5187         if (temp != NULL) {
   5188             if (PyInt_CheckExact(temp) || PyBool_Check(temp))
   5189                 result = PyObject_IsTrue(temp);
   5190             else {
   5191                 PyErr_Format(PyExc_TypeError,
   5192                              "%s should return "
   5193                              "bool or int, returned %s",
   5194                              (using_len ? "__len__"
   5195                                         : "__nonzero__"),
   5196                              temp->ob_type->tp_name);
   5197                 result = -1;
   5198             }
   5199             Py_DECREF(temp);
   5200         }
   5201     }
   5202     Py_DECREF(func);
   5203     return result;
   5204 }
   5205 
   5206 
   5207 static PyObject *
   5208 slot_nb_index(PyObject *self)
   5209 {
   5210     static PyObject *index_str;
   5211     return call_method(self, "__index__", &index_str, "()");
   5212 }
   5213 
   5214 
   5215 SLOT0(slot_nb_invert, "__invert__")
   5216 SLOT1BIN(slot_nb_lshift, nb_lshift, "__lshift__", "__rlshift__")
   5217 SLOT1BIN(slot_nb_rshift, nb_rshift, "__rshift__", "__rrshift__")
   5218 SLOT1BIN(slot_nb_and, nb_and, "__and__", "__rand__")
   5219 SLOT1BIN(slot_nb_xor, nb_xor, "__xor__", "__rxor__")
   5220 SLOT1BIN(slot_nb_or, nb_or, "__or__", "__ror__")
   5221 
   5222 static int
   5223 slot_nb_coerce(PyObject **a, PyObject **b)
   5224 {
   5225     static PyObject *coerce_str;
   5226     PyObject *self = *a, *other = *b;
   5227 
   5228     if (self->ob_type->tp_as_number != NULL &&
   5229         self->ob_type->tp_as_number->nb_coerce == slot_nb_coerce) {
   5230         PyObject *r;
   5231         r = call_maybe(
   5232             self, "__coerce__", &coerce_str, "(O)", other);
   5233         if (r == NULL)
   5234             return -1;
   5235         if (r == Py_NotImplemented) {
   5236             Py_DECREF(r);
   5237         }
   5238         else {
   5239             if (!PyTuple_Check(r) || PyTuple_GET_SIZE(r) != 2) {
   5240                 PyErr_SetString(PyExc_TypeError,
   5241                     "__coerce__ didn't return a 2-tuple");
   5242                 Py_DECREF(r);
   5243                 return -1;
   5244             }
   5245             *a = PyTuple_GET_ITEM(r, 0);
   5246             Py_INCREF(*a);
   5247             *b = PyTuple_GET_ITEM(r, 1);
   5248             Py_INCREF(*b);
   5249             Py_DECREF(r);
   5250             return 0;
   5251         }
   5252     }
   5253     if (other->ob_type->tp_as_number != NULL &&
   5254         other->ob_type->tp_as_number->nb_coerce == slot_nb_coerce) {
   5255         PyObject *r;
   5256         r = call_maybe(
   5257             other, "__coerce__", &coerce_str, "(O)", self);
   5258         if (r == NULL)
   5259             return -1;
   5260         if (r == Py_NotImplemented) {
   5261             Py_DECREF(r);
   5262             return 1;
   5263         }
   5264         if (!PyTuple_Check(r) || PyTuple_GET_SIZE(r) != 2) {
   5265             PyErr_SetString(PyExc_TypeError,
   5266                             "__coerce__ didn't return a 2-tuple");
   5267             Py_DECREF(r);
   5268             return -1;
   5269         }
   5270         *a = PyTuple_GET_ITEM(r, 1);
   5271         Py_INCREF(*a);
   5272         *b = PyTuple_GET_ITEM(r, 0);
   5273         Py_INCREF(*b);
   5274         Py_DECREF(r);
   5275         return 0;
   5276     }
   5277     return 1;
   5278 }
   5279 
   5280 SLOT0(slot_nb_int, "__int__")
   5281 SLOT0(slot_nb_long, "__long__")
   5282 SLOT0(slot_nb_float, "__float__")
   5283 SLOT0(slot_nb_oct, "__oct__")
   5284 SLOT0(slot_nb_hex, "__hex__")
   5285 SLOT1(slot_nb_inplace_add, "__iadd__", PyObject *, "O")
   5286 SLOT1(slot_nb_inplace_subtract, "__isub__", PyObject *, "O")
   5287 SLOT1(slot_nb_inplace_multiply, "__imul__", PyObject *, "O")
   5288 SLOT1(slot_nb_inplace_divide, "__idiv__", PyObject *, "O")
   5289 SLOT1(slot_nb_inplace_remainder, "__imod__", PyObject *, "O")
   5290 /* Can't use SLOT1 here, because nb_inplace_power is ternary */
   5291 static PyObject *
   5292 slot_nb_inplace_power(PyObject *self, PyObject * arg1, PyObject *arg2)
   5293 {
   5294   static PyObject *cache_str;
   5295   return call_method(self, "__ipow__", &cache_str, "(" "O" ")", arg1);
   5296 }
   5297 SLOT1(slot_nb_inplace_lshift, "__ilshift__", PyObject *, "O")
   5298 SLOT1(slot_nb_inplace_rshift, "__irshift__", PyObject *, "O")
   5299 SLOT1(slot_nb_inplace_and, "__iand__", PyObject *, "O")
   5300 SLOT1(slot_nb_inplace_xor, "__ixor__", PyObject *, "O")
   5301 SLOT1(slot_nb_inplace_or, "__ior__", PyObject *, "O")
   5302 SLOT1BIN(slot_nb_floor_divide, nb_floor_divide,
   5303          "__floordiv__", "__rfloordiv__")
   5304 SLOT1BIN(slot_nb_true_divide, nb_true_divide, "__truediv__", "__rtruediv__")
   5305 SLOT1(slot_nb_inplace_floor_divide, "__ifloordiv__", PyObject *, "O")
   5306 SLOT1(slot_nb_inplace_true_divide, "__itruediv__", PyObject *, "O")
   5307 
   5308 static int
   5309 half_compare(PyObject *self, PyObject *other)
   5310 {
   5311     PyObject *func, *args, *res;
   5312     static PyObject *cmp_str;
   5313     Py_ssize_t c;
   5314 
   5315     func = lookup_method(self, "__cmp__", &cmp_str);
   5316     if (func == NULL) {
   5317         PyErr_Clear();
   5318     }
   5319     else {
   5320         args = PyTuple_Pack(1, other);
   5321         if (args == NULL)
   5322             res = NULL;
   5323         else {
   5324             res = PyObject_Call(func, args, NULL);
   5325             Py_DECREF(args);
   5326         }
   5327         Py_DECREF(func);
   5328         if (res != Py_NotImplemented) {
   5329             if (res == NULL)
   5330                 return -2;
   5331             c = PyInt_AsLong(res);
   5332             Py_DECREF(res);
   5333             if (c == -1 && PyErr_Occurred())
   5334                 return -2;
   5335             return (c < 0) ? -1 : (c > 0) ? 1 : 0;
   5336         }
   5337         Py_DECREF(res);
   5338     }
   5339     return 2;
   5340 }
   5341 
   5342 /* This slot is published for the benefit of try_3way_compare in object.c */
   5343 int
   5344 _PyObject_SlotCompare(PyObject *self, PyObject *other)
   5345 {
   5346     int c;
   5347 
   5348     if (Py_TYPE(self)->tp_compare == _PyObject_SlotCompare) {
   5349         c = half_compare(self, other);
   5350         if (c <= 1)
   5351             return c;
   5352     }
   5353     if (Py_TYPE(other)->tp_compare == _PyObject_SlotCompare) {
   5354         c = half_compare(other, self);
   5355         if (c < -1)
   5356             return -2;
   5357         if (c <= 1)
   5358             return -c;
   5359     }
   5360     return (void *)self < (void *)other ? -1 :
   5361         (void *)self > (void *)other ? 1 : 0;
   5362 }
   5363 
   5364 static PyObject *
   5365 slot_tp_repr(PyObject *self)
   5366 {
   5367     PyObject *func, *res;
   5368     static PyObject *repr_str;
   5369 
   5370     func = lookup_method(self, "__repr__", &repr_str);
   5371     if (func != NULL) {
   5372         res = PyEval_CallObject(func, NULL);
   5373         Py_DECREF(func);
   5374         return res;
   5375     }
   5376     PyErr_Clear();
   5377     return PyString_FromFormat("<%s object at %p>",
   5378                                Py_TYPE(self)->tp_name, self);
   5379 }
   5380 
   5381 static PyObject *
   5382 slot_tp_str(PyObject *self)
   5383 {
   5384     PyObject *func, *res;
   5385     static PyObject *str_str;
   5386 
   5387     func = lookup_method(self, "__str__", &str_str);
   5388     if (func != NULL) {
   5389         res = PyEval_CallObject(func, NULL);
   5390         Py_DECREF(func);
   5391         return res;
   5392     }
   5393     else {
   5394         PyErr_Clear();
   5395         return slot_tp_repr(self);
   5396     }
   5397 }
   5398 
   5399 static long
   5400 slot_tp_hash(PyObject *self)
   5401 {
   5402     PyObject *func;
   5403     static PyObject *hash_str, *eq_str, *cmp_str;
   5404     long h;
   5405 
   5406     func = lookup_method(self, "__hash__", &hash_str);
   5407 
   5408     if (func != NULL && func != Py_None) {
   5409         PyObject *res = PyEval_CallObject(func, NULL);
   5410         Py_DECREF(func);
   5411         if (res == NULL)
   5412             return -1;
   5413         if (PyLong_Check(res))
   5414             h = PyLong_Type.tp_hash(res);
   5415         else
   5416             h = PyInt_AsLong(res);
   5417         Py_DECREF(res);
   5418     }
   5419     else {
   5420         Py_XDECREF(func); /* may be None */
   5421         PyErr_Clear();
   5422         func = lookup_method(self, "__eq__", &eq_str);
   5423         if (func == NULL) {
   5424             PyErr_Clear();
   5425             func = lookup_method(self, "__cmp__", &cmp_str);
   5426         }
   5427         if (func != NULL) {
   5428             Py_DECREF(func);
   5429             return PyObject_HashNotImplemented(self);
   5430         }
   5431         PyErr_Clear();
   5432         h = _Py_HashPointer((void *)self);
   5433     }
   5434     if (h == -1 && !PyErr_Occurred())
   5435         h = -2;
   5436     return h;
   5437 }
   5438 
   5439 static PyObject *
   5440 slot_tp_call(PyObject *self, PyObject *args, PyObject *kwds)
   5441 {
   5442     static PyObject *call_str;
   5443     PyObject *meth = lookup_method(self, "__call__", &call_str);
   5444     PyObject *res;
   5445 
   5446     if (meth == NULL)
   5447         return NULL;
   5448 
   5449     res = PyObject_Call(meth, args, kwds);
   5450 
   5451     Py_DECREF(meth);
   5452     return res;
   5453 }
   5454 
   5455 /* There are two slot dispatch functions for tp_getattro.
   5456 
   5457    - slot_tp_getattro() is used when __getattribute__ is overridden
   5458      but no __getattr__ hook is present;
   5459 
   5460    - slot_tp_getattr_hook() is used when a __getattr__ hook is present.
   5461 
   5462    The code in update_one_slot() always installs slot_tp_getattr_hook(); this
   5463    detects the absence of __getattr__ and then installs the simpler slot if
   5464    necessary. */
   5465 
   5466 static PyObject *
   5467 slot_tp_getattro(PyObject *self, PyObject *name)
   5468 {
   5469     static PyObject *getattribute_str = NULL;
   5470     return call_method(self, "__getattribute__", &getattribute_str,
   5471                        "(O)", name);
   5472 }
   5473 
   5474 static PyObject *
   5475 call_attribute(PyObject *self, PyObject *attr, PyObject *name)
   5476 {
   5477     PyObject *res, *descr = NULL;
   5478     descrgetfunc f = Py_TYPE(attr)->tp_descr_get;
   5479 
   5480     if (f != NULL) {
   5481         descr = f(attr, self, (PyObject *)(Py_TYPE(self)));
   5482         if (descr == NULL)
   5483             return NULL;
   5484         else
   5485             attr = descr;
   5486     }
   5487     res = PyObject_CallFunctionObjArgs(attr, name, NULL);
   5488     Py_XDECREF(descr);
   5489     return res;
   5490 }
   5491 
   5492 static PyObject *
   5493 slot_tp_getattr_hook(PyObject *self, PyObject *name)
   5494 {
   5495     PyTypeObject *tp = Py_TYPE(self);
   5496     PyObject *getattr, *getattribute, *res;
   5497     static PyObject *getattribute_str = NULL;
   5498     static PyObject *getattr_str = NULL;
   5499 
   5500     if (getattr_str == NULL) {
   5501         getattr_str = PyString_InternFromString("__getattr__");
   5502         if (getattr_str == NULL)
   5503             return NULL;
   5504     }
   5505     if (getattribute_str == NULL) {
   5506         getattribute_str =
   5507             PyString_InternFromString("__getattribute__");
   5508         if (getattribute_str == NULL)
   5509             return NULL;
   5510     }
   5511     /* speed hack: we could use lookup_maybe, but that would resolve the
   5512        method fully for each attribute lookup for classes with
   5513        __getattr__, even when the attribute is present. So we use
   5514        _PyType_Lookup and create the method only when needed, with
   5515        call_attribute. */
   5516     getattr = _PyType_Lookup(tp, getattr_str);
   5517     if (getattr == NULL) {
   5518         /* No __getattr__ hook: use a simpler dispatcher */
   5519         tp->tp_getattro = slot_tp_getattro;
   5520         return slot_tp_getattro(self, name);
   5521     }
   5522     Py_INCREF(getattr);
   5523     /* speed hack: we could use lookup_maybe, but that would resolve the
   5524        method fully for each attribute lookup for classes with
   5525        __getattr__, even when self has the default __getattribute__
   5526        method. So we use _PyType_Lookup and create the method only when
   5527        needed, with call_attribute. */
   5528     getattribute = _PyType_Lookup(tp, getattribute_str);
   5529     if (getattribute == NULL ||
   5530         (Py_TYPE(getattribute) == &PyWrapperDescr_Type &&
   5531          ((PyWrapperDescrObject *)getattribute)->d_wrapped ==
   5532          (void *)PyObject_GenericGetAttr))
   5533         res = PyObject_GenericGetAttr(self, name);
   5534     else {
   5535         Py_INCREF(getattribute);
   5536         res = call_attribute(self, getattribute, name);
   5537         Py_DECREF(getattribute);
   5538     }
   5539     if (res == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
   5540         PyErr_Clear();
   5541         res = call_attribute(self, getattr, name);
   5542     }
   5543     Py_DECREF(getattr);
   5544     return res;
   5545 }
   5546 
   5547 static int
   5548 slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value)
   5549 {
   5550     PyObject *res;
   5551     static PyObject *delattr_str, *setattr_str;
   5552 
   5553     if (value == NULL)
   5554         res = call_method(self, "__delattr__", &delattr_str,
   5555                           "(O)", name);
   5556     else
   5557         res = call_method(self, "__setattr__", &setattr_str,
   5558                           "(OO)", name, value);
   5559     if (res == NULL)
   5560         return -1;
   5561     Py_DECREF(res);
   5562     return 0;
   5563 }
   5564 
   5565 static char *name_op[] = {
   5566     "__lt__",
   5567     "__le__",
   5568     "__eq__",
   5569     "__ne__",
   5570     "__gt__",
   5571     "__ge__",
   5572 };
   5573 
   5574 static PyObject *
   5575 half_richcompare(PyObject *self, PyObject *other, int op)
   5576 {
   5577     PyObject *func, *args, *res;
   5578     static PyObject *op_str[6];
   5579 
   5580     func = lookup_method(self, name_op[op], &op_str[op]);
   5581     if (func == NULL) {
   5582         PyErr_Clear();
   5583         Py_INCREF(Py_NotImplemented);
   5584         return Py_NotImplemented;
   5585     }
   5586     args = PyTuple_Pack(1, other);
   5587     if (args == NULL)
   5588         res = NULL;
   5589     else {
   5590         res = PyObject_Call(func, args, NULL);
   5591         Py_DECREF(args);
   5592     }
   5593     Py_DECREF(func);
   5594     return res;
   5595 }
   5596 
   5597 static PyObject *
   5598 slot_tp_richcompare(PyObject *self, PyObject *other, int op)
   5599 {
   5600     PyObject *res;
   5601 
   5602     if (Py_TYPE(self)->tp_richcompare == slot_tp_richcompare) {
   5603         res = half_richcompare(self, other, op);
   5604         if (res != Py_NotImplemented)
   5605             return res;
   5606         Py_DECREF(res);
   5607     }
   5608     if (Py_TYPE(other)->tp_richcompare == slot_tp_richcompare) {
   5609         res = half_richcompare(other, self, _Py_SwappedOp[op]);
   5610         if (res != Py_NotImplemented) {
   5611             return res;
   5612         }
   5613         Py_DECREF(res);
   5614     }
   5615     Py_INCREF(Py_NotImplemented);
   5616     return Py_NotImplemented;
   5617 }
   5618 
   5619 static PyObject *
   5620 slot_tp_iter(PyObject *self)
   5621 {
   5622     PyObject *func, *res;
   5623     static PyObject *iter_str, *getitem_str;
   5624 
   5625     func = lookup_method(self, "__iter__", &iter_str);
   5626     if (func != NULL) {
   5627         PyObject *args;
   5628         args = res = PyTuple_New(0);
   5629         if (args != NULL) {
   5630             res = PyObject_Call(func, args, NULL);
   5631             Py_DECREF(args);
   5632         }
   5633         Py_DECREF(func);
   5634         return res;
   5635     }
   5636     PyErr_Clear();
   5637     func = lookup_method(self, "__getitem__", &getitem_str);
   5638     if (func == NULL) {
   5639         PyErr_Format(PyExc_TypeError,
   5640                      "'%.200s' object is not iterable",
   5641                      Py_TYPE(self)->tp_name);
   5642         return NULL;
   5643     }
   5644     Py_DECREF(func);
   5645     return PySeqIter_New(self);
   5646 }
   5647 
   5648 static PyObject *
   5649 slot_tp_iternext(PyObject *self)
   5650 {
   5651     static PyObject *next_str;
   5652     return call_method(self, "next", &next_str, "()");
   5653 }
   5654 
   5655 static PyObject *
   5656 slot_tp_descr_get(PyObject *self, PyObject *obj, PyObject *type)
   5657 {
   5658     PyTypeObject *tp = Py_TYPE(self);
   5659     PyObject *get;
   5660     static PyObject *get_str = NULL;
   5661 
   5662     if (get_str == NULL) {
   5663         get_str = PyString_InternFromString("__get__");
   5664         if (get_str == NULL)
   5665             return NULL;
   5666     }
   5667     get = _PyType_Lookup(tp, get_str);
   5668     if (get == NULL) {
   5669         /* Avoid further slowdowns */
   5670         if (tp->tp_descr_get == slot_tp_descr_get)
   5671             tp->tp_descr_get = NULL;
   5672         Py_INCREF(self);
   5673         return self;
   5674     }
   5675     if (obj == NULL)
   5676         obj = Py_None;
   5677     if (type == NULL)
   5678         type = Py_None;
   5679     return PyObject_CallFunctionObjArgs(get, self, obj, type, NULL);
   5680 }
   5681 
   5682 static int
   5683 slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value)
   5684 {
   5685     PyObject *res;
   5686     static PyObject *del_str, *set_str;
   5687 
   5688     if (value == NULL)
   5689         res = call_method(self, "__delete__", &del_str,
   5690                           "(O)", target);
   5691     else
   5692         res = call_method(self, "__set__", &set_str,
   5693                           "(OO)", target, value);
   5694     if (res == NULL)
   5695         return -1;
   5696     Py_DECREF(res);
   5697     return 0;
   5698 }
   5699 
   5700 static int
   5701 slot_tp_init(PyObject *self, PyObject *args, PyObject *kwds)
   5702 {
   5703     static PyObject *init_str;
   5704     PyObject *meth = lookup_method(self, "__init__", &init_str);
   5705     PyObject *res;
   5706 
   5707     if (meth == NULL)
   5708         return -1;
   5709     res = PyObject_Call(meth, args, kwds);
   5710     Py_DECREF(meth);
   5711     if (res == NULL)
   5712         return -1;
   5713     if (res != Py_None) {
   5714         PyErr_Format(PyExc_TypeError,
   5715                      "__init__() should return None, not '%.200s'",
   5716                      Py_TYPE(res)->tp_name);
   5717         Py_DECREF(res);
   5718         return -1;
   5719     }
   5720     Py_DECREF(res);
   5721     return 0;
   5722 }
   5723 
   5724 static PyObject *
   5725 slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
   5726 {
   5727     static PyObject *new_str;
   5728     PyObject *func;
   5729     PyObject *newargs, *x;
   5730     Py_ssize_t i, n;
   5731 
   5732     if (new_str == NULL) {
   5733         new_str = PyString_InternFromString("__new__");
   5734         if (new_str == NULL)
   5735             return NULL;
   5736     }
   5737     func = PyObject_GetAttr((PyObject *)type, new_str);
   5738     if (func == NULL)
   5739         return NULL;
   5740     assert(PyTuple_Check(args));
   5741     n = PyTuple_GET_SIZE(args);
   5742     newargs = PyTuple_New(n+1);
   5743     if (newargs == NULL)
   5744         return NULL;
   5745     Py_INCREF(type);
   5746     PyTuple_SET_ITEM(newargs, 0, (PyObject *)type);
   5747     for (i = 0; i < n; i++) {
   5748         x = PyTuple_GET_ITEM(args, i);
   5749         Py_INCREF(x);
   5750         PyTuple_SET_ITEM(newargs, i+1, x);
   5751     }
   5752     x = PyObject_Call(func, newargs, kwds);
   5753     Py_DECREF(newargs);
   5754     Py_DECREF(func);
   5755     return x;
   5756 }
   5757 
   5758 static void
   5759 slot_tp_del(PyObject *self)
   5760 {
   5761     static PyObject *del_str = NULL;
   5762     PyObject *del, *res;
   5763     PyObject *error_type, *error_value, *error_traceback;
   5764 
   5765     /* Temporarily resurrect the object. */
   5766     assert(self->ob_refcnt == 0);
   5767     self->ob_refcnt = 1;
   5768 
   5769     /* Save the current exception, if any. */
   5770     PyErr_Fetch(&error_type, &error_value, &error_traceback);
   5771 
   5772     /* Execute __del__ method, if any. */
   5773     del = lookup_maybe(self, "__del__", &del_str);
   5774     if (del != NULL) {
   5775         res = PyEval_CallObject(del, NULL);
   5776         if (res == NULL)
   5777             PyErr_WriteUnraisable(del);
   5778         else
   5779             Py_DECREF(res);
   5780         Py_DECREF(del);
   5781     }
   5782 
   5783     /* Restore the saved exception. */
   5784     PyErr_Restore(error_type, error_value, error_traceback);
   5785 
   5786     /* Undo the temporary resurrection; can't use DECREF here, it would
   5787      * cause a recursive call.
   5788      */
   5789     assert(self->ob_refcnt > 0);
   5790     if (--self->ob_refcnt == 0)
   5791         return;         /* this is the normal path out */
   5792 
   5793     /* __del__ resurrected it!  Make it look like the original Py_DECREF
   5794      * never happened.
   5795      */
   5796     {
   5797         Py_ssize_t refcnt = self->ob_refcnt;
   5798         _Py_NewReference(self);
   5799         self->ob_refcnt = refcnt;
   5800     }
   5801     assert(!PyType_IS_GC(Py_TYPE(self)) ||
   5802            _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
   5803     /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
   5804      * we need to undo that. */
   5805     _Py_DEC_REFTOTAL;
   5806     /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
   5807      * chain, so no more to do there.
   5808      * If COUNT_ALLOCS, the original decref bumped tp_frees, and
   5809      * _Py_NewReference bumped tp_allocs:  both of those need to be
   5810      * undone.
   5811      */
   5812 #ifdef COUNT_ALLOCS
   5813     --Py_TYPE(self)->tp_frees;
   5814     --Py_TYPE(self)->tp_allocs;
   5815 #endif
   5816 }
   5817 
   5818 
   5819 /*
   5820 Table mapping __foo__ names to tp_foo offsets and slot_tp_foo wrapper functions.
   5821 
   5822 The table is ordered by offsets relative to the 'PyHeapTypeObject' structure,
   5823 which incorporates the additional structures used for numbers, sequences and
   5824 mappings.  Note that multiple names may map to the same slot (e.g. __eq__,
   5825 __ne__ etc. all map to tp_richcompare) and one name may map to multiple slots
   5826 (e.g. __str__ affects tp_str as well as tp_repr). The table is terminated with
   5827 an all-zero entry.  (This table is further initialized in init_slotdefs().)
   5828 */
   5829 
   5830 typedef struct wrapperbase slotdef;
   5831 
   5832 #undef TPSLOT
   5833 #undef FLSLOT
   5834 #undef ETSLOT
   5835 #undef SQSLOT
   5836 #undef MPSLOT
   5837 #undef NBSLOT
   5838 #undef UNSLOT
   5839 #undef IBSLOT
   5840 #undef BINSLOT
   5841 #undef RBINSLOT
   5842 
   5843 #define TPSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
   5844     {NAME, offsetof(PyTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
   5845      PyDoc_STR(DOC)}
   5846 #define FLSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC, FLAGS) \
   5847     {NAME, offsetof(PyTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
   5848      PyDoc_STR(DOC), FLAGS}
   5849 #define ETSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
   5850     {NAME, offsetof(PyHeapTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
   5851      PyDoc_STR(DOC)}
   5852 #define SQSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
   5853     ETSLOT(NAME, as_sequence.SLOT, FUNCTION, WRAPPER, DOC)
   5854 #define MPSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
   5855     ETSLOT(NAME, as_mapping.SLOT, FUNCTION, WRAPPER, DOC)
   5856 #define NBSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
   5857     ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, DOC)
   5858 #define UNSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
   5859     ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, \
   5860            "x." NAME "() <==> " DOC)
   5861 #define IBSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
   5862     ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, \
   5863            "x." NAME "(y) <==> x" DOC "y")
   5864 #define BINSLOT(NAME, SLOT, FUNCTION, DOC) \
   5865     ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_l, \
   5866            "x." NAME "(y) <==> x" DOC "y")
   5867 #define RBINSLOT(NAME, SLOT, FUNCTION, DOC) \
   5868     ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_r, \
   5869            "x." NAME "(y) <==> y" DOC "x")
   5870 #define BINSLOTNOTINFIX(NAME, SLOT, FUNCTION, DOC) \
   5871     ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_l, \
   5872            "x." NAME "(y) <==> " DOC)
   5873 #define RBINSLOTNOTINFIX(NAME, SLOT, FUNCTION, DOC) \
   5874     ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_r, \
   5875            "x." NAME "(y) <==> " DOC)
   5876 
   5877 static slotdef slotdefs[] = {
   5878     TPSLOT("__str__", tp_print, NULL, NULL, ""),
   5879     TPSLOT("__repr__", tp_print, NULL, NULL, ""),
   5880     TPSLOT("__getattribute__", tp_getattr, NULL, NULL, ""),
   5881     TPSLOT("__getattr__", tp_getattr, NULL, NULL, ""),
   5882     TPSLOT("__setattr__", tp_setattr, NULL, NULL, ""),
   5883     TPSLOT("__delattr__", tp_setattr, NULL, NULL, ""),
   5884     TPSLOT("__cmp__", tp_compare, _PyObject_SlotCompare, wrap_cmpfunc,
   5885            "x.__cmp__(y) <==> cmp(x,y)"),
   5886     TPSLOT("__repr__", tp_repr, slot_tp_repr, wrap_unaryfunc,
   5887            "x.__repr__() <==> repr(x)"),
   5888     TPSLOT("__hash__", tp_hash, slot_tp_hash, wrap_hashfunc,
   5889            "x.__hash__() <==> hash(x)"),
   5890     FLSLOT("__call__", tp_call, slot_tp_call, (wrapperfunc)wrap_call,
   5891            "x.__call__(...) <==> x(...)", PyWrapperFlag_KEYWORDS),
   5892     TPSLOT("__str__", tp_str, slot_tp_str, wrap_unaryfunc,
   5893            "x.__str__() <==> str(x)"),
   5894     TPSLOT("__getattribute__", tp_getattro, slot_tp_getattr_hook,
   5895            wrap_binaryfunc, "x.__getattribute__('name') <==> x.name"),
   5896     TPSLOT("__getattr__", tp_getattro, slot_tp_getattr_hook, NULL, ""),
   5897     TPSLOT("__setattr__", tp_setattro, slot_tp_setattro, wrap_setattr,
   5898            "x.__setattr__('name', value) <==> x.name = value"),
   5899     TPSLOT("__delattr__", tp_setattro, slot_tp_setattro, wrap_delattr,
   5900            "x.__delattr__('name') <==> del x.name"),
   5901     TPSLOT("__lt__", tp_richcompare, slot_tp_richcompare, richcmp_lt,
   5902            "x.__lt__(y) <==> x<y"),
   5903     TPSLOT("__le__", tp_richcompare, slot_tp_richcompare, richcmp_le,
   5904            "x.__le__(y) <==> x<=y"),
   5905     TPSLOT("__eq__", tp_richcompare, slot_tp_richcompare, richcmp_eq,
   5906            "x.__eq__(y) <==> x==y"),
   5907     TPSLOT("__ne__", tp_richcompare, slot_tp_richcompare, richcmp_ne,
   5908            "x.__ne__(y) <==> x!=y"),
   5909     TPSLOT("__gt__", tp_richcompare, slot_tp_richcompare, richcmp_gt,
   5910            "x.__gt__(y) <==> x>y"),
   5911     TPSLOT("__ge__", tp_richcompare, slot_tp_richcompare, richcmp_ge,
   5912            "x.__ge__(y) <==> x>=y"),
   5913     TPSLOT("__iter__", tp_iter, slot_tp_iter, wrap_unaryfunc,
   5914            "x.__iter__() <==> iter(x)"),
   5915     TPSLOT("next", tp_iternext, slot_tp_iternext, wrap_next,
   5916            "x.next() -> the next value, or raise StopIteration"),
   5917     TPSLOT("__get__", tp_descr_get, slot_tp_descr_get, wrap_descr_get,
   5918            "descr.__get__(obj[, type]) -> value"),
   5919     TPSLOT("__set__", tp_descr_set, slot_tp_descr_set, wrap_descr_set,
   5920            "descr.__set__(obj, value)"),
   5921     TPSLOT("__delete__", tp_descr_set, slot_tp_descr_set,
   5922            wrap_descr_delete, "descr.__delete__(obj)"),
   5923     FLSLOT("__init__", tp_init, slot_tp_init, (wrapperfunc)wrap_init,
   5924            "x.__init__(...) initializes x; "
   5925            "see help(type(x)) for signature",
   5926            PyWrapperFlag_KEYWORDS),
   5927     TPSLOT("__new__", tp_new, slot_tp_new, NULL, ""),
   5928     TPSLOT("__del__", tp_del, slot_tp_del, NULL, ""),
   5929     BINSLOT("__add__", nb_add, slot_nb_add,
   5930         "+"),
   5931     RBINSLOT("__radd__", nb_add, slot_nb_add,
   5932              "+"),
   5933     BINSLOT("__sub__", nb_subtract, slot_nb_subtract,
   5934         "-"),
   5935     RBINSLOT("__rsub__", nb_subtract, slot_nb_subtract,
   5936              "-"),
   5937     BINSLOT("__mul__", nb_multiply, slot_nb_multiply,
   5938         "*"),
   5939     RBINSLOT("__rmul__", nb_multiply, slot_nb_multiply,
   5940              "*"),
   5941     BINSLOT("__div__", nb_divide, slot_nb_divide,
   5942         "/"),
   5943     RBINSLOT("__rdiv__", nb_divide, slot_nb_divide,
   5944              "/"),
   5945     BINSLOT("__mod__", nb_remainder, slot_nb_remainder,
   5946         "%"),
   5947     RBINSLOT("__rmod__", nb_remainder, slot_nb_remainder,
   5948              "%"),
   5949     BINSLOTNOTINFIX("__divmod__", nb_divmod, slot_nb_divmod,
   5950         "divmod(x, y)"),
   5951     RBINSLOTNOTINFIX("__rdivmod__", nb_divmod, slot_nb_divmod,
   5952              "divmod(y, x)"),
   5953     NBSLOT("__pow__", nb_power, slot_nb_power, wrap_ternaryfunc,
   5954            "x.__pow__(y[, z]) <==> pow(x, y[, z])"),
   5955     NBSLOT("__rpow__", nb_power, slot_nb_power, wrap_ternaryfunc_r,
   5956            "y.__rpow__(x[, z]) <==> pow(x, y[, z])"),
   5957     UNSLOT("__neg__", nb_negative, slot_nb_negative, wrap_unaryfunc, "-x"),
   5958     UNSLOT("__pos__", nb_positive, slot_nb_positive, wrap_unaryfunc, "+x"),
   5959     UNSLOT("__abs__", nb_absolute, slot_nb_absolute, wrap_unaryfunc,
   5960            "abs(x)"),
   5961     UNSLOT("__nonzero__", nb_nonzero, slot_nb_nonzero, wrap_inquirypred,
   5962            "x != 0"),
   5963     UNSLOT("__invert__", nb_invert, slot_nb_invert, wrap_unaryfunc, "~x"),
   5964     BINSLOT("__lshift__", nb_lshift, slot_nb_lshift, "<<"),
   5965     RBINSLOT("__rlshift__", nb_lshift, slot_nb_lshift, "<<"),
   5966     BINSLOT("__rshift__", nb_rshift, slot_nb_rshift, ">>"),
   5967     RBINSLOT("__rrshift__", nb_rshift, slot_nb_rshift, ">>"),
   5968     BINSLOT("__and__", nb_and, slot_nb_and, "&"),
   5969     RBINSLOT("__rand__", nb_and, slot_nb_and, "&"),
   5970     BINSLOT("__xor__", nb_xor, slot_nb_xor, "^"),
   5971     RBINSLOT("__rxor__", nb_xor, slot_nb_xor, "^"),
   5972     BINSLOT("__or__", nb_or, slot_nb_or, "|"),
   5973     RBINSLOT("__ror__", nb_or, slot_nb_or, "|"),
   5974     NBSLOT("__coerce__", nb_coerce, slot_nb_coerce, wrap_coercefunc,
   5975            "x.__coerce__(y) <==> coerce(x, y)"),
   5976     UNSLOT("__int__", nb_int, slot_nb_int, wrap_unaryfunc,
   5977            "int(x)"),
   5978     UNSLOT("__long__", nb_long, slot_nb_long, wrap_unaryfunc,
   5979            "long(x)"),
   5980     UNSLOT("__float__", nb_float, slot_nb_float, wrap_unaryfunc,
   5981            "float(x)"),
   5982     UNSLOT("__oct__", nb_oct, slot_nb_oct, wrap_unaryfunc,
   5983            "oct(x)"),
   5984     UNSLOT("__hex__", nb_hex, slot_nb_hex, wrap_unaryfunc,
   5985            "hex(x)"),
   5986     IBSLOT("__iadd__", nb_inplace_add, slot_nb_inplace_add,
   5987            wrap_binaryfunc, "+="),
   5988     IBSLOT("__isub__", nb_inplace_subtract, slot_nb_inplace_subtract,
   5989            wrap_binaryfunc, "-="),
   5990     IBSLOT("__imul__", nb_inplace_multiply, slot_nb_inplace_multiply,
   5991            wrap_binaryfunc, "*="),
   5992     IBSLOT("__idiv__", nb_inplace_divide, slot_nb_inplace_divide,
   5993            wrap_binaryfunc, "/="),
   5994     IBSLOT("__imod__", nb_inplace_remainder, slot_nb_inplace_remainder,
   5995            wrap_binaryfunc, "%="),
   5996     IBSLOT("__ipow__", nb_inplace_power, slot_nb_inplace_power,
   5997            wrap_binaryfunc, "**="),
   5998     IBSLOT("__ilshift__", nb_inplace_lshift, slot_nb_inplace_lshift,
   5999            wrap_binaryfunc, "<<="),
   6000     IBSLOT("__irshift__", nb_inplace_rshift, slot_nb_inplace_rshift,
   6001            wrap_binaryfunc, ">>="),
   6002     IBSLOT("__iand__", nb_inplace_and, slot_nb_inplace_and,
   6003            wrap_binaryfunc, "&="),
   6004     IBSLOT("__ixor__", nb_inplace_xor, slot_nb_inplace_xor,
   6005            wrap_binaryfunc, "^="),
   6006     IBSLOT("__ior__", nb_inplace_or, slot_nb_inplace_or,
   6007            wrap_binaryfunc, "|="),
   6008     BINSLOT("__floordiv__", nb_floor_divide, slot_nb_floor_divide, "//"),
   6009     RBINSLOT("__rfloordiv__", nb_floor_divide, slot_nb_floor_divide, "//"),
   6010     BINSLOT("__truediv__", nb_true_divide, slot_nb_true_divide, "/"),
   6011     RBINSLOT("__rtruediv__", nb_true_divide, slot_nb_true_divide, "/"),
   6012     IBSLOT("__ifloordiv__", nb_inplace_floor_divide,
   6013            slot_nb_inplace_floor_divide, wrap_binaryfunc, "//="),
   6014     IBSLOT("__itruediv__", nb_inplace_true_divide,
   6015            slot_nb_inplace_true_divide, wrap_binaryfunc, "/="),
   6016     NBSLOT("__index__", nb_index, slot_nb_index, wrap_unaryfunc,
   6017            "x[y:z] <==> x[y.__index__():z.__index__()]"),
   6018     MPSLOT("__len__", mp_length, slot_mp_length, wrap_lenfunc,
   6019            "x.__len__() <==> len(x)"),
   6020     MPSLOT("__getitem__", mp_subscript, slot_mp_subscript,
   6021            wrap_binaryfunc,
   6022            "x.__getitem__(y) <==> x[y]"),
   6023     MPSLOT("__setitem__", mp_ass_subscript, slot_mp_ass_subscript,
   6024            wrap_objobjargproc,
   6025            "x.__setitem__(i, y) <==> x[i]=y"),
   6026     MPSLOT("__delitem__", mp_ass_subscript, slot_mp_ass_subscript,
   6027            wrap_delitem,
   6028            "x.__delitem__(y) <==> del x[y]"),
   6029     SQSLOT("__len__", sq_length, slot_sq_length, wrap_lenfunc,
   6030            "x.__len__() <==> len(x)"),
   6031     /* Heap types defining __add__/__mul__ have sq_concat/sq_repeat == NULL.
   6032        The logic in abstract.c always falls back to nb_add/nb_multiply in
   6033        this case.  Defining both the nb_* and the sq_* slots to call the
   6034        user-defined methods has unexpected side-effects, as shown by
   6035        test_descr.notimplemented() */
   6036     SQSLOT("__add__", sq_concat, NULL, wrap_binaryfunc,
   6037       "x.__add__(y) <==> x+y"),
   6038     SQSLOT("__mul__", sq_repeat, NULL, wrap_indexargfunc,
   6039       "x.__mul__(n) <==> x*n"),
   6040     SQSLOT("__rmul__", sq_repeat, NULL, wrap_indexargfunc,
   6041       "x.__rmul__(n) <==> n*x"),
   6042     SQSLOT("__getitem__", sq_item, slot_sq_item, wrap_sq_item,
   6043            "x.__getitem__(y) <==> x[y]"),
   6044     SQSLOT("__getslice__", sq_slice, slot_sq_slice, wrap_ssizessizeargfunc,
   6045            "x.__getslice__(i, j) <==> x[i:j]\n\
   6046            \n\
   6047            Use of negative indices is not supported."),
   6048     SQSLOT("__setitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_setitem,
   6049            "x.__setitem__(i, y) <==> x[i]=y"),
   6050     SQSLOT("__delitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_delitem,
   6051            "x.__delitem__(y) <==> del x[y]"),
   6052     SQSLOT("__setslice__", sq_ass_slice, slot_sq_ass_slice,
   6053            wrap_ssizessizeobjargproc,
   6054            "x.__setslice__(i, j, y) <==> x[i:j]=y\n\
   6055            \n\
   6056            Use  of negative indices is not supported."),
   6057     SQSLOT("__delslice__", sq_ass_slice, slot_sq_ass_slice, wrap_delslice,
   6058            "x.__delslice__(i, j) <==> del x[i:j]\n\
   6059            \n\
   6060            Use of negative indices is not supported."),
   6061     SQSLOT("__contains__", sq_contains, slot_sq_contains, wrap_objobjproc,
   6062            "x.__contains__(y) <==> y in x"),
   6063     SQSLOT("__iadd__", sq_inplace_concat, NULL,
   6064       wrap_binaryfunc, "x.__iadd__(y) <==> x+=y"),
   6065     SQSLOT("__imul__", sq_inplace_repeat, NULL,
   6066       wrap_indexargfunc, "x.__imul__(y) <==> x*=y"),
   6067     {NULL}
   6068 };
   6069 
   6070 /* Given a type pointer and an offset gotten from a slotdef entry, return a
   6071    pointer to the actual slot.  This is not quite the same as simply adding
   6072    the offset to the type pointer, since it takes care to indirect through the
   6073    proper indirection pointer (as_buffer, etc.); it returns NULL if the
   6074    indirection pointer is NULL. */
   6075 static void **
   6076 slotptr(PyTypeObject *type, int ioffset)
   6077 {
   6078     char *ptr;
   6079     long offset = ioffset;
   6080 
   6081     /* Note: this depends on the order of the members of PyHeapTypeObject! */
   6082     assert(offset >= 0);
   6083     assert((size_t)offset < offsetof(PyHeapTypeObject, as_buffer));
   6084     if ((size_t)offset >= offsetof(PyHeapTypeObject, as_sequence)) {
   6085         ptr = (char *)type->tp_as_sequence;
   6086         offset -= offsetof(PyHeapTypeObject, as_sequence);
   6087     }
   6088     else if ((size_t)offset >= offsetof(PyHeapTypeObject, as_mapping)) {
   6089         ptr = (char *)type->tp_as_mapping;
   6090         offset -= offsetof(PyHeapTypeObject, as_mapping);
   6091     }
   6092     else if ((size_t)offset >= offsetof(PyHeapTypeObject, as_number)) {
   6093         ptr = (char *)type->tp_as_number;
   6094         offset -= offsetof(PyHeapTypeObject, as_number);
   6095     }
   6096     else {
   6097         ptr = (char *)type;
   6098     }
   6099     if (ptr != NULL)
   6100         ptr += offset;
   6101     return (void **)ptr;
   6102 }
   6103 
   6104 /* Length of array of slotdef pointers used to store slots with the
   6105    same __name__.  There should be at most MAX_EQUIV-1 slotdef entries with
   6106    the same __name__, for any __name__. Since that's a static property, it is
   6107    appropriate to declare fixed-size arrays for this. */
   6108 #define MAX_EQUIV 10
   6109 
   6110 /* Return a slot pointer for a given name, but ONLY if the attribute has
   6111    exactly one slot function.  The name must be an interned string. */
   6112 static void **
   6113 resolve_slotdups(PyTypeObject *type, PyObject *name)
   6114 {
   6115     /* XXX Maybe this could be optimized more -- but is it worth it? */
   6116 
   6117     /* pname and ptrs act as a little cache */
   6118     static PyObject *pname;
   6119     static slotdef *ptrs[MAX_EQUIV];
   6120     slotdef *p, **pp;
   6121     void **res, **ptr;
   6122 
   6123     if (pname != name) {
   6124         /* Collect all slotdefs that match name into ptrs. */
   6125         pname = name;
   6126         pp = ptrs;
   6127         for (p = slotdefs; p->name_strobj; p++) {
   6128             if (p->name_strobj == name)
   6129                 *pp++ = p;
   6130         }
   6131         *pp = NULL;
   6132     }
   6133 
   6134     /* Look in all matching slots of the type; if exactly one of these has
   6135        a filled-in slot, return its value.      Otherwise return NULL. */
   6136     res = NULL;
   6137     for (pp = ptrs; *pp; pp++) {
   6138         ptr = slotptr(type, (*pp)->offset);
   6139         if (ptr == NULL || *ptr == NULL)
   6140             continue;
   6141         if (res != NULL)
   6142             return NULL;
   6143         res = ptr;
   6144     }
   6145     return res;
   6146 }
   6147 
   6148 /* Common code for update_slots_callback() and fixup_slot_dispatchers().  This
   6149    does some incredibly complex thinking and then sticks something into the
   6150    slot.  (It sees if the adjacent slotdefs for the same slot have conflicting
   6151    interests, and then stores a generic wrapper or a specific function into
   6152    the slot.)  Return a pointer to the next slotdef with a different offset,
   6153    because that's convenient  for fixup_slot_dispatchers(). */
   6154 static slotdef *
   6155 update_one_slot(PyTypeObject *type, slotdef *p)
   6156 {
   6157     PyObject *descr;
   6158     PyWrapperDescrObject *d;
   6159     void *generic = NULL, *specific = NULL;
   6160     int use_generic = 0;
   6161     int offset = p->offset;
   6162     void **ptr = slotptr(type, offset);
   6163 
   6164     if (ptr == NULL) {
   6165         do {
   6166             ++p;
   6167         } while (p->offset == offset);
   6168         return p;
   6169     }
   6170     do {
   6171         descr = _PyType_Lookup(type, p->name_strobj);
   6172         if (descr == NULL) {
   6173             if (ptr == (void**)&type->tp_iternext) {
   6174                 specific = _PyObject_NextNotImplemented;
   6175             }
   6176             continue;
   6177         }
   6178         if (Py_TYPE(descr) == &PyWrapperDescr_Type &&
   6179             ((PyWrapperDescrObject *)descr)->d_base->name_strobj == p->name_strobj) {
   6180             void **tptr = resolve_slotdups(type, p->name_strobj);
   6181             if (tptr == NULL || tptr == ptr)
   6182                 generic = p->function;
   6183             d = (PyWrapperDescrObject *)descr;
   6184             if (d->d_base->wrapper == p->wrapper &&
   6185                 PyType_IsSubtype(type, d->d_type))
   6186             {
   6187                 if (specific == NULL ||
   6188                     specific == d->d_wrapped)
   6189                     specific = d->d_wrapped;
   6190                 else
   6191                     use_generic = 1;
   6192             }
   6193         }
   6194         else if (Py_TYPE(descr) == &PyCFunction_Type &&
   6195                  PyCFunction_GET_FUNCTION(descr) ==
   6196                  (PyCFunction)tp_new_wrapper &&
   6197                  ptr == (void**)&type->tp_new)
   6198         {
   6199             /* The __new__ wrapper is not a wrapper descriptor,
   6200                so must be special-cased differently.
   6201                If we don't do this, creating an instance will
   6202                always use slot_tp_new which will look up
   6203                __new__ in the MRO which will call tp_new_wrapper
   6204                which will look through the base classes looking
   6205                for a static base and call its tp_new (usually
   6206                PyType_GenericNew), after performing various
   6207                sanity checks and constructing a new argument
   6208                list.  Cut all that nonsense short -- this speeds
   6209                up instance creation tremendously. */
   6210             specific = (void *)type->tp_new;
   6211             /* XXX I'm not 100% sure that there isn't a hole
   6212                in this reasoning that requires additional
   6213                sanity checks.  I'll buy the first person to
   6214                point out a bug in this reasoning a beer. */
   6215         }
   6216         else if (descr == Py_None &&
   6217                  ptr == (void**)&type->tp_hash) {
   6218             /* We specifically allow __hash__ to be set to None
   6219                to prevent inheritance of the default
   6220                implementation from object.__hash__ */
   6221             specific = PyObject_HashNotImplemented;
   6222         }
   6223         else {
   6224             use_generic = 1;
   6225             generic = p->function;
   6226         }
   6227     } while ((++p)->offset == offset);
   6228     if (specific && !use_generic)
   6229         *ptr = specific;
   6230     else
   6231         *ptr = generic;
   6232     return p;
   6233 }
   6234 
   6235 /* In the type, update the slots whose slotdefs are gathered in the pp array.
   6236    This is a callback for update_subclasses(). */
   6237 static int
   6238 update_slots_callback(PyTypeObject *type, void *data)
   6239 {
   6240     slotdef **pp = (slotdef **)data;
   6241 
   6242     for (; *pp; pp++)
   6243         update_one_slot(type, *pp);
   6244     return 0;
   6245 }
   6246 
   6247 /* Initialize the slotdefs table by adding interned string objects for the
   6248    names and sorting the entries. */
   6249 static void
   6250 init_slotdefs(void)
   6251 {
   6252     slotdef *p;
   6253     static int initialized = 0;
   6254 
   6255     if (initialized)
   6256         return;
   6257     for (p = slotdefs; p->name; p++) {
   6258         /* Slots must be ordered by their offset in the PyHeapTypeObject. */
   6259         assert(!p[1].name || p->offset <= p[1].offset);
   6260         p->name_strobj = PyString_InternFromString(p->name);
   6261         if (!p->name_strobj)
   6262             Py_FatalError("Out of memory interning slotdef names");
   6263     }
   6264     initialized = 1;
   6265 }
   6266 
   6267 /* Update the slots after assignment to a class (type) attribute. */
   6268 static int
   6269 update_slot(PyTypeObject *type, PyObject *name)
   6270 {
   6271     slotdef *ptrs[MAX_EQUIV];
   6272     slotdef *p;
   6273     slotdef **pp;
   6274     int offset;
   6275 
   6276     /* Clear the VALID_VERSION flag of 'type' and all its
   6277        subclasses.  This could possibly be unified with the
   6278        update_subclasses() recursion below, but carefully:
   6279        they each have their own conditions on which to stop
   6280        recursing into subclasses. */
   6281     PyType_Modified(type);
   6282 
   6283     init_slotdefs();
   6284     pp = ptrs;
   6285     for (p = slotdefs; p->name; p++) {
   6286         /* XXX assume name is interned! */
   6287         if (p->name_strobj == name)
   6288             *pp++ = p;
   6289     }
   6290     *pp = NULL;
   6291     for (pp = ptrs; *pp; pp++) {
   6292         p = *pp;
   6293         offset = p->offset;
   6294         while (p > slotdefs && (p-1)->offset == offset)
   6295             --p;
   6296         *pp = p;
   6297     }
   6298     if (ptrs[0] == NULL)
   6299         return 0; /* Not an attribute that affects any slots */
   6300     return update_subclasses(type, name,
   6301                              update_slots_callback, (void *)ptrs);
   6302 }
   6303 
   6304 /* Store the proper functions in the slot dispatches at class (type)
   6305    definition time, based upon which operations the class overrides in its
   6306    dict. */
   6307 static void
   6308 fixup_slot_dispatchers(PyTypeObject *type)
   6309 {
   6310     slotdef *p;
   6311 
   6312     init_slotdefs();
   6313     for (p = slotdefs; p->name; )
   6314         p = update_one_slot(type, p);
   6315 }
   6316 
   6317 static void
   6318 update_all_slots(PyTypeObject* type)
   6319 {
   6320     slotdef *p;
   6321 
   6322     init_slotdefs();
   6323     for (p = slotdefs; p->name; p++) {
   6324         /* update_slot returns int but can't actually fail */
   6325         update_slot(type, p->name_strobj);
   6326     }
   6327 }
   6328 
   6329 /* recurse_down_subclasses() and update_subclasses() are mutually
   6330    recursive functions to call a callback for all subclasses,
   6331    but refraining from recursing into subclasses that define 'name'. */
   6332 
   6333 static int
   6334 update_subclasses(PyTypeObject *type, PyObject *name,
   6335                   update_callback callback, void *data)
   6336 {
   6337     if (callback(type, data) < 0)
   6338         return -1;
   6339     return recurse_down_subclasses(type, name, callback, data);
   6340 }
   6341 
   6342 static int
   6343 recurse_down_subclasses(PyTypeObject *type, PyObject *name,
   6344                         update_callback callback, void *data)
   6345 {
   6346     PyTypeObject *subclass;
   6347     PyObject *ref, *subclasses, *dict;
   6348     Py_ssize_t i, n;
   6349 
   6350     subclasses = type->tp_subclasses;
   6351     if (subclasses == NULL)
   6352         return 0;
   6353     assert(PyList_Check(subclasses));
   6354     n = PyList_GET_SIZE(subclasses);
   6355     for (i = 0; i < n; i++) {
   6356         ref = PyList_GET_ITEM(subclasses, i);
   6357         assert(PyWeakref_CheckRef(ref));
   6358         subclass = (PyTypeObject *)PyWeakref_GET_OBJECT(ref);
   6359         assert(subclass != NULL);
   6360         if ((PyObject *)subclass == Py_None)
   6361             continue;
   6362         assert(PyType_Check(subclass));
   6363         /* Avoid recursing down into unaffected classes */
   6364         dict = subclass->tp_dict;
   6365         if (dict != NULL && PyDict_Check(dict) &&
   6366             PyDict_GetItem(dict, name) != NULL)
   6367             continue;
   6368         if (update_subclasses(subclass, name, callback, data) < 0)
   6369             return -1;
   6370     }
   6371     return 0;
   6372 }
   6373 
   6374 /* This function is called by PyType_Ready() to populate the type's
   6375    dictionary with method descriptors for function slots.  For each
   6376    function slot (like tp_repr) that's defined in the type, one or more
   6377    corresponding descriptors are added in the type's tp_dict dictionary
   6378    under the appropriate name (like __repr__).  Some function slots
   6379    cause more than one descriptor to be added (for example, the nb_add
   6380    slot adds both __add__ and __radd__ descriptors) and some function
   6381    slots compete for the same descriptor (for example both sq_item and
   6382    mp_subscript generate a __getitem__ descriptor).
   6383 
   6384    In the latter case, the first slotdef entry encountered wins.  Since
   6385    slotdef entries are sorted by the offset of the slot in the
   6386    PyHeapTypeObject, this gives us some control over disambiguating
   6387    between competing slots: the members of PyHeapTypeObject are listed
   6388    from most general to least general, so the most general slot is
   6389    preferred.  In particular, because as_mapping comes before as_sequence,
   6390    for a type that defines both mp_subscript and sq_item, mp_subscript
   6391    wins.
   6392 
   6393    This only adds new descriptors and doesn't overwrite entries in
   6394    tp_dict that were previously defined.  The descriptors contain a
   6395    reference to the C function they must call, so that it's safe if they
   6396    are copied into a subtype's __dict__ and the subtype has a different
   6397    C function in its slot -- calling the method defined by the
   6398    descriptor will call the C function that was used to create it,
   6399    rather than the C function present in the slot when it is called.
   6400    (This is important because a subtype may have a C function in the
   6401    slot that calls the method from the dictionary, and we want to avoid
   6402    infinite recursion here.) */
   6403 
   6404 static int
   6405 add_operators(PyTypeObject *type)
   6406 {
   6407     PyObject *dict = type->tp_dict;
   6408     slotdef *p;
   6409     PyObject *descr;
   6410     void **ptr;
   6411 
   6412     init_slotdefs();
   6413     for (p = slotdefs; p->name; p++) {
   6414         if (p->wrapper == NULL)
   6415             continue;
   6416         ptr = slotptr(type, p->offset);
   6417         if (!ptr || !*ptr)
   6418             continue;
   6419         if (PyDict_GetItem(dict, p->name_strobj))
   6420             continue;
   6421         if (*ptr == PyObject_HashNotImplemented) {
   6422             /* Classes may prevent the inheritance of the tp_hash
   6423                slot by storing PyObject_HashNotImplemented in it. Make it
   6424                visible as a None value for the __hash__ attribute. */
   6425             if (PyDict_SetItem(dict, p->name_strobj, Py_None) < 0)
   6426                 return -1;
   6427         }
   6428         else {
   6429             descr = PyDescr_NewWrapper(type, p, *ptr);
   6430             if (descr == NULL)
   6431                 return -1;
   6432             if (PyDict_SetItem(dict, p->name_strobj, descr) < 0)
   6433                 return -1;
   6434             Py_DECREF(descr);
   6435         }
   6436     }
   6437     if (type->tp_new != NULL) {
   6438         if (add_tp_new_wrapper(type) < 0)
   6439             return -1;
   6440     }
   6441     return 0;
   6442 }
   6443 
   6444 
   6445 /* Cooperative 'super' */
   6446 
   6447 typedef struct {
   6448     PyObject_HEAD
   6449     PyTypeObject *type;
   6450     PyObject *obj;
   6451     PyTypeObject *obj_type;
   6452 } superobject;
   6453 
   6454 static PyMemberDef super_members[] = {
   6455     {"__thisclass__", T_OBJECT, offsetof(superobject, type), READONLY,
   6456      "the class invoking super()"},
   6457     {"__self__",  T_OBJECT, offsetof(superobject, obj), READONLY,
   6458      "the instance invoking super(); may be None"},
   6459     {"__self_class__", T_OBJECT, offsetof(superobject, obj_type), READONLY,
   6460      "the type of the instance invoking super(); may be None"},
   6461     {0}
   6462 };
   6463 
   6464 static void
   6465 super_dealloc(PyObject *self)
   6466 {
   6467     superobject *su = (superobject *)self;
   6468 
   6469     _PyObject_GC_UNTRACK(self);
   6470     Py_XDECREF(su->obj);
   6471     Py_XDECREF(su->type);
   6472     Py_XDECREF(su->obj_type);
   6473     Py_TYPE(self)->tp_free(self);
   6474 }
   6475 
   6476 static PyObject *
   6477 super_repr(PyObject *self)
   6478 {
   6479     superobject *su = (superobject *)self;
   6480 
   6481     if (su->obj_type)
   6482         return PyString_FromFormat(
   6483             "<super: <class '%s'>, <%s object>>",
   6484             su->type ? su->type->tp_name : "NULL",
   6485             su->obj_type->tp_name);
   6486     else
   6487         return PyString_FromFormat(
   6488             "<super: <class '%s'>, NULL>",
   6489             su->type ? su->type->tp_name : "NULL");
   6490 }
   6491 
   6492 static PyObject *
   6493 super_getattro(PyObject *self, PyObject *name)
   6494 {
   6495     superobject *su = (superobject *)self;
   6496     int skip = su->obj_type == NULL;
   6497 
   6498     if (!skip) {
   6499         /* We want __class__ to return the class of the super object
   6500            (i.e. super, or a subclass), not the class of su->obj. */
   6501         skip = (PyString_Check(name) &&
   6502             PyString_GET_SIZE(name) == 9 &&
   6503             strcmp(PyString_AS_STRING(name), "__class__") == 0);
   6504     }
   6505 
   6506     if (!skip) {
   6507         PyObject *mro, *res, *tmp, *dict;
   6508         PyTypeObject *starttype;
   6509         descrgetfunc f;
   6510         Py_ssize_t i, n;
   6511 
   6512         starttype = su->obj_type;
   6513         mro = starttype->tp_mro;
   6514 
   6515         if (mro == NULL)
   6516             n = 0;
   6517         else {
   6518             assert(PyTuple_Check(mro));
   6519             n = PyTuple_GET_SIZE(mro);
   6520         }
   6521         for (i = 0; i < n; i++) {
   6522             if ((PyObject *)(su->type) == PyTuple_GET_ITEM(mro, i))
   6523                 break;
   6524         }
   6525         i++;
   6526         res = NULL;
   6527         for (; i < n; i++) {
   6528             tmp = PyTuple_GET_ITEM(mro, i);
   6529             if (PyType_Check(tmp))
   6530                 dict = ((PyTypeObject *)tmp)->tp_dict;
   6531             else if (PyClass_Check(tmp))
   6532                 dict = ((PyClassObject *)tmp)->cl_dict;
   6533             else
   6534                 continue;
   6535             res = PyDict_GetItem(dict, name);
   6536             if (res != NULL) {
   6537                 Py_INCREF(res);
   6538                 f = Py_TYPE(res)->tp_descr_get;
   6539                 if (f != NULL) {
   6540                     tmp = f(res,
   6541                         /* Only pass 'obj' param if
   6542                            this is instance-mode super
   6543                            (See SF ID #743627)
   6544                         */
   6545                         (su->obj == (PyObject *)
   6546                                     su->obj_type
   6547                             ? (PyObject *)NULL
   6548                             : su->obj),
   6549                         (PyObject *)starttype);
   6550                     Py_DECREF(res);
   6551                     res = tmp;
   6552                 }
   6553                 return res;
   6554             }
   6555         }
   6556     }
   6557     return PyObject_GenericGetAttr(self, name);
   6558 }
   6559 
   6560 static PyTypeObject *
   6561 supercheck(PyTypeObject *type, PyObject *obj)
   6562 {
   6563     /* Check that a super() call makes sense.  Return a type object.
   6564 
   6565        obj can be a new-style class, or an instance of one:
   6566 
   6567        - If it is a class, it must be a subclass of 'type'.      This case is
   6568          used for class methods; the return value is obj.
   6569 
   6570        - If it is an instance, it must be an instance of 'type'.  This is
   6571          the normal case; the return value is obj.__class__.
   6572 
   6573        But... when obj is an instance, we want to allow for the case where
   6574        Py_TYPE(obj) is not a subclass of type, but obj.__class__ is!
   6575        This will allow using super() with a proxy for obj.
   6576     */
   6577 
   6578     /* Check for first bullet above (special case) */
   6579     if (PyType_Check(obj) && PyType_IsSubtype((PyTypeObject *)obj, type)) {
   6580         Py_INCREF(obj);
   6581         return (PyTypeObject *)obj;
   6582     }
   6583 
   6584     /* Normal case */
   6585     if (PyType_IsSubtype(Py_TYPE(obj), type)) {
   6586         Py_INCREF(Py_TYPE(obj));
   6587         return Py_TYPE(obj);
   6588     }
   6589     else {
   6590         /* Try the slow way */
   6591         static PyObject *class_str = NULL;
   6592         PyObject *class_attr;
   6593 
   6594         if (class_str == NULL) {
   6595             class_str = PyString_FromString("__class__");
   6596             if (class_str == NULL)
   6597                 return NULL;
   6598         }
   6599 
   6600         class_attr = PyObject_GetAttr(obj, class_str);
   6601 
   6602         if (class_attr != NULL &&
   6603             PyType_Check(class_attr) &&
   6604             (PyTypeObject *)class_attr != Py_TYPE(obj))
   6605         {
   6606             int ok = PyType_IsSubtype(
   6607                 (PyTypeObject *)class_attr, type);
   6608             if (ok)
   6609                 return (PyTypeObject *)class_attr;
   6610         }
   6611 
   6612         if (class_attr == NULL)
   6613             PyErr_Clear();
   6614         else
   6615             Py_DECREF(class_attr);
   6616     }
   6617 
   6618     PyErr_SetString(PyExc_TypeError,
   6619                     "super(type, obj): "
   6620                     "obj must be an instance or subtype of type");
   6621     return NULL;
   6622 }
   6623 
   6624 static PyObject *
   6625 super_descr_get(PyObject *self, PyObject *obj, PyObject *type)
   6626 {
   6627     superobject *su = (superobject *)self;
   6628     superobject *newobj;
   6629 
   6630     if (obj == NULL || obj == Py_None || su->obj != NULL) {
   6631         /* Not binding to an object, or already bound */
   6632         Py_INCREF(self);
   6633         return self;
   6634     }
   6635     if (Py_TYPE(su) != &PySuper_Type)
   6636         /* If su is an instance of a (strict) subclass of super,
   6637            call its type */
   6638         return PyObject_CallFunctionObjArgs((PyObject *)Py_TYPE(su),
   6639                                             su->type, obj, NULL);
   6640     else {
   6641         /* Inline the common case */
   6642         PyTypeObject *obj_type = supercheck(su->type, obj);
   6643         if (obj_type == NULL)
   6644             return NULL;
   6645         newobj = (superobject *)PySuper_Type.tp_new(&PySuper_Type,
   6646                                                  NULL, NULL);
   6647         if (newobj == NULL)
   6648             return NULL;
   6649         Py_INCREF(su->type);
   6650         Py_INCREF(obj);
   6651         newobj->type = su->type;
   6652         newobj->obj = obj;
   6653         newobj->obj_type = obj_type;
   6654         return (PyObject *)newobj;
   6655     }
   6656 }
   6657 
   6658 static int
   6659 super_init(PyObject *self, PyObject *args, PyObject *kwds)
   6660 {
   6661     superobject *su = (superobject *)self;
   6662     PyTypeObject *type;
   6663     PyObject *obj = NULL;
   6664     PyTypeObject *obj_type = NULL;
   6665 
   6666     if (!_PyArg_NoKeywords("super", kwds))
   6667         return -1;
   6668     if (!PyArg_ParseTuple(args, "O!|O:super", &PyType_Type, &type, &obj))
   6669         return -1;
   6670     if (obj == Py_None)
   6671         obj = NULL;
   6672     if (obj != NULL) {
   6673         obj_type = supercheck(type, obj);
   6674         if (obj_type == NULL)
   6675             return -1;
   6676         Py_INCREF(obj);
   6677     }
   6678     Py_INCREF(type);
   6679     su->type = type;
   6680     su->obj = obj;
   6681     su->obj_type = obj_type;
   6682     return 0;
   6683 }
   6684 
   6685 PyDoc_STRVAR(super_doc,
   6686 "super(type, obj) -> bound super object; requires isinstance(obj, type)\n"
   6687 "super(type) -> unbound super object\n"
   6688 "super(type, type2) -> bound super object; requires issubclass(type2, type)\n"
   6689 "Typical use to call a cooperative superclass method:\n"
   6690 "class C(B):\n"
   6691 "    def meth(self, arg):\n"
   6692 "        super(C, self).meth(arg)");
   6693 
   6694 static int
   6695 super_traverse(PyObject *self, visitproc visit, void *arg)
   6696 {
   6697     superobject *su = (superobject *)self;
   6698 
   6699     Py_VISIT(su->obj);
   6700     Py_VISIT(su->type);
   6701     Py_VISIT(su->obj_type);
   6702 
   6703     return 0;
   6704 }
   6705 
   6706 PyTypeObject PySuper_Type = {
   6707     PyVarObject_HEAD_INIT(&PyType_Type, 0)
   6708     "super",                                    /* tp_name */
   6709     sizeof(superobject),                        /* tp_basicsize */
   6710     0,                                          /* tp_itemsize */
   6711     /* methods */
   6712     super_dealloc,                              /* tp_dealloc */
   6713     0,                                          /* tp_print */
   6714     0,                                          /* tp_getattr */
   6715     0,                                          /* tp_setattr */
   6716     0,                                          /* tp_compare */
   6717     super_repr,                                 /* tp_repr */
   6718     0,                                          /* tp_as_number */
   6719     0,                                          /* tp_as_sequence */
   6720     0,                                          /* tp_as_mapping */
   6721     0,                                          /* tp_hash */
   6722     0,                                          /* tp_call */
   6723     0,                                          /* tp_str */
   6724     super_getattro,                             /* tp_getattro */
   6725     0,                                          /* tp_setattro */
   6726     0,                                          /* tp_as_buffer */
   6727     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
   6728         Py_TPFLAGS_BASETYPE,                    /* tp_flags */
   6729     super_doc,                                  /* tp_doc */
   6730     super_traverse,                             /* tp_traverse */
   6731     0,                                          /* tp_clear */
   6732     0,                                          /* tp_richcompare */
   6733     0,                                          /* tp_weaklistoffset */
   6734     0,                                          /* tp_iter */
   6735     0,                                          /* tp_iternext */
   6736     0,                                          /* tp_methods */
   6737     super_members,                              /* tp_members */
   6738     0,                                          /* tp_getset */
   6739     0,                                          /* tp_base */
   6740     0,                                          /* tp_dict */
   6741     super_descr_get,                            /* tp_descr_get */
   6742     0,                                          /* tp_descr_set */
   6743     0,                                          /* tp_dictoffset */
   6744     super_init,                                 /* tp_init */
   6745     PyType_GenericAlloc,                        /* tp_alloc */
   6746     PyType_GenericNew,                          /* tp_new */
   6747     PyObject_GC_Del,                            /* tp_free */
   6748 };
   6749