Mercurial > cpython-lru_cache-weakref
annotate Objects/setobject.c @ 49955:878d40468c4e legacy-trunk
Issue #4384: Added logging integration with warnings module using captureWarnings(). This change includes a NullHandler which does nothing; it will be of use to library developers who want to avoid the "No handlers could be found for logger XXX" message which can appear if the library user doesn't configure logging.
| author | Vinay Sajip <vinay_sajip@yahoo.co.uk> |
|---|---|
| date | Wed, 03 Dec 2008 23:22:58 +0000 |
| parents | 6e7b853e8616 |
| children | df3923c36ec5 |
| 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 |
|
35311
541bfbb10030
* Move copyright notice to top and indicate derivation from sets.py and
Raymond Hettinger <python@rcn.com>
parents:
35301
diff
changeset
|
2 /* set object implementation |
|
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 |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41682
diff
changeset
|
6 Copyright (c) 2003-2007 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" |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
12 |
|
40431
6b02fe1b382f
Port Georg's dictobject.c fix keys that were tuples got unpacked on the way to setting a KeyError (svn revision 52535, sf bug
Raymond Hettinger <python@rcn.com>
parents:
40430
diff
changeset
|
13 /* Set a key error with the specified argument, wrapping it in a |
|
6b02fe1b382f
Port Georg's dictobject.c fix keys that were tuples got unpacked on the way to setting a KeyError (svn revision 52535, sf bug
Raymond Hettinger <python@rcn.com>
parents:
40430
diff
changeset
|
14 * tuple automatically so that tuple keys are not unpacked as the |
|
6b02fe1b382f
Port Georg's dictobject.c fix keys that were tuples got unpacked on the way to setting a KeyError (svn revision 52535, sf bug
Raymond Hettinger <python@rcn.com>
parents:
40430
diff
changeset
|
15 * exception arguments. */ |
|
6b02fe1b382f
Port Georg's dictobject.c fix keys that were tuples got unpacked on the way to setting a KeyError (svn revision 52535, sf bug
Raymond Hettinger <python@rcn.com>
parents:
40430
diff
changeset
|
16 static void |
|
6b02fe1b382f
Port Georg's dictobject.c fix keys that were tuples got unpacked on the way to setting a KeyError (svn revision 52535, sf bug
Raymond Hettinger <python@rcn.com>
parents:
40430
diff
changeset
|
17 set_key_error(PyObject *arg) |
|
6b02fe1b382f
Port Georg's dictobject.c fix keys that were tuples got unpacked on the way to setting a KeyError (svn revision 52535, sf bug
Raymond Hettinger <python@rcn.com>
parents:
40430
diff
changeset
|
18 { |
|
6b02fe1b382f
Port Georg's dictobject.c fix keys that were tuples got unpacked on the way to setting a KeyError (svn revision 52535, sf bug
Raymond Hettinger <python@rcn.com>
parents:
40430
diff
changeset
|
19 PyObject *tup; |
|
6b02fe1b382f
Port Georg's dictobject.c fix keys that were tuples got unpacked on the way to setting a KeyError (svn revision 52535, sf bug
Raymond Hettinger <python@rcn.com>
parents:
40430
diff
changeset
|
20 tup = PyTuple_Pack(1, arg); |
|
6b02fe1b382f
Port Georg's dictobject.c fix keys that were tuples got unpacked on the way to setting a KeyError (svn revision 52535, sf bug
Raymond Hettinger <python@rcn.com>
parents:
40430
diff
changeset
|
21 if (!tup) |
|
6b02fe1b382f
Port Georg's dictobject.c fix keys that were tuples got unpacked on the way to setting a KeyError (svn revision 52535, sf bug
Raymond Hettinger <python@rcn.com>
parents:
40430
diff
changeset
|
22 return; /* caller will expect error to be set anyway */ |
|
6b02fe1b382f
Port Georg's dictobject.c fix keys that were tuples got unpacked on the way to setting a KeyError (svn revision 52535, sf bug
Raymond Hettinger <python@rcn.com>
parents:
40430
diff
changeset
|
23 PyErr_SetObject(PyExc_KeyError, tup); |
|
6b02fe1b382f
Port Georg's dictobject.c fix keys that were tuples got unpacked on the way to setting a KeyError (svn revision 52535, sf bug
Raymond Hettinger <python@rcn.com>
parents:
40430
diff
changeset
|
24 Py_DECREF(tup); |
|
6b02fe1b382f
Port Georg's dictobject.c fix keys that were tuples got unpacked on the way to setting a KeyError (svn revision 52535, sf bug
Raymond Hettinger <python@rcn.com>
parents:
40430
diff
changeset
|
25 } |
|
6b02fe1b382f
Port Georg's dictobject.c fix keys that were tuples got unpacked on the way to setting a KeyError (svn revision 52535, sf bug
Raymond Hettinger <python@rcn.com>
parents:
40430
diff
changeset
|
26 |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
27 /* 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
|
28 #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
|
29 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
30 /* 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
|
31 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
|
32 |
|
37638
65ecb83ea7dd
Ignore the references to the dummy objects used as deleted keys
Armin Rigo <arigo@tunes.org>
parents:
37602
diff
changeset
|
33 #ifdef Py_REF_DEBUG |
|
65ecb83ea7dd
Ignore the references to the dummy objects used as deleted keys
Armin Rigo <arigo@tunes.org>
parents:
37602
diff
changeset
|
34 PyObject * |
|
65ecb83ea7dd
Ignore the references to the dummy objects used as deleted keys
Armin Rigo <arigo@tunes.org>
parents:
37602
diff
changeset
|
35 _PySet_Dummy(void) |
|
65ecb83ea7dd
Ignore the references to the dummy objects used as deleted keys
Armin Rigo <arigo@tunes.org>
parents:
37602
diff
changeset
|
36 { |
|
65ecb83ea7dd
Ignore the references to the dummy objects used as deleted keys
Armin Rigo <arigo@tunes.org>
parents:
37602
diff
changeset
|
37 return dummy; |
|
65ecb83ea7dd
Ignore the references to the dummy objects used as deleted keys
Armin Rigo <arigo@tunes.org>
parents:
37602
diff
changeset
|
38 } |
|
65ecb83ea7dd
Ignore the references to the dummy objects used as deleted keys
Armin Rigo <arigo@tunes.org>
parents:
37602
diff
changeset
|
39 #endif |
|
65ecb83ea7dd
Ignore the references to the dummy objects used as deleted keys
Armin Rigo <arigo@tunes.org>
parents:
37602
diff
changeset
|
40 |
|
35321
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
41 #define INIT_NONZERO_SET_SLOTS(so) do { \ |
|
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
42 (so)->table = (so)->smalltable; \ |
|
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
43 (so)->mask = PySet_MINSIZE - 1; \ |
|
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
44 (so)->hash = -1; \ |
|
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
45 } while(0) |
|
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
46 |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
47 #define EMPTY_TO_MINSIZE(so) do { \ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
48 memset((so)->smalltable, 0, sizeof((so)->smalltable)); \ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
49 (so)->used = (so)->fill = 0; \ |
|
35321
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
50 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
|
51 } while(0) |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
52 |
|
35321
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
53 /* Reuse scheme to save calls to malloc, free, and memset */ |
|
45191
920a7633ae08
Unified naming convention for free lists and their limits. All free lists
Christian Heimes <christian@cheimes.de>
parents:
45138
diff
changeset
|
54 #ifndef PySet_MAXFREELIST |
|
920a7633ae08
Unified naming convention for free lists and their limits. All free lists
Christian Heimes <christian@cheimes.de>
parents:
45138
diff
changeset
|
55 #define PySet_MAXFREELIST 80 |
|
920a7633ae08
Unified naming convention for free lists and their limits. All free lists
Christian Heimes <christian@cheimes.de>
parents:
45138
diff
changeset
|
56 #endif |
|
920a7633ae08
Unified naming convention for free lists and their limits. All free lists
Christian Heimes <christian@cheimes.de>
parents:
45138
diff
changeset
|
57 static PySetObject *free_list[PySet_MAXFREELIST]; |
|
920a7633ae08
Unified naming convention for free lists and their limits. All free lists
Christian Heimes <christian@cheimes.de>
parents:
45138
diff
changeset
|
58 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
|
59 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
60 /* |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
61 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
|
62 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
|
63 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
|
64 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
|
65 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
66 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
|
67 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
|
68 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
69 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
|
70 |
|
35581
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
71 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
|
72 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
|
73 */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
74 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
75 static setentry * |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
76 set_lookkey(PySetObject *so, PyObject *key, register long hash) |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
77 { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
78 register Py_ssize_t i; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
79 register size_t perturb; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
80 register setentry *freeslot; |
| 38872 | 81 register size_t mask = so->mask; |
|
35312
8aa9bd80286b
* Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents:
35311
diff
changeset
|
82 setentry *table = so->table; |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
83 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
|
84 register int cmp; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
85 PyObject *startkey; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
86 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
87 i = hash & mask; |
|
35312
8aa9bd80286b
* Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents:
35311
diff
changeset
|
88 entry = &table[i]; |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
89 if (entry->key == NULL || entry->key == key) |
|
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
90 return entry; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
91 |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
92 if (entry->key == dummy) |
|
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
93 freeslot = entry; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
94 else { |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
95 if (entry->hash == hash) { |
|
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
96 startkey = entry->key; |
|
47386
ea273c8e3eaa
Issue 2855: Fix obscure crasher by slowing down the entire module. Mimics what was done to dictionaries in r59223.
Raymond Hettinger <python@rcn.com>
parents:
47294
diff
changeset
|
97 Py_INCREF(startkey); |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
98 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); |
|
47386
ea273c8e3eaa
Issue 2855: Fix obscure crasher by slowing down the entire module. Mimics what was done to dictionaries in r59223.
Raymond Hettinger <python@rcn.com>
parents:
47294
diff
changeset
|
99 Py_DECREF(startkey); |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
100 if (cmp < 0) |
|
35581
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
101 return NULL; |
|
35312
8aa9bd80286b
* Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents:
35311
diff
changeset
|
102 if (table == so->table && entry->key == startkey) { |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
103 if (cmp > 0) |
|
35581
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
104 return entry; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
105 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
106 else { |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
107 /* The compare did major nasty stuff to the |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
108 * set: start over. |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
109 */ |
|
35581
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
110 return set_lookkey(so, key, hash); |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
111 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
112 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
113 freeslot = NULL; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
114 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
115 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
116 /* In the loop, key == dummy is by far (factor of 100s) the |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
117 least likely outcome, so test for that last. */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
118 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) { |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
119 i = (i << 2) + i + perturb + 1; |
|
35312
8aa9bd80286b
* Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents:
35311
diff
changeset
|
120 entry = &table[i & mask]; |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
121 if (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
|
122 if (freeslot != NULL) |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
123 entry = freeslot; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
124 break; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
125 } |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
126 if (entry->key == key) |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
127 break; |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
128 if (entry->hash == hash && entry->key != dummy) { |
|
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
129 startkey = entry->key; |
|
47386
ea273c8e3eaa
Issue 2855: Fix obscure crasher by slowing down the entire module. Mimics what was done to dictionaries in r59223.
Raymond Hettinger <python@rcn.com>
parents:
47294
diff
changeset
|
130 Py_INCREF(startkey); |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
131 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); |
|
47386
ea273c8e3eaa
Issue 2855: Fix obscure crasher by slowing down the entire module. Mimics what was done to dictionaries in r59223.
Raymond Hettinger <python@rcn.com>
parents:
47294
diff
changeset
|
132 Py_DECREF(startkey); |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
133 if (cmp < 0) |
|
35581
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
134 return NULL; |
|
35312
8aa9bd80286b
* Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents:
35311
diff
changeset
|
135 if (table == so->table && entry->key == startkey) { |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
136 if (cmp > 0) |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
137 break; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
138 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
139 else { |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
140 /* The compare did major nasty stuff to the |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
141 * set: start over. |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
142 */ |
|
35581
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
143 return set_lookkey(so, key, hash); |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
144 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
145 } |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
146 else if (entry->key == dummy && freeslot == NULL) |
|
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
147 freeslot = entry; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
148 } |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
149 return entry; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
150 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
151 |
|
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 * Hacked up version of set_lookkey which can assume keys are always strings; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47386
diff
changeset
|
154 * This means we can always use _PyString_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
|
155 * 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
|
156 */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
157 static setentry * |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
158 set_lookkey_string(PySetObject *so, PyObject *key, register long hash) |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
159 { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
160 register Py_ssize_t i; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
161 register size_t perturb; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
162 register setentry *freeslot; |
| 38872 | 163 register size_t mask = so->mask; |
|
35312
8aa9bd80286b
* Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents:
35311
diff
changeset
|
164 setentry *table = so->table; |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
165 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
|
166 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
167 /* Make sure this function doesn't have to handle non-string keys, |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
168 including subclasses of str; e.g., one reason to subclass |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
169 strings is to override __eq__, and for speed we don't cater to |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
170 that here. */ |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47386
diff
changeset
|
171 if (!PyString_CheckExact(key)) { |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
172 so->lookup = set_lookkey; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
173 return set_lookkey(so, key, hash); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
174 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
175 i = hash & mask; |
|
35312
8aa9bd80286b
* Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents:
35311
diff
changeset
|
176 entry = &table[i]; |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
177 if (entry->key == NULL || entry->key == key) |
|
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
178 return entry; |
|
35339
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
179 if (entry->key == dummy) |
|
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
180 freeslot = entry; |
|
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
181 else { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47386
diff
changeset
|
182 if (entry->hash == hash && _PyString_Eq(entry->key, key)) |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
183 return entry; |
|
35339
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
184 freeslot = NULL; |
|
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
185 } |
|
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
186 |
|
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
187 /* In the loop, key == dummy is by far (factor of 100s) the |
|
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
188 least likely outcome, so test for that last. */ |
|
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
189 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) { |
|
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
190 i = (i << 2) + i + perturb + 1; |
|
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
191 entry = &table[i & mask]; |
|
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
192 if (entry->key == NULL) |
|
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
193 return freeslot == NULL ? entry : freeslot; |
|
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
194 if (entry->key == key |
|
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
195 || (entry->hash == hash |
|
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
196 && entry->key != dummy |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47386
diff
changeset
|
197 && _PyString_Eq(entry->key, key))) |
|
35339
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
198 return entry; |
|
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
199 if (entry->key == dummy && freeslot == NULL) |
|
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
200 freeslot = entry; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
201 } |
|
40225
796304efa268
Fix warnings with HP's C compiler. It doesn't recognize that infinite
Neal Norwitz <nnorwitz@gmail.com>
parents:
39794
diff
changeset
|
202 assert(0); /* NOT REACHED */ |
|
796304efa268
Fix warnings with HP's C compiler. It doesn't recognize that infinite
Neal Norwitz <nnorwitz@gmail.com>
parents:
39794
diff
changeset
|
203 return 0; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
204 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
205 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
206 /* |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
207 Internal routine to insert a new key into the table. |
|
40430
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
208 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
|
209 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
|
210 */ |
|
35581
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
211 static int |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
212 set_insert_key(register PySetObject *so, PyObject *key, long hash) |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
213 { |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
214 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
|
215 typedef setentry *(*lookupfunc)(PySetObject *, PyObject *, long); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
216 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
217 assert(so->lookup != NULL); |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
218 entry = so->lookup(so, key, hash); |
|
35581
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
219 if (entry == NULL) |
|
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
220 return -1; |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
221 if (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
|
222 /* UNUSED */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
223 so->fill++; |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
224 entry->key = key; |
|
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
225 entry->hash = hash; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
226 so->used++; |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
227 } else if (entry->key == dummy) { |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
228 /* DUMMY */ |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
229 entry->key = key; |
|
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
230 entry->hash = hash; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
231 so->used++; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
232 Py_DECREF(dummy); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
233 } else { |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
234 /* ACTIVE */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
235 Py_DECREF(key); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
236 } |
|
35581
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
237 return 0; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
238 } |
|
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 /* |
|
40430
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
241 Internal routine used by set_table_resize() to insert an item which is |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
242 known to be absent from the set. This routine also assumes that |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
243 the set contains no deleted entries. Besides the performance benefit, |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
244 using set_insert_clean() in set_table_resize() is dangerous (SF bug #1456209). |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
245 Note that no refcounts are changed by this routine; if needed, the caller |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
246 is responsible for incref'ing `key`. |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
247 */ |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
248 static void |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
249 set_insert_clean(register PySetObject *so, PyObject *key, long hash) |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
250 { |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
251 register size_t i; |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
252 register size_t perturb; |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
253 register size_t mask = (size_t)so->mask; |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
254 setentry *table = so->table; |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
255 register setentry *entry; |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
256 |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
257 i = hash & mask; |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
258 entry = &table[i]; |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
259 for (perturb = hash; entry->key != NULL; perturb >>= PERTURB_SHIFT) { |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
260 i = (i << 2) + i + perturb + 1; |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
261 entry = &table[i & mask]; |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
262 } |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
263 so->fill++; |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
264 entry->key = key; |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
265 entry->hash = hash; |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
266 so->used++; |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
267 } |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
268 |
|
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
269 /* |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
270 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
|
271 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
|
272 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
|
273 */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
274 static int |
| 38872 | 275 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
|
276 { |
| 38872 | 277 Py_ssize_t newsize; |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
278 setentry *oldtable, *newtable, *entry; |
| 38872 | 279 Py_ssize_t i; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
280 int is_oldtable_malloced; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
281 setentry small_copy[PySet_MINSIZE]; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
282 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
283 assert(minused >= 0); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
284 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
285 /* Find the smallest table size > minused. */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
286 for (newsize = PySet_MINSIZE; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
287 newsize <= minused && newsize > 0; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
288 newsize <<= 1) |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
289 ; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
290 if (newsize <= 0) { |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
291 PyErr_NoMemory(); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
292 return -1; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
293 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
294 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
295 /* Get space for a new table. */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
296 oldtable = so->table; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
297 assert(oldtable != NULL); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
298 is_oldtable_malloced = oldtable != so->smalltable; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
299 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
300 if (newsize == PySet_MINSIZE) { |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
301 /* A large table is shrinking, or we can't get any smaller. */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
302 newtable = so->smalltable; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
303 if (newtable == oldtable) { |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
304 if (so->fill == so->used) { |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
305 /* No dummies, so no point doing anything. */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
306 return 0; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
307 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
308 /* We're not going to resize it, but rebuild the |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
309 table anyway to purge old dummy entries. |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
310 Subtle: This is *necessary* if fill==size, |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
311 as set_lookkey needs at least one virgin slot to |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
312 terminate failing searches. If fill < size, it's |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
313 merely desirable, as dummies slow searches. */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
314 assert(so->fill > so->used); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
315 memcpy(small_copy, oldtable, sizeof(small_copy)); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
316 oldtable = small_copy; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
317 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
318 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
319 else { |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
320 newtable = PyMem_NEW(setentry, newsize); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
321 if (newtable == NULL) { |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
322 PyErr_NoMemory(); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
323 return -1; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
324 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
325 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
326 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
327 /* Make the set empty, using the new table. */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
328 assert(newtable != oldtable); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
329 so->table = newtable; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
330 so->mask = newsize - 1; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
331 memset(newtable, 0, sizeof(setentry) * newsize); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
332 so->used = 0; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
333 i = so->fill; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
334 so->fill = 0; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
335 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
336 /* Copy the data over; this is refcount-neutral for active entries; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
337 dummy entries aren't copied over, of course */ |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
338 for (entry = oldtable; i > 0; entry++) { |
|
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
339 if (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
|
340 /* UNUSED */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
341 ; |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
342 } else if (entry->key == dummy) { |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
343 /* DUMMY */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
344 --i; |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
345 assert(entry->key == dummy); |
|
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
346 Py_DECREF(entry->key); |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
347 } else { |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
348 /* ACTIVE */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
349 --i; |
|
40430
6e91fc88bf99
Port Armin's fix for a dict resize vulnerability (svn revision 46589, sf bug 1456209).
Raymond Hettinger <python@rcn.com>
parents:
40429
diff
changeset
|
350 set_insert_clean(so, entry->key, entry->hash); |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
351 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
352 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
353 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
354 if (is_oldtable_malloced) |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
355 PyMem_DEL(oldtable); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
356 return 0; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
357 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
358 |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
359 /* 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
|
360 |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
361 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
|
362 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
|
363 { |
| 38872 | 364 register Py_ssize_t n_used; |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
365 |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
366 assert(so->fill <= so->mask); /* at least one empty slot */ |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
367 n_used = so->used; |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
368 Py_INCREF(entry->key); |
|
39794
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
369 if (set_insert_key(so, entry->key, entry->hash) == -1) { |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
370 Py_DECREF(entry->key); |
|
35581
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
371 return -1; |
|
39794
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
372 } |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
373 if (!(so->used > n_used && so->fill*3 >= (so->mask+1)*2)) |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
374 return 0; |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
375 return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4); |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
376 } |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
377 |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
378 static int |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
379 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
|
380 { |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
381 register long hash; |
| 38872 | 382 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
|
383 |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47386
diff
changeset
|
384 if (!PyString_CheckExact(key) || |
|
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47386
diff
changeset
|
385 (hash = ((PyStringObject *) key)->ob_shash) == -1) { |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
386 hash = PyObject_Hash(key); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
387 if (hash == -1) |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
388 return -1; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
389 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
390 assert(so->fill <= so->mask); /* at least one empty slot */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
391 n_used = so->used; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
392 Py_INCREF(key); |
|
35581
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
393 if (set_insert_key(so, key, hash) == -1) { |
|
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
394 Py_DECREF(key); |
|
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
395 return -1; |
|
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
396 } |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
397 if (!(so->used > n_used && so->fill*3 >= (so->mask+1)*2)) |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
398 return 0; |
|
35321
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
399 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
|
400 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
401 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
402 #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
|
403 #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
|
404 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
405 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
|
406 set_discard_entry(PySetObject *so, setentry *oldentry) |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
407 { register setentry *entry; |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
408 PyObject *old_key; |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
409 |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
410 entry = (so->lookup)(so, oldentry->key, oldentry->hash); |
|
35581
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
411 if (entry == NULL) |
|
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
412 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
|
413 if (entry->key == NULL || entry->key == dummy) |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
414 return DISCARD_NOTFOUND; |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
415 old_key = entry->key; |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
416 Py_INCREF(dummy); |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
417 entry->key = dummy; |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
418 so->used--; |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
419 Py_DECREF(old_key); |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
420 return DISCARD_FOUND; |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
421 } |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
422 |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
423 static int |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
424 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
|
425 { |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
426 register long hash; |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
427 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
|
428 PyObject *old_key; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
429 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
430 assert (PyAnySet_Check(so)); |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47386
diff
changeset
|
431 if (!PyString_CheckExact(key) || |
|
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47386
diff
changeset
|
432 (hash = ((PyStringObject *) key)->ob_shash) == -1) { |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
433 hash = PyObject_Hash(key); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
434 if (hash == -1) |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
435 return -1; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
436 } |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
437 entry = (so->lookup)(so, key, hash); |
|
35581
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
438 if (entry == NULL) |
|
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
439 return -1; |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
440 if (entry->key == NULL || entry->key == dummy) |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
441 return DISCARD_NOTFOUND; |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
442 old_key = entry->key; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
443 Py_INCREF(dummy); |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
444 entry->key = dummy; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
445 so->used--; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
446 Py_DECREF(old_key); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
447 return DISCARD_FOUND; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
448 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
449 |
|
35315
a6cbfcd0e691
Factor away a redundant clear() function.
Raymond Hettinger <python@rcn.com>
parents:
35312
diff
changeset
|
450 static int |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
451 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
|
452 { |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
453 setentry *entry, *table; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
454 int table_is_malloced; |
| 38872 | 455 Py_ssize_t fill; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
456 setentry small_copy[PySet_MINSIZE]; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
457 #ifdef Py_DEBUG |
| 38872 | 458 Py_ssize_t i, n; |
|
35312
8aa9bd80286b
* Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents:
35311
diff
changeset
|
459 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
|
460 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
461 n = so->mask + 1; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
462 i = 0; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
463 #endif |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
464 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
465 table = so->table; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
466 assert(table != NULL); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
467 table_is_malloced = table != so->smalltable; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
468 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
469 /* This is delicate. During the process of clearing the set, |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
470 * decrefs can cause the set to mutate. To avoid fatal confusion |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
471 * (voice of experience), we have to make the set empty before |
|
35315
a6cbfcd0e691
Factor away a redundant clear() function.
Raymond Hettinger <python@rcn.com>
parents:
35312
diff
changeset
|
472 * clearing the slots, and never refer to anything via so->ref while |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
473 * clearing. |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
474 */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
475 fill = so->fill; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
476 if (table_is_malloced) |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
477 EMPTY_TO_MINSIZE(so); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
478 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
479 else if (fill > 0) { |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
480 /* It's a small table with something that needs to be cleared. |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
481 * Afraid the only safe way is to copy the set entries into |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
482 * another small table first. |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
483 */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
484 memcpy(small_copy, table, sizeof(small_copy)); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
485 table = small_copy; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
486 EMPTY_TO_MINSIZE(so); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
487 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
488 /* else it's a small table that's already empty */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
489 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
490 /* Now we can finally clear things. If C had refcounts, we could |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
491 * assert that the refcount on table is 1 now, i.e. that this function |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
492 * has unique access to it, so decref side-effects can't alter it. |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
493 */ |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
494 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
|
495 #ifdef Py_DEBUG |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
496 assert(i < n); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
497 ++i; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
498 #endif |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
499 if (entry->key) { |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
500 --fill; |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
501 Py_DECREF(entry->key); |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
502 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
503 #ifdef Py_DEBUG |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
504 else |
|
37219
d7a6ec9de887
Tighten an overbroad and misleading assertion.
Raymond Hettinger <python@rcn.com>
parents:
36833
diff
changeset
|
505 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
|
506 #endif |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
507 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
508 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
509 if (table_is_malloced) |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
510 PyMem_DEL(table); |
|
35315
a6cbfcd0e691
Factor away a redundant clear() function.
Raymond Hettinger <python@rcn.com>
parents:
35312
diff
changeset
|
511 return 0; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
512 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
513 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
514 /* |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
515 * 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
|
516 * |
| 38872 | 517 * 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
|
518 * setentry *entry; |
|
35297
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
519 * 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
|
520 * 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
|
521 * 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
|
522 * } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
523 * |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
524 * CAUTION: In general, it isn't safe to use set_next in a loop that |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
525 * mutates the table. |
|
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 static int |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
528 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
|
529 { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
530 Py_ssize_t i; |
| 38872 | 531 Py_ssize_t mask; |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
532 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
|
533 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
534 assert (PyAnySet_Check(so)); |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
535 i = *pos_ptr; |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
536 assert(i >= 0); |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
537 table = so->table; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
538 mask = so->mask; |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
539 while (i <= mask && (table[i].key == NULL || table[i].key == dummy)) |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
540 i++; |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
541 *pos_ptr = i+1; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
542 if (i > mask) |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
543 return 0; |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
544 assert(table[i].key != NULL); |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
545 *entry_ptr = &table[i]; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
546 return 1; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
547 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
548 |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
549 static void |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
550 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
|
551 { |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
552 register setentry *entry; |
| 38872 | 553 Py_ssize_t fill = so->fill; |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
554 PyObject_GC_UnTrack(so); |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
555 Py_TRASHCAN_SAFE_BEGIN(so) |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
556 if (so->weakreflist != NULL) |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
557 PyObject_ClearWeakRefs((PyObject *) so); |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
558 |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
559 for (entry = so->table; fill > 0; entry++) { |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
560 if (entry->key) { |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
561 --fill; |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
562 Py_DECREF(entry->key); |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
563 } |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
564 } |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
565 if (so->table != so->smalltable) |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
566 PyMem_DEL(so->table); |
|
45191
920a7633ae08
Unified naming convention for free lists and their limits. All free lists
Christian Heimes <christian@cheimes.de>
parents:
45138
diff
changeset
|
567 if (numfree < PySet_MAXFREELIST && PyAnySet_CheckExact(so)) |
|
920a7633ae08
Unified naming convention for free lists and their limits. All free lists
Christian Heimes <christian@cheimes.de>
parents:
45138
diff
changeset
|
568 free_list[numfree++] = so; |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
569 else |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43958
diff
changeset
|
570 Py_TYPE(so)->tp_free(so); |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
571 Py_TRASHCAN_SAFE_END(so) |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
572 } |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
573 |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
574 static int |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
575 set_tp_print(PySetObject *so, FILE *fp, int flags) |
|
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 setentry *entry; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
578 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
|
579 char *emit = ""; /* No separator emitted on first pass */ |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
580 char *separator = ", "; |
|
40536
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
581 int status = Py_ReprEnter((PyObject*)so); |
|
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
582 |
|
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
583 if (status != 0) { |
|
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
584 if (status < 0) |
|
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
585 return status; |
|
43378
7630248b593c
Add a bunch of GIL release/acquire points in tp_print implementations and for
Brett Cannon <bcannon@gmail.com>
parents:
42333
diff
changeset
|
586 Py_BEGIN_ALLOW_THREADS |
|
40536
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
587 fprintf(fp, "%s(...)", so->ob_type->tp_name); |
|
43378
7630248b593c
Add a bunch of GIL release/acquire points in tp_print implementations and for
Brett Cannon <bcannon@gmail.com>
parents:
42333
diff
changeset
|
588 Py_END_ALLOW_THREADS |
|
40536
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
589 return 0; |
|
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
590 } |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
591 |
|
43378
7630248b593c
Add a bunch of GIL release/acquire points in tp_print implementations and for
Brett Cannon <bcannon@gmail.com>
parents:
42333
diff
changeset
|
592 Py_BEGIN_ALLOW_THREADS |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
593 fprintf(fp, "%s([", so->ob_type->tp_name); |
|
43378
7630248b593c
Add a bunch of GIL release/acquire points in tp_print implementations and for
Brett Cannon <bcannon@gmail.com>
parents:
42333
diff
changeset
|
594 Py_END_ALLOW_THREADS |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
595 while (set_next(so, &pos, &entry)) { |
|
43378
7630248b593c
Add a bunch of GIL release/acquire points in tp_print implementations and for
Brett Cannon <bcannon@gmail.com>
parents:
42333
diff
changeset
|
596 Py_BEGIN_ALLOW_THREADS |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
597 fputs(emit, fp); |
|
43378
7630248b593c
Add a bunch of GIL release/acquire points in tp_print implementations and for
Brett Cannon <bcannon@gmail.com>
parents:
42333
diff
changeset
|
598 Py_END_ALLOW_THREADS |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
599 emit = separator; |
|
40536
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
600 if (PyObject_Print(entry->key, fp, 0) != 0) { |
|
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
601 Py_ReprLeave((PyObject*)so); |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
602 return -1; |
|
40536
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
603 } |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
604 } |
|
43378
7630248b593c
Add a bunch of GIL release/acquire points in tp_print implementations and for
Brett Cannon <bcannon@gmail.com>
parents:
42333
diff
changeset
|
605 Py_BEGIN_ALLOW_THREADS |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
606 fputs("])", fp); |
|
43378
7630248b593c
Add a bunch of GIL release/acquire points in tp_print implementations and for
Brett Cannon <bcannon@gmail.com>
parents:
42333
diff
changeset
|
607 Py_END_ALLOW_THREADS |
|
40536
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
608 Py_ReprLeave((PyObject*)so); |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
609 return 0; |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
610 } |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
611 |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
612 static PyObject * |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
613 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
|
614 { |
|
40536
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
615 PyObject *keys, *result=NULL, *listrepr; |
|
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
616 int status = Py_ReprEnter((PyObject*)so); |
|
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
617 |
|
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
618 if (status != 0) { |
|
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
619 if (status < 0) |
|
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
620 return NULL; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47386
diff
changeset
|
621 return PyString_FromFormat("%s(...)", so->ob_type->tp_name); |
|
40536
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
622 } |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
623 |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
624 keys = PySequence_List((PyObject *)so); |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
625 if (keys == NULL) |
|
40536
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
626 goto done; |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
627 listrepr = PyObject_Repr(keys); |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
628 Py_DECREF(keys); |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
629 if (listrepr == NULL) |
|
40536
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
630 goto done; |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
631 |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47386
diff
changeset
|
632 result = PyString_FromFormat("%s(%s)", so->ob_type->tp_name, |
|
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47386
diff
changeset
|
633 PyString_AS_STRING(listrepr)); |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
634 Py_DECREF(listrepr); |
|
40536
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
635 done: |
|
c1a4dc71cdd3
For sets with cyclical reprs, emit an ellipsis instead of infinitely recursing.
Raymond Hettinger <python@rcn.com>
parents:
40431
diff
changeset
|
636 Py_ReprLeave((PyObject*)so); |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
637 return result; |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
638 } |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
639 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
640 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
|
641 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
|
642 { |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
643 return ((PySetObject *)so)->used; |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
644 } |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
645 |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
646 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
|
647 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
|
648 { |
|
35297
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
649 PySetObject *other; |
| 38872 | 650 register Py_ssize_t i; |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
651 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
|
652 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
653 assert (PyAnySet_Check(so)); |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
654 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
|
655 |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
656 other = (PySetObject*)otherset; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
657 if (other == so || other->used == 0) |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
658 /* a.update(a) or a.update({}); nothing to do */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
659 return 0; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
660 /* Do one big resize at the start, rather than |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
661 * incrementally resizing as we insert new keys. Expect |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
662 * that there will be no (or few) overlapping keys. |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
663 */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
664 if ((so->fill + other->used)*3 >= (so->mask+1)*2) { |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
665 if (set_table_resize(so, (so->used + other->used)*2) != 0) |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
666 return -1; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
667 } |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
668 for (i = 0; i <= other->mask; i++) { |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
669 entry = &other->table[i]; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
670 if (entry->key != NULL && |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
671 entry->key != dummy) { |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
672 Py_INCREF(entry->key); |
|
35581
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
673 if (set_insert_key(so, entry->key, entry->hash) == -1) { |
|
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
674 Py_DECREF(entry->key); |
|
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
675 return -1; |
|
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
676 } |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
677 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
678 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
679 return 0; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
680 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
681 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
682 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
|
683 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
|
684 { |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
685 long hash; |
|
35581
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
686 setentry *entry; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
687 |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47386
diff
changeset
|
688 if (!PyString_CheckExact(key) || |
|
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47386
diff
changeset
|
689 (hash = ((PyStringObject *) key)->ob_shash) == -1) { |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
690 hash = PyObject_Hash(key); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
691 if (hash == -1) |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
692 return -1; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
693 } |
|
35581
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
694 entry = (so->lookup)(so, key, hash); |
|
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
695 if (entry == NULL) |
|
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
696 return -1; |
|
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
697 key = entry->key; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
698 return key != NULL && key != dummy; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
699 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
700 |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
701 static int |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
702 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
|
703 { |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
704 PyObject *key; |
|
35581
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
705 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
|
706 |
|
35581
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
707 lu_entry = (so->lookup)(so, entry->key, entry->hash); |
|
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
708 if (lu_entry == NULL) |
|
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
709 return -1; |
|
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
710 key = lu_entry->key; |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
711 return key != NULL && key != dummy; |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
712 } |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
713 |
|
35341
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
714 static PyObject * |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
715 set_pop(PySetObject *so) |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
716 { |
| 38872 | 717 register Py_ssize_t i = 0; |
|
35341
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
718 register setentry *entry; |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
719 PyObject *key; |
|
35341
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
720 |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
721 assert (PyAnySet_Check(so)); |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
722 if (so->used == 0) { |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
723 PyErr_SetString(PyExc_KeyError, "pop from an empty set"); |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
724 return NULL; |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
725 } |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
726 |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
727 /* Set entry to "the first" unused or dummy set entry. We abuse |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
728 * the hash field of slot 0 to hold a search finger: |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
729 * If slot 0 has a value, use slot 0. |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
730 * Else slot 0 is being used to hold a search finger, |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
731 * and we use its hash value as the first index to look. |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
732 */ |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
733 entry = &so->table[0]; |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
734 if (entry->key == NULL || entry->key == dummy) { |
| 38872 | 735 i = entry->hash; |
|
35341
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
736 /* The hash field may be a real hash value, or it may be a |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
737 * legit search finger, or it may be a once-legit search |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
738 * finger that's out of bounds now because it wrapped around |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
739 * or the table shrunk -- simply make sure it's in bounds now. |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
740 */ |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
741 if (i > so->mask || i < 1) |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
742 i = 1; /* skip slot 0 */ |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
743 while ((entry = &so->table[i])->key == NULL || entry->key==dummy) { |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
744 i++; |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
745 if (i > so->mask) |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
746 i = 1; |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
747 } |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
748 } |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
749 key = entry->key; |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
750 Py_INCREF(dummy); |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
751 entry->key = dummy; |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
752 so->used--; |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
753 so->table[0].hash = i + 1; /* next place to start */ |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
754 return key; |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
755 } |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
756 |
|
49431
2e794757bdc8
Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47961
diff
changeset
|
757 PyDoc_STRVAR(pop_doc, "Remove and return an arbitrary set element.\n\ |
|
2e794757bdc8
Merged revisions 66766-66767,66771-66772,66774,66776,66783-66787,66790,66793,66797 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47961
diff
changeset
|
758 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
|
759 |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
760 static int |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
761 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
|
762 { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
763 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
|
764 setentry *entry; |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
765 |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
766 while (set_next(so, &pos, &entry)) |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
767 Py_VISIT(entry->key); |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
768 return 0; |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
769 } |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
770 |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
771 static long |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
772 frozenset_hash(PyObject *self) |
|
35341
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
773 { |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
774 PySetObject *so = (PySetObject *)self; |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
775 long h, hash = 1927868237L; |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
776 setentry *entry; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
777 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
|
778 |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
779 if (so->hash != -1) |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
780 return so->hash; |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
781 |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
782 hash *= PySet_GET_SIZE(self) + 1; |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
783 while (set_next(so, &pos, &entry)) { |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
784 /* Work to increase the bit dispersion for closely spaced hash |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
785 values. The is important because some use cases have many |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
786 combinations of a small number of elements with nearby |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
787 hashes so that many distinct combinations collapse to only |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
788 a handful of distinct hash values. */ |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
789 h = entry->hash; |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
790 hash ^= (h ^ (h << 16) ^ 89869747L) * 3644798167u; |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
791 } |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
792 hash = hash * 69069L + 907133923L; |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
793 if (hash == -1) |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
794 hash = 590923713L; |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
795 so->hash = hash; |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
796 return hash; |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
797 } |
|
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
798 |
|
35311
541bfbb10030
* Move copyright notice to top and indicate derivation from sets.py and
Raymond Hettinger <python@rcn.com>
parents:
35301
diff
changeset
|
799 /***** 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
|
800 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
801 typedef struct { |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
802 PyObject_HEAD |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
803 PySetObject *si_set; /* Set to NULL when iterator is exhausted */ |
| 38872 | 804 Py_ssize_t si_used; |
| 805 Py_ssize_t si_pos; | |
| 806 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
|
807 } setiterobject; |
|
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 static void |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
810 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
|
811 { |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
812 Py_XDECREF(si->si_set); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
813 PyObject_Del(si); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
814 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
815 |
|
35636
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35581
diff
changeset
|
816 static PyObject * |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
817 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
|
818 { |
| 38872 | 819 Py_ssize_t len = 0; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
820 if (si->si_set != NULL && si->si_used == si->si_set->used) |
|
35636
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35581
diff
changeset
|
821 len = si->len; |
|
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35581
diff
changeset
|
822 return PyInt_FromLong(len); |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
823 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
824 |
|
36484
20f75d5e79e9
Renamed _length_cue() to __length_hint__(). See:
Armin Rigo <arigo@tunes.org>
parents:
36244
diff
changeset
|
825 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
|
826 |
|
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35581
diff
changeset
|
827 static PyMethodDef setiter_methods[] = { |
|
36484
20f75d5e79e9
Renamed _length_cue() to __length_hint__(). See:
Armin Rigo <arigo@tunes.org>
parents:
36244
diff
changeset
|
828 {"__length_hint__", (PyCFunction)setiter_len, METH_NOARGS, length_hint_doc}, |
|
35636
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35581
diff
changeset
|
829 {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
|
830 }; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
831 |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
832 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
|
833 { |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
834 PyObject *key; |
| 38872 | 835 register Py_ssize_t i, mask; |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
836 register setentry *entry; |
|
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
837 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
|
838 |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
839 if (so == NULL) |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
840 return NULL; |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
841 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
|
842 |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
843 if (si->si_used != so->used) { |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
844 PyErr_SetString(PyExc_RuntimeError, |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
845 "Set changed size during iteration"); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
846 si->si_used = -1; /* Make this state sticky */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
847 return NULL; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
848 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
849 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
850 i = si->si_pos; |
|
35349
6f1cd28d6b87
Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents:
35348
diff
changeset
|
851 assert(i>=0); |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
852 entry = so->table; |
|
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
853 mask = so->mask; |
|
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
854 while (i <= mask && (entry[i].key == NULL || entry[i].key == dummy)) |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
855 i++; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
856 si->si_pos = i+1; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
857 if (i > mask) |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
858 goto fail; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
859 si->len--; |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
860 key = entry[i].key; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
861 Py_INCREF(key); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
862 return key; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
863 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
864 fail: |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
865 Py_DECREF(so); |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
866 si->si_set = NULL; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
867 return NULL; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
868 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
869 |
|
35296
d91964f5fe0d
Fix build on gcc: PySetIter_Type should be static in definition
Hye-Shik Chang <hyeshik@gmail.com>
parents:
35295
diff
changeset
|
870 static PyTypeObject PySetIter_Type = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41682
diff
changeset
|
871 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
872 "setiterator", /* tp_name */ |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
873 sizeof(setiterobject), /* tp_basicsize */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
874 0, /* tp_itemsize */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
875 /* methods */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
876 (destructor)setiter_dealloc, /* tp_dealloc */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
877 0, /* tp_print */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
878 0, /* tp_getattr */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
879 0, /* tp_setattr */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
880 0, /* tp_compare */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
881 0, /* tp_repr */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
882 0, /* tp_as_number */ |
|
35636
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35581
diff
changeset
|
883 0, /* tp_as_sequence */ |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
884 0, /* tp_as_mapping */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
885 0, /* tp_hash */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
886 0, /* tp_call */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
887 0, /* tp_str */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
888 PyObject_GenericGetAttr, /* tp_getattro */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
889 0, /* tp_setattro */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
890 0, /* tp_as_buffer */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
891 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
892 0, /* tp_doc */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
893 0, /* tp_traverse */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
894 0, /* tp_clear */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
895 0, /* tp_richcompare */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
896 0, /* tp_weaklistoffset */ |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
897 PyObject_SelfIter, /* tp_iter */ |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
898 (iternextfunc)setiter_iternext, /* tp_iternext */ |
|
35636
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35581
diff
changeset
|
899 setiter_methods, /* tp_methods */ |
|
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35581
diff
changeset
|
900 0, |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
901 }; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
902 |
|
37602
ca95ad5b0fbc
Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents:
37315
diff
changeset
|
903 static PyObject * |
|
ca95ad5b0fbc
Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents:
37315
diff
changeset
|
904 set_iter(PySetObject *so) |
|
ca95ad5b0fbc
Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents:
37315
diff
changeset
|
905 { |
|
ca95ad5b0fbc
Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents:
37315
diff
changeset
|
906 setiterobject *si = PyObject_New(setiterobject, &PySetIter_Type); |
|
ca95ad5b0fbc
Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents:
37315
diff
changeset
|
907 if (si == NULL) |
|
ca95ad5b0fbc
Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents:
37315
diff
changeset
|
908 return NULL; |
|
ca95ad5b0fbc
Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents:
37315
diff
changeset
|
909 Py_INCREF(so); |
|
ca95ad5b0fbc
Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents:
37315
diff
changeset
|
910 si->si_set = so; |
|
ca95ad5b0fbc
Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents:
37315
diff
changeset
|
911 si->si_used = so->used; |
|
ca95ad5b0fbc
Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents:
37315
diff
changeset
|
912 si->si_pos = 0; |
|
ca95ad5b0fbc
Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents:
37315
diff
changeset
|
913 si->len = so->used; |
|
ca95ad5b0fbc
Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents:
37315
diff
changeset
|
914 return (PyObject *)si; |
|
ca95ad5b0fbc
Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents:
37315
diff
changeset
|
915 } |
|
ca95ad5b0fbc
Remove "static forward" declaration. Move constructors
Martin v. Löwis <martin@v.loewis.de>
parents:
37315
diff
changeset
|
916 |
|
35297
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
917 static int |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
918 set_update_internal(PySetObject *so, PyObject *other) |
|
31015
8d413578eb1a
Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents:
31012
diff
changeset
|
919 { |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
920 PyObject *key, *it; |
|
31015
8d413578eb1a
Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents:
31012
diff
changeset
|
921 |
|
44949
ddb1e499a01f
Changes 54857 and 54840 broke code and were reverted in Py2.5 just before
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
922 if (PyAnySet_Check(other)) |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
923 return set_merge(so, other); |
|
31015
8d413578eb1a
Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents:
31012
diff
changeset
|
924 |
|
40739
2a8e9efb5d20
Bug #1648179: set.update() not recognizing __iter__ overrides in dict subclasses.
Raymond Hettinger <python@rcn.com>
parents:
40601
diff
changeset
|
925 if (PyDict_CheckExact(other)) { |
|
36244
e7880f4f53a4
Remove some shadowed variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
35862
diff
changeset
|
926 PyObject *value; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
927 Py_ssize_t pos = 0; |
|
40864
b0f8e9b0cc19
Extend work on revision 52962: Eliminate redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40768
diff
changeset
|
928 long hash; |
|
40875
d5a15f853db7
Fixup set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40864
diff
changeset
|
929 Py_ssize_t dictsize = PyDict_Size(other); |
|
40864
b0f8e9b0cc19
Extend work on revision 52962: Eliminate redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40768
diff
changeset
|
930 |
|
40875
d5a15f853db7
Fixup set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40864
diff
changeset
|
931 /* Do one big resize at the start, rather than |
|
d5a15f853db7
Fixup set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40864
diff
changeset
|
932 * incrementally resizing as we insert new keys. Expect |
|
d5a15f853db7
Fixup set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40864
diff
changeset
|
933 * that there will be no (or few) overlapping keys. |
|
d5a15f853db7
Fixup set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40864
diff
changeset
|
934 */ |
|
d5a15f853db7
Fixup set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40864
diff
changeset
|
935 if (dictsize == -1) |
|
d5a15f853db7
Fixup set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40864
diff
changeset
|
936 return -1; |
|
d5a15f853db7
Fixup set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40864
diff
changeset
|
937 if ((so->fill + dictsize)*3 >= (so->mask+1)*2) { |
|
d5a15f853db7
Fixup set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40864
diff
changeset
|
938 if (set_table_resize(so, (so->used + dictsize)*2) != 0) |
|
d5a15f853db7
Fixup set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40864
diff
changeset
|
939 return -1; |
|
d5a15f853db7
Fixup set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40864
diff
changeset
|
940 } |
|
40864
b0f8e9b0cc19
Extend work on revision 52962: Eliminate redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40768
diff
changeset
|
941 while (_PyDict_Next(other, &pos, &key, &value, &hash)) { |
|
b0f8e9b0cc19
Extend work on revision 52962: Eliminate redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40768
diff
changeset
|
942 setentry an_entry; |
|
b0f8e9b0cc19
Extend work on revision 52962: Eliminate redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40768
diff
changeset
|
943 |
|
b0f8e9b0cc19
Extend work on revision 52962: Eliminate redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40768
diff
changeset
|
944 an_entry.hash = hash; |
|
b0f8e9b0cc19
Extend work on revision 52962: Eliminate redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40768
diff
changeset
|
945 an_entry.key = key; |
|
b0f8e9b0cc19
Extend work on revision 52962: Eliminate redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40768
diff
changeset
|
946 if (set_add_entry(so, &an_entry) == -1) |
|
35297
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
947 return -1; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
948 } |
|
35297
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
949 return 0; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
950 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
951 |
|
31015
8d413578eb1a
Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents:
31012
diff
changeset
|
952 it = PyObject_GetIter(other); |
|
8d413578eb1a
Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents:
31012
diff
changeset
|
953 if (it == NULL) |
|
35297
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
954 return -1; |
|
31015
8d413578eb1a
Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents:
31012
diff
changeset
|
955 |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
956 while ((key = PyIter_Next(it)) != NULL) { |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
957 if (set_add_key(so, key) == -1) { |
|
31015
8d413578eb1a
Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents:
31012
diff
changeset
|
958 Py_DECREF(it); |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
959 Py_DECREF(key); |
|
35297
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
960 return -1; |
|
31015
8d413578eb1a
Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents:
31012
diff
changeset
|
961 } |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
962 Py_DECREF(key); |
|
31015
8d413578eb1a
Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents:
31012
diff
changeset
|
963 } |
|
8d413578eb1a
Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents:
31012
diff
changeset
|
964 Py_DECREF(it); |
|
8d413578eb1a
Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents:
31012
diff
changeset
|
965 if (PyErr_Occurred()) |
|
35297
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
966 return -1; |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
967 return 0; |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
968 } |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
969 |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
970 static PyObject * |
|
47530
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
971 set_update(PySetObject *so, PyObject *args) |
|
35297
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
972 { |
|
47530
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
973 Py_ssize_t i; |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
974 |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
975 for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) { |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
976 PyObject *other = PyTuple_GET_ITEM(args, i); |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
977 if (set_update_internal(so, other) == -1) |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
978 return NULL; |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
979 } |
|
31015
8d413578eb1a
Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents:
31012
diff
changeset
|
980 Py_RETURN_NONE; |
|
8d413578eb1a
Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents:
31012
diff
changeset
|
981 } |
|
8d413578eb1a
Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents:
31012
diff
changeset
|
982 |
|
8d413578eb1a
Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents:
31012
diff
changeset
|
983 PyDoc_STRVAR(update_doc, |
|
47530
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
984 "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
|
985 |
|
8d413578eb1a
Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents:
31012
diff
changeset
|
986 static PyObject * |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
987 make_new_set(PyTypeObject *type, PyObject *iterable) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
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 register PySetObject *so = NULL; |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
990 |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
991 if (dummy == NULL) { /* Auto-initialize dummy */ |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47386
diff
changeset
|
992 dummy = PyString_FromString("<dummy key>"); |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
993 if (dummy == NULL) |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
994 return NULL; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
995 } |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
996 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
997 /* create PySetObject structure */ |
|
45191
920a7633ae08
Unified naming convention for free lists and their limits. All free lists
Christian Heimes <christian@cheimes.de>
parents:
45138
diff
changeset
|
998 if (numfree && |
|
35321
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
999 (type == &PySet_Type || type == &PyFrozenSet_Type)) { |
|
45191
920a7633ae08
Unified naming convention for free lists and their limits. All free lists
Christian Heimes <christian@cheimes.de>
parents:
45138
diff
changeset
|
1000 so = free_list[--numfree]; |
|
35321
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
1001 assert (so != NULL && PyAnySet_CheckExact(so)); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43958
diff
changeset
|
1002 Py_TYPE(so) = type; |
|
35321
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
1003 _Py_NewReference((PyObject *)so); |
|
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
1004 EMPTY_TO_MINSIZE(so); |
|
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
1005 PyObject_GC_Track(so); |
|
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
1006 } else { |
|
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
1007 so = (PySetObject *)type->tp_alloc(type, 0); |
|
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
1008 if (so == NULL) |
|
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
1009 return NULL; |
|
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
1010 /* tp_alloc has already zeroed the structure */ |
|
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
1011 assert(so->table == NULL && so->fill == 0 && so->used == 0); |
|
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
1012 INIT_NONZERO_SET_SLOTS(so); |
|
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
1013 } |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1014 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1015 so->lookup = set_lookkey_string; |
|
32158
679e5c8effae
Make sets and deques weak referencable.
Raymond Hettinger <python@rcn.com>
parents:
31628
diff
changeset
|
1016 so->weakreflist = NULL; |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1017 |
|
31015
8d413578eb1a
Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents:
31012
diff
changeset
|
1018 if (iterable != NULL) { |
|
35297
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1019 if (set_update_internal(so, iterable) == -1) { |
|
31015
8d413578eb1a
Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents:
31012
diff
changeset
|
1020 Py_DECREF(so); |
|
8d413578eb1a
Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents:
31012
diff
changeset
|
1021 return NULL; |
|
8d413578eb1a
Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents:
31012
diff
changeset
|
1022 } |
|
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 |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1025 return (PyObject *)so; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1026 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1027 |
|
35297
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1028 /* The empty frozenset is a singleton */ |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1029 static PyObject *emptyfrozenset = NULL; |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1030 |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1031 static PyObject * |
|
30931
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1032 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
|
1033 { |
|
35297
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1034 PyObject *iterable = NULL, *result; |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1035 |
|
40601
7da3dbc8145b
SF #1486663 -- Allow keyword args in subclasses of set() and frozenset().
Raymond Hettinger <python@rcn.com>
parents:
40536
diff
changeset
|
1036 if (type == &PyFrozenSet_Type && !_PyArg_NoKeywords("frozenset()", kwds)) |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
35398
diff
changeset
|
1037 return NULL; |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
35398
diff
changeset
|
1038 |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1039 if (!PyArg_UnpackTuple(args, type->tp_name, 0, 1, &iterable)) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1040 return NULL; |
|
35297
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1041 |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1042 if (type != &PyFrozenSet_Type) |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1043 return make_new_set(type, iterable); |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1044 |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1045 if (iterable != NULL) { |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1046 /* frozenset(f) is idempotent */ |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1047 if (PyFrozenSet_CheckExact(iterable)) { |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1048 Py_INCREF(iterable); |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1049 return iterable; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1050 } |
|
35297
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1051 result = make_new_set(type, iterable); |
|
35346
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
1052 if (result == NULL || PySet_GET_SIZE(result)) |
|
35297
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1053 return result; |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1054 Py_DECREF(result); |
|
31004
5b77bc4d25b1
* Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents:
31002
diff
changeset
|
1055 } |
|
35297
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1056 /* The empty frozenset is a singleton */ |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1057 if (emptyfrozenset == NULL) |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1058 emptyfrozenset = make_new_set(type, NULL); |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1059 Py_XINCREF(emptyfrozenset); |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1060 return emptyfrozenset; |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1061 } |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1062 |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1063 void |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1064 PySet_Fini(void) |
|
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1065 { |
|
35321
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
1066 PySetObject *so; |
|
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
1067 |
|
45191
920a7633ae08
Unified naming convention for free lists and their limits. All free lists
Christian Heimes <christian@cheimes.de>
parents:
45138
diff
changeset
|
1068 while (numfree) { |
|
920a7633ae08
Unified naming convention for free lists and their limits. All free lists
Christian Heimes <christian@cheimes.de>
parents:
45138
diff
changeset
|
1069 numfree--; |
|
920a7633ae08
Unified naming convention for free lists and their limits. All free lists
Christian Heimes <christian@cheimes.de>
parents:
45138
diff
changeset
|
1070 so = free_list[numfree]; |
|
35321
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
1071 PyObject_GC_Del(so); |
|
bdcb01a9b60c
* Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents:
35317
diff
changeset
|
1072 } |
|
37747
a5902e0ec07c
Clear dummy and emptyfrozenset, so that we don't have
Martin v. Löwis <martin@v.loewis.de>
parents:
37638
diff
changeset
|
1073 Py_CLEAR(dummy); |
|
a5902e0ec07c
Clear dummy and emptyfrozenset, so that we don't have
Martin v. Löwis <martin@v.loewis.de>
parents:
37638
diff
changeset
|
1074 Py_CLEAR(emptyfrozenset); |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1075 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1076 |
|
30931
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1077 static PyObject * |
|
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1078 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
|
1079 { |
|
40601
7da3dbc8145b
SF #1486663 -- Allow keyword args in subclasses of set() and frozenset().
Raymond Hettinger <python@rcn.com>
parents:
40536
diff
changeset
|
1080 if (type == &PySet_Type && !_PyArg_NoKeywords("set()", kwds)) |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
35398
diff
changeset
|
1081 return NULL; |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
35398
diff
changeset
|
1082 |
|
30931
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1083 return make_new_set(type, NULL); |
|
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1084 } |
|
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1085 |
|
35293
8fffb4c95487
Comment on the set_swap_bodies() helper function.
Raymond Hettinger <python@rcn.com>
parents:
35292
diff
changeset
|
1086 /* 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
|
1087 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
|
1088 Semantically equivalent to: |
|
8fffb4c95487
Comment on the set_swap_bodies() helper function.
Raymond Hettinger <python@rcn.com>
parents:
35292
diff
changeset
|
1089 |
|
8fffb4c95487
Comment on the set_swap_bodies() helper function.
Raymond Hettinger <python@rcn.com>
parents:
35292
diff
changeset
|
1090 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
|
1091 |
|
8fffb4c95487
Comment on the set_swap_bodies() helper function.
Raymond Hettinger <python@rcn.com>
parents:
35292
diff
changeset
|
1092 The function always succeeds and it leaves both objects in a stable state. |
|
8fffb4c95487
Comment on the set_swap_bodies() helper function.
Raymond Hettinger <python@rcn.com>
parents:
35292
diff
changeset
|
1093 Useful for creating temporary frozensets from sets for membership testing |
|
8fffb4c95487
Comment on the set_swap_bodies() helper function.
Raymond Hettinger <python@rcn.com>
parents:
35292
diff
changeset
|
1094 in __contains__(), discard(), and remove(). Also useful for operations |
|
8fffb4c95487
Comment on the set_swap_bodies() helper function.
Raymond Hettinger <python@rcn.com>
parents:
35292
diff
changeset
|
1095 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
|
1096 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
|
1097 */ |
|
8fffb4c95487
Comment on the set_swap_bodies() helper function.
Raymond Hettinger <python@rcn.com>
parents:
35292
diff
changeset
|
1098 |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1099 static void |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1100 set_swap_bodies(PySetObject *a, PySetObject *b) |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1101 { |
| 38872 | 1102 Py_ssize_t t; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1103 setentry *u; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1104 setentry *(*f)(PySetObject *so, PyObject *key, long hash); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1105 setentry tab[PySet_MINSIZE]; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1106 long h; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1107 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1108 t = a->fill; a->fill = b->fill; b->fill = t; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1109 t = a->used; a->used = b->used; b->used = t; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1110 t = a->mask; a->mask = b->mask; b->mask = t; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1111 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1112 u = a->table; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1113 if (a->table == a->smalltable) |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1114 u = b->smalltable; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1115 a->table = b->table; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1116 if (b->table == b->smalltable) |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1117 a->table = a->smalltable; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1118 b->table = u; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1119 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1120 f = a->lookup; a->lookup = b->lookup; b->lookup = f; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1121 |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1122 if (a->table == a->smalltable || b->table == b->smalltable) { |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1123 memcpy(tab, a->smalltable, sizeof(tab)); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1124 memcpy(a->smalltable, b->smalltable, sizeof(tab)); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1125 memcpy(b->smalltable, tab, sizeof(tab)); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1126 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1127 |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43958
diff
changeset
|
1128 if (PyType_IsSubtype(Py_TYPE(a), &PyFrozenSet_Type) && |
|
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43958
diff
changeset
|
1129 PyType_IsSubtype(Py_TYPE(b), &PyFrozenSet_Type)) { |
|
35312
8aa9bd80286b
* Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents:
35311
diff
changeset
|
1130 h = a->hash; a->hash = b->hash; b->hash = h; |
|
8aa9bd80286b
* Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents:
35311
diff
changeset
|
1131 } else { |
|
8aa9bd80286b
* Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents:
35311
diff
changeset
|
1132 a->hash = -1; |
|
8aa9bd80286b
* Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents:
35311
diff
changeset
|
1133 b->hash = -1; |
|
8aa9bd80286b
* Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents:
35311
diff
changeset
|
1134 } |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1135 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1136 |
|
31172
e4fb6164158c
* Added a new method flag, METH_COEXIST.
Raymond Hettinger <python@rcn.com>
parents:
31019
diff
changeset
|
1137 static PyObject * |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1138 set_copy(PySetObject *so) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1139 { |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43958
diff
changeset
|
1140 return make_new_set(Py_TYPE(so), (PyObject *)so); |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1141 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1142 |
|
31004
5b77bc4d25b1
* Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents:
31002
diff
changeset
|
1143 static PyObject * |
|
5b77bc4d25b1
* Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents:
31002
diff
changeset
|
1144 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
|
1145 { |
|
31008
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1146 if (PyFrozenSet_CheckExact(so)) { |
|
31004
5b77bc4d25b1
* Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents:
31002
diff
changeset
|
1147 Py_INCREF(so); |
|
5b77bc4d25b1
* Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents:
31002
diff
changeset
|
1148 return (PyObject *)so; |
|
5b77bc4d25b1
* Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents:
31002
diff
changeset
|
1149 } |
|
5b77bc4d25b1
* Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents:
31002
diff
changeset
|
1150 return set_copy(so); |
|
5b77bc4d25b1
* Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents:
31002
diff
changeset
|
1151 } |
|
5b77bc4d25b1
* Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents:
31002
diff
changeset
|
1152 |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1153 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
|
1154 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1155 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
|
1156 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
|
1157 { |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1158 set_clear_internal(so); |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1159 Py_RETURN_NONE; |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1160 } |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1161 |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1162 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
|
1163 |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1164 static PyObject * |
|
47530
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1165 set_union(PySetObject *so, PyObject *args) |
|
31008
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1166 { |
|
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1167 PySetObject *result; |
|
47530
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1168 PyObject *other; |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1169 Py_ssize_t i; |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1170 |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1171 result = (PySetObject *)set_copy(so); |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1172 if (result == NULL) |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1173 return NULL; |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1174 |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1175 for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) { |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1176 other = PyTuple_GET_ITEM(args, i); |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1177 if ((PyObject *)so == other) |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1178 return (PyObject *)result; |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1179 if (set_update_internal(result, other) == -1) { |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1180 Py_DECREF(result); |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1181 return NULL; |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1182 } |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1183 } |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1184 return (PyObject *)result; |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1185 } |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1186 |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1187 PyDoc_STRVAR(union_doc, |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1188 "Return the union of sets as a new set.\n\ |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1189 \n\ |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1190 (i.e. all elements that are in either set.)"); |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1191 |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1192 static PyObject * |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1193 set_or(PySetObject *so, PyObject *other) |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1194 { |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1195 PySetObject *result; |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1196 |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1197 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) { |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1198 Py_INCREF(Py_NotImplemented); |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1199 return Py_NotImplemented; |
|
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
1200 } |
|
31008
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1201 |
|
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1202 result = (PySetObject *)set_copy(so); |
|
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1203 if (result == NULL) |
|
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1204 return NULL; |
|
35353
e8806094d644
Add shortcuts for a|a and a&a.
Raymond Hettinger <python@rcn.com>
parents:
35349
diff
changeset
|
1205 if ((PyObject *)so == other) |
|
e8806094d644
Add shortcuts for a|a and a&a.
Raymond Hettinger <python@rcn.com>
parents:
35349
diff
changeset
|
1206 return (PyObject *)result; |
|
35297
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1207 if (set_update_internal(result, other) == -1) { |
|
31008
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1208 Py_DECREF(result); |
|
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1209 return NULL; |
|
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1210 } |
|
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1211 return (PyObject *)result; |
|
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1212 } |
|
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1213 |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1214 static PyObject * |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1215 set_ior(PySetObject *so, PyObject *other) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1216 { |
|
30931
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1217 if (!PyAnySet_Check(other)) { |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1218 Py_INCREF(Py_NotImplemented); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1219 return Py_NotImplemented; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1220 } |
|
35297
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1221 if (set_update_internal(so, other) == -1) |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1222 return NULL; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1223 Py_INCREF(so); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1224 return (PyObject *)so; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1225 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1226 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1227 static PyObject * |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1228 set_intersection(PySetObject *so, PyObject *other) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1229 { |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1230 PySetObject *result; |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
1231 PyObject *key, *it, *tmp; |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1232 |
|
35353
e8806094d644
Add shortcuts for a|a and a&a.
Raymond Hettinger <python@rcn.com>
parents:
35349
diff
changeset
|
1233 if ((PyObject *)so == other) |
|
e8806094d644
Add shortcuts for a|a and a&a.
Raymond Hettinger <python@rcn.com>
parents:
35349
diff
changeset
|
1234 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
|
1235 |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43958
diff
changeset
|
1236 result = (PySetObject *)make_new_set(Py_TYPE(so), NULL); |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1237 if (result == NULL) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1238 return NULL; |
|
31008
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1239 |
|
44949
ddb1e499a01f
Changes 54857 and 54840 broke code and were reverted in Py2.5 just before
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1240 if (PyAnySet_Check(other)) { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
1241 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
|
1242 setentry *entry; |
|
35332
fd02b84fb2db
* Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents:
35328
diff
changeset
|
1243 |
|
35346
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
1244 if (PySet_GET_SIZE(other) > PySet_GET_SIZE(so)) { |
|
35332
fd02b84fb2db
* Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents:
35328
diff
changeset
|
1245 tmp = (PyObject *)so; |
|
fd02b84fb2db
* Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents:
35328
diff
changeset
|
1246 so = (PySetObject *)other; |
|
fd02b84fb2db
* Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents:
35328
diff
changeset
|
1247 other = tmp; |
|
fd02b84fb2db
* Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents:
35328
diff
changeset
|
1248 } |
|
fd02b84fb2db
* Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents:
35328
diff
changeset
|
1249 |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1250 while (set_next((PySetObject *)other, &pos, &entry)) { |
|
39794
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1251 int rv = set_contains_entry(so, entry); |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1252 if (rv == -1) { |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1253 Py_DECREF(result); |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1254 return NULL; |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1255 } |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1256 if (rv) { |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1257 if (set_add_entry(result, entry) == -1) { |
|
31300
bf8402a56fa4
* Simplify and speedup logic for tp_print.
Raymond Hettinger <python@rcn.com>
parents:
31203
diff
changeset
|
1258 Py_DECREF(result); |
|
bf8402a56fa4
* Simplify and speedup logic for tp_print.
Raymond Hettinger <python@rcn.com>
parents:
31203
diff
changeset
|
1259 return NULL; |
|
bf8402a56fa4
* Simplify and speedup logic for tp_print.
Raymond Hettinger <python@rcn.com>
parents:
31203
diff
changeset
|
1260 } |
|
bf8402a56fa4
* Simplify and speedup logic for tp_print.
Raymond Hettinger <python@rcn.com>
parents:
31203
diff
changeset
|
1261 } |
|
bf8402a56fa4
* Simplify and speedup logic for tp_print.
Raymond Hettinger <python@rcn.com>
parents:
31203
diff
changeset
|
1262 } |
|
bf8402a56fa4
* Simplify and speedup logic for tp_print.
Raymond Hettinger <python@rcn.com>
parents:
31203
diff
changeset
|
1263 return (PyObject *)result; |
|
31008
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1264 } |
|
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1265 |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1266 it = PyObject_GetIter(other); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1267 if (it == NULL) { |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1268 Py_DECREF(result); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1269 return NULL; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1270 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1271 |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
1272 while ((key = PyIter_Next(it)) != NULL) { |
|
40429
e5ce5a053411
Eliminate two redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40225
diff
changeset
|
1273 int rv; |
|
e5ce5a053411
Eliminate two redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40225
diff
changeset
|
1274 setentry entry; |
|
e5ce5a053411
Eliminate two redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40225
diff
changeset
|
1275 long hash = PyObject_Hash(key); |
|
e5ce5a053411
Eliminate two redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40225
diff
changeset
|
1276 |
|
e5ce5a053411
Eliminate two redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40225
diff
changeset
|
1277 if (hash == -1) { |
|
e5ce5a053411
Eliminate two redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40225
diff
changeset
|
1278 Py_DECREF(it); |
|
e5ce5a053411
Eliminate two redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40225
diff
changeset
|
1279 Py_DECREF(result); |
|
e5ce5a053411
Eliminate two redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40225
diff
changeset
|
1280 Py_DECREF(key); |
|
e5ce5a053411
Eliminate two redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40225
diff
changeset
|
1281 return NULL; |
|
e5ce5a053411
Eliminate two redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40225
diff
changeset
|
1282 } |
|
e5ce5a053411
Eliminate two redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40225
diff
changeset
|
1283 entry.hash = hash; |
|
e5ce5a053411
Eliminate two redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40225
diff
changeset
|
1284 entry.key = key; |
|
e5ce5a053411
Eliminate two redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40225
diff
changeset
|
1285 rv = set_contains_entry(so, &entry); |
|
39794
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1286 if (rv == -1) { |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1287 Py_DECREF(it); |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1288 Py_DECREF(result); |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1289 Py_DECREF(key); |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1290 return NULL; |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1291 } |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1292 if (rv) { |
|
40429
e5ce5a053411
Eliminate two redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40225
diff
changeset
|
1293 if (set_add_entry(result, &entry) == -1) { |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1294 Py_DECREF(it); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1295 Py_DECREF(result); |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
1296 Py_DECREF(key); |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1297 return NULL; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1298 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1299 } |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
1300 Py_DECREF(key); |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1301 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1302 Py_DECREF(it); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1303 if (PyErr_Occurred()) { |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1304 Py_DECREF(result); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1305 return NULL; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1306 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1307 return (PyObject *)result; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1308 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1309 |
|
47533
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1310 static PyObject * |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1311 set_intersection_multi(PySetObject *so, PyObject *args) |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1312 { |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1313 Py_ssize_t i; |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1314 PyObject *result = (PyObject *)so; |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1315 |
|
47574
7d70b59eeaf2
Handle the case with zero arguments.
Raymond Hettinger <python@rcn.com>
parents:
47533
diff
changeset
|
1316 if (PyTuple_GET_SIZE(args) == 0) |
|
7d70b59eeaf2
Handle the case with zero arguments.
Raymond Hettinger <python@rcn.com>
parents:
47533
diff
changeset
|
1317 return set_copy(so); |
|
7d70b59eeaf2
Handle the case with zero arguments.
Raymond Hettinger <python@rcn.com>
parents:
47533
diff
changeset
|
1318 |
|
47533
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1319 Py_INCREF(so); |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1320 for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) { |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1321 PyObject *other = PyTuple_GET_ITEM(args, i); |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1322 PyObject *newresult = set_intersection((PySetObject *)result, other); |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1323 if (newresult == NULL) { |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1324 Py_DECREF(result); |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1325 return NULL; |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1326 } |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1327 Py_DECREF(result); |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1328 result = newresult; |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1329 } |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1330 return result; |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1331 } |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1332 |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1333 PyDoc_STRVAR(intersection_doc, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1334 "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
|
1335 \n\ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1336 (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
|
1337 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1338 static PyObject * |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1339 set_intersection_update(PySetObject *so, PyObject *other) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1340 { |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1341 PyObject *tmp; |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1342 |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1343 tmp = set_intersection(so, other); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1344 if (tmp == NULL) |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1345 return NULL; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1346 set_swap_bodies(so, (PySetObject *)tmp); |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1347 Py_DECREF(tmp); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1348 Py_RETURN_NONE; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1349 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1350 |
|
47533
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1351 static PyObject * |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1352 set_intersection_update_multi(PySetObject *so, PyObject *args) |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1353 { |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1354 PyObject *tmp; |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1355 |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1356 tmp = set_intersection_multi(so, args); |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1357 if (tmp == NULL) |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1358 return NULL; |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1359 set_swap_bodies(so, (PySetObject *)tmp); |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1360 Py_DECREF(tmp); |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1361 Py_RETURN_NONE; |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1362 } |
|
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
1363 |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1364 PyDoc_STRVAR(intersection_update_doc, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1365 "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
|
1366 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1367 static PyObject * |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1368 set_and(PySetObject *so, PyObject *other) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1369 { |
|
30931
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1370 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) { |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1371 Py_INCREF(Py_NotImplemented); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1372 return Py_NotImplemented; |
|
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 return set_intersection(so, other); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1375 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1376 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1377 static PyObject * |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1378 set_iand(PySetObject *so, PyObject *other) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1379 { |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1380 PyObject *result; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1381 |
|
30931
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1382 if (!PyAnySet_Check(other)) { |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1383 Py_INCREF(Py_NotImplemented); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1384 return Py_NotImplemented; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1385 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1386 result = set_intersection_update(so, other); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1387 if (result == NULL) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1388 return NULL; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1389 Py_DECREF(result); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1390 Py_INCREF(so); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1391 return (PyObject *)so; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1392 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1393 |
| 43794 | 1394 static PyObject * |
| 1395 set_isdisjoint(PySetObject *so, PyObject *other) | |
| 1396 { | |
| 1397 PyObject *key, *it, *tmp; | |
| 1398 | |
| 1399 if ((PyObject *)so == other) { | |
| 1400 if (PySet_GET_SIZE(so) == 0) | |
| 1401 Py_RETURN_TRUE; | |
| 1402 else | |
| 1403 Py_RETURN_FALSE; | |
| 1404 } | |
| 1405 | |
| 1406 if (PyAnySet_CheckExact(other)) { | |
| 1407 Py_ssize_t pos = 0; | |
| 1408 setentry *entry; | |
| 1409 | |
| 1410 if (PySet_GET_SIZE(other) > PySet_GET_SIZE(so)) { | |
| 1411 tmp = (PyObject *)so; | |
| 1412 so = (PySetObject *)other; | |
| 1413 other = tmp; | |
| 1414 } | |
| 1415 while (set_next((PySetObject *)other, &pos, &entry)) { | |
| 1416 int rv = set_contains_entry(so, entry); | |
| 1417 if (rv == -1) | |
| 1418 return NULL; | |
| 1419 if (rv) | |
| 1420 Py_RETURN_FALSE; | |
| 1421 } | |
| 1422 Py_RETURN_TRUE; | |
| 1423 } | |
| 1424 | |
| 1425 it = PyObject_GetIter(other); | |
| 1426 if (it == NULL) | |
| 1427 return NULL; | |
| 1428 | |
| 1429 while ((key = PyIter_Next(it)) != NULL) { | |
| 1430 int rv; | |
| 1431 setentry entry; | |
| 1432 long hash = PyObject_Hash(key); | |
| 1433 | |
| 1434 if (hash == -1) { | |
|
43800
b22f27e07011
Reposition the decref (spotted by eagle-eye norwitz).
Raymond Hettinger <python@rcn.com>
parents:
43794
diff
changeset
|
1435 Py_DECREF(key); |
| 43794 | 1436 Py_DECREF(it); |
| 1437 return NULL; | |
| 1438 } | |
| 1439 entry.hash = hash; | |
| 1440 entry.key = key; | |
| 1441 rv = set_contains_entry(so, &entry); | |
|
43800
b22f27e07011
Reposition the decref (spotted by eagle-eye norwitz).
Raymond Hettinger <python@rcn.com>
parents:
43794
diff
changeset
|
1442 Py_DECREF(key); |
| 43794 | 1443 if (rv == -1) { |
| 1444 Py_DECREF(it); | |
| 1445 return NULL; | |
| 1446 } | |
| 1447 if (rv) { | |
| 1448 Py_DECREF(it); | |
| 1449 Py_RETURN_FALSE; | |
| 1450 } | |
| 1451 } | |
| 1452 Py_DECREF(it); | |
| 1453 if (PyErr_Occurred()) | |
| 1454 return NULL; | |
| 1455 Py_RETURN_TRUE; | |
| 1456 } | |
| 1457 | |
| 1458 PyDoc_STRVAR(isdisjoint_doc, | |
| 1459 "Return True if two sets have a null intersection."); | |
| 1460 | |
|
35862
6867995a18a7
Prevent name pollution by making lots of internal functions static.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35636
diff
changeset
|
1461 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
|
1462 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
|
1463 { |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1464 if ((PyObject *)so == other) |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1465 return set_clear_internal(so); |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1466 |
|
44949
ddb1e499a01f
Changes 54857 and 54840 broke code and were reverted in Py2.5 just before
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1467 if (PyAnySet_Check(other)) { |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1468 setentry *entry; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
1469 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
|
1470 |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1471 while (set_next((PySetObject *)other, &pos, &entry)) |
|
39794
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1472 if (set_discard_entry(so, entry) == -1) |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1473 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
|
1474 } else { |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1475 PyObject *key, *it; |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1476 it = PyObject_GetIter(other); |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1477 if (it == NULL) |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1478 return -1; |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1479 |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1480 while ((key = PyIter_Next(it)) != NULL) { |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1481 if (set_discard_key(so, key) == -1) { |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1482 Py_DECREF(it); |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1483 Py_DECREF(key); |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1484 return -1; |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1485 } |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1486 Py_DECREF(key); |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1487 } |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1488 Py_DECREF(it); |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1489 if (PyErr_Occurred()) |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1490 return -1; |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1491 } |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1492 /* If more than 1/5 are dummies, then resize them away. */ |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1493 if ((so->fill - so->used) * 5 < so->mask) |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1494 return 0; |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1495 return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4); |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1496 } |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1497 |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1498 static PyObject * |
|
47588
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1499 set_difference_update(PySetObject *so, PyObject *args) |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1500 { |
|
47588
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1501 Py_ssize_t i; |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1502 |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1503 for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) { |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1504 PyObject *other = PyTuple_GET_ITEM(args, i); |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1505 if (set_difference_update_internal(so, other) == -1) |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1506 return NULL; |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1507 } |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1508 Py_RETURN_NONE; |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1509 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1510 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1511 PyDoc_STRVAR(difference_update_doc, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1512 "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
|
1513 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1514 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
|
1515 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
|
1516 { |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1517 PyObject *result; |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1518 setentry *entry; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
1519 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
|
1520 |
|
44949
ddb1e499a01f
Changes 54857 and 54840 broke code and were reverted in Py2.5 just before
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1521 if (!PyAnySet_Check(other) && !PyDict_CheckExact(other)) { |
|
31191
e4682af7aea9
Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents:
31178
diff
changeset
|
1522 result = set_copy(so); |
|
e4682af7aea9
Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents:
31178
diff
changeset
|
1523 if (result == NULL) |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1524 return NULL; |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1525 if (set_difference_update_internal((PySetObject *)result, other) != -1) |
|
31191
e4682af7aea9
Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents:
31178
diff
changeset
|
1526 return result; |
|
e4682af7aea9
Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents:
31178
diff
changeset
|
1527 Py_DECREF(result); |
|
e4682af7aea9
Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents:
31178
diff
changeset
|
1528 return NULL; |
|
e4682af7aea9
Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents:
31178
diff
changeset
|
1529 } |
|
e4682af7aea9
Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents:
31178
diff
changeset
|
1530 |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43958
diff
changeset
|
1531 result = make_new_set(Py_TYPE(so), NULL); |
|
31191
e4682af7aea9
Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents:
31178
diff
changeset
|
1532 if (result == NULL) |
|
e4682af7aea9
Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents:
31178
diff
changeset
|
1533 return NULL; |
|
e4682af7aea9
Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents:
31178
diff
changeset
|
1534 |
|
40739
2a8e9efb5d20
Bug #1648179: set.update() not recognizing __iter__ overrides in dict subclasses.
Raymond Hettinger <python@rcn.com>
parents:
40601
diff
changeset
|
1535 if (PyDict_CheckExact(other)) { |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1536 while (set_next(so, &pos, &entry)) { |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1537 setentry entrycopy; |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1538 entrycopy.hash = entry->hash; |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1539 entrycopy.key = entry->key; |
|
40864
b0f8e9b0cc19
Extend work on revision 52962: Eliminate redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40768
diff
changeset
|
1540 if (!_PyDict_Contains(other, entry->key, entry->hash)) { |
|
39794
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1541 if (set_add_entry((PySetObject *)result, &entrycopy) == -1) { |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1542 Py_DECREF(result); |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1543 return NULL; |
|
39794
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1544 } |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1545 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1546 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1547 return result; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1548 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1549 |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1550 while (set_next(so, &pos, &entry)) { |
|
39794
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1551 int rv = set_contains_entry((PySetObject *)other, entry); |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1552 if (rv == -1) { |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1553 Py_DECREF(result); |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1554 return NULL; |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1555 } |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1556 if (!rv) { |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1557 if (set_add_entry((PySetObject *)result, entry) == -1) { |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1558 Py_DECREF(result); |
|
31191
e4682af7aea9
Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents:
31178
diff
changeset
|
1559 return NULL; |
|
39794
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1560 } |
|
31191
e4682af7aea9
Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents:
31178
diff
changeset
|
1561 } |
|
e4682af7aea9
Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents:
31178
diff
changeset
|
1562 } |
|
e4682af7aea9
Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents:
31178
diff
changeset
|
1563 return result; |
|
e4682af7aea9
Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents:
31178
diff
changeset
|
1564 } |
|
e4682af7aea9
Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents:
31178
diff
changeset
|
1565 |
|
47588
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1566 static PyObject * |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1567 set_difference_multi(PySetObject *so, PyObject *args) |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1568 { |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1569 Py_ssize_t i; |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1570 PyObject *result, *other; |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1571 |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1572 if (PyTuple_GET_SIZE(args) == 0) |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1573 return set_copy(so); |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1574 |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1575 other = PyTuple_GET_ITEM(args, 0); |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1576 result = set_difference(so, other); |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1577 if (result == NULL) |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1578 return NULL; |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1579 |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1580 for (i=1 ; i<PyTuple_GET_SIZE(args) ; i++) { |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1581 other = PyTuple_GET_ITEM(args, i); |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1582 if (set_difference_update_internal((PySetObject *)result, other) == -1) { |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1583 Py_DECREF(result); |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1584 return NULL; |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1585 } |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1586 } |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1587 return result; |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1588 } |
|
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1589 |
|
31191
e4682af7aea9
Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents:
31178
diff
changeset
|
1590 PyDoc_STRVAR(difference_doc, |
|
47588
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1591 "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
|
1592 \n\ |
|
47588
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1593 (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
|
1594 static PyObject * |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1595 set_sub(PySetObject *so, PyObject *other) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1596 { |
|
30931
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1597 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) { |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1598 Py_INCREF(Py_NotImplemented); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1599 return Py_NotImplemented; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1600 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1601 return set_difference(so, other); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1602 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1603 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1604 static PyObject * |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1605 set_isub(PySetObject *so, PyObject *other) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1606 { |
|
30931
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1607 if (!PyAnySet_Check(other)) { |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1608 Py_INCREF(Py_NotImplemented); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1609 return Py_NotImplemented; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1610 } |
|
47588
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
1611 if (set_difference_update_internal(so, other) == -1) |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1612 return NULL; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1613 Py_INCREF(so); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1614 return (PyObject *)so; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1615 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1616 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1617 static PyObject * |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1618 set_symmetric_difference_update(PySetObject *so, PyObject *other) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1619 { |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1620 PySetObject *otherset; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1621 PyObject *key; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
1622 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
|
1623 setentry *entry; |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1624 |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1625 if ((PyObject *)so == other) |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1626 return set_clear(so); |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1627 |
|
40739
2a8e9efb5d20
Bug #1648179: set.update() not recognizing __iter__ overrides in dict subclasses.
Raymond Hettinger <python@rcn.com>
parents:
40601
diff
changeset
|
1628 if (PyDict_CheckExact(other)) { |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1629 PyObject *value; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1630 int rv; |
|
40864
b0f8e9b0cc19
Extend work on revision 52962: Eliminate redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40768
diff
changeset
|
1631 long hash; |
|
b0f8e9b0cc19
Extend work on revision 52962: Eliminate redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40768
diff
changeset
|
1632 while (_PyDict_Next(other, &pos, &key, &value, &hash)) { |
|
40429
e5ce5a053411
Eliminate two redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40225
diff
changeset
|
1633 setentry an_entry; |
|
e5ce5a053411
Eliminate two redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40225
diff
changeset
|
1634 |
|
e5ce5a053411
Eliminate two redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40225
diff
changeset
|
1635 an_entry.hash = hash; |
|
e5ce5a053411
Eliminate two redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40225
diff
changeset
|
1636 an_entry.key = key; |
|
e5ce5a053411
Eliminate two redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40225
diff
changeset
|
1637 rv = set_discard_entry(so, &an_entry); |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1638 if (rv == -1) |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1639 return NULL; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1640 if (rv == DISCARD_NOTFOUND) { |
|
40429
e5ce5a053411
Eliminate two redundant calls to PyObject_Hash().
Raymond Hettinger <python@rcn.com>
parents:
40225
diff
changeset
|
1641 if (set_add_entry(so, &an_entry) == -1) |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1642 return NULL; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1643 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1644 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1645 Py_RETURN_NONE; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1646 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1647 |
|
44949
ddb1e499a01f
Changes 54857 and 54840 broke code and were reverted in Py2.5 just before
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1648 if (PyAnySet_Check(other)) { |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1649 Py_INCREF(other); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1650 otherset = (PySetObject *)other; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1651 } else { |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43958
diff
changeset
|
1652 otherset = (PySetObject *)make_new_set(Py_TYPE(so), other); |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1653 if (otherset == NULL) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1654 return NULL; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1655 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1656 |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1657 while (set_next(otherset, &pos, &entry)) { |
|
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1658 int rv = set_discard_entry(so, entry); |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1659 if (rv == -1) { |
|
39104
6064cb301209
otherset is known to be non-NULL based on checks before and DECREF after.
Neal Norwitz <nnorwitz@gmail.com>
parents:
38872
diff
changeset
|
1660 Py_DECREF(otherset); |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1661 return NULL; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1662 } |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1663 if (rv == DISCARD_NOTFOUND) { |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1664 if (set_add_entry(so, entry) == -1) { |
|
39104
6064cb301209
otherset is known to be non-NULL based on checks before and DECREF after.
Neal Norwitz <nnorwitz@gmail.com>
parents:
38872
diff
changeset
|
1665 Py_DECREF(otherset); |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1666 return NULL; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1667 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1668 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1669 } |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1670 Py_DECREF(otherset); |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1671 Py_RETURN_NONE; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1672 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1673 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1674 PyDoc_STRVAR(symmetric_difference_update_doc, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1675 "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
|
1676 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1677 static PyObject * |
|
31008
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1678 set_symmetric_difference(PySetObject *so, PyObject *other) |
|
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1679 { |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1680 PyObject *rv; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1681 PySetObject *otherset; |
|
31008
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1682 |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43958
diff
changeset
|
1683 otherset = (PySetObject *)make_new_set(Py_TYPE(so), other); |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1684 if (otherset == NULL) |
|
31008
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1685 return NULL; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1686 rv = set_symmetric_difference_update(otherset, (PyObject *)so); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1687 if (rv == NULL) |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1688 return NULL; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1689 Py_DECREF(rv); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1690 return (PyObject *)otherset; |
|
31008
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1691 } |
|
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1692 |
|
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1693 PyDoc_STRVAR(symmetric_difference_doc, |
|
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1694 "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
|
1695 \n\ |
|
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1696 (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
|
1697 |
|
4224d807911c
* Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents:
31004
diff
changeset
|
1698 static PyObject * |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1699 set_xor(PySetObject *so, PyObject *other) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1700 { |
|
30931
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1701 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) { |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1702 Py_INCREF(Py_NotImplemented); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1703 return Py_NotImplemented; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1704 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1705 return set_symmetric_difference(so, other); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1706 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1707 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1708 static PyObject * |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1709 set_ixor(PySetObject *so, PyObject *other) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1710 { |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1711 PyObject *result; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1712 |
|
30931
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1713 if (!PyAnySet_Check(other)) { |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1714 Py_INCREF(Py_NotImplemented); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1715 return Py_NotImplemented; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1716 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1717 result = set_symmetric_difference_update(so, other); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1718 if (result == NULL) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1719 return NULL; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1720 Py_DECREF(result); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1721 Py_INCREF(so); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1722 return (PyObject *)so; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1723 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1724 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1725 static PyObject * |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1726 set_issubset(PySetObject *so, PyObject *other) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1727 { |
|
35339
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
1728 setentry *entry; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
1729 Py_ssize_t pos = 0; |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1730 |
|
44949
ddb1e499a01f
Changes 54857 and 54840 broke code and were reverted in Py2.5 just before
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1731 if (!PyAnySet_Check(other)) { |
|
35339
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
1732 PyObject *tmp, *result; |
|
30994
632b223cb8e8
issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents:
30993
diff
changeset
|
1733 tmp = make_new_set(&PySet_Type, other); |
|
632b223cb8e8
issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents:
30993
diff
changeset
|
1734 if (tmp == NULL) |
|
632b223cb8e8
issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents:
30993
diff
changeset
|
1735 return NULL; |
|
632b223cb8e8
issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents:
30993
diff
changeset
|
1736 result = set_issubset(so, tmp); |
|
632b223cb8e8
issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents:
30993
diff
changeset
|
1737 Py_DECREF(tmp); |
|
632b223cb8e8
issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents:
30993
diff
changeset
|
1738 return result; |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1739 } |
|
35346
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
1740 if (PySet_GET_SIZE(so) > PySet_GET_SIZE(other)) |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1741 Py_RETURN_FALSE; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1742 |
|
35339
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
1743 while (set_next(so, &pos, &entry)) { |
|
39794
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1744 int rv = set_contains_entry((PySetObject *)other, entry); |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1745 if (rv == -1) |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1746 return NULL; |
|
ef0f42bf2a08
Fix refcounts and add error checks.
Raymond Hettinger <python@rcn.com>
parents:
39268
diff
changeset
|
1747 if (!rv) |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1748 Py_RETURN_FALSE; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1749 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1750 Py_RETURN_TRUE; |
|
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(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
|
1754 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1755 static PyObject * |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1756 set_issuperset(PySetObject *so, PyObject *other) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1757 { |
|
30994
632b223cb8e8
issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents:
30993
diff
changeset
|
1758 PyObject *tmp, *result; |
|
632b223cb8e8
issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents:
30993
diff
changeset
|
1759 |
|
44949
ddb1e499a01f
Changes 54857 and 54840 broke code and were reverted in Py2.5 just before
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1760 if (!PyAnySet_Check(other)) { |
|
30994
632b223cb8e8
issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents:
30993
diff
changeset
|
1761 tmp = make_new_set(&PySet_Type, other); |
|
632b223cb8e8
issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents:
30993
diff
changeset
|
1762 if (tmp == NULL) |
|
632b223cb8e8
issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents:
30993
diff
changeset
|
1763 return NULL; |
|
632b223cb8e8
issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents:
30993
diff
changeset
|
1764 result = set_issuperset(so, tmp); |
|
632b223cb8e8
issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents:
30993
diff
changeset
|
1765 Py_DECREF(tmp); |
|
632b223cb8e8
issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents:
30993
diff
changeset
|
1766 return result; |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1767 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1768 return set_issubset((PySetObject *)other, (PyObject *)so); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1769 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1770 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1771 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
|
1772 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1773 static PyObject * |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1774 set_richcompare(PySetObject *v, PyObject *w, int op) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1775 { |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1776 PyObject *r1, *r2; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1777 |
|
30931
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1778 if(!PyAnySet_Check(w)) { |
|
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1779 if (op == Py_EQ) |
|
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1780 Py_RETURN_FALSE; |
|
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1781 if (op == Py_NE) |
|
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1782 Py_RETURN_TRUE; |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1783 PyErr_SetString(PyExc_TypeError, "can only compare to a set"); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1784 return NULL; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1785 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1786 switch (op) { |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1787 case Py_EQ: |
|
35346
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
1788 if (PySet_GET_SIZE(v) != PySet_GET_SIZE(w)) |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1789 Py_RETURN_FALSE; |
|
35398
1708479ade4d
* Add a fast equality check path for frozensets where the hash value has
Raymond Hettinger <python@rcn.com>
parents:
35353
diff
changeset
|
1790 if (v->hash != -1 && |
|
1708479ade4d
* Add a fast equality check path for frozensets where the hash value has
Raymond Hettinger <python@rcn.com>
parents:
35353
diff
changeset
|
1791 ((PySetObject *)w)->hash != -1 && |
|
1708479ade4d
* Add a fast equality check path for frozensets where the hash value has
Raymond Hettinger <python@rcn.com>
parents:
35353
diff
changeset
|
1792 v->hash != ((PySetObject *)w)->hash) |
|
1708479ade4d
* Add a fast equality check path for frozensets where the hash value has
Raymond Hettinger <python@rcn.com>
parents:
35353
diff
changeset
|
1793 Py_RETURN_FALSE; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1794 return set_issubset(v, w); |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1795 case Py_NE: |
|
35398
1708479ade4d
* Add a fast equality check path for frozensets where the hash value has
Raymond Hettinger <python@rcn.com>
parents:
35353
diff
changeset
|
1796 r1 = set_richcompare(v, w, Py_EQ); |
|
1708479ade4d
* Add a fast equality check path for frozensets where the hash value has
Raymond Hettinger <python@rcn.com>
parents:
35353
diff
changeset
|
1797 if (r1 == NULL) |
|
1708479ade4d
* Add a fast equality check path for frozensets where the hash value has
Raymond Hettinger <python@rcn.com>
parents:
35353
diff
changeset
|
1798 return NULL; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1799 r2 = PyBool_FromLong(PyObject_Not(r1)); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1800 Py_DECREF(r1); |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1801 return r2; |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1802 case Py_LE: |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1803 return set_issubset(v, w); |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1804 case Py_GE: |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1805 return set_issuperset(v, w); |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1806 case Py_LT: |
|
35346
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
1807 if (PySet_GET_SIZE(v) >= PySet_GET_SIZE(w)) |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1808 Py_RETURN_FALSE; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1809 return set_issubset(v, w); |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1810 case Py_GT: |
|
35346
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
1811 if (PySet_GET_SIZE(v) <= PySet_GET_SIZE(w)) |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1812 Py_RETURN_FALSE; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1813 return set_issuperset(v, w); |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1814 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1815 Py_INCREF(Py_NotImplemented); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1816 return Py_NotImplemented; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1817 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1818 |
|
35339
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
1819 static int |
|
37304
79a0f080f898
Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents:
37219
diff
changeset
|
1820 set_nocmp(PyObject *self, PyObject *other) |
|
35339
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
1821 { |
|
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
1822 PyErr_SetString(PyExc_TypeError, "cannot compare sets using cmp()"); |
|
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
1823 return -1; |
|
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
1824 } |
|
028e94a6efc5
* Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents:
35332
diff
changeset
|
1825 |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1826 static PyObject * |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
1827 set_add(PySetObject *so, PyObject *key) |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1828 { |
|
35328
0ef64a93f3f2
* Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents:
35321
diff
changeset
|
1829 if (set_add_key(so, key) == -1) |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1830 return NULL; |
|
31178
1bbc2085f213
* Refactor set.__contains__()
Raymond Hettinger <python@rcn.com>
parents:
31177
diff
changeset
|
1831 Py_RETURN_NONE; |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1832 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1833 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1834 PyDoc_STRVAR(add_doc, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1835 "Add an element to a set.\n\ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1836 \n\ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1837 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
|
1838 |
|
35341
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1839 static int |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1840 set_contains(PySetObject *so, PyObject *key) |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1841 { |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1842 PyObject *tmpkey; |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1843 int rv; |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1844 |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1845 rv = set_contains_key(so, key); |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1846 if (rv == -1) { |
|
46726
2ef1c381138d
Frozensets do not benefit from autoconversion.
Raymond Hettinger <python@rcn.com>
parents:
45300
diff
changeset
|
1847 if (!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError)) |
|
35341
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1848 return -1; |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1849 PyErr_Clear(); |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1850 tmpkey = make_new_set(&PyFrozenSet_Type, NULL); |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1851 if (tmpkey == NULL) |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1852 return -1; |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1853 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key); |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1854 rv = set_contains(so, tmpkey); |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1855 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key); |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1856 Py_DECREF(tmpkey); |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1857 } |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1858 return rv; |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1859 } |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1860 |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1861 static PyObject * |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1862 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
|
1863 { |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1864 long result; |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1865 |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1866 result = set_contains(so, key); |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1867 if (result == -1) |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1868 return NULL; |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1869 return PyBool_FromLong(result); |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1870 } |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1871 |
|
f6b462d2a3a3
More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents:
35339
diff
changeset
|
1872 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
|
1873 |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1874 static PyObject * |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
1875 set_remove(PySetObject *so, PyObject *key) |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1876 { |
|
49466
6e7b853e8616
#4069: aSet.remove(otherSet) would always report the empty frozenset([]) as the missing key.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
49431
diff
changeset
|
1877 PyObject *tmpkey; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1878 int rv; |
|
31002
622a76bc0237
Extend temporary hashability to remove() and discard().
Raymond Hettinger <python@rcn.com>
parents:
30995
diff
changeset
|
1879 |
|
35332
fd02b84fb2db
* Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents:
35328
diff
changeset
|
1880 rv = set_discard_key(so, key); |
|
fd02b84fb2db
* Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents:
35328
diff
changeset
|
1881 if (rv == -1) { |
|
46726
2ef1c381138d
Frozensets do not benefit from autoconversion.
Raymond Hettinger <python@rcn.com>
parents:
45300
diff
changeset
|
1882 if (!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError)) |
|
35332
fd02b84fb2db
* Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents:
35328
diff
changeset
|
1883 return NULL; |
|
fd02b84fb2db
* Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents:
35328
diff
changeset
|
1884 PyErr_Clear(); |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
1885 tmpkey = make_new_set(&PyFrozenSet_Type, NULL); |
|
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
1886 if (tmpkey == NULL) |
|
31002
622a76bc0237
Extend temporary hashability to remove() and discard().
Raymond Hettinger <python@rcn.com>
parents:
30995
diff
changeset
|
1887 return NULL; |
|
35332
fd02b84fb2db
* Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents:
35328
diff
changeset
|
1888 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key); |
|
49466
6e7b853e8616
#4069: aSet.remove(otherSet) would always report the empty frozenset([]) as the missing key.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
49431
diff
changeset
|
1889 rv = set_discard_key(so, tmpkey); |
|
35332
fd02b84fb2db
* Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents:
35328
diff
changeset
|
1890 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key); |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
1891 Py_DECREF(tmpkey); |
|
49466
6e7b853e8616
#4069: aSet.remove(otherSet) would always report the empty frozenset([]) as the missing key.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
49431
diff
changeset
|
1892 if (rv == -1) |
|
6e7b853e8616
#4069: aSet.remove(otherSet) would always report the empty frozenset([]) as the missing key.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
49431
diff
changeset
|
1893 return NULL; |
|
6e7b853e8616
#4069: aSet.remove(otherSet) would always report the empty frozenset([]) as the missing key.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
49431
diff
changeset
|
1894 } |
|
6e7b853e8616
#4069: aSet.remove(otherSet) would always report the empty frozenset([]) as the missing key.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
49431
diff
changeset
|
1895 |
|
6e7b853e8616
#4069: aSet.remove(otherSet) would always report the empty frozenset([]) as the missing key.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
49431
diff
changeset
|
1896 if (rv == DISCARD_NOTFOUND) { |
|
40431
6b02fe1b382f
Port Georg's dictobject.c fix keys that were tuples got unpacked on the way to setting a KeyError (svn revision 52535, sf bug
Raymond Hettinger <python@rcn.com>
parents:
40430
diff
changeset
|
1897 set_key_error(key); |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1898 return NULL; |
|
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1899 } |
|
31178
1bbc2085f213
* Refactor set.__contains__()
Raymond Hettinger <python@rcn.com>
parents:
31177
diff
changeset
|
1900 Py_RETURN_NONE; |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1901 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1902 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1903 PyDoc_STRVAR(remove_doc, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1904 "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
|
1905 \n\ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1906 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
|
1907 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1908 static PyObject * |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
1909 set_discard(PySetObject *so, PyObject *key) |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1910 { |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
1911 PyObject *tmpkey, *result; |
|
35332
fd02b84fb2db
* Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents:
35328
diff
changeset
|
1912 int rv; |
|
31177
eeaa3660671c
Refactor set.discard() and set.remove().
Raymond Hettinger <python@rcn.com>
parents:
31175
diff
changeset
|
1913 |
|
35332
fd02b84fb2db
* Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents:
35328
diff
changeset
|
1914 rv = set_discard_key(so, key); |
|
fd02b84fb2db
* Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents:
35328
diff
changeset
|
1915 if (rv == -1) { |
|
46726
2ef1c381138d
Frozensets do not benefit from autoconversion.
Raymond Hettinger <python@rcn.com>
parents:
45300
diff
changeset
|
1916 if (!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError)) |
|
35332
fd02b84fb2db
* Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents:
35328
diff
changeset
|
1917 return NULL; |
|
fd02b84fb2db
* Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents:
35328
diff
changeset
|
1918 PyErr_Clear(); |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
1919 tmpkey = make_new_set(&PyFrozenSet_Type, NULL); |
|
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
1920 if (tmpkey == NULL) |
|
31177
eeaa3660671c
Refactor set.discard() and set.remove().
Raymond Hettinger <python@rcn.com>
parents:
31175
diff
changeset
|
1921 return NULL; |
|
35332
fd02b84fb2db
* Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents:
35328
diff
changeset
|
1922 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key); |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
1923 result = set_discard(so, tmpkey); |
|
35332
fd02b84fb2db
* Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents:
35328
diff
changeset
|
1924 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key); |
|
35295
f30ebdc3bddf
Improve variable names.
Raymond Hettinger <python@rcn.com>
parents:
35294
diff
changeset
|
1925 Py_DECREF(tmpkey); |
|
31177
eeaa3660671c
Refactor set.discard() and set.remove().
Raymond Hettinger <python@rcn.com>
parents:
31175
diff
changeset
|
1926 return result; |
|
eeaa3660671c
Refactor set.discard() and set.remove().
Raymond Hettinger <python@rcn.com>
parents:
31175
diff
changeset
|
1927 } |
|
31178
1bbc2085f213
* Refactor set.__contains__()
Raymond Hettinger <python@rcn.com>
parents:
31177
diff
changeset
|
1928 Py_RETURN_NONE; |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1929 } |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1930 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1931 PyDoc_STRVAR(discard_doc, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1932 "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
|
1933 \n\ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1934 If the element is not a member, do nothing."); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1935 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1936 static PyObject * |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1937 set_reduce(PySetObject *so) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1938 { |
|
33948
f2ce15b02ba3
SF 1062353: set pickling problems
Raymond Hettinger <python@rcn.com>
parents:
33605
diff
changeset
|
1939 PyObject *keys=NULL, *args=NULL, *result=NULL, *dict=NULL; |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1940 |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1941 keys = PySequence_List((PyObject *)so); |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1942 if (keys == NULL) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1943 goto done; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1944 args = PyTuple_Pack(1, keys); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1945 if (args == NULL) |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1946 goto done; |
|
33948
f2ce15b02ba3
SF 1062353: set pickling problems
Raymond Hettinger <python@rcn.com>
parents:
33605
diff
changeset
|
1947 dict = PyObject_GetAttrString((PyObject *)so, "__dict__"); |
|
f2ce15b02ba3
SF 1062353: set pickling problems
Raymond Hettinger <python@rcn.com>
parents:
33605
diff
changeset
|
1948 if (dict == NULL) { |
|
f2ce15b02ba3
SF 1062353: set pickling problems
Raymond Hettinger <python@rcn.com>
parents:
33605
diff
changeset
|
1949 PyErr_Clear(); |
|
f2ce15b02ba3
SF 1062353: set pickling problems
Raymond Hettinger <python@rcn.com>
parents:
33605
diff
changeset
|
1950 dict = Py_None; |
|
f2ce15b02ba3
SF 1062353: set pickling problems
Raymond Hettinger <python@rcn.com>
parents:
33605
diff
changeset
|
1951 Py_INCREF(dict); |
|
f2ce15b02ba3
SF 1062353: set pickling problems
Raymond Hettinger <python@rcn.com>
parents:
33605
diff
changeset
|
1952 } |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43958
diff
changeset
|
1953 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
|
1954 done: |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1955 Py_XDECREF(args); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1956 Py_XDECREF(keys); |
|
33948
f2ce15b02ba3
SF 1062353: set pickling problems
Raymond Hettinger <python@rcn.com>
parents:
33605
diff
changeset
|
1957 Py_XDECREF(dict); |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1958 return result; |
|
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(reduce_doc, "Return state information for pickling."); |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1962 |
|
47922
7cfc28ac0715
Added additional __sizeof__ implementations and addressed comments made in
Robert Schuppenies <okkotonushi@googlemail.com>
parents:
47588
diff
changeset
|
1963 static PyObject * |
|
7cfc28ac0715
Added additional __sizeof__ implementations and addressed comments made in
Robert Schuppenies <okkotonushi@googlemail.com>
parents:
47588
diff
changeset
|
1964 set_sizeof(PySetObject *so) |
|
7cfc28ac0715
Added additional __sizeof__ implementations and addressed comments made in
Robert Schuppenies <okkotonushi@googlemail.com>
parents:
47588
diff
changeset
|
1965 { |
|
7cfc28ac0715
Added additional __sizeof__ implementations and addressed comments made in
Robert Schuppenies <okkotonushi@googlemail.com>
parents:
47588
diff
changeset
|
1966 Py_ssize_t res; |
|
7cfc28ac0715
Added additional __sizeof__ implementations and addressed comments made in
Robert Schuppenies <okkotonushi@googlemail.com>
parents:
47588
diff
changeset
|
1967 |
|
7cfc28ac0715
Added additional __sizeof__ implementations and addressed comments made in
Robert Schuppenies <okkotonushi@googlemail.com>
parents:
47588
diff
changeset
|
1968 res = sizeof(PySetObject); |
|
7cfc28ac0715
Added additional __sizeof__ implementations and addressed comments made in
Robert Schuppenies <okkotonushi@googlemail.com>
parents:
47588
diff
changeset
|
1969 if (so->table != so->smalltable) |
|
7cfc28ac0715
Added additional __sizeof__ implementations and addressed comments made in
Robert Schuppenies <okkotonushi@googlemail.com>
parents:
47588
diff
changeset
|
1970 res = res + (so->mask + 1) * sizeof(setentry); |
|
7cfc28ac0715
Added additional __sizeof__ implementations and addressed comments made in
Robert Schuppenies <okkotonushi@googlemail.com>
parents:
47588
diff
changeset
|
1971 return PyInt_FromSsize_t(res); |
|
7cfc28ac0715
Added additional __sizeof__ implementations and addressed comments made in
Robert Schuppenies <okkotonushi@googlemail.com>
parents:
47588
diff
changeset
|
1972 } |
|
7cfc28ac0715
Added additional __sizeof__ implementations and addressed comments made in
Robert Schuppenies <okkotonushi@googlemail.com>
parents:
47588
diff
changeset
|
1973 |
|
7cfc28ac0715
Added additional __sizeof__ implementations and addressed comments made in
Robert Schuppenies <okkotonushi@googlemail.com>
parents:
47588
diff
changeset
|
1974 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
|
1975 static int |
|
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1976 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
|
1977 { |
|
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1978 PyObject *iterable = NULL; |
|
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1979 |
|
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1980 if (!PyAnySet_Check(self)) |
|
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1981 return -1; |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43958
diff
changeset
|
1982 if (!PyArg_UnpackTuple(args, Py_TYPE(self)->tp_name, 0, 1, &iterable)) |
|
30931
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1983 return -1; |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
1984 set_clear_internal(self); |
|
30931
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1985 self->hash = -1; |
|
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1986 if (iterable == NULL) |
|
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1987 return 0; |
|
35297
26bf6c27e9ce
* Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents:
35296
diff
changeset
|
1988 return set_update_internal(self, iterable); |
|
30931
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1989 } |
|
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
1990 |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1991 static PySequenceMethods set_as_sequence = { |
|
37304
79a0f080f898
Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents:
37219
diff
changeset
|
1992 set_len, /* sq_length */ |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1993 0, /* sq_concat */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1994 0, /* sq_repeat */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1995 0, /* sq_item */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1996 0, /* sq_slice */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1997 0, /* sq_ass_item */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1998 0, /* sq_ass_slice */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1999 (objobjproc)set_contains, /* sq_contains */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2000 }; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2001 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2002 /* set object ********************************************************/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2003 |
|
35348
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2004 #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
|
2005 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
|
2006 |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2007 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
|
2008 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
|
2009 #endif |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2010 |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2011 static PyMethodDef set_methods[] = { |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2012 {"add", (PyCFunction)set_add, METH_O, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2013 add_doc}, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2014 {"clear", (PyCFunction)set_clear, METH_NOARGS, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2015 clear_doc}, |
|
31177
eeaa3660671c
Refactor set.discard() and set.remove().
Raymond Hettinger <python@rcn.com>
parents:
31175
diff
changeset
|
2016 {"__contains__",(PyCFunction)set_direct_contains, METH_O | METH_COEXIST, |
|
31172
e4fb6164158c
* Added a new method flag, METH_COEXIST.
Raymond Hettinger <python@rcn.com>
parents:
31019
diff
changeset
|
2017 contains_doc}, |
|
45300
a47f5ffc0823
dict.copy() rises from the ashes. Revert r60687.
Raymond Hettinger <python@rcn.com>
parents:
45250
diff
changeset
|
2018 {"copy", (PyCFunction)set_copy, METH_NOARGS, |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2019 copy_doc}, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2020 {"discard", (PyCFunction)set_discard, METH_O, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2021 discard_doc}, |
|
47588
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
2022 {"difference", (PyCFunction)set_difference_multi, METH_VARARGS, |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2023 difference_doc}, |
|
47588
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
2024 {"difference_update", (PyCFunction)set_difference_update, METH_VARARGS, |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2025 difference_update_doc}, |
|
47533
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
2026 {"intersection",(PyCFunction)set_intersection_multi, METH_VARARGS, |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2027 intersection_doc}, |
|
47533
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
2028 {"intersection_update",(PyCFunction)set_intersection_update_multi, METH_VARARGS, |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2029 intersection_update_doc}, |
| 43794 | 2030 {"isdisjoint", (PyCFunction)set_isdisjoint, METH_O, |
| 2031 isdisjoint_doc}, | |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2032 {"issubset", (PyCFunction)set_issubset, METH_O, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2033 issubset_doc}, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2034 {"issuperset", (PyCFunction)set_issuperset, METH_O, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2035 issuperset_doc}, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2036 {"pop", (PyCFunction)set_pop, METH_NOARGS, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2037 pop_doc}, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2038 {"__reduce__", (PyCFunction)set_reduce, METH_NOARGS, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2039 reduce_doc}, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2040 {"remove", (PyCFunction)set_remove, METH_O, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2041 remove_doc}, |
|
47922
7cfc28ac0715
Added additional __sizeof__ implementations and addressed comments made in
Robert Schuppenies <okkotonushi@googlemail.com>
parents:
47588
diff
changeset
|
2042 {"__sizeof__", (PyCFunction)set_sizeof, METH_NOARGS, |
|
7cfc28ac0715
Added additional __sizeof__ implementations and addressed comments made in
Robert Schuppenies <okkotonushi@googlemail.com>
parents:
47588
diff
changeset
|
2043 sizeof_doc}, |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2044 {"symmetric_difference",(PyCFunction)set_symmetric_difference, METH_O, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2045 symmetric_difference_doc}, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2046 {"symmetric_difference_update",(PyCFunction)set_symmetric_difference_update, METH_O, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2047 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
|
2048 #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
|
2049 {"test_c_api", (PyCFunction)test_c_api, METH_NOARGS, |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2050 test_c_api_doc}, |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2051 #endif |
|
47530
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
2052 {"union", (PyCFunction)set_union, METH_VARARGS, |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2053 union_doc}, |
|
47530
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
2054 {"update", (PyCFunction)set_update, METH_VARARGS, |
|
31015
8d413578eb1a
Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents:
31012
diff
changeset
|
2055 update_doc}, |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2056 {NULL, NULL} /* sentinel */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2057 }; |
|
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 static PyNumberMethods set_as_number = { |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2060 0, /*nb_add*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2061 (binaryfunc)set_sub, /*nb_subtract*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2062 0, /*nb_multiply*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2063 0, /*nb_divide*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2064 0, /*nb_remainder*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2065 0, /*nb_divmod*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2066 0, /*nb_power*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2067 0, /*nb_negative*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2068 0, /*nb_positive*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2069 0, /*nb_absolute*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2070 0, /*nb_nonzero*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2071 0, /*nb_invert*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2072 0, /*nb_lshift*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2073 0, /*nb_rshift*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2074 (binaryfunc)set_and, /*nb_and*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2075 (binaryfunc)set_xor, /*nb_xor*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2076 (binaryfunc)set_or, /*nb_or*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2077 0, /*nb_coerce*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2078 0, /*nb_int*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2079 0, /*nb_long*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2080 0, /*nb_float*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2081 0, /*nb_oct*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2082 0, /*nb_hex*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2083 0, /*nb_inplace_add*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2084 (binaryfunc)set_isub, /*nb_inplace_subtract*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2085 0, /*nb_inplace_multiply*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2086 0, /*nb_inplace_divide*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2087 0, /*nb_inplace_remainder*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2088 0, /*nb_inplace_power*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2089 0, /*nb_inplace_lshift*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2090 0, /*nb_inplace_rshift*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2091 (binaryfunc)set_iand, /*nb_inplace_and*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2092 (binaryfunc)set_ixor, /*nb_inplace_xor*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2093 (binaryfunc)set_ior, /*nb_inplace_or*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2094 }; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2095 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2096 PyDoc_STRVAR(set_doc, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2097 "set(iterable) --> set object\n\ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2098 \n\ |
|
39268
2f3d871bf6ef
[Bug #1414697] Change docstring of set/frozenset types to specify that the contents are unique. Raymond, please feel free to edit or revert.
Andrew M. Kuchling <amk@amk.ca>
parents:
39104
diff
changeset
|
2099 Build an unordered collection of unique elements."); |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2100 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2101 PyTypeObject PySet_Type = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41682
diff
changeset
|
2102 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2103 "set", /* tp_name */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2104 sizeof(PySetObject), /* tp_basicsize */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2105 0, /* tp_itemsize */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2106 /* methods */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2107 (destructor)set_dealloc, /* tp_dealloc */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2108 (printfunc)set_tp_print, /* tp_print */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2109 0, /* tp_getattr */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2110 0, /* tp_setattr */ |
|
37304
79a0f080f898
Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents:
37219
diff
changeset
|
2111 set_nocmp, /* tp_compare */ |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2112 (reprfunc)set_repr, /* tp_repr */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2113 &set_as_number, /* tp_as_number */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2114 &set_as_sequence, /* tp_as_sequence */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2115 0, /* tp_as_mapping */ |
|
47961
f9b80a820a25
Issue 2235: __hash__ is once again inherited by default, but inheritance can be blocked explicitly so that collections.Hashable remains meaningful
Nick Coghlan <ncoghlan@gmail.com>
parents:
47922
diff
changeset
|
2116 (hashfunc)PyObject_HashNotImplemented, /* tp_hash */ |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2117 0, /* tp_call */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2118 0, /* tp_str */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2119 PyObject_GenericGetAttr, /* tp_getattro */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2120 0, /* tp_setattro */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2121 0, /* tp_as_buffer */ |
|
35110
f3d3151f8417
SF patch #1200018: Restore GC support to set objects
Raymond Hettinger <python@rcn.com>
parents:
33948
diff
changeset
|
2122 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES | |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
2123 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2124 set_doc, /* tp_doc */ |
|
35110
f3d3151f8417
SF patch #1200018: Restore GC support to set objects
Raymond Hettinger <python@rcn.com>
parents:
33948
diff
changeset
|
2125 (traverseproc)set_traverse, /* tp_traverse */ |
|
35315
a6cbfcd0e691
Factor away a redundant clear() function.
Raymond Hettinger <python@rcn.com>
parents:
35312
diff
changeset
|
2126 (inquiry)set_clear_internal, /* tp_clear */ |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2127 (richcmpfunc)set_richcompare, /* tp_richcompare */ |
|
32158
679e5c8effae
Make sets and deques weak referencable.
Raymond Hettinger <python@rcn.com>
parents:
31628
diff
changeset
|
2128 offsetof(PySetObject, weakreflist), /* tp_weaklistoffset */ |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
2129 (getiterfunc)set_iter, /* tp_iter */ |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2130 0, /* tp_iternext */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2131 set_methods, /* tp_methods */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2132 0, /* tp_members */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2133 0, /* tp_getset */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2134 0, /* tp_base */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2135 0, /* tp_dict */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2136 0, /* tp_descr_get */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2137 0, /* tp_descr_set */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2138 0, /* tp_dictoffset */ |
|
30931
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
2139 (initproc)set_init, /* tp_init */ |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2140 PyType_GenericAlloc, /* tp_alloc */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2141 set_new, /* tp_new */ |
|
35110
f3d3151f8417
SF patch #1200018: Restore GC support to set objects
Raymond Hettinger <python@rcn.com>
parents:
33948
diff
changeset
|
2142 PyObject_GC_Del, /* tp_free */ |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2143 }; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2144 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2145 /* frozenset object ********************************************************/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2146 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2147 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2148 static PyMethodDef frozenset_methods[] = { |
|
31177
eeaa3660671c
Refactor set.discard() and set.remove().
Raymond Hettinger <python@rcn.com>
parents:
31175
diff
changeset
|
2149 {"__contains__",(PyCFunction)set_direct_contains, METH_O | METH_COEXIST, |
|
31172
e4fb6164158c
* Added a new method flag, METH_COEXIST.
Raymond Hettinger <python@rcn.com>
parents:
31019
diff
changeset
|
2150 contains_doc}, |
|
31004
5b77bc4d25b1
* Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents:
31002
diff
changeset
|
2151 {"copy", (PyCFunction)frozenset_copy, METH_NOARGS, |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2152 copy_doc}, |
|
47588
8fe47b2c8bfe
Multi-arg form for set.difference() and set.difference_update().
Raymond Hettinger <python@rcn.com>
parents:
47574
diff
changeset
|
2153 {"difference", (PyCFunction)set_difference_multi, METH_VARARGS, |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2154 difference_doc}, |
|
47533
10577e25f78f
Let set.intersection() and set.intersection_update() take multiple input arguments.
Raymond Hettinger <python@rcn.com>
parents:
47530
diff
changeset
|
2155 {"intersection",(PyCFunction)set_intersection_multi, METH_VARARGS, |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2156 intersection_doc}, |
| 43794 | 2157 {"isdisjoint", (PyCFunction)set_isdisjoint, METH_O, |
| 2158 isdisjoint_doc}, | |
|
31004
5b77bc4d25b1
* Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents:
31002
diff
changeset
|
2159 {"issubset", (PyCFunction)set_issubset, METH_O, |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2160 issubset_doc}, |
|
31004
5b77bc4d25b1
* Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents:
31002
diff
changeset
|
2161 {"issuperset", (PyCFunction)set_issuperset, METH_O, |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2162 issuperset_doc}, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2163 {"__reduce__", (PyCFunction)set_reduce, METH_NOARGS, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2164 reduce_doc}, |
|
47922
7cfc28ac0715
Added additional __sizeof__ implementations and addressed comments made in
Robert Schuppenies <okkotonushi@googlemail.com>
parents:
47588
diff
changeset
|
2165 {"__sizeof__", (PyCFunction)set_sizeof, METH_NOARGS, |
|
7cfc28ac0715
Added additional __sizeof__ implementations and addressed comments made in
Robert Schuppenies <okkotonushi@googlemail.com>
parents:
47588
diff
changeset
|
2166 sizeof_doc}, |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2167 {"symmetric_difference",(PyCFunction)set_symmetric_difference, METH_O, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2168 symmetric_difference_doc}, |
|
47530
d4cd7223af3b
Let set.union() and set.update() accept multiple inputs.
Raymond Hettinger <python@rcn.com>
parents:
47527
diff
changeset
|
2169 {"union", (PyCFunction)set_union, METH_VARARGS, |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2170 union_doc}, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2171 {NULL, NULL} /* sentinel */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2172 }; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2173 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2174 static PyNumberMethods frozenset_as_number = { |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2175 0, /*nb_add*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2176 (binaryfunc)set_sub, /*nb_subtract*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2177 0, /*nb_multiply*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2178 0, /*nb_divide*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2179 0, /*nb_remainder*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2180 0, /*nb_divmod*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2181 0, /*nb_power*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2182 0, /*nb_negative*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2183 0, /*nb_positive*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2184 0, /*nb_absolute*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2185 0, /*nb_nonzero*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2186 0, /*nb_invert*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2187 0, /*nb_lshift*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2188 0, /*nb_rshift*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2189 (binaryfunc)set_and, /*nb_and*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2190 (binaryfunc)set_xor, /*nb_xor*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2191 (binaryfunc)set_or, /*nb_or*/ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2192 }; |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2193 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2194 PyDoc_STRVAR(frozenset_doc, |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2195 "frozenset(iterable) --> frozenset object\n\ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2196 \n\ |
|
39268
2f3d871bf6ef
[Bug #1414697] Change docstring of set/frozenset types to specify that the contents are unique. Raymond, please feel free to edit or revert.
Andrew M. Kuchling <amk@amk.ca>
parents:
39104
diff
changeset
|
2197 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
|
2198 |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2199 PyTypeObject PyFrozenSet_Type = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41682
diff
changeset
|
2200 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2201 "frozenset", /* tp_name */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2202 sizeof(PySetObject), /* tp_basicsize */ |
|
31300
bf8402a56fa4
* Simplify and speedup logic for tp_print.
Raymond Hettinger <python@rcn.com>
parents:
31203
diff
changeset
|
2203 0, /* tp_itemsize */ |
|
bf8402a56fa4
* Simplify and speedup logic for tp_print.
Raymond Hettinger <python@rcn.com>
parents:
31203
diff
changeset
|
2204 /* methods */ |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2205 (destructor)set_dealloc, /* tp_dealloc */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2206 (printfunc)set_tp_print, /* tp_print */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2207 0, /* tp_getattr */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2208 0, /* tp_setattr */ |
|
37304
79a0f080f898
Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents:
37219
diff
changeset
|
2209 set_nocmp, /* tp_compare */ |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2210 (reprfunc)set_repr, /* tp_repr */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2211 &frozenset_as_number, /* tp_as_number */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2212 &set_as_sequence, /* tp_as_sequence */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2213 0, /* tp_as_mapping */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2214 frozenset_hash, /* tp_hash */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2215 0, /* tp_call */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2216 0, /* tp_str */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2217 PyObject_GenericGetAttr, /* tp_getattro */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2218 0, /* tp_setattro */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2219 0, /* tp_as_buffer */ |
|
35110
f3d3151f8417
SF patch #1200018: Restore GC support to set objects
Raymond Hettinger <python@rcn.com>
parents:
33948
diff
changeset
|
2220 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES | |
|
35292
35a698302c63
Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents:
35110
diff
changeset
|
2221 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2222 frozenset_doc, /* tp_doc */ |
|
35110
f3d3151f8417
SF patch #1200018: Restore GC support to set objects
Raymond Hettinger <python@rcn.com>
parents:
33948
diff
changeset
|
2223 (traverseproc)set_traverse, /* tp_traverse */ |
|
35315
a6cbfcd0e691
Factor away a redundant clear() function.
Raymond Hettinger <python@rcn.com>
parents:
35312
diff
changeset
|
2224 (inquiry)set_clear_internal, /* tp_clear */ |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2225 (richcmpfunc)set_richcompare, /* tp_richcompare */ |
|
32158
679e5c8effae
Make sets and deques weak referencable.
Raymond Hettinger <python@rcn.com>
parents:
31628
diff
changeset
|
2226 offsetof(PySetObject, weakreflist), /* tp_weaklistoffset */ |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2227 (getiterfunc)set_iter, /* tp_iter */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2228 0, /* tp_iternext */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2229 frozenset_methods, /* tp_methods */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2230 0, /* tp_members */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2231 0, /* tp_getset */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2232 0, /* tp_base */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2233 0, /* tp_dict */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2234 0, /* tp_descr_get */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2235 0, /* tp_descr_set */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2236 0, /* tp_dictoffset */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2237 0, /* tp_init */ |
|
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2238 PyType_GenericAlloc, /* tp_alloc */ |
|
30931
fa6e8d4f88c6
Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents:
30930
diff
changeset
|
2239 frozenset_new, /* tp_new */ |
|
35110
f3d3151f8417
SF patch #1200018: Restore GC support to set objects
Raymond Hettinger <python@rcn.com>
parents:
33948
diff
changeset
|
2240 PyObject_GC_Del, /* tp_free */ |
|
30929
54ff68e973ee
* Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2241 }; |
|
35346
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2242 |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2243 |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2244 /***** C API functions *************************************************/ |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2245 |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2246 PyObject * |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2247 PySet_New(PyObject *iterable) |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2248 { |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2249 return make_new_set(&PySet_Type, iterable); |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2250 } |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2251 |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2252 PyObject * |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2253 PyFrozenSet_New(PyObject *iterable) |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2254 { |
|
45035
15e8b34254ec
Make PySet_Add() work with frozensets.
Raymond Hettinger <python@rcn.com>
parents:
44964
diff
changeset
|
2255 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
|
2256 } |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2257 |
|
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
|
2258 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
|
2259 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
|
2260 { |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2261 if (!PyAnySet_Check(anyset)) { |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2262 PyErr_BadInternalCall(); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2263 return -1; |
|
35346
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2264 } |
|
35398
1708479ade4d
* Add a fast equality check path for frozensets where the hash value has
Raymond Hettinger <python@rcn.com>
parents:
35353
diff
changeset
|
2265 return PySet_GET_SIZE(anyset); |
|
35346
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2266 } |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2267 |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2268 int |
|
37315
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2269 PySet_Clear(PyObject *set) |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2270 { |
|
45037
77d052ce1f4c
Factor-out common code with a new macro
Raymond Hettinger <python@rcn.com>
parents:
45035
diff
changeset
|
2271 if (!PySet_Check(set)) { |
|
37315
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2272 PyErr_BadInternalCall(); |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2273 return -1; |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2274 } |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2275 return set_clear_internal((PySetObject *)set); |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2276 } |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2277 |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2278 int |
|
35346
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2279 PySet_Contains(PyObject *anyset, PyObject *key) |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2280 { |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2281 if (!PyAnySet_Check(anyset)) { |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2282 PyErr_BadInternalCall(); |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2283 return -1; |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2284 } |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2285 return set_contains_key((PySetObject *)anyset, key); |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2286 } |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2287 |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2288 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
|
2289 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
|
2290 { |
|
45037
77d052ce1f4c
Factor-out common code with a new macro
Raymond Hettinger <python@rcn.com>
parents:
45035
diff
changeset
|
2291 if (!PySet_Check(set)) { |
|
35346
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2292 PyErr_BadInternalCall(); |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2293 return -1; |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2294 } |
|
35348
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2295 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
|
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 int |
|
45035
15e8b34254ec
Make PySet_Add() work with frozensets.
Raymond Hettinger <python@rcn.com>
parents:
44964
diff
changeset
|
2299 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
|
2300 { |
|
45138
4f6f44bc5195
Ensure that PySet_Add() operates on a newly created frozenset, like PyTuple_SetItem does.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
45037
diff
changeset
|
2301 if (!PySet_Check(anyset) && |
|
4f6f44bc5195
Ensure that PySet_Add() operates on a newly created frozenset, like PyTuple_SetItem does.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
45037
diff
changeset
|
2302 (!PyFrozenSet_Check(anyset) || Py_REFCNT(anyset) != 1)) { |
|
44964
3124cc5b973f
Revert PySet_Add() changes.
Raymond Hettinger <python@rcn.com>
parents:
44963
diff
changeset
|
2303 PyErr_BadInternalCall(); |
|
3124cc5b973f
Revert PySet_Add() changes.
Raymond Hettinger <python@rcn.com>
parents:
44963
diff
changeset
|
2304 return -1; |
|
3124cc5b973f
Revert PySet_Add() changes.
Raymond Hettinger <python@rcn.com>
parents:
44963
diff
changeset
|
2305 } |
|
45035
15e8b34254ec
Make PySet_Add() work with frozensets.
Raymond Hettinger <python@rcn.com>
parents:
44964
diff
changeset
|
2306 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
|
2307 } |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2308 |
|
37315
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2309 int |
|
41248
ec6fb091039b
Extend work on rev 52962 and 53829 eliminating redundant PyObject_Hash() calls and fixing set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40875
diff
changeset
|
2310 _PySet_Next(PyObject *set, Py_ssize_t *pos, PyObject **key) |
|
37315
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2311 { |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2312 setentry *entry_ptr; |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2313 |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2314 if (!PyAnySet_Check(set)) { |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2315 PyErr_BadInternalCall(); |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2316 return -1; |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2317 } |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2318 if (set_next((PySetObject *)set, pos, &entry_ptr) == 0) |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2319 return 0; |
|
41248
ec6fb091039b
Extend work on rev 52962 and 53829 eliminating redundant PyObject_Hash() calls and fixing set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40875
diff
changeset
|
2320 *key = entry_ptr->key; |
|
ec6fb091039b
Extend work on rev 52962 and 53829 eliminating redundant PyObject_Hash() calls and fixing set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40875
diff
changeset
|
2321 return 1; |
|
ec6fb091039b
Extend work on rev 52962 and 53829 eliminating redundant PyObject_Hash() calls and fixing set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40875
diff
changeset
|
2322 } |
|
ec6fb091039b
Extend work on rev 52962 and 53829 eliminating redundant PyObject_Hash() calls and fixing set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40875
diff
changeset
|
2323 |
|
ec6fb091039b
Extend work on rev 52962 and 53829 eliminating redundant PyObject_Hash() calls and fixing set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40875
diff
changeset
|
2324 int |
|
ec6fb091039b
Extend work on rev 52962 and 53829 eliminating redundant PyObject_Hash() calls and fixing set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40875
diff
changeset
|
2325 _PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key, long *hash) |
|
ec6fb091039b
Extend work on rev 52962 and 53829 eliminating redundant PyObject_Hash() calls and fixing set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40875
diff
changeset
|
2326 { |
|
ec6fb091039b
Extend work on rev 52962 and 53829 eliminating redundant PyObject_Hash() calls and fixing set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40875
diff
changeset
|
2327 setentry *entry; |
|
ec6fb091039b
Extend work on rev 52962 and 53829 eliminating redundant PyObject_Hash() calls and fixing set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40875
diff
changeset
|
2328 |
|
ec6fb091039b
Extend work on rev 52962 and 53829 eliminating redundant PyObject_Hash() calls and fixing set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40875
diff
changeset
|
2329 if (!PyAnySet_Check(set)) { |
|
ec6fb091039b
Extend work on rev 52962 and 53829 eliminating redundant PyObject_Hash() calls and fixing set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40875
diff
changeset
|
2330 PyErr_BadInternalCall(); |
|
ec6fb091039b
Extend work on rev 52962 and 53829 eliminating redundant PyObject_Hash() calls and fixing set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40875
diff
changeset
|
2331 return -1; |
|
ec6fb091039b
Extend work on rev 52962 and 53829 eliminating redundant PyObject_Hash() calls and fixing set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40875
diff
changeset
|
2332 } |
|
ec6fb091039b
Extend work on rev 52962 and 53829 eliminating redundant PyObject_Hash() calls and fixing set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40875
diff
changeset
|
2333 if (set_next((PySetObject *)set, pos, &entry) == 0) |
|
ec6fb091039b
Extend work on rev 52962 and 53829 eliminating redundant PyObject_Hash() calls and fixing set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40875
diff
changeset
|
2334 return 0; |
|
ec6fb091039b
Extend work on rev 52962 and 53829 eliminating redundant PyObject_Hash() calls and fixing set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40875
diff
changeset
|
2335 *key = entry->key; |
|
ec6fb091039b
Extend work on rev 52962 and 53829 eliminating redundant PyObject_Hash() calls and fixing set/dict interoperability.
Raymond Hettinger <python@rcn.com>
parents:
40875
diff
changeset
|
2336 *hash = entry->hash; |
|
37315
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2337 return 1; |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2338 } |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2339 |
|
35346
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2340 PyObject * |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2341 PySet_Pop(PyObject *set) |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2342 { |
|
45037
77d052ce1f4c
Factor-out common code with a new macro
Raymond Hettinger <python@rcn.com>
parents:
45035
diff
changeset
|
2343 if (!PySet_Check(set)) { |
|
35346
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2344 PyErr_BadInternalCall(); |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2345 return NULL; |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2346 } |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2347 return set_pop((PySetObject *)set); |
|
dd2357953fe3
Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents:
35341
diff
changeset
|
2348 } |
|
35348
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2349 |
|
37315
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2350 int |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2351 _PySet_Update(PyObject *set, PyObject *iterable) |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2352 { |
|
45037
77d052ce1f4c
Factor-out common code with a new macro
Raymond Hettinger <python@rcn.com>
parents:
45035
diff
changeset
|
2353 if (!PySet_Check(set)) { |
|
37315
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2354 PyErr_BadInternalCall(); |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2355 return -1; |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2356 } |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2357 return set_update_internal((PySetObject *)set, iterable); |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2358 } |
|
35348
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2359 |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2360 #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
|
2361 |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2362 /* Test code to be called with any three element set. |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2363 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
|
2364 |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2365 #define assertRaises(call_return_value, exception) \ |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2366 do { \ |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2367 assert(call_return_value); \ |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2368 assert(PyErr_ExceptionMatches(exception)); \ |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2369 PyErr_Clear(); \ |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2370 } while(0) |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2371 |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2372 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
|
2373 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
|
2374 { |
| 38872 | 2375 Py_ssize_t count; |
|
37315
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2376 char *s; |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2377 Py_ssize_t i; |
|
41682
7594709e631b
Fix a bug in test_c_api() that caused a negative refcount.
Guido van Rossum <guido@python.org>
parents:
41248
diff
changeset
|
2378 PyObject *elem=NULL, *dup=NULL, *t, *f, *dup2, *x; |
|
37315
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2379 PyObject *ob = (PyObject *)so; |
|
35348
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2380 |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2381 /* Verify preconditions and exercise type/size checks */ |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2382 assert(PyAnySet_Check(ob)); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2383 assert(PyAnySet_CheckExact(ob)); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2384 assert(!PyFrozenSet_CheckExact(ob)); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2385 assert(PySet_Size(ob) == 3); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2386 assert(PySet_GET_SIZE(ob) == 3); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2387 |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2388 /* Raise TypeError for non-iterable constructor arguments */ |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2389 assertRaises(PySet_New(Py_None) == NULL, PyExc_TypeError); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2390 assertRaises(PyFrozenSet_New(Py_None) == NULL, PyExc_TypeError); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2391 |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2392 /* Raise TypeError for unhashable key */ |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2393 dup = PySet_New(ob); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2394 assertRaises(PySet_Discard(ob, dup) == -1, PyExc_TypeError); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2395 assertRaises(PySet_Contains(ob, dup) == -1, PyExc_TypeError); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2396 assertRaises(PySet_Add(ob, dup) == -1, PyExc_TypeError); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2397 |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2398 /* Exercise successful pop, contains, add, and discard */ |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2399 elem = PySet_Pop(ob); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2400 assert(PySet_Contains(ob, elem) == 0); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2401 assert(PySet_GET_SIZE(ob) == 2); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2402 assert(PySet_Add(ob, elem) == 0); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2403 assert(PySet_Contains(ob, elem) == 1); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2404 assert(PySet_GET_SIZE(ob) == 3); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2405 assert(PySet_Discard(ob, elem) == 1); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2406 assert(PySet_GET_SIZE(ob) == 2); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2407 assert(PySet_Discard(ob, elem) == 0); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2408 assert(PySet_GET_SIZE(ob) == 2); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2409 |
|
37315
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2410 /* Exercise clear */ |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2411 dup2 = PySet_New(dup); |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2412 assert(PySet_Clear(dup2) == 0); |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2413 assert(PySet_Size(dup2) == 0); |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2414 Py_DECREF(dup2); |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2415 |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2416 /* Raise SystemError on clear or update of frozen set */ |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2417 f = PyFrozenSet_New(dup); |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2418 assertRaises(PySet_Clear(f) == -1, PyExc_SystemError); |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2419 assertRaises(_PySet_Update(f, dup) == -1, PyExc_SystemError); |
|
45138
4f6f44bc5195
Ensure that PySet_Add() operates on a newly created frozenset, like PyTuple_SetItem does.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
45037
diff
changeset
|
2420 assert(PySet_Add(f, elem) == 0); |
|
4f6f44bc5195
Ensure that PySet_Add() operates on a newly created frozenset, like PyTuple_SetItem does.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
45037
diff
changeset
|
2421 Py_INCREF(f); |
|
4f6f44bc5195
Ensure that PySet_Add() operates on a newly created frozenset, like PyTuple_SetItem does.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
45037
diff
changeset
|
2422 assertRaises(PySet_Add(f, elem) == -1, PyExc_SystemError); |
|
4f6f44bc5195
Ensure that PySet_Add() operates on a newly created frozenset, like PyTuple_SetItem does.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
45037
diff
changeset
|
2423 Py_DECREF(f); |
|
37315
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2424 Py_DECREF(f); |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2425 |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2426 /* Exercise direct iteration */ |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2427 i = 0, count = 0; |
|
41682
7594709e631b
Fix a bug in test_c_api() that caused a negative refcount.
Guido van Rossum <guido@python.org>
parents:
41248
diff
changeset
|
2428 while (_PySet_Next((PyObject *)dup, &i, &x)) { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47386
diff
changeset
|
2429 s = PyString_AsString(x); |
|
37315
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2430 assert(s && (s[0] == 'a' || s[0] == 'b' || s[0] == 'c')); |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2431 count++; |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2432 } |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2433 assert(count == 3); |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2434 |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2435 /* Exercise updates */ |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2436 dup2 = PySet_New(NULL); |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2437 assert(_PySet_Update(dup2, dup) == 0); |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2438 assert(PySet_Size(dup2) == 3); |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2439 assert(_PySet_Update(dup2, dup) == 0); |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2440 assert(PySet_Size(dup2) == 3); |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2441 Py_DECREF(dup2); |
|
19059df45cfe
SF patch #1458476 with modifications based on discussions in python-dev. This
Barry Warsaw <barry@python.org>
parents:
37304
diff
changeset
|
2442 |
|
35348
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2443 /* Raise SystemError when self argument is not a set or frozenset. */ |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2444 t = PyTuple_New(0); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2445 assertRaises(PySet_Size(t) == -1, PyExc_SystemError); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2446 assertRaises(PySet_Contains(t, elem) == -1, PyExc_SystemError); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2447 Py_DECREF(t); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2448 |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2449 /* Raise SystemError when self argument is not a set. */ |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2450 f = PyFrozenSet_New(dup); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2451 assert(PySet_Size(f) == 3); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2452 assert(PyFrozenSet_CheckExact(f)); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2453 assertRaises(PySet_Discard(f, elem) == -1, PyExc_SystemError); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2454 assertRaises(PySet_Pop(f) == NULL, PyExc_SystemError); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2455 Py_DECREF(f); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2456 |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2457 /* Raise KeyError when popping from an empty set */ |
|
35353
e8806094d644
Add shortcuts for a|a and a&a.
Raymond Hettinger <python@rcn.com>
parents:
35349
diff
changeset
|
2458 assert(PyNumber_InPlaceSubtract(ob, ob) == ob); |
|
e8806094d644
Add shortcuts for a|a and a&a.
Raymond Hettinger <python@rcn.com>
parents:
35349
diff
changeset
|
2459 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
|
2460 assert(PySet_GET_SIZE(ob) == 0); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2461 assertRaises(PySet_Pop(ob) == NULL, PyExc_KeyError); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2462 |
|
35353
e8806094d644
Add shortcuts for a|a and a&a.
Raymond Hettinger <python@rcn.com>
parents:
35349
diff
changeset
|
2463 /* Restore the set from the copy using the PyNumber API */ |
|
e8806094d644
Add shortcuts for a|a and a&a.
Raymond Hettinger <python@rcn.com>
parents:
35349
diff
changeset
|
2464 assert(PyNumber_InPlaceOr(ob, dup) == ob); |
|
e8806094d644
Add shortcuts for a|a and a&a.
Raymond Hettinger <python@rcn.com>
parents:
35349
diff
changeset
|
2465 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
|
2466 |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2467 /* Verify constructors accept NULL arguments */ |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2468 f = PySet_New(NULL); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2469 assert(f != NULL); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2470 assert(PySet_GET_SIZE(f) == 0); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2471 Py_DECREF(f); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2472 f = PyFrozenSet_New(NULL); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2473 assert(f != NULL); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2474 assert(PyFrozenSet_CheckExact(f)); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2475 assert(PySet_GET_SIZE(f) == 0); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2476 Py_DECREF(f); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2477 |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2478 Py_DECREF(elem); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2479 Py_DECREF(dup); |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2480 Py_RETURN_TRUE; |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2481 } |
|
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2482 |
|
35581
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
2483 #undef assertRaises |
|
37859c6ad5bb
No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
2484 |
|
35348
2f1bf64b837e
Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents:
35347
diff
changeset
|
2485 #endif |
