diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2017-04-19 18:22:49 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-19 18:22:49 (GMT) |
commit | 680fea4067537a9b9c79aadd44a3a19e83cd2dbf (patch) | |
tree | baf7cb3259f1b27e82d5166e5a88fd4e0f557ea4 /Objects | |
parent | 8e5b52a8da07e781bda50ba0a7065b1058495a37 (diff) | |
download | cpython-680fea4067537a9b9c79aadd44a3a19e83cd2dbf.zip cpython-680fea4067537a9b9c79aadd44a3a19e83cd2dbf.tar.gz cpython-680fea4067537a9b9c79aadd44a3a19e83cd2dbf.tar.bz2 |
bpo-30061: Check if PyObject_Size()/PySequence_Size()/PyMapping_Size() (#1096) (#1180)
raised an error.
(cherry picked from commit bf623ae8843dc30b28c574bec8d29fc14be59d86)
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/setobject.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/Objects/setobject.c b/Objects/setobject.c index 9fe2813..c1bc1e1 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1550,20 +1550,26 @@ set_difference(PySetObject *so, PyObject *other) PyObject *key; Py_hash_t hash; setentry *entry; - Py_ssize_t pos = 0; + Py_ssize_t pos = 0, other_size; int rv; if (PySet_GET_SIZE(so) == 0) { return set_copy(so); } - if (!PyAnySet_Check(other) && !PyDict_CheckExact(other)) { + if (PyAnySet_Check(other)) { + other_size = PySet_GET_SIZE(other); + } + else if (PyDict_CheckExact(other)) { + other_size = PyDict_Size(other); + } + else { return set_copy_and_difference(so, other); } /* If len(so) much more than len(other), it's more efficient to simply copy * so and then iterate other looking for common elements. */ - if ((PySet_GET_SIZE(so) >> 2) > PyObject_Size(other)) { + if ((PySet_GET_SIZE(so) >> 2) > other_size) { return set_copy_and_difference(so, other); } |