diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2016-10-30 15:27:40 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2016-10-30 15:27:40 (GMT) |
commit | a182d7bc14cedc26b17bd95682c5b4d54d222b5b (patch) | |
tree | 8a4bd1289aae9f58772bfc1541b5b9e409f8836a /Objects/odictobject.c | |
parent | 92b615491110a413f123cf6d54b05a21916ad58a (diff) | |
parent | b7d14a09c245f1e78911208b7f65bd09d7c03f2c (diff) | |
download | cpython-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.c | 29 |
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); + } } } } |