diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2017-04-19 20:03:52 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-19 20:03:52 +0300 |
commit | bf623ae8843dc30b28c574bec8d29fc14be59d86 (patch) | |
tree | 0a7ab5b441e0306767bfbc6da4522e4af34ab9e6 /Objects/setobject.c | |
parent | c209b70d610da50a844a3c10f37d6183bade3446 (diff) | |
download | cpython-bf623ae8843dc30b28c574bec8d29fc14be59d86.tar.gz cpython-bf623ae8843dc30b28c574bec8d29fc14be59d86.zip |
bpo-30061: Check if PyObject_Size()/PySequence_Size()/PyMapping_Size() (#1096)
raised an error.
Replace them with using concrete types API that never fails if appropriate.
Diffstat (limited to 'Objects/setobject.c')
-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 23b32d0d83b..a9dba31c423 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1546,20 +1546,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_GET_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); } |