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