summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2016-09-26 18:29:34 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2016-09-26 18:29:34 (GMT)
commit46825d2399a461b060f2451c93cd0c349c5df485 (patch)
tree6ac7c4ef424c47d374aa8153c473b8a0898a4d62
parent4781b59185220b6db3081257a21ba904efcce012 (diff)
downloadcpython-46825d2399a461b060f2451c93cd0c349c5df485.zip
cpython-46825d2399a461b060f2451c93cd0c349c5df485.tar.gz
cpython-46825d2399a461b060f2451c93cd0c349c5df485.tar.bz2
Issue #28194: Clean up some checks in dict implementation.
Patch by Xiang Zhang.
-rw-r--r--Objects/dictobject.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 25fdedd..36ea8f1 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -710,13 +710,14 @@ top:
}
else {
ep = &ep0[ix];
+ assert(ep->me_key != NULL);
if (ep->me_key == key) {
*value_addr = &ep->me_value;
if (hashpos != NULL)
*hashpos = i;
return ix;
}
- if (ep->me_key != NULL && ep->me_hash == hash) {
+ if (ep->me_hash == hash) {
startkey = ep->me_key;
Py_INCREF(startkey);
cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
@@ -755,6 +756,7 @@ top:
continue;
}
ep = &ep0[ix];
+ assert(ep->me_key != NULL);
if (ep->me_key == key) {
if (hashpos != NULL) {
*hashpos = i;
@@ -762,7 +764,7 @@ top:
*value_addr = &ep->me_value;
return ix;
}
- if (ep->me_hash == hash && ep->me_key != NULL) {
+ if (ep->me_hash == hash) {
startkey = ep->me_key;
Py_INCREF(startkey);
cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
@@ -822,9 +824,9 @@ lookdict_unicode(PyDictObject *mp, PyObject *key,
}
else {
ep = &ep0[ix];
- /* only split table can be ix != DKIX_DUMMY && me_key == NULL */
assert(ep->me_key != NULL);
- if (ep->me_key == key || (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
+ if (ep->me_key == key
+ || (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
if (hashpos != NULL)
*hashpos = i;
*value_addr = &ep->me_value;
@@ -849,10 +851,9 @@ lookdict_unicode(PyDictObject *mp, PyObject *key,
continue;
}
ep = &ep0[ix];
+ assert(ep->me_key != NULL);
if (ep->me_key == key
- || (ep->me_hash == hash
- && ep->me_key != NULL
- && unicode_eq(ep->me_key, key))) {
+ || (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
*value_addr = &ep->me_value;
if (hashpos != NULL) {
*hashpos = i;
@@ -962,7 +963,7 @@ lookdict_split(PyDictObject *mp, PyObject *key,
}
assert(ix >= 0);
ep = &ep0[ix];
- assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
+ assert(ep->me_key != NULL && PyUnicode_CheckExact(ep->me_key));
if (ep->me_key == key ||
(ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
if (hashpos != NULL)
@@ -981,7 +982,7 @@ lookdict_split(PyDictObject *mp, PyObject *key,
}
assert(ix >= 0);
ep = &ep0[ix];
- assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
+ assert(ep->me_key != NULL && PyUnicode_CheckExact(ep->me_key));
if (ep->me_key == key ||
(ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
if (hashpos != NULL)
@@ -2881,7 +2882,7 @@ dict_traverse(PyObject *op, visitproc visit, void *arg)
{
PyDictObject *mp = (PyDictObject *)op;
PyDictKeysObject *keys = mp->ma_keys;
- PyDictKeyEntry *entries = DK_ENTRIES(mp->ma_keys);
+ PyDictKeyEntry *entries = DK_ENTRIES(keys);
Py_ssize_t i, n = keys->dk_nentries;
if (keys->dk_lookup == lookdict) {