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