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