Home | History | Annotate | Download | only in Objects
      1 
      2 /* set object implementation
      3    Written and maintained by Raymond D. Hettinger <python (at) rcn.com>
      4    Derived from Lib/sets.py and Objects/dictobject.c.
      5 */
      6 
      7 #include "Python.h"
      8 #include "structmember.h"
      9 
     10 /* Set a key error with the specified argument, wrapping it in a
     11  * tuple automatically so that tuple keys are not unpacked as the
     12  * exception arguments. */
     13 static void
     14 set_key_error(PyObject *arg)
     15 {
     16     PyObject *tup;
     17     tup = PyTuple_Pack(1, arg);
     18     if (!tup)
     19         return; /* caller will expect error to be set anyway */
     20     PyErr_SetObject(PyExc_KeyError, tup);
     21     Py_DECREF(tup);
     22 }
     23 
     24 /* This must be >= 1. */
     25 #define PERTURB_SHIFT 5
     26 
     27 /* Object used as dummy key to fill deleted entries */
     28 static PyObject *dummy = NULL; /* Initialized by first call to make_new_set() */
     29 
     30 #ifdef Py_REF_DEBUG
     31 PyObject *
     32 _PySet_Dummy(void)
     33 {
     34     return dummy;
     35 }
     36 #endif
     37 
     38 #define INIT_NONZERO_SET_SLOTS(so) do {                         \
     39     (so)->table = (so)->smalltable;                             \
     40     (so)->mask = PySet_MINSIZE - 1;                             \
     41     (so)->hash = -1;                                            \
     42     } while(0)
     43 
     44 #define EMPTY_TO_MINSIZE(so) do {                               \
     45     memset((so)->smalltable, 0, sizeof((so)->smalltable));      \
     46     (so)->used = (so)->fill = 0;                                \
     47     INIT_NONZERO_SET_SLOTS(so);                                 \
     48     } while(0)
     49 
     50 /* Reuse scheme to save calls to malloc, free, and memset */
     51 #ifndef PySet_MAXFREELIST
     52 #define PySet_MAXFREELIST 80
     53 #endif
     54 static PySetObject *free_list[PySet_MAXFREELIST];
     55 static int numfree = 0;
     56 
     57 /*
     58 The basic lookup function used by all operations.
     59 This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
     60 Open addressing is preferred over chaining since the link overhead for
     61 chaining would be substantial (100% with typical malloc overhead).
     62 
     63 The initial probe index is computed as hash mod the table size. Subsequent
     64 probe indices are computed as explained in Objects/dictobject.c.
     65 
     66 All arithmetic on hash should ignore overflow.
     67 
     68 Unlike the dictionary implementation, the lookkey functions can return
     69 NULL if the rich comparison returns an error.
     70 */
     71 
     72 static setentry *
     73 set_lookkey(PySetObject *so, PyObject *key, register long hash)
     74 {
     75     register Py_ssize_t i;
     76     register size_t perturb;
     77     register setentry *freeslot;
     78     register size_t mask = so->mask;
     79     setentry *table = so->table;
     80     register setentry *entry;
     81     register int cmp;
     82     PyObject *startkey;
     83 
     84     i = hash & mask;
     85     entry = &table[i];
     86     if (entry->key == NULL || entry->key == key)
     87         return entry;
     88 
     89     if (entry->key == dummy)
     90         freeslot = entry;
     91     else {
     92         if (entry->hash == hash) {
     93             startkey = entry->key;
     94             Py_INCREF(startkey);
     95             cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
     96             Py_DECREF(startkey);
     97             if (cmp < 0)
     98                 return NULL;
     99             if (table == so->table && entry->key == startkey) {
    100                 if (cmp > 0)
    101                     return entry;
    102             }
    103             else {
    104                 /* The compare did major nasty stuff to the
    105                  * set:  start over.
    106                  */
    107                 return set_lookkey(so, key, hash);
    108             }
    109         }
    110         freeslot = NULL;
    111     }
    112 
    113     /* In the loop, key == dummy is by far (factor of 100s) the
    114        least likely outcome, so test for that last. */
    115     for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
    116         i = (i << 2) + i + perturb + 1;
    117         entry = &table[i & mask];
    118         if (entry->key == NULL) {
    119             if (freeslot != NULL)
    120                 entry = freeslot;
    121             break;
    122         }
    123         if (entry->key == key)
    124             break;
    125         if (entry->hash == hash && entry->key != dummy) {
    126             startkey = entry->key;
    127             Py_INCREF(startkey);
    128             cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
    129             Py_DECREF(startkey);
    130             if (cmp < 0)
    131                 return NULL;
    132             if (table == so->table && entry->key == startkey) {
    133                 if (cmp > 0)
    134                     break;
    135             }
    136             else {
    137                 /* The compare did major nasty stuff to the
    138                  * set:  start over.
    139                  */
    140                 return set_lookkey(so, key, hash);
    141             }
    142         }
    143         else if (entry->key == dummy && freeslot == NULL)
    144             freeslot = entry;
    145     }
    146     return entry;
    147 }
    148 
    149 /*
    150  * Hacked up version of set_lookkey which can assume keys are always strings;
    151  * This means we can always use _PyString_Eq directly and not have to check to
    152  * see if the comparison altered the table.
    153  */
    154 static setentry *
    155 set_lookkey_string(PySetObject *so, PyObject *key, register long hash)
    156 {
    157     register Py_ssize_t i;
    158     register size_t perturb;
    159     register setentry *freeslot;
    160     register size_t mask = so->mask;
    161     setentry *table = so->table;
    162     register setentry *entry;
    163 
    164     /* Make sure this function doesn't have to handle non-string keys,
    165        including subclasses of str; e.g., one reason to subclass
    166        strings is to override __eq__, and for speed we don't cater to
    167        that here. */
    168     if (!PyString_CheckExact(key)) {
    169         so->lookup = set_lookkey;
    170         return set_lookkey(so, key, hash);
    171     }
    172     i = hash & mask;
    173     entry = &table[i];
    174     if (entry->key == NULL || entry->key == key)
    175         return entry;
    176     if (entry->key == dummy)
    177         freeslot = entry;
    178     else {
    179         if (entry->hash == hash && _PyString_Eq(entry->key, key))
    180             return entry;
    181         freeslot = NULL;
    182     }
    183 
    184     /* In the loop, key == dummy is by far (factor of 100s) the
    185        least likely outcome, so test for that last. */
    186     for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
    187         i = (i << 2) + i + perturb + 1;
    188         entry = &table[i & mask];
    189         if (entry->key == NULL)
    190             return freeslot == NULL ? entry : freeslot;
    191         if (entry->key == key
    192             || (entry->hash == hash
    193             && entry->key != dummy
    194             && _PyString_Eq(entry->key, key)))
    195             return entry;
    196         if (entry->key == dummy && freeslot == NULL)
    197             freeslot = entry;
    198     }
    199     assert(0);          /* NOT REACHED */
    200     return 0;
    201 }
    202 
    203 /*
    204 Internal routine to insert a new key into the table.
    205 Used by the public insert routine.
    206 Eats a reference to key.
    207 */
    208 static int
    209 set_insert_key(register PySetObject *so, PyObject *key, long hash)
    210 {
    211     register setentry *entry;
    212 
    213     assert(so->lookup != NULL);
    214     entry = so->lookup(so, key, hash);
    215     if (entry == NULL)
    216         return -1;
    217     if (entry->key == NULL) {
    218         /* UNUSED */
    219         so->fill++;
    220         entry->key = key;
    221         entry->hash = hash;
    222         so->used++;
    223     } else if (entry->key == dummy) {
    224         /* DUMMY */
    225         entry->key = key;
    226         entry->hash = hash;
    227         so->used++;
    228         Py_DECREF(dummy);
    229     } else {
    230         /* ACTIVE */
    231         Py_DECREF(key);
    232     }
    233     return 0;
    234 }
    235 
    236 /*
    237 Internal routine used by set_table_resize() to insert an item which is
    238 known to be absent from the set.  This routine also assumes that
    239 the set contains no deleted entries.  Besides the performance benefit,
    240 using set_insert_clean() in set_table_resize() is dangerous (SF bug #1456209).
    241 Note that no refcounts are changed by this routine; if needed, the caller
    242 is responsible for incref'ing `key`.
    243 */
    244 static void
    245 set_insert_clean(register PySetObject *so, PyObject *key, long hash)
    246 {
    247     register size_t i;
    248     register size_t perturb;
    249     register size_t mask = (size_t)so->mask;
    250     setentry *table = so->table;
    251     register setentry *entry;
    252 
    253     i = hash & mask;
    254     entry = &table[i];
    255     for (perturb = hash; entry->key != NULL; perturb >>= PERTURB_SHIFT) {
    256         i = (i << 2) + i + perturb + 1;
    257         entry = &table[i & mask];
    258     }
    259     so->fill++;
    260     entry->key = key;
    261     entry->hash = hash;
    262     so->used++;
    263 }
    264 
    265 /*
    266 Restructure the table by allocating a new table and reinserting all
    267 keys again.  When entries have been deleted, the new table may
    268 actually be smaller than the old one.
    269 */
    270 static int
    271 set_table_resize(PySetObject *so, Py_ssize_t minused)
    272 {
    273     Py_ssize_t newsize;
    274     setentry *oldtable, *newtable, *entry;
    275     Py_ssize_t i;
    276     int is_oldtable_malloced;
    277     setentry small_copy[PySet_MINSIZE];
    278 
    279     assert(minused >= 0);
    280 
    281     /* Find the smallest table size > minused. */
    282     for (newsize = PySet_MINSIZE;
    283          newsize <= minused && newsize > 0;
    284          newsize <<= 1)
    285         ;
    286     if (newsize <= 0) {
    287         PyErr_NoMemory();
    288         return -1;
    289     }
    290 
    291     /* Get space for a new table. */
    292     oldtable = so->table;
    293     assert(oldtable != NULL);
    294     is_oldtable_malloced = oldtable != so->smalltable;
    295 
    296     if (newsize == PySet_MINSIZE) {
    297         /* A large table is shrinking, or we can't get any smaller. */
    298         newtable = so->smalltable;
    299         if (newtable == oldtable) {
    300             if (so->fill == so->used) {
    301                 /* No dummies, so no point doing anything. */
    302                 return 0;
    303             }
    304             /* We're not going to resize it, but rebuild the
    305                table anyway to purge old dummy entries.
    306                Subtle:  This is *necessary* if fill==size,
    307                as set_lookkey needs at least one virgin slot to
    308                terminate failing searches.  If fill < size, it's
    309                merely desirable, as dummies slow searches. */
    310             assert(so->fill > so->used);
    311             memcpy(small_copy, oldtable, sizeof(small_copy));
    312             oldtable = small_copy;
    313         }
    314     }
    315     else {
    316         newtable = PyMem_NEW(setentry, newsize);
    317         if (newtable == NULL) {
    318             PyErr_NoMemory();
    319             return -1;
    320         }
    321     }
    322 
    323     /* Make the set empty, using the new table. */
    324     assert(newtable != oldtable);
    325     so->table = newtable;
    326     so->mask = newsize - 1;
    327     memset(newtable, 0, sizeof(setentry) * newsize);
    328     so->used = 0;
    329     i = so->fill;
    330     so->fill = 0;
    331 
    332     /* Copy the data over; this is refcount-neutral for active entries;
    333        dummy entries aren't copied over, of course */
    334     for (entry = oldtable; i > 0; entry++) {
    335         if (entry->key == NULL) {
    336             /* UNUSED */
    337             ;
    338         } else if (entry->key == dummy) {
    339             /* DUMMY */
    340             --i;
    341             assert(entry->key == dummy);
    342             Py_DECREF(entry->key);
    343         } else {
    344             /* ACTIVE */
    345             --i;
    346             set_insert_clean(so, entry->key, entry->hash);
    347         }
    348     }
    349 
    350     if (is_oldtable_malloced)
    351         PyMem_DEL(oldtable);
    352     return 0;
    353 }
    354 
    355 /* CAUTION: set_add_key/entry() must guarantee it won't resize the table */
    356 
    357 static int
    358 set_add_entry(register PySetObject *so, setentry *entry)
    359 {
    360     register Py_ssize_t n_used;
    361     PyObject *key = entry->key;
    362     long hash = entry->hash;
    363 
    364     assert(so->fill <= so->mask);  /* at least one empty slot */
    365     n_used = so->used;
    366     Py_INCREF(key);
    367     if (set_insert_key(so, key, hash) == -1) {
    368         Py_DECREF(key);
    369         return -1;
    370     }
    371     if (!(so->used > n_used && so->fill*3 >= (so->mask+1)*2))
    372         return 0;
    373     return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
    374 }
    375 
    376 static int
    377 set_add_key(register PySetObject *so, PyObject *key)
    378 {
    379     register long hash;
    380     register Py_ssize_t n_used;
    381 
    382     if (!PyString_CheckExact(key) ||
    383         (hash = ((PyStringObject *) key)->ob_shash) == -1) {
    384         hash = PyObject_Hash(key);
    385         if (hash == -1)
    386             return -1;
    387     }
    388     assert(so->fill <= so->mask);  /* at least one empty slot */
    389     n_used = so->used;
    390     Py_INCREF(key);
    391     if (set_insert_key(so, key, hash) == -1) {
    392         Py_DECREF(key);
    393         return -1;
    394     }
    395     if (!(so->used > n_used && so->fill*3 >= (so->mask+1)*2))
    396         return 0;
    397     return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
    398 }
    399 
    400 #define DISCARD_NOTFOUND 0
    401 #define DISCARD_FOUND 1
    402 
    403 static int
    404 set_discard_entry(PySetObject *so, setentry *oldentry)
    405 {       register setentry *entry;
    406     PyObject *old_key;
    407 
    408     entry = (so->lookup)(so, oldentry->key, oldentry->hash);
    409     if (entry == NULL)
    410         return -1;
    411     if (entry->key == NULL  ||  entry->key == dummy)
    412         return DISCARD_NOTFOUND;
    413     old_key = entry->key;
    414     Py_INCREF(dummy);
    415     entry->key = dummy;
    416     so->used--;
    417     Py_DECREF(old_key);
    418     return DISCARD_FOUND;
    419 }
    420 
    421 static int
    422 set_discard_key(PySetObject *so, PyObject *key)
    423 {
    424     register long hash;
    425     register setentry *entry;
    426     PyObject *old_key;
    427 
    428     assert (PyAnySet_Check(so));
    429     if (!PyString_CheckExact(key) ||
    430         (hash = ((PyStringObject *) key)->ob_shash) == -1) {
    431         hash = PyObject_Hash(key);
    432         if (hash == -1)
    433             return -1;
    434     }
    435     entry = (so->lookup)(so, key, hash);
    436     if (entry == NULL)
    437         return -1;
    438     if (entry->key == NULL  ||  entry->key == dummy)
    439         return DISCARD_NOTFOUND;
    440     old_key = entry->key;
    441     Py_INCREF(dummy);
    442     entry->key = dummy;
    443     so->used--;
    444     Py_DECREF(old_key);
    445     return DISCARD_FOUND;
    446 }
    447 
    448 static int
    449 set_clear_internal(PySetObject *so)
    450 {
    451     setentry *entry, *table;
    452     int table_is_malloced;
    453     Py_ssize_t fill;
    454     setentry small_copy[PySet_MINSIZE];
    455 #ifdef Py_DEBUG
    456     Py_ssize_t i, n;
    457     assert (PyAnySet_Check(so));
    458 
    459     n = so->mask + 1;
    460     i = 0;
    461 #endif
    462 
    463     table = so->table;
    464     assert(table != NULL);
    465     table_is_malloced = table != so->smalltable;
    466 
    467     /* This is delicate.  During the process of clearing the set,
    468      * decrefs can cause the set to mutate.  To avoid fatal confusion
    469      * (voice of experience), we have to make the set empty before
    470      * clearing the slots, and never refer to anything via so->ref while
    471      * clearing.
    472      */
    473     fill = so->fill;
    474     if (table_is_malloced)
    475         EMPTY_TO_MINSIZE(so);
    476 
    477     else if (fill > 0) {
    478         /* It's a small table with something that needs to be cleared.
    479          * Afraid the only safe way is to copy the set entries into
    480          * another small table first.
    481          */
    482         memcpy(small_copy, table, sizeof(small_copy));
    483         table = small_copy;
    484         EMPTY_TO_MINSIZE(so);
    485     }
    486     /* else it's a small table that's already empty */
    487 
    488     /* Now we can finally clear things.  If C had refcounts, we could
    489      * assert that the refcount on table is 1 now, i.e. that this function
    490      * has unique access to it, so decref side-effects can't alter it.
    491      */
    492     for (entry = table; fill > 0; ++entry) {
    493 #ifdef Py_DEBUG
    494         assert(i < n);
    495         ++i;
    496 #endif
    497         if (entry->key) {
    498             --fill;
    499             Py_DECREF(entry->key);
    500         }
    501 #ifdef Py_DEBUG
    502         else
    503             assert(entry->key == NULL);
    504 #endif
    505     }
    506 
    507     if (table_is_malloced)
    508         PyMem_DEL(table);
    509     return 0;
    510 }
    511 
    512 /*
    513  * Iterate over a set table.  Use like so:
    514  *
    515  *     Py_ssize_t pos;
    516  *     setentry *entry;
    517  *     pos = 0;   # important!  pos should not otherwise be changed by you
    518  *     while (set_next(yourset, &pos, &entry)) {
    519  *              Refer to borrowed reference in entry->key.
    520  *     }
    521  *
    522  * CAUTION:  In general, it isn't safe to use set_next in a loop that
    523  * mutates the table.
    524  */
    525 static int
    526 set_next(PySetObject *so, Py_ssize_t *pos_ptr, setentry **entry_ptr)
    527 {
    528     Py_ssize_t i;
    529     Py_ssize_t mask;
    530     register setentry *table;
    531 
    532     assert (PyAnySet_Check(so));
    533     i = *pos_ptr;
    534     assert(i >= 0);
    535     table = so->table;
    536     mask = so->mask;
    537     while (i <= mask && (table[i].key == NULL || table[i].key == dummy))
    538         i++;
    539     *pos_ptr = i+1;
    540     if (i > mask)
    541         return 0;
    542     assert(table[i].key != NULL);
    543     *entry_ptr = &table[i];
    544     return 1;
    545 }
    546 
    547 static void
    548 set_dealloc(PySetObject *so)
    549 {
    550     register setentry *entry;
    551     Py_ssize_t fill = so->fill;
    552     PyObject_GC_UnTrack(so);
    553     Py_TRASHCAN_SAFE_BEGIN(so)
    554     if (so->weakreflist != NULL)
    555         PyObject_ClearWeakRefs((PyObject *) so);
    556 
    557     for (entry = so->table; fill > 0; entry++) {
    558         if (entry->key) {
    559             --fill;
    560             Py_DECREF(entry->key);
    561         }
    562     }
    563     if (so->table != so->smalltable)
    564         PyMem_DEL(so->table);
    565     if (numfree < PySet_MAXFREELIST && PyAnySet_CheckExact(so))
    566         free_list[numfree++] = so;
    567     else
    568         Py_TYPE(so)->tp_free(so);
    569     Py_TRASHCAN_SAFE_END(so)
    570 }
    571 
    572 static int
    573 set_tp_print(PySetObject *so, FILE *fp, int flags)
    574 {
    575     setentry *entry;
    576     Py_ssize_t pos=0;
    577     char *emit = "";            /* No separator emitted on first pass */
    578     char *separator = ", ";
    579     int status = Py_ReprEnter((PyObject*)so);
    580 
    581     if (status != 0) {
    582         if (status < 0)
    583             return status;
    584         Py_BEGIN_ALLOW_THREADS
    585         fprintf(fp, "%s(...)", so->ob_type->tp_name);
    586         Py_END_ALLOW_THREADS
    587         return 0;
    588     }
    589 
    590     Py_BEGIN_ALLOW_THREADS
    591     fprintf(fp, "%s([", so->ob_type->tp_name);
    592     Py_END_ALLOW_THREADS
    593     while (set_next(so, &pos, &entry)) {
    594         Py_BEGIN_ALLOW_THREADS
    595         fputs(emit, fp);
    596         Py_END_ALLOW_THREADS
    597         emit = separator;
    598         if (PyObject_Print(entry->key, fp, 0) != 0) {
    599             Py_ReprLeave((PyObject*)so);
    600             return -1;
    601         }
    602     }
    603     Py_BEGIN_ALLOW_THREADS
    604     fputs("])", fp);
    605     Py_END_ALLOW_THREADS
    606     Py_ReprLeave((PyObject*)so);
    607     return 0;
    608 }
    609 
    610 static PyObject *
    611 set_repr(PySetObject *so)
    612 {
    613     PyObject *keys, *result=NULL, *listrepr;
    614     int status = Py_ReprEnter((PyObject*)so);
    615 
    616     if (status != 0) {
    617         if (status < 0)
    618             return NULL;
    619         return PyString_FromFormat("%s(...)", so->ob_type->tp_name);
    620     }
    621 
    622     keys = PySequence_List((PyObject *)so);
    623     if (keys == NULL)
    624         goto done;
    625     listrepr = PyObject_Repr(keys);
    626     Py_DECREF(keys);
    627     if (listrepr == NULL)
    628         goto done;
    629 
    630     result = PyString_FromFormat("%s(%s)", so->ob_type->tp_name,
    631         PyString_AS_STRING(listrepr));
    632     Py_DECREF(listrepr);
    633 done:
    634     Py_ReprLeave((PyObject*)so);
    635     return result;
    636 }
    637 
    638 static Py_ssize_t
    639 set_len(PyObject *so)
    640 {
    641     return ((PySetObject *)so)->used;
    642 }
    643 
    644 static int
    645 set_merge(PySetObject *so, PyObject *otherset)
    646 {
    647     PySetObject *other;
    648     PyObject *key;
    649     long hash;
    650     register Py_ssize_t i;
    651     register setentry *entry;
    652 
    653     assert (PyAnySet_Check(so));
    654     assert (PyAnySet_Check(otherset));
    655 
    656     other = (PySetObject*)otherset;
    657     if (other == so || other->used == 0)
    658         /* a.update(a) or a.update({}); nothing to do */
    659         return 0;
    660     /* Do one big resize at the start, rather than
    661      * incrementally resizing as we insert new keys.  Expect
    662      * that there will be no (or few) overlapping keys.
    663      */
    664     if ((so->fill + other->used)*3 >= (so->mask+1)*2) {
    665        if (set_table_resize(so, (so->used + other->used)*2) != 0)
    666            return -1;
    667     }
    668     for (i = 0; i <= other->mask; i++) {
    669         entry = &other->table[i];
    670         key = entry->key;
    671         hash = entry->hash;
    672         if (key != NULL &&
    673             key != dummy) {
    674             Py_INCREF(key);
    675             if (set_insert_key(so, key, hash) == -1) {
    676                 Py_DECREF(key);
    677                 return -1;
    678             }
    679         }
    680     }
    681     return 0;
    682 }
    683 
    684 static int
    685 set_contains_key(PySetObject *so, PyObject *key)
    686 {
    687     long hash;
    688     setentry *entry;
    689 
    690     if (!PyString_CheckExact(key) ||
    691         (hash = ((PyStringObject *) key)->ob_shash) == -1) {
    692         hash = PyObject_Hash(key);
    693         if (hash == -1)
    694             return -1;
    695     }
    696     entry = (so->lookup)(so, key, hash);
    697     if (entry == NULL)
    698         return -1;
    699     key = entry->key;
    700     return key != NULL && key != dummy;
    701 }
    702 
    703 static int
    704 set_contains_entry(PySetObject *so, setentry *entry)
    705 {
    706     PyObject *key;
    707     setentry *lu_entry;
    708 
    709     lu_entry = (so->lookup)(so, entry->key, entry->hash);
    710     if (lu_entry == NULL)
    711         return -1;
    712     key = lu_entry->key;
    713     return key != NULL && key != dummy;
    714 }
    715 
    716 static PyObject *
    717 set_pop(PySetObject *so)
    718 {
    719     register Py_ssize_t i = 0;
    720     register setentry *entry;
    721     PyObject *key;
    722 
    723     assert (PyAnySet_Check(so));
    724     if (so->used == 0) {
    725         PyErr_SetString(PyExc_KeyError, "pop from an empty set");
    726         return NULL;
    727     }
    728 
    729     /* Set entry to "the first" unused or dummy set entry.  We abuse
    730      * the hash field of slot 0 to hold a search finger:
    731      * If slot 0 has a value, use slot 0.
    732      * Else slot 0 is being used to hold a search finger,
    733      * and we use its hash value as the first index to look.
    734      */
    735     entry = &so->table[0];
    736     if (entry->key == NULL || entry->key == dummy) {
    737         i = entry->hash;
    738         /* The hash field may be a real hash value, or it may be a
    739          * legit search finger, or it may be a once-legit search
    740          * finger that's out of bounds now because it wrapped around
    741          * or the table shrunk -- simply make sure it's in bounds now.
    742          */
    743         if (i > so->mask || i < 1)
    744             i = 1;              /* skip slot 0 */
    745         while ((entry = &so->table[i])->key == NULL || entry->key==dummy) {
    746             i++;
    747             if (i > so->mask)
    748                 i = 1;
    749         }
    750     }
    751     key = entry->key;
    752     Py_INCREF(dummy);
    753     entry->key = dummy;
    754     so->used--;
    755     so->table[0].hash = i + 1;  /* next place to start */
    756     return key;
    757 }
    758 
    759 PyDoc_STRVAR(pop_doc, "Remove and return an arbitrary set element.\n\
    760 Raises KeyError if the set is empty.");
    761 
    762 static int
    763 set_traverse(PySetObject *so, visitproc visit, void *arg)
    764 {
    765     Py_ssize_t pos = 0;
    766     setentry *entry;
    767 
    768     while (set_next(so, &pos, &entry))
    769         Py_VISIT(entry->key);
    770     return 0;
    771 }
    772 
    773 static long
    774 frozenset_hash(PyObject *self)
    775 {
    776     PySetObject *so = (PySetObject *)self;
    777     long h, hash = 1927868237L;
    778     setentry *entry;
    779     Py_ssize_t pos = 0;
    780 
    781     if (so->hash != -1)
    782         return so->hash;
    783 
    784     hash *= PySet_GET_SIZE(self) + 1;
    785     while (set_next(so, &pos, &entry)) {
    786         /* Work to increase the bit dispersion for closely spaced hash
    787            values.  This is important because some use cases have many
    788            combinations of a small number of elements with nearby
    789            hashes so that many distinct combinations collapse to only
    790            a handful of distinct hash values. */
    791         h = entry->hash;
    792         hash ^= (h ^ (h << 16) ^ 89869747L)  * 3644798167u;
    793     }
    794     hash = hash * 69069L + 907133923L;
    795     if (hash == -1)
    796         hash = 590923713L;
    797     so->hash = hash;
    798     return hash;
    799 }
    800 
    801 /***** Set iterator type ***********************************************/
    802 
    803 typedef struct {
    804     PyObject_HEAD
    805     PySetObject *si_set; /* Set to NULL when iterator is exhausted */
    806     Py_ssize_t si_used;
    807     Py_ssize_t si_pos;
    808     Py_ssize_t len;
    809 } setiterobject;
    810 
    811 static void
    812 setiter_dealloc(setiterobject *si)
    813 {
    814     Py_XDECREF(si->si_set);
    815     PyObject_GC_Del(si);
    816 }
    817 
    818 static int
    819 setiter_traverse(setiterobject *si, visitproc visit, void *arg)
    820 {
    821     Py_VISIT(si->si_set);
    822     return 0;
    823 }
    824 
    825 static PyObject *
    826 setiter_len(setiterobject *si)
    827 {
    828     Py_ssize_t len = 0;
    829     if (si->si_set != NULL && si->si_used == si->si_set->used)
    830         len = si->len;
    831     return PyInt_FromLong(len);
    832 }
    833 
    834 PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
    835 
    836 static PyMethodDef setiter_methods[] = {
    837     {"__length_hint__", (PyCFunction)setiter_len, METH_NOARGS, length_hint_doc},
    838     {NULL,              NULL}           /* sentinel */
    839 };
    840 
    841 static PyObject *setiter_iternext(setiterobject *si)
    842 {
    843     PyObject *key;
    844     register Py_ssize_t i, mask;
    845     register setentry *entry;
    846     PySetObject *so = si->si_set;
    847 
    848     if (so == NULL)
    849         return NULL;
    850     assert (PyAnySet_Check(so));
    851 
    852     if (si->si_used != so->used) {
    853         PyErr_SetString(PyExc_RuntimeError,
    854                         "Set changed size during iteration");
    855         si->si_used = -1; /* Make this state sticky */
    856         return NULL;
    857     }
    858 
    859     i = si->si_pos;
    860     assert(i>=0);
    861     entry = so->table;
    862     mask = so->mask;
    863     while (i <= mask && (entry[i].key == NULL || entry[i].key == dummy))
    864         i++;
    865     si->si_pos = i+1;
    866     if (i > mask)
    867         goto fail;
    868     si->len--;
    869     key = entry[i].key;
    870     Py_INCREF(key);
    871     return key;
    872 
    873 fail:
    874     si->si_set = NULL;
    875     Py_DECREF(so);
    876     return NULL;
    877 }
    878 
    879 static PyTypeObject PySetIter_Type = {
    880     PyVarObject_HEAD_INIT(&PyType_Type, 0)
    881     "setiterator",                              /* tp_name */
    882     sizeof(setiterobject),                      /* tp_basicsize */
    883     0,                                          /* tp_itemsize */
    884     /* methods */
    885     (destructor)setiter_dealloc,                /* tp_dealloc */
    886     0,                                          /* tp_print */
    887     0,                                          /* tp_getattr */
    888     0,                                          /* tp_setattr */
    889     0,                                          /* tp_compare */
    890     0,                                          /* tp_repr */
    891     0,                                          /* tp_as_number */
    892     0,                                          /* tp_as_sequence */
    893     0,                                          /* tp_as_mapping */
    894     0,                                          /* tp_hash */
    895     0,                                          /* tp_call */
    896     0,                                          /* tp_str */
    897     PyObject_GenericGetAttr,                    /* tp_getattro */
    898     0,                                          /* tp_setattro */
    899     0,                                          /* tp_as_buffer */
    900     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
    901     0,                                          /* tp_doc */
    902     (traverseproc)setiter_traverse,             /* tp_traverse */
    903     0,                                          /* tp_clear */
    904     0,                                          /* tp_richcompare */
    905     0,                                          /* tp_weaklistoffset */
    906     PyObject_SelfIter,                          /* tp_iter */
    907     (iternextfunc)setiter_iternext,             /* tp_iternext */
    908     setiter_methods,                            /* tp_methods */
    909     0,
    910 };
    911 
    912 static PyObject *
    913 set_iter(PySetObject *so)
    914 {
    915     setiterobject *si = PyObject_GC_New(setiterobject, &PySetIter_Type);
    916     if (si == NULL)
    917         return NULL;
    918     Py_INCREF(so);
    919     si->si_set = so;
    920     si->si_used = so->used;
    921     si->si_pos = 0;
    922     si->len = so->used;
    923     _PyObject_GC_TRACK(si);
    924     return (PyObject *)si;
    925 }
    926 
    927 static int
    928 set_update_internal(PySetObject *so, PyObject *other)
    929 {
    930     PyObject *key, *it;
    931 
    932     if (PyAnySet_Check(other))
    933         return set_merge(so, other);
    934 
    935     if (PyDict_CheckExact(other)) {
    936         PyObject *value;
    937         Py_ssize_t pos = 0;
    938         long hash;
    939         Py_ssize_t dictsize = PyDict_Size(other);
    940 
    941         /* Do one big resize at the start, rather than
    942         * incrementally resizing as we insert new keys.  Expect
    943         * that there will be no (or few) overlapping keys.
    944         */
    945         if (dictsize == -1)
    946             return -1;
    947         if ((so->fill + dictsize)*3 >= (so->mask+1)*2) {
    948             if (set_table_resize(so, (so->used + dictsize)*2) != 0)
    949                 return -1;
    950         }
    951         while (_PyDict_Next(other, &pos, &key, &value, &hash)) {
    952             setentry an_entry;
    953 
    954             an_entry.hash = hash;
    955             an_entry.key = key;
    956             if (set_add_entry(so, &an_entry) == -1)
    957                 return -1;
    958         }
    959         return 0;
    960     }
    961 
    962     it = PyObject_GetIter(other);
    963     if (it == NULL)
    964         return -1;
    965 
    966     while ((key = PyIter_Next(it)) != NULL) {
    967         if (set_add_key(so, key) == -1) {
    968             Py_DECREF(it);
    969             Py_DECREF(key);
    970             return -1;
    971         }
    972         Py_DECREF(key);
    973     }
    974     Py_DECREF(it);
    975     if (PyErr_Occurred())
    976         return -1;
    977     return 0;
    978 }
    979 
    980 static PyObject *
    981 set_update(PySetObject *so, PyObject *args)
    982 {
    983     Py_ssize_t i;
    984 
    985     for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
    986         PyObject *other = PyTuple_GET_ITEM(args, i);
    987         if (set_update_internal(so, other) == -1)
    988             return NULL;
    989     }
    990     Py_RETURN_NONE;
    991 }
    992 
    993 PyDoc_STRVAR(update_doc,
    994 "Update a set with the union of itself and others.");
    995 
    996 static PyObject *
    997 make_new_set(PyTypeObject *type, PyObject *iterable)
    998 {
    999     register PySetObject *so = NULL;
   1000 
   1001     if (dummy == NULL) { /* Auto-initialize dummy */
   1002         dummy = PyString_FromString("<dummy key>");
   1003         if (dummy == NULL)
   1004             return NULL;
   1005     }
   1006 
   1007     /* create PySetObject structure */
   1008     if (numfree &&
   1009         (type == &PySet_Type  ||  type == &PyFrozenSet_Type)) {
   1010         so = free_list[--numfree];
   1011         assert (so != NULL && PyAnySet_CheckExact(so));
   1012         Py_TYPE(so) = type;
   1013         _Py_NewReference((PyObject *)so);
   1014         EMPTY_TO_MINSIZE(so);
   1015         PyObject_GC_Track(so);
   1016     } else {
   1017         so = (PySetObject *)type->tp_alloc(type, 0);
   1018         if (so == NULL)
   1019             return NULL;
   1020         /* tp_alloc has already zeroed the structure */
   1021         assert(so->table == NULL && so->fill == 0 && so->used == 0);
   1022         INIT_NONZERO_SET_SLOTS(so);
   1023     }
   1024 
   1025     so->lookup = set_lookkey_string;
   1026     so->weakreflist = NULL;
   1027 
   1028     if (iterable != NULL) {
   1029         if (set_update_internal(so, iterable) == -1) {
   1030             Py_DECREF(so);
   1031             return NULL;
   1032         }
   1033     }
   1034 
   1035     return (PyObject *)so;
   1036 }
   1037 
   1038 /* The empty frozenset is a singleton */
   1039 static PyObject *emptyfrozenset = NULL;
   1040 
   1041 static PyObject *
   1042 frozenset_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
   1043 {
   1044     PyObject *iterable = NULL, *result;
   1045 
   1046     if (type == &PyFrozenSet_Type && !_PyArg_NoKeywords("frozenset()", kwds))
   1047         return NULL;
   1048 
   1049     if (!PyArg_UnpackTuple(args, type->tp_name, 0, 1, &iterable))
   1050         return NULL;
   1051 
   1052     if (type != &PyFrozenSet_Type)
   1053         return make_new_set(type, iterable);
   1054 
   1055     if (iterable != NULL) {
   1056         /* frozenset(f) is idempotent */
   1057         if (PyFrozenSet_CheckExact(iterable)) {
   1058             Py_INCREF(iterable);
   1059             return iterable;
   1060         }
   1061         result = make_new_set(type, iterable);
   1062         if (result == NULL || PySet_GET_SIZE(result))
   1063             return result;
   1064         Py_DECREF(result);
   1065     }
   1066     /* The empty frozenset is a singleton */
   1067     if (emptyfrozenset == NULL)
   1068         emptyfrozenset = make_new_set(type, NULL);
   1069     Py_XINCREF(emptyfrozenset);
   1070     return emptyfrozenset;
   1071 }
   1072 
   1073 void
   1074 PySet_Fini(void)
   1075 {
   1076     PySetObject *so;
   1077 
   1078     while (numfree) {
   1079         numfree--;
   1080         so = free_list[numfree];
   1081         PyObject_GC_Del(so);
   1082     }
   1083     Py_CLEAR(dummy);
   1084     Py_CLEAR(emptyfrozenset);
   1085 }
   1086 
   1087 static PyObject *
   1088 set_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
   1089 {
   1090     if (type == &PySet_Type && !_PyArg_NoKeywords("set()", kwds))
   1091         return NULL;
   1092 
   1093     return make_new_set(type, NULL);
   1094 }
   1095 
   1096 /* set_swap_bodies() switches the contents of any two sets by moving their
   1097    internal data pointers and, if needed, copying the internal smalltables.
   1098    Semantically equivalent to:
   1099 
   1100      t=set(a); a.clear(); a.update(b); b.clear(); b.update(t); del t
   1101 
   1102    The function always succeeds and it leaves both objects in a stable state.
   1103    Useful for creating temporary frozensets from sets for membership testing
   1104    in __contains__(), discard(), and remove().  Also useful for operations
   1105    that update in-place (by allowing an intermediate result to be swapped
   1106    into one of the original inputs).
   1107 */
   1108 
   1109 static void
   1110 set_swap_bodies(PySetObject *a, PySetObject *b)
   1111 {
   1112     Py_ssize_t t;
   1113     setentry *u;
   1114     setentry *(*f)(PySetObject *so, PyObject *key, long hash);
   1115     setentry tab[PySet_MINSIZE];
   1116     long h;
   1117 
   1118     t = a->fill;     a->fill   = b->fill;        b->fill  = t;
   1119     t = a->used;     a->used   = b->used;        b->used  = t;
   1120     t = a->mask;     a->mask   = b->mask;        b->mask  = t;
   1121 
   1122     u = a->table;
   1123     if (a->table == a->smalltable)
   1124         u = b->smalltable;
   1125     a->table  = b->table;
   1126     if (b->table == b->smalltable)
   1127         a->table = a->smalltable;
   1128     b->table = u;
   1129 
   1130     f = a->lookup;   a->lookup = b->lookup;      b->lookup = f;
   1131 
   1132     if (a->table == a->smalltable || b->table == b->smalltable) {
   1133         memcpy(tab, a->smalltable, sizeof(tab));
   1134         memcpy(a->smalltable, b->smalltable, sizeof(tab));
   1135         memcpy(b->smalltable, tab, sizeof(tab));
   1136     }
   1137 
   1138     if (PyType_IsSubtype(Py_TYPE(a), &PyFrozenSet_Type)  &&
   1139         PyType_IsSubtype(Py_TYPE(b), &PyFrozenSet_Type)) {
   1140         h = a->hash;     a->hash = b->hash;  b->hash = h;
   1141     } else {
   1142         a->hash = -1;
   1143         b->hash = -1;
   1144     }
   1145 }
   1146 
   1147 static PyObject *
   1148 set_copy(PySetObject *so)
   1149 {
   1150     return make_new_set(Py_TYPE(so), (PyObject *)so);
   1151 }
   1152 
   1153 static PyObject *
   1154 frozenset_copy(PySetObject *so)
   1155 {
   1156     if (PyFrozenSet_CheckExact(so)) {
   1157         Py_INCREF(so);
   1158         return (PyObject *)so;
   1159     }
   1160     return set_copy(so);
   1161 }
   1162 
   1163 PyDoc_STRVAR(copy_doc, "Return a shallow copy of a set.");
   1164 
   1165 static PyObject *
   1166 set_clear(PySetObject *so)
   1167 {
   1168     set_clear_internal(so);
   1169     Py_RETURN_NONE;
   1170 }
   1171 
   1172 PyDoc_STRVAR(clear_doc, "Remove all elements from this set.");
   1173 
   1174 static PyObject *
   1175 set_union(PySetObject *so, PyObject *args)
   1176 {
   1177     PySetObject *result;
   1178     PyObject *other;
   1179     Py_ssize_t i;
   1180 
   1181     result = (PySetObject *)set_copy(so);
   1182     if (result == NULL)
   1183         return NULL;
   1184 
   1185     for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
   1186         other = PyTuple_GET_ITEM(args, i);
   1187         if ((PyObject *)so == other)
   1188             continue;
   1189         if (set_update_internal(result, other) == -1) {
   1190             Py_DECREF(result);
   1191             return NULL;
   1192         }
   1193     }
   1194     return (PyObject *)result;
   1195 }
   1196 
   1197 PyDoc_STRVAR(union_doc,
   1198  "Return the union of sets as a new set.\n\
   1199 \n\
   1200 (i.e. all elements that are in either set.)");
   1201 
   1202 static PyObject *
   1203 set_or(PySetObject *so, PyObject *other)
   1204 {
   1205     PySetObject *result;
   1206 
   1207     if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
   1208         Py_INCREF(Py_NotImplemented);
   1209         return Py_NotImplemented;
   1210     }
   1211 
   1212     result = (PySetObject *)set_copy(so);
   1213     if (result == NULL)
   1214         return NULL;
   1215     if ((PyObject *)so == other)
   1216         return (PyObject *)result;
   1217     if (set_update_internal(result, other) == -1) {
   1218         Py_DECREF(result);
   1219         return NULL;
   1220     }
   1221     return (PyObject *)result;
   1222 }
   1223 
   1224 static PyObject *
   1225 set_ior(PySetObject *so, PyObject *other)
   1226 {
   1227     if (!PyAnySet_Check(other)) {
   1228         Py_INCREF(Py_NotImplemented);
   1229         return Py_NotImplemented;
   1230     }
   1231     if (set_update_internal(so, other) == -1)
   1232         return NULL;
   1233     Py_INCREF(so);
   1234     return (PyObject *)so;
   1235 }
   1236 
   1237 static PyObject *
   1238 set_intersection(PySetObject *so, PyObject *other)
   1239 {
   1240     PySetObject *result;
   1241     PyObject *key, *it, *tmp;
   1242 
   1243     if ((PyObject *)so == other)
   1244         return set_copy(so);
   1245 
   1246     result = (PySetObject *)make_new_set(Py_TYPE(so), NULL);
   1247     if (result == NULL)
   1248         return NULL;
   1249 
   1250     if (PyAnySet_Check(other)) {
   1251         Py_ssize_t pos = 0;
   1252         setentry *entry;
   1253 
   1254         if (PySet_GET_SIZE(other) > PySet_GET_SIZE(so)) {
   1255             tmp = (PyObject *)so;
   1256             so = (PySetObject *)other;
   1257             other = tmp;
   1258         }
   1259 
   1260         while (set_next((PySetObject *)other, &pos, &entry)) {
   1261             int rv = set_contains_entry(so, entry);
   1262             if (rv == -1) {
   1263                 Py_DECREF(result);
   1264                 return NULL;
   1265             }
   1266             if (rv) {
   1267                 if (set_add_entry(result, entry) == -1) {
   1268                     Py_DECREF(result);
   1269                     return NULL;
   1270                 }
   1271             }
   1272         }
   1273         return (PyObject *)result;
   1274     }
   1275 
   1276     it = PyObject_GetIter(other);
   1277     if (it == NULL) {
   1278         Py_DECREF(result);
   1279         return NULL;
   1280     }
   1281 
   1282     while ((key = PyIter_Next(it)) != NULL) {
   1283         int rv;
   1284         setentry entry;
   1285         long hash = PyObject_Hash(key);
   1286 
   1287         if (hash == -1) {
   1288             Py_DECREF(it);
   1289             Py_DECREF(result);
   1290             Py_DECREF(key);
   1291             return NULL;
   1292         }
   1293         entry.hash = hash;
   1294         entry.key = key;
   1295         rv = set_contains_entry(so, &entry);
   1296         if (rv == -1) {
   1297             Py_DECREF(it);
   1298             Py_DECREF(result);
   1299             Py_DECREF(key);
   1300             return NULL;
   1301         }
   1302         if (rv) {
   1303             if (set_add_entry(result, &entry) == -1) {
   1304                 Py_DECREF(it);
   1305                 Py_DECREF(result);
   1306                 Py_DECREF(key);
   1307                 return NULL;
   1308             }
   1309         }
   1310         Py_DECREF(key);
   1311     }
   1312     Py_DECREF(it);
   1313     if (PyErr_Occurred()) {
   1314         Py_DECREF(result);
   1315         return NULL;
   1316     }
   1317     return (PyObject *)result;
   1318 }
   1319 
   1320 static PyObject *
   1321 set_intersection_multi(PySetObject *so, PyObject *args)
   1322 {
   1323     Py_ssize_t i;
   1324     PyObject *result = (PyObject *)so;
   1325 
   1326     if (PyTuple_GET_SIZE(args) == 0)
   1327         return set_copy(so);
   1328 
   1329     Py_INCREF(so);
   1330     for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
   1331         PyObject *other = PyTuple_GET_ITEM(args, i);
   1332         PyObject *newresult = set_intersection((PySetObject *)result, other);
   1333         if (newresult == NULL) {
   1334             Py_DECREF(result);
   1335             return NULL;
   1336         }
   1337         Py_DECREF(result);
   1338         result = newresult;
   1339     }
   1340     return result;
   1341 }
   1342 
   1343 PyDoc_STRVAR(intersection_doc,
   1344 "Return the intersection of two or more sets as a new set.\n\
   1345 \n\
   1346 (i.e. elements that are common to all of the sets.)");
   1347 
   1348 static PyObject *
   1349 set_intersection_update(PySetObject *so, PyObject *other)
   1350 {
   1351     PyObject *tmp;
   1352 
   1353     tmp = set_intersection(so, other);
   1354     if (tmp == NULL)
   1355         return NULL;
   1356     set_swap_bodies(so, (PySetObject *)tmp);
   1357     Py_DECREF(tmp);
   1358     Py_RETURN_NONE;
   1359 }
   1360 
   1361 static PyObject *
   1362 set_intersection_update_multi(PySetObject *so, PyObject *args)
   1363 {
   1364     PyObject *tmp;
   1365 
   1366     tmp = set_intersection_multi(so, args);
   1367     if (tmp == NULL)
   1368         return NULL;
   1369     set_swap_bodies(so, (PySetObject *)tmp);
   1370     Py_DECREF(tmp);
   1371     Py_RETURN_NONE;
   1372 }
   1373 
   1374 PyDoc_STRVAR(intersection_update_doc,
   1375 "Update a set with the intersection of itself and another.");
   1376 
   1377 static PyObject *
   1378 set_and(PySetObject *so, PyObject *other)
   1379 {
   1380     if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
   1381         Py_INCREF(Py_NotImplemented);
   1382         return Py_NotImplemented;
   1383     }
   1384     return set_intersection(so, other);
   1385 }
   1386 
   1387 static PyObject *
   1388 set_iand(PySetObject *so, PyObject *other)
   1389 {
   1390     PyObject *result;
   1391 
   1392     if (!PyAnySet_Check(other)) {
   1393         Py_INCREF(Py_NotImplemented);
   1394         return Py_NotImplemented;
   1395     }
   1396     result = set_intersection_update(so, other);
   1397     if (result == NULL)
   1398         return NULL;
   1399     Py_DECREF(result);
   1400     Py_INCREF(so);
   1401     return (PyObject *)so;
   1402 }
   1403 
   1404 static PyObject *
   1405 set_isdisjoint(PySetObject *so, PyObject *other)
   1406 {
   1407     PyObject *key, *it, *tmp;
   1408 
   1409     if ((PyObject *)so == other) {
   1410         if (PySet_GET_SIZE(so) == 0)
   1411             Py_RETURN_TRUE;
   1412         else
   1413             Py_RETURN_FALSE;
   1414     }
   1415 
   1416     if (PyAnySet_CheckExact(other)) {
   1417         Py_ssize_t pos = 0;
   1418         setentry *entry;
   1419 
   1420         if (PySet_GET_SIZE(other) > PySet_GET_SIZE(so)) {
   1421             tmp = (PyObject *)so;
   1422             so = (PySetObject *)other;
   1423             other = tmp;
   1424         }
   1425         while (set_next((PySetObject *)other, &pos, &entry)) {
   1426             int rv = set_contains_entry(so, entry);
   1427             if (rv == -1)
   1428                 return NULL;
   1429             if (rv)
   1430                 Py_RETURN_FALSE;
   1431         }
   1432         Py_RETURN_TRUE;
   1433     }
   1434 
   1435     it = PyObject_GetIter(other);
   1436     if (it == NULL)
   1437         return NULL;
   1438 
   1439     while ((key = PyIter_Next(it)) != NULL) {
   1440         int rv;
   1441         setentry entry;
   1442         long hash = PyObject_Hash(key);
   1443 
   1444         if (hash == -1) {
   1445             Py_DECREF(key);
   1446             Py_DECREF(it);
   1447             return NULL;
   1448         }
   1449         entry.hash = hash;
   1450         entry.key = key;
   1451         rv = set_contains_entry(so, &entry);
   1452         Py_DECREF(key);
   1453         if (rv == -1) {
   1454             Py_DECREF(it);
   1455             return NULL;
   1456         }
   1457         if (rv) {
   1458             Py_DECREF(it);
   1459             Py_RETURN_FALSE;
   1460         }
   1461     }
   1462     Py_DECREF(it);
   1463     if (PyErr_Occurred())
   1464         return NULL;
   1465     Py_RETURN_TRUE;
   1466 }
   1467 
   1468 PyDoc_STRVAR(isdisjoint_doc,
   1469 "Return True if two sets have a null intersection.");
   1470 
   1471 static int
   1472 set_difference_update_internal(PySetObject *so, PyObject *other)
   1473 {
   1474     if ((PyObject *)so == other)
   1475         return set_clear_internal(so);
   1476 
   1477     if (PyAnySet_Check(other)) {
   1478         setentry *entry;
   1479         Py_ssize_t pos = 0;
   1480 
   1481         while (set_next((PySetObject *)other, &pos, &entry))
   1482             if (set_discard_entry(so, entry) == -1)
   1483                 return -1;
   1484     } else {
   1485         PyObject *key, *it;
   1486         it = PyObject_GetIter(other);
   1487         if (it == NULL)
   1488             return -1;
   1489 
   1490         while ((key = PyIter_Next(it)) != NULL) {
   1491             if (set_discard_key(so, key) == -1) {
   1492                 Py_DECREF(it);
   1493                 Py_DECREF(key);
   1494                 return -1;
   1495             }
   1496             Py_DECREF(key);
   1497         }
   1498         Py_DECREF(it);
   1499         if (PyErr_Occurred())
   1500             return -1;
   1501     }
   1502     /* If more than 1/5 are dummies, then resize them away. */
   1503     if ((so->fill - so->used) * 5 < so->mask)
   1504         return 0;
   1505     return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
   1506 }
   1507 
   1508 static PyObject *
   1509 set_difference_update(PySetObject *so, PyObject *args)
   1510 {
   1511     Py_ssize_t i;
   1512 
   1513     for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
   1514         PyObject *other = PyTuple_GET_ITEM(args, i);
   1515         if (set_difference_update_internal(so, other) == -1)
   1516             return NULL;
   1517     }
   1518     Py_RETURN_NONE;
   1519 }
   1520 
   1521 PyDoc_STRVAR(difference_update_doc,
   1522 "Remove all elements of another set from this set.");
   1523 
   1524 static PyObject *
   1525 set_difference(PySetObject *so, PyObject *other)
   1526 {
   1527     PyObject *result;
   1528     setentry *entry;
   1529     Py_ssize_t pos = 0;
   1530 
   1531     if (!PyAnySet_Check(other)  && !PyDict_CheckExact(other)) {
   1532         result = set_copy(so);
   1533         if (result == NULL)
   1534             return NULL;
   1535         if (set_difference_update_internal((PySetObject *)result, other) != -1)
   1536             return result;
   1537         Py_DECREF(result);
   1538         return NULL;
   1539     }
   1540 
   1541     result = make_new_set(Py_TYPE(so), NULL);
   1542     if (result == NULL)
   1543         return NULL;
   1544 
   1545     if (PyDict_CheckExact(other)) {
   1546         while (set_next(so, &pos, &entry)) {
   1547             setentry entrycopy;
   1548             int rv;
   1549             entrycopy.hash = entry->hash;
   1550             entrycopy.key = entry->key;
   1551             rv = _PyDict_Contains(other, entry->key, entry->hash);
   1552             if (rv < 0) {
   1553                 Py_DECREF(result);
   1554                 return NULL;
   1555             }
   1556             if (!rv) {
   1557                 if (set_add_entry((PySetObject *)result, &entrycopy) == -1) {
   1558                     Py_DECREF(result);
   1559                     return NULL;
   1560                 }
   1561             }
   1562         }
   1563         return result;
   1564     }
   1565 
   1566     while (set_next(so, &pos, &entry)) {
   1567         int rv = set_contains_entry((PySetObject *)other, entry);
   1568         if (rv == -1) {
   1569             Py_DECREF(result);
   1570             return NULL;
   1571         }
   1572         if (!rv) {
   1573             if (set_add_entry((PySetObject *)result, entry) == -1) {
   1574                 Py_DECREF(result);
   1575                 return NULL;
   1576             }
   1577         }
   1578     }
   1579     return result;
   1580 }
   1581 
   1582 static PyObject *
   1583 set_difference_multi(PySetObject *so, PyObject *args)
   1584 {
   1585     Py_ssize_t i;
   1586     PyObject *result, *other;
   1587 
   1588     if (PyTuple_GET_SIZE(args) == 0)
   1589         return set_copy(so);
   1590 
   1591     other = PyTuple_GET_ITEM(args, 0);
   1592     result = set_difference(so, other);
   1593     if (result == NULL)
   1594         return NULL;
   1595 
   1596     for (i=1 ; i<PyTuple_GET_SIZE(args) ; i++) {
   1597         other = PyTuple_GET_ITEM(args, i);
   1598         if (set_difference_update_internal((PySetObject *)result, other) == -1) {
   1599             Py_DECREF(result);
   1600             return NULL;
   1601         }
   1602     }
   1603     return result;
   1604 }
   1605 
   1606 PyDoc_STRVAR(difference_doc,
   1607 "Return the difference of two or more sets as a new set.\n\
   1608 \n\
   1609 (i.e. all elements that are in this set but not the others.)");
   1610 static PyObject *
   1611 set_sub(PySetObject *so, PyObject *other)
   1612 {
   1613     if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
   1614         Py_INCREF(Py_NotImplemented);
   1615         return Py_NotImplemented;
   1616     }
   1617     return set_difference(so, other);
   1618 }
   1619 
   1620 static PyObject *
   1621 set_isub(PySetObject *so, PyObject *other)
   1622 {
   1623     if (!PyAnySet_Check(other)) {
   1624         Py_INCREF(Py_NotImplemented);
   1625         return Py_NotImplemented;
   1626     }
   1627     if (set_difference_update_internal(so, other) == -1)
   1628         return NULL;
   1629     Py_INCREF(so);
   1630     return (PyObject *)so;
   1631 }
   1632 
   1633 static PyObject *
   1634 set_symmetric_difference_update(PySetObject *so, PyObject *other)
   1635 {
   1636     PySetObject *otherset;
   1637     PyObject *key;
   1638     Py_ssize_t pos = 0;
   1639     setentry *entry;
   1640 
   1641     if ((PyObject *)so == other)
   1642         return set_clear(so);
   1643 
   1644     if (PyDict_CheckExact(other)) {
   1645         PyObject *value;
   1646         int rv;
   1647         long hash;
   1648         while (_PyDict_Next(other, &pos, &key, &value, &hash)) {
   1649             setentry an_entry;
   1650 
   1651             Py_INCREF(key);
   1652             an_entry.hash = hash;
   1653             an_entry.key = key;
   1654 
   1655             rv = set_discard_entry(so, &an_entry);
   1656             if (rv == -1) {
   1657                 Py_DECREF(key);
   1658                 return NULL;
   1659             }
   1660             if (rv == DISCARD_NOTFOUND) {
   1661                 if (set_add_entry(so, &an_entry) == -1) {
   1662                     Py_DECREF(key);
   1663                     return NULL;
   1664                 }
   1665             }
   1666             Py_DECREF(key);
   1667         }
   1668         Py_RETURN_NONE;
   1669     }
   1670 
   1671     if (PyAnySet_Check(other)) {
   1672         Py_INCREF(other);
   1673         otherset = (PySetObject *)other;
   1674     } else {
   1675         otherset = (PySetObject *)make_new_set(Py_TYPE(so), other);
   1676         if (otherset == NULL)
   1677             return NULL;
   1678     }
   1679 
   1680     while (set_next(otherset, &pos, &entry)) {
   1681         int rv = set_discard_entry(so, entry);
   1682         if (rv == -1) {
   1683             Py_DECREF(otherset);
   1684             return NULL;
   1685         }
   1686         if (rv == DISCARD_NOTFOUND) {
   1687             if (set_add_entry(so, entry) == -1) {
   1688                 Py_DECREF(otherset);
   1689                 return NULL;
   1690             }
   1691         }
   1692     }
   1693     Py_DECREF(otherset);
   1694     Py_RETURN_NONE;
   1695 }
   1696 
   1697 PyDoc_STRVAR(symmetric_difference_update_doc,
   1698 "Update a set with the symmetric difference of itself and another.");
   1699 
   1700 static PyObject *
   1701 set_symmetric_difference(PySetObject *so, PyObject *other)
   1702 {
   1703     PyObject *rv;
   1704     PySetObject *otherset;
   1705 
   1706     otherset = (PySetObject *)make_new_set(Py_TYPE(so), other);
   1707     if (otherset == NULL)
   1708         return NULL;
   1709     rv = set_symmetric_difference_update(otherset, (PyObject *)so);
   1710     if (rv == NULL)
   1711         return NULL;
   1712     Py_DECREF(rv);
   1713     return (PyObject *)otherset;
   1714 }
   1715 
   1716 PyDoc_STRVAR(symmetric_difference_doc,
   1717 "Return the symmetric difference of two sets as a new set.\n\
   1718 \n\
   1719 (i.e. all elements that are in exactly one of the sets.)");
   1720 
   1721 static PyObject *
   1722 set_xor(PySetObject *so, PyObject *other)
   1723 {
   1724     if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
   1725         Py_INCREF(Py_NotImplemented);
   1726         return Py_NotImplemented;
   1727     }
   1728     return set_symmetric_difference(so, other);
   1729 }
   1730 
   1731 static PyObject *
   1732 set_ixor(PySetObject *so, PyObject *other)
   1733 {
   1734     PyObject *result;
   1735 
   1736     if (!PyAnySet_Check(other)) {
   1737         Py_INCREF(Py_NotImplemented);
   1738         return Py_NotImplemented;
   1739     }
   1740     result = set_symmetric_difference_update(so, other);
   1741     if (result == NULL)
   1742         return NULL;
   1743     Py_DECREF(result);
   1744     Py_INCREF(so);
   1745     return (PyObject *)so;
   1746 }
   1747 
   1748 static PyObject *
   1749 set_issubset(PySetObject *so, PyObject *other)
   1750 {
   1751     setentry *entry;
   1752     Py_ssize_t pos = 0;
   1753 
   1754     if (!PyAnySet_Check(other)) {
   1755         PyObject *tmp, *result;
   1756         tmp = make_new_set(&PySet_Type, other);
   1757         if (tmp == NULL)
   1758             return NULL;
   1759         result = set_issubset(so, tmp);
   1760         Py_DECREF(tmp);
   1761         return result;
   1762     }
   1763     if (PySet_GET_SIZE(so) > PySet_GET_SIZE(other))
   1764         Py_RETURN_FALSE;
   1765 
   1766     while (set_next(so, &pos, &entry)) {
   1767         int rv = set_contains_entry((PySetObject *)other, entry);
   1768         if (rv == -1)
   1769             return NULL;
   1770         if (!rv)
   1771             Py_RETURN_FALSE;
   1772     }
   1773     Py_RETURN_TRUE;
   1774 }
   1775 
   1776 PyDoc_STRVAR(issubset_doc, "Report whether another set contains this set.");
   1777 
   1778 static PyObject *
   1779 set_issuperset(PySetObject *so, PyObject *other)
   1780 {
   1781     PyObject *tmp, *result;
   1782 
   1783     if (!PyAnySet_Check(other)) {
   1784         tmp = make_new_set(&PySet_Type, other);
   1785         if (tmp == NULL)
   1786             return NULL;
   1787         result = set_issuperset(so, tmp);
   1788         Py_DECREF(tmp);
   1789         return result;
   1790     }
   1791     return set_issubset((PySetObject *)other, (PyObject *)so);
   1792 }
   1793 
   1794 PyDoc_STRVAR(issuperset_doc, "Report whether this set contains another set.");
   1795 
   1796 static PyObject *
   1797 set_richcompare(PySetObject *v, PyObject *w, int op)
   1798 {
   1799     PyObject *r1;
   1800     int r2;
   1801 
   1802     if(!PyAnySet_Check(w)) {
   1803         Py_INCREF(Py_NotImplemented);
   1804         return Py_NotImplemented;
   1805     }
   1806     switch (op) {
   1807     case Py_EQ:
   1808         if (PySet_GET_SIZE(v) != PySet_GET_SIZE(w))
   1809             Py_RETURN_FALSE;
   1810         if (v->hash != -1  &&
   1811             ((PySetObject *)w)->hash != -1 &&
   1812             v->hash != ((PySetObject *)w)->hash)
   1813             Py_RETURN_FALSE;
   1814         return set_issubset(v, w);
   1815     case Py_NE:
   1816         r1 = set_richcompare(v, w, Py_EQ);
   1817         if (r1 == NULL)
   1818             return NULL;
   1819         r2 = PyObject_IsTrue(r1);
   1820         Py_DECREF(r1);
   1821         if (r2 < 0)
   1822             return NULL;
   1823         return PyBool_FromLong(!r2);
   1824     case Py_LE:
   1825         return set_issubset(v, w);
   1826     case Py_GE:
   1827         return set_issuperset(v, w);
   1828     case Py_LT:
   1829         if (PySet_GET_SIZE(v) >= PySet_GET_SIZE(w))
   1830             Py_RETURN_FALSE;
   1831         return set_issubset(v, w);
   1832     case Py_GT:
   1833         if (PySet_GET_SIZE(v) <= PySet_GET_SIZE(w))
   1834             Py_RETURN_FALSE;
   1835         return set_issuperset(v, w);
   1836     }
   1837     Py_INCREF(Py_NotImplemented);
   1838     return Py_NotImplemented;
   1839 }
   1840 
   1841 static int
   1842 set_nocmp(PyObject *self, PyObject *other)
   1843 {
   1844     PyErr_SetString(PyExc_TypeError, "cannot compare sets using cmp()");
   1845     return -1;
   1846 }
   1847 
   1848 static PyObject *
   1849 set_add(PySetObject *so, PyObject *key)
   1850 {
   1851     if (set_add_key(so, key) == -1)
   1852         return NULL;
   1853     Py_RETURN_NONE;
   1854 }
   1855 
   1856 PyDoc_STRVAR(add_doc,
   1857 "Add an element to a set.\n\
   1858 \n\
   1859 This has no effect if the element is already present.");
   1860 
   1861 static int
   1862 set_contains(PySetObject *so, PyObject *key)
   1863 {
   1864     PyObject *tmpkey;
   1865     int rv;
   1866 
   1867     rv = set_contains_key(so, key);
   1868     if (rv == -1) {
   1869         if (!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
   1870             return -1;
   1871         PyErr_Clear();
   1872         tmpkey = make_new_set(&PyFrozenSet_Type, key);
   1873         if (tmpkey == NULL)
   1874             return -1;
   1875         rv = set_contains_key(so, tmpkey);
   1876         Py_DECREF(tmpkey);
   1877     }
   1878     return rv;
   1879 }
   1880 
   1881 static PyObject *
   1882 set_direct_contains(PySetObject *so, PyObject *key)
   1883 {
   1884     long result;
   1885 
   1886     result = set_contains(so, key);
   1887     if (result == -1)
   1888         return NULL;
   1889     return PyBool_FromLong(result);
   1890 }
   1891 
   1892 PyDoc_STRVAR(contains_doc, "x.__contains__(y) <==> y in x.");
   1893 
   1894 static PyObject *
   1895 set_remove(PySetObject *so, PyObject *key)
   1896 {
   1897     PyObject *tmpkey;
   1898     int rv;
   1899 
   1900     rv = set_discard_key(so, key);
   1901     if (rv == -1) {
   1902         if (!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
   1903             return NULL;
   1904         PyErr_Clear();
   1905         tmpkey = make_new_set(&PyFrozenSet_Type, key);
   1906         if (tmpkey == NULL)
   1907             return NULL;
   1908         rv = set_discard_key(so, tmpkey);
   1909         Py_DECREF(tmpkey);
   1910         if (rv == -1)
   1911             return NULL;
   1912     }
   1913 
   1914     if (rv == DISCARD_NOTFOUND) {
   1915         set_key_error(key);
   1916         return NULL;
   1917     }
   1918     Py_RETURN_NONE;
   1919 }
   1920 
   1921 PyDoc_STRVAR(remove_doc,
   1922 "Remove an element from a set; it must be a member.\n\
   1923 \n\
   1924 If the element is not a member, raise a KeyError.");
   1925 
   1926 static PyObject *
   1927 set_discard(PySetObject *so, PyObject *key)
   1928 {
   1929     PyObject *tmpkey;
   1930     int rv;
   1931 
   1932     rv = set_discard_key(so, key);
   1933     if (rv == -1) {
   1934         if (!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
   1935             return NULL;
   1936         PyErr_Clear();
   1937         tmpkey = make_new_set(&PyFrozenSet_Type, key);
   1938         if (tmpkey == NULL)
   1939             return NULL;
   1940         rv = set_discard_key(so, tmpkey);
   1941         Py_DECREF(tmpkey);
   1942         if (rv == -1)
   1943             return NULL;
   1944     }
   1945     Py_RETURN_NONE;
   1946 }
   1947 
   1948 PyDoc_STRVAR(discard_doc,
   1949 "Remove an element from a set if it is a member.\n\
   1950 \n\
   1951 If the element is not a member, do nothing.");
   1952 
   1953 static PyObject *
   1954 set_reduce(PySetObject *so)
   1955 {
   1956     PyObject *keys=NULL, *args=NULL, *result=NULL, *dict=NULL;
   1957 
   1958     keys = PySequence_List((PyObject *)so);
   1959     if (keys == NULL)
   1960         goto done;
   1961     args = PyTuple_Pack(1, keys);
   1962     if (args == NULL)
   1963         goto done;
   1964     dict = PyObject_GetAttrString((PyObject *)so, "__dict__");
   1965     if (dict == NULL) {
   1966         PyErr_Clear();
   1967         dict = Py_None;
   1968         Py_INCREF(dict);
   1969     }
   1970     result = PyTuple_Pack(3, Py_TYPE(so), args, dict);
   1971 done:
   1972     Py_XDECREF(args);
   1973     Py_XDECREF(keys);
   1974     Py_XDECREF(dict);
   1975     return result;
   1976 }
   1977 
   1978 PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
   1979 
   1980 static PyObject *
   1981 set_sizeof(PySetObject *so)
   1982 {
   1983     Py_ssize_t res;
   1984 
   1985     res = _PyObject_SIZE(Py_TYPE(so));
   1986     if (so->table != so->smalltable)
   1987         res = res + (so->mask + 1) * sizeof(setentry);
   1988     return PyInt_FromSsize_t(res);
   1989 }
   1990 
   1991 PyDoc_STRVAR(sizeof_doc, "S.__sizeof__() -> size of S in memory, in bytes");
   1992 static int
   1993 set_init(PySetObject *self, PyObject *args, PyObject *kwds)
   1994 {
   1995     PyObject *iterable = NULL;
   1996 
   1997     if (!PyAnySet_Check(self))
   1998         return -1;
   1999     if (PySet_Check(self) && !_PyArg_NoKeywords("set()", kwds))
   2000         return -1;
   2001     if (!PyArg_UnpackTuple(args, Py_TYPE(self)->tp_name, 0, 1, &iterable))
   2002         return -1;
   2003     set_clear_internal(self);
   2004     self->hash = -1;
   2005     if (iterable == NULL)
   2006         return 0;
   2007     return set_update_internal(self, iterable);
   2008 }
   2009 
   2010 static PySequenceMethods set_as_sequence = {
   2011     set_len,                            /* sq_length */
   2012     0,                                  /* sq_concat */
   2013     0,                                  /* sq_repeat */
   2014     0,                                  /* sq_item */
   2015     0,                                  /* sq_slice */
   2016     0,                                  /* sq_ass_item */
   2017     0,                                  /* sq_ass_slice */
   2018     (objobjproc)set_contains,           /* sq_contains */
   2019 };
   2020 
   2021 /* set object ********************************************************/
   2022 
   2023 #ifdef Py_DEBUG
   2024 static PyObject *test_c_api(PySetObject *so);
   2025 
   2026 PyDoc_STRVAR(test_c_api_doc, "Exercises C API.  Returns True.\n\
   2027 All is well if assertions don't fail.");
   2028 #endif
   2029 
   2030 static PyMethodDef set_methods[] = {
   2031     {"add",             (PyCFunction)set_add,           METH_O,
   2032      add_doc},
   2033     {"clear",           (PyCFunction)set_clear,         METH_NOARGS,
   2034      clear_doc},
   2035     {"__contains__",(PyCFunction)set_direct_contains,           METH_O | METH_COEXIST,
   2036      contains_doc},
   2037     {"copy",            (PyCFunction)set_copy,          METH_NOARGS,
   2038      copy_doc},
   2039     {"discard",         (PyCFunction)set_discard,       METH_O,
   2040      discard_doc},
   2041     {"difference",      (PyCFunction)set_difference_multi,      METH_VARARGS,
   2042      difference_doc},
   2043     {"difference_update",       (PyCFunction)set_difference_update,     METH_VARARGS,
   2044      difference_update_doc},
   2045     {"intersection",(PyCFunction)set_intersection_multi,        METH_VARARGS,
   2046      intersection_doc},
   2047     {"intersection_update",(PyCFunction)set_intersection_update_multi,          METH_VARARGS,
   2048      intersection_update_doc},
   2049     {"isdisjoint",      (PyCFunction)set_isdisjoint,    METH_O,
   2050      isdisjoint_doc},
   2051     {"issubset",        (PyCFunction)set_issubset,      METH_O,
   2052      issubset_doc},
   2053     {"issuperset",      (PyCFunction)set_issuperset,    METH_O,
   2054      issuperset_doc},
   2055     {"pop",             (PyCFunction)set_pop,           METH_NOARGS,
   2056      pop_doc},
   2057     {"__reduce__",      (PyCFunction)set_reduce,        METH_NOARGS,
   2058      reduce_doc},
   2059     {"remove",          (PyCFunction)set_remove,        METH_O,
   2060      remove_doc},
   2061     {"__sizeof__",      (PyCFunction)set_sizeof,        METH_NOARGS,
   2062      sizeof_doc},
   2063     {"symmetric_difference",(PyCFunction)set_symmetric_difference,      METH_O,
   2064      symmetric_difference_doc},
   2065     {"symmetric_difference_update",(PyCFunction)set_symmetric_difference_update,        METH_O,
   2066      symmetric_difference_update_doc},
   2067 #ifdef Py_DEBUG
   2068     {"test_c_api",      (PyCFunction)test_c_api,        METH_NOARGS,
   2069      test_c_api_doc},
   2070 #endif
   2071     {"union",           (PyCFunction)set_union,         METH_VARARGS,
   2072      union_doc},
   2073     {"update",          (PyCFunction)set_update,        METH_VARARGS,
   2074      update_doc},
   2075     {NULL,              NULL}   /* sentinel */
   2076 };
   2077 
   2078 static PyNumberMethods set_as_number = {
   2079     0,                                  /*nb_add*/
   2080     (binaryfunc)set_sub,                /*nb_subtract*/
   2081     0,                                  /*nb_multiply*/
   2082     0,                                  /*nb_divide*/
   2083     0,                                  /*nb_remainder*/
   2084     0,                                  /*nb_divmod*/
   2085     0,                                  /*nb_power*/
   2086     0,                                  /*nb_negative*/
   2087     0,                                  /*nb_positive*/
   2088     0,                                  /*nb_absolute*/
   2089     0,                                  /*nb_nonzero*/
   2090     0,                                  /*nb_invert*/
   2091     0,                                  /*nb_lshift*/
   2092     0,                                  /*nb_rshift*/
   2093     (binaryfunc)set_and,                /*nb_and*/
   2094     (binaryfunc)set_xor,                /*nb_xor*/
   2095     (binaryfunc)set_or,                 /*nb_or*/
   2096     0,                                  /*nb_coerce*/
   2097     0,                                  /*nb_int*/
   2098     0,                                  /*nb_long*/
   2099     0,                                  /*nb_float*/
   2100     0,                                  /*nb_oct*/
   2101     0,                                  /*nb_hex*/
   2102     0,                                  /*nb_inplace_add*/
   2103     (binaryfunc)set_isub,               /*nb_inplace_subtract*/
   2104     0,                                  /*nb_inplace_multiply*/
   2105     0,                                  /*nb_inplace_divide*/
   2106     0,                                  /*nb_inplace_remainder*/
   2107     0,                                  /*nb_inplace_power*/
   2108     0,                                  /*nb_inplace_lshift*/
   2109     0,                                  /*nb_inplace_rshift*/
   2110     (binaryfunc)set_iand,               /*nb_inplace_and*/
   2111     (binaryfunc)set_ixor,               /*nb_inplace_xor*/
   2112     (binaryfunc)set_ior,                /*nb_inplace_or*/
   2113 };
   2114 
   2115 PyDoc_STRVAR(set_doc,
   2116 "set() -> new empty set object\n\
   2117 set(iterable) -> new set object\n\
   2118 \n\
   2119 Build an unordered collection of unique elements.");
   2120 
   2121 PyTypeObject PySet_Type = {
   2122     PyVarObject_HEAD_INIT(&PyType_Type, 0)
   2123     "set",                              /* tp_name */
   2124     sizeof(PySetObject),                /* tp_basicsize */
   2125     0,                                  /* tp_itemsize */
   2126     /* methods */
   2127     (destructor)set_dealloc,            /* tp_dealloc */
   2128     (printfunc)set_tp_print,            /* tp_print */
   2129     0,                                  /* tp_getattr */
   2130     0,                                  /* tp_setattr */
   2131     set_nocmp,                          /* tp_compare */
   2132     (reprfunc)set_repr,                 /* tp_repr */
   2133     &set_as_number,                     /* tp_as_number */
   2134     &set_as_sequence,                   /* tp_as_sequence */
   2135     0,                                  /* tp_as_mapping */
   2136     (hashfunc)PyObject_HashNotImplemented,      /* tp_hash */
   2137     0,                                  /* tp_call */
   2138     0,                                  /* tp_str */
   2139     PyObject_GenericGetAttr,            /* tp_getattro */
   2140     0,                                  /* tp_setattro */
   2141     0,                                  /* tp_as_buffer */
   2142     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES |
   2143         Py_TPFLAGS_BASETYPE,            /* tp_flags */
   2144     set_doc,                            /* tp_doc */
   2145     (traverseproc)set_traverse,         /* tp_traverse */
   2146     (inquiry)set_clear_internal,        /* tp_clear */
   2147     (richcmpfunc)set_richcompare,       /* tp_richcompare */
   2148     offsetof(PySetObject, weakreflist),         /* tp_weaklistoffset */
   2149     (getiterfunc)set_iter,      /* tp_iter */
   2150     0,                                  /* tp_iternext */
   2151     set_methods,                        /* tp_methods */
   2152     0,                                  /* tp_members */
   2153     0,                                  /* tp_getset */
   2154     0,                                  /* tp_base */
   2155     0,                                  /* tp_dict */
   2156     0,                                  /* tp_descr_get */
   2157     0,                                  /* tp_descr_set */
   2158     0,                                  /* tp_dictoffset */
   2159     (initproc)set_init,                 /* tp_init */
   2160     PyType_GenericAlloc,                /* tp_alloc */
   2161     set_new,                            /* tp_new */
   2162     PyObject_GC_Del,                    /* tp_free */
   2163 };
   2164 
   2165 /* frozenset object ********************************************************/
   2166 
   2167 
   2168 static PyMethodDef frozenset_methods[] = {
   2169     {"__contains__",(PyCFunction)set_direct_contains,           METH_O | METH_COEXIST,
   2170      contains_doc},
   2171     {"copy",            (PyCFunction)frozenset_copy,    METH_NOARGS,
   2172      copy_doc},
   2173     {"difference",      (PyCFunction)set_difference_multi,      METH_VARARGS,
   2174      difference_doc},
   2175     {"intersection",(PyCFunction)set_intersection_multi,        METH_VARARGS,
   2176      intersection_doc},
   2177     {"isdisjoint",      (PyCFunction)set_isdisjoint,    METH_O,
   2178      isdisjoint_doc},
   2179     {"issubset",        (PyCFunction)set_issubset,      METH_O,
   2180      issubset_doc},
   2181     {"issuperset",      (PyCFunction)set_issuperset,    METH_O,
   2182      issuperset_doc},
   2183     {"__reduce__",      (PyCFunction)set_reduce,        METH_NOARGS,
   2184      reduce_doc},
   2185     {"__sizeof__",      (PyCFunction)set_sizeof,        METH_NOARGS,
   2186      sizeof_doc},
   2187     {"symmetric_difference",(PyCFunction)set_symmetric_difference,      METH_O,
   2188      symmetric_difference_doc},
   2189     {"union",           (PyCFunction)set_union,         METH_VARARGS,
   2190      union_doc},
   2191     {NULL,              NULL}   /* sentinel */
   2192 };
   2193 
   2194 static PyNumberMethods frozenset_as_number = {
   2195     0,                                  /*nb_add*/
   2196     (binaryfunc)set_sub,                /*nb_subtract*/
   2197     0,                                  /*nb_multiply*/
   2198     0,                                  /*nb_divide*/
   2199     0,                                  /*nb_remainder*/
   2200     0,                                  /*nb_divmod*/
   2201     0,                                  /*nb_power*/
   2202     0,                                  /*nb_negative*/
   2203     0,                                  /*nb_positive*/
   2204     0,                                  /*nb_absolute*/
   2205     0,                                  /*nb_nonzero*/
   2206     0,                                  /*nb_invert*/
   2207     0,                                  /*nb_lshift*/
   2208     0,                                  /*nb_rshift*/
   2209     (binaryfunc)set_and,                /*nb_and*/
   2210     (binaryfunc)set_xor,                /*nb_xor*/
   2211     (binaryfunc)set_or,                 /*nb_or*/
   2212 };
   2213 
   2214 PyDoc_STRVAR(frozenset_doc,
   2215 "frozenset() -> empty frozenset object\n\
   2216 frozenset(iterable) -> frozenset object\n\
   2217 \n\
   2218 Build an immutable unordered collection of unique elements.");
   2219 
   2220 PyTypeObject PyFrozenSet_Type = {
   2221     PyVarObject_HEAD_INIT(&PyType_Type, 0)
   2222     "frozenset",                        /* tp_name */
   2223     sizeof(PySetObject),                /* tp_basicsize */
   2224     0,                                  /* tp_itemsize */
   2225     /* methods */
   2226     (destructor)set_dealloc,            /* tp_dealloc */
   2227     (printfunc)set_tp_print,            /* tp_print */
   2228     0,                                  /* tp_getattr */
   2229     0,                                  /* tp_setattr */
   2230     set_nocmp,                          /* tp_compare */
   2231     (reprfunc)set_repr,                 /* tp_repr */
   2232     &frozenset_as_number,               /* tp_as_number */
   2233     &set_as_sequence,                   /* tp_as_sequence */
   2234     0,                                  /* tp_as_mapping */
   2235     frozenset_hash,                     /* tp_hash */
   2236     0,                                  /* tp_call */
   2237     0,                                  /* tp_str */
   2238     PyObject_GenericGetAttr,            /* tp_getattro */
   2239     0,                                  /* tp_setattro */
   2240     0,                                  /* tp_as_buffer */
   2241     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES |
   2242         Py_TPFLAGS_BASETYPE,            /* tp_flags */
   2243     frozenset_doc,                      /* tp_doc */
   2244     (traverseproc)set_traverse,         /* tp_traverse */
   2245     (inquiry)set_clear_internal,        /* tp_clear */
   2246     (richcmpfunc)set_richcompare,       /* tp_richcompare */
   2247     offsetof(PySetObject, weakreflist),         /* tp_weaklistoffset */
   2248     (getiterfunc)set_iter,              /* tp_iter */
   2249     0,                                  /* tp_iternext */
   2250     frozenset_methods,                  /* tp_methods */
   2251     0,                                  /* tp_members */
   2252     0,                                  /* tp_getset */
   2253     0,                                  /* tp_base */
   2254     0,                                  /* tp_dict */
   2255     0,                                  /* tp_descr_get */
   2256     0,                                  /* tp_descr_set */
   2257     0,                                  /* tp_dictoffset */
   2258     0,                                  /* tp_init */
   2259     PyType_GenericAlloc,                /* tp_alloc */
   2260     frozenset_new,                      /* tp_new */
   2261     PyObject_GC_Del,                    /* tp_free */
   2262 };
   2263 
   2264 
   2265 /***** C API functions *************************************************/
   2266 
   2267 PyObject *
   2268 PySet_New(PyObject *iterable)
   2269 {
   2270     return make_new_set(&PySet_Type, iterable);
   2271 }
   2272 
   2273 PyObject *
   2274 PyFrozenSet_New(PyObject *iterable)
   2275 {
   2276     return make_new_set(&PyFrozenSet_Type, iterable);
   2277 }
   2278 
   2279 Py_ssize_t
   2280 PySet_Size(PyObject *anyset)
   2281 {
   2282     if (!PyAnySet_Check(anyset)) {
   2283         PyErr_BadInternalCall();
   2284         return -1;
   2285     }
   2286     return PySet_GET_SIZE(anyset);
   2287 }
   2288 
   2289 int
   2290 PySet_Clear(PyObject *set)
   2291 {
   2292     if (!PySet_Check(set)) {
   2293         PyErr_BadInternalCall();
   2294         return -1;
   2295     }
   2296     return set_clear_internal((PySetObject *)set);
   2297 }
   2298 
   2299 int
   2300 PySet_Contains(PyObject *anyset, PyObject *key)
   2301 {
   2302     if (!PyAnySet_Check(anyset)) {
   2303         PyErr_BadInternalCall();
   2304         return -1;
   2305     }
   2306     return set_contains_key((PySetObject *)anyset, key);
   2307 }
   2308 
   2309 int
   2310 PySet_Discard(PyObject *set, PyObject *key)
   2311 {
   2312     if (!PySet_Check(set)) {
   2313         PyErr_BadInternalCall();
   2314         return -1;
   2315     }
   2316     return set_discard_key((PySetObject *)set, key);
   2317 }
   2318 
   2319 int
   2320 PySet_Add(PyObject *anyset, PyObject *key)
   2321 {
   2322     if (!PySet_Check(anyset) &&
   2323         (!PyFrozenSet_Check(anyset) || Py_REFCNT(anyset) != 1)) {
   2324         PyErr_BadInternalCall();
   2325         return -1;
   2326     }
   2327     return set_add_key((PySetObject *)anyset, key);
   2328 }
   2329 
   2330 int
   2331 _PySet_Next(PyObject *set, Py_ssize_t *pos, PyObject **key)
   2332 {
   2333     setentry *entry_ptr;
   2334 
   2335     if (!PyAnySet_Check(set)) {
   2336         PyErr_BadInternalCall();
   2337         return -1;
   2338     }
   2339     if (set_next((PySetObject *)set, pos, &entry_ptr) == 0)
   2340         return 0;
   2341     *key = entry_ptr->key;
   2342     return 1;
   2343 }
   2344 
   2345 int
   2346 _PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key, long *hash)
   2347 {
   2348     setentry *entry;
   2349 
   2350     if (!PyAnySet_Check(set)) {
   2351         PyErr_BadInternalCall();
   2352         return -1;
   2353     }
   2354     if (set_next((PySetObject *)set, pos, &entry) == 0)
   2355         return 0;
   2356     *key = entry->key;
   2357     *hash = entry->hash;
   2358     return 1;
   2359 }
   2360 
   2361 PyObject *
   2362 PySet_Pop(PyObject *set)
   2363 {
   2364     if (!PySet_Check(set)) {
   2365         PyErr_BadInternalCall();
   2366         return NULL;
   2367     }
   2368     return set_pop((PySetObject *)set);
   2369 }
   2370 
   2371 int
   2372 _PySet_Update(PyObject *set, PyObject *iterable)
   2373 {
   2374     if (!PySet_Check(set)) {
   2375         PyErr_BadInternalCall();
   2376         return -1;
   2377     }
   2378     return set_update_internal((PySetObject *)set, iterable);
   2379 }
   2380 
   2381 #ifdef Py_DEBUG
   2382 
   2383 /* Test code to be called with any three element set.
   2384    Returns True and original set is restored. */
   2385 
   2386 #define assertRaises(call_return_value, exception)              \
   2387     do {                                                        \
   2388         assert(call_return_value);                              \
   2389         assert(PyErr_ExceptionMatches(exception));              \
   2390         PyErr_Clear();                                          \
   2391     } while(0)
   2392 
   2393 static PyObject *
   2394 test_c_api(PySetObject *so)
   2395 {
   2396     Py_ssize_t count;
   2397     char *s;
   2398     Py_ssize_t i;
   2399     PyObject *elem=NULL, *dup=NULL, *t, *f, *dup2, *x;
   2400     PyObject *ob = (PyObject *)so;
   2401     PyObject *str;
   2402 
   2403     /* Verify preconditions */
   2404     assert(PyAnySet_Check(ob));
   2405     assert(PyAnySet_CheckExact(ob));
   2406     assert(!PyFrozenSet_CheckExact(ob));
   2407 
   2408     /* so.clear(); so |= set("abc"); */
   2409     str = PyString_FromString("abc");
   2410     if (str == NULL)
   2411         return NULL;
   2412     set_clear_internal(so);
   2413     if (set_update_internal(so, str) == -1) {
   2414         Py_DECREF(str);
   2415         return NULL;
   2416     }
   2417     Py_DECREF(str);
   2418 
   2419     /* Exercise type/size checks */
   2420     assert(PySet_Size(ob) == 3);
   2421     assert(PySet_GET_SIZE(ob) == 3);
   2422 
   2423     /* Raise TypeError for non-iterable constructor arguments */
   2424     assertRaises(PySet_New(Py_None) == NULL, PyExc_TypeError);
   2425     assertRaises(PyFrozenSet_New(Py_None) == NULL, PyExc_TypeError);
   2426 
   2427     /* Raise TypeError for unhashable key */
   2428     dup = PySet_New(ob);
   2429     assertRaises(PySet_Discard(ob, dup) == -1, PyExc_TypeError);
   2430     assertRaises(PySet_Contains(ob, dup) == -1, PyExc_TypeError);
   2431     assertRaises(PySet_Add(ob, dup) == -1, PyExc_TypeError);
   2432 
   2433     /* Exercise successful pop, contains, add, and discard */
   2434     elem = PySet_Pop(ob);
   2435     assert(PySet_Contains(ob, elem) == 0);
   2436     assert(PySet_GET_SIZE(ob) == 2);
   2437     assert(PySet_Add(ob, elem) == 0);
   2438     assert(PySet_Contains(ob, elem) == 1);
   2439     assert(PySet_GET_SIZE(ob) == 3);
   2440     assert(PySet_Discard(ob, elem) == 1);
   2441     assert(PySet_GET_SIZE(ob) == 2);
   2442     assert(PySet_Discard(ob, elem) == 0);
   2443     assert(PySet_GET_SIZE(ob) == 2);
   2444 
   2445     /* Exercise clear */
   2446     dup2 = PySet_New(dup);
   2447     assert(PySet_Clear(dup2) == 0);
   2448     assert(PySet_Size(dup2) == 0);
   2449     Py_DECREF(dup2);
   2450 
   2451     /* Raise SystemError on clear or update of frozen set */
   2452     f = PyFrozenSet_New(dup);
   2453     assertRaises(PySet_Clear(f) == -1, PyExc_SystemError);
   2454     assertRaises(_PySet_Update(f, dup) == -1, PyExc_SystemError);
   2455     assert(PySet_Add(f, elem) == 0);
   2456     Py_INCREF(f);
   2457     assertRaises(PySet_Add(f, elem) == -1, PyExc_SystemError);
   2458     Py_DECREF(f);
   2459     Py_DECREF(f);
   2460 
   2461     /* Exercise direct iteration */
   2462     i = 0, count = 0;
   2463     while (_PySet_Next((PyObject *)dup, &i, &x)) {
   2464         s = PyString_AsString(x);
   2465         assert(s && (s[0] == 'a' || s[0] == 'b' || s[0] == 'c'));
   2466         count++;
   2467     }
   2468     assert(count == 3);
   2469 
   2470     /* Exercise updates */
   2471     dup2 = PySet_New(NULL);
   2472     assert(_PySet_Update(dup2, dup) == 0);
   2473     assert(PySet_Size(dup2) == 3);
   2474     assert(_PySet_Update(dup2, dup) == 0);
   2475     assert(PySet_Size(dup2) == 3);
   2476     Py_DECREF(dup2);
   2477 
   2478     /* Raise SystemError when self argument is not a set or frozenset. */
   2479     t = PyTuple_New(0);
   2480     assertRaises(PySet_Size(t) == -1, PyExc_SystemError);
   2481     assertRaises(PySet_Contains(t, elem) == -1, PyExc_SystemError);
   2482     Py_DECREF(t);
   2483 
   2484     /* Raise SystemError when self argument is not a set. */
   2485     f = PyFrozenSet_New(dup);
   2486     assert(PySet_Size(f) == 3);
   2487     assert(PyFrozenSet_CheckExact(f));
   2488     assertRaises(PySet_Discard(f, elem) == -1, PyExc_SystemError);
   2489     assertRaises(PySet_Pop(f) == NULL, PyExc_SystemError);
   2490     Py_DECREF(f);
   2491 
   2492     /* Raise KeyError when popping from an empty set */
   2493     assert(PyNumber_InPlaceSubtract(ob, ob) == ob);
   2494     Py_DECREF(ob);
   2495     assert(PySet_GET_SIZE(ob) == 0);
   2496     assertRaises(PySet_Pop(ob) == NULL, PyExc_KeyError);
   2497 
   2498     /* Restore the set from the copy using the PyNumber API */
   2499     assert(PyNumber_InPlaceOr(ob, dup) == ob);
   2500     Py_DECREF(ob);
   2501 
   2502     /* Verify constructors accept NULL arguments */
   2503     f = PySet_New(NULL);
   2504     assert(f != NULL);
   2505     assert(PySet_GET_SIZE(f) == 0);
   2506     Py_DECREF(f);
   2507     f = PyFrozenSet_New(NULL);
   2508     assert(f != NULL);
   2509     assert(PyFrozenSet_CheckExact(f));
   2510     assert(PySet_GET_SIZE(f) == 0);
   2511     Py_DECREF(f);
   2512 
   2513     Py_DECREF(elem);
   2514     Py_DECREF(dup);
   2515     Py_RETURN_TRUE;
   2516 }
   2517 
   2518 #undef assertRaises
   2519 
   2520 #endif
   2521