• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /* set object implementation
3    Written and maintained by Raymond D. Hettinger <python@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
set_key_error(PyObject * arg)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 *
_PySet_Dummy(void)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 *
set_lookkey(PySetObject * so,PyObject * key,register long hash)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 *
set_lookkey_string(PySetObject * so,PyObject * key,register long hash)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
set_insert_key(register PySetObject * so,PyObject * key,long hash)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
set_insert_clean(register PySetObject * so,PyObject * key,long hash)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
set_table_resize(PySetObject * so,Py_ssize_t minused)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
set_add_entry(register PySetObject * so,setentry * entry)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
set_add_key(register PySetObject * so,PyObject * key)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
set_discard_entry(PySetObject * so,setentry * oldentry)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
set_discard_key(PySetObject * so,PyObject * key)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
set_clear_internal(PySetObject * so)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
set_next(PySetObject * so,Py_ssize_t * pos_ptr,setentry ** entry_ptr)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
set_dealloc(PySetObject * so)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
set_tp_print(PySetObject * so,FILE * fp,int flags)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 *
set_repr(PySetObject * so)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
set_len(PyObject * so)642 set_len(PyObject *so)
643 {
644     return ((PySetObject *)so)->used;
645 }
646 
647 static int
set_merge(PySetObject * so,PyObject * otherset)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
set_contains_key(PySetObject * so,PyObject * key)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
set_contains_entry(PySetObject * so,setentry * entry)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 *
set_pop(PySetObject * so)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
set_traverse(PySetObject * so,visitproc visit,void * arg)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
frozenset_hash(PyObject * self)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
setiter_dealloc(setiterobject * si)815 setiter_dealloc(setiterobject *si)
816 {
817     Py_XDECREF(si->si_set);
818     PyObject_GC_Del(si);
819 }
820 
821 static int
setiter_traverse(setiterobject * si,visitproc visit,void * arg)822 setiter_traverse(setiterobject *si, visitproc visit, void *arg)
823 {
824     Py_VISIT(si->si_set);
825     return 0;
826 }
827 
828 static PyObject *
setiter_len(setiterobject * si)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 
setiter_iternext(setiterobject * si)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 *
set_iter(PySetObject * so)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
set_update_internal(PySetObject * so,PyObject * other)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 *
set_update(PySetObject * so,PyObject * args)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 *
make_new_set(PyTypeObject * type,PyObject * iterable)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 *
frozenset_new(PyTypeObject * type,PyObject * args,PyObject * kwds)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
PySet_Fini(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 *
set_new(PyTypeObject * type,PyObject * args,PyObject * kwds)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
set_swap_bodies(PySetObject * a,PySetObject * b)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 *
set_copy(PySetObject * so)1151 set_copy(PySetObject *so)
1152 {
1153     return make_new_set(Py_TYPE(so), (PyObject *)so);
1154 }
1155 
1156 static PyObject *
frozenset_copy(PySetObject * so)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 *
set_clear(PySetObject * so)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 *
set_union(PySetObject * so,PyObject * args)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 *
set_or(PySetObject * so,PyObject * other)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 *
set_ior(PySetObject * so,PyObject * other)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 *
set_intersection(PySetObject * so,PyObject * other)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 *
set_intersection_multi(PySetObject * so,PyObject * args)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 *
set_intersection_update(PySetObject * so,PyObject * other)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 *
set_intersection_update_multi(PySetObject * so,PyObject * args)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 *
set_and(PySetObject * so,PyObject * other)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 *
set_iand(PySetObject * so,PyObject * other)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 *
set_isdisjoint(PySetObject * so,PyObject * other)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
set_difference_update_internal(PySetObject * so,PyObject * other)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 *
set_difference_update(PySetObject * so,PyObject * args)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 *
set_difference(PySetObject * so,PyObject * other)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 *
set_difference_multi(PySetObject * so,PyObject * args)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 *
set_sub(PySetObject * so,PyObject * other)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 *
set_isub(PySetObject * so,PyObject * other)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 *
set_symmetric_difference_update(PySetObject * so,PyObject * other)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 *
set_symmetric_difference(PySetObject * so,PyObject * other)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 *
set_xor(PySetObject * so,PyObject * other)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 *
set_ixor(PySetObject * so,PyObject * other)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 *
set_issubset(PySetObject * so,PyObject * other)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 *
set_issuperset(PySetObject * so,PyObject * other)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 *
set_richcompare(PySetObject * v,PyObject * w,int op)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
set_nocmp(PyObject * self,PyObject * other)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 *
set_add(PySetObject * so,PyObject * key)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
set_contains(PySetObject * so,PyObject * key)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 *
set_direct_contains(PySetObject * so,PyObject * key)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 *
set_remove(PySetObject * so,PyObject * key)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 *
set_discard(PySetObject * so,PyObject * key)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 *
set_reduce(PySetObject * so)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 *
set_sizeof(PySetObject * so)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
set_init(PySetObject * self,PyObject * args,PyObject * kwds)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 *
PySet_New(PyObject * iterable)2262 PySet_New(PyObject *iterable)
2263 {
2264     return make_new_set(&PySet_Type, iterable);
2265 }
2266 
2267 PyObject *
PyFrozenSet_New(PyObject * iterable)2268 PyFrozenSet_New(PyObject *iterable)
2269 {
2270     return make_new_set(&PyFrozenSet_Type, iterable);
2271 }
2272 
2273 Py_ssize_t
PySet_Size(PyObject * anyset)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
PySet_Clear(PyObject * set)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
PySet_Contains(PyObject * anyset,PyObject * key)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
PySet_Discard(PyObject * set,PyObject * key)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
PySet_Add(PyObject * anyset,PyObject * key)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
_PySet_Next(PyObject * set,Py_ssize_t * pos,PyObject ** key)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
_PySet_NextEntry(PyObject * set,Py_ssize_t * pos,PyObject ** key,long * hash)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 *
PySet_Pop(PyObject * set)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
_PySet_Update(PyObject * set,PyObject * iterable)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 *
test_c_api(PySetObject * so)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