summaryrefslogtreecommitdiffstats
path: root/Objects/odictobject.c
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2016-10-30 15:27:40 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2016-10-30 15:27:40 (GMT)
commita182d7bc14cedc26b17bd95682c5b4d54d222b5b (patch)
tree8a4bd1289aae9f58772bfc1541b5b9e409f8836a /Objects/odictobject.c
parent92b615491110a413f123cf6d54b05a21916ad58a (diff)
parentb7d14a09c245f1e78911208b7f65bd09d7c03f2c (diff)
downloadcpython-a182d7bc14cedc26b17bd95682c5b4d54d222b5b.zip
cpython-a182d7bc14cedc26b17bd95682c5b4d54d222b5b.tar.gz
cpython-a182d7bc14cedc26b17bd95682c5b4d54d222b5b.tar.bz2
Merge from 3.6.
Diffstat (limited to 'Objects/odictobject.c')
-rw-r--r--Objects/odictobject.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/Objects/odictobject.c b/Objects/odictobject.c
index be61d4e..22b1f1d 100644
--- a/Objects/odictobject.c
+++ b/Objects/odictobject.c
@@ -1102,13 +1102,28 @@ _odict_popkey_hash(PyObject *od, PyObject *key, PyObject *failobj,
}
/* Now delete the value from the dict. */
- if (node != NULL) {
- value = _PyDict_GetItem_KnownHash(od, key, hash); /* borrowed */
- if (value != NULL) {
- Py_INCREF(value);
- if (_PyDict_DelItem_KnownHash(od, key, hash) < 0) {
- Py_DECREF(value);
- return NULL;
+ if (PyODict_CheckExact(od)) {
+ if (node != NULL) {
+ value = _PyDict_GetItem_KnownHash(od, key, hash); /* borrowed */
+ if (value != NULL) {
+ Py_INCREF(value);
+ if (_PyDict_DelItem_KnownHash(od, key, hash) < 0) {
+ Py_DECREF(value);
+ return NULL;
+ }
+ }
+ }
+ }
+ else {
+ int exists = PySequence_Contains(od, key);
+ if (exists < 0)
+ return NULL;
+ if (exists) {
+ value = PyObject_GetItem(od, key);
+ if (value != NULL) {
+ if (PyObject_DelItem(od, key) == -1) {
+ Py_CLEAR(value);
+ }
}
}
}