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