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