diff -r 18ed518d2eef Objects/dictobject.c --- a/Objects/dictobject.c Tue Nov 29 09:56:07 2016 +0200 +++ b/Objects/dictobject.c Tue Nov 29 21:32:46 2016 +0900 @@ -468,27 +468,22 @@ static int assert(DKIX_DUMMY <= ix && ix <= usable); } - for (i=0; i < usable; i++) { + for (i=0; i < keys->dk_nentries; i++) { PyDictKeyEntry *entry = &entries[i]; PyObject *key = entry->me_key; - if (key != NULL) { - if (PyUnicode_CheckExact(key)) { - Py_hash_t hash = ((PyASCIIObject *)key)->hash; - assert(hash != -1); - assert(entry->me_hash == hash); - } - else { - /* test_dict fails if PyObject_Hash() is called again */ - assert(entry->me_hash != -1); - } - if (!splitted) { - assert(entry->me_value != NULL); - } + assert(key != NULL); + if (PyUnicode_CheckExact(key)) { + Py_hash_t hash = ((PyASCIIObject *)key)->hash; + assert(hash != -1); + assert(entry->me_hash == hash); } - - if (splitted) { - assert(entry->me_value == NULL); + else { + /* test_dict fails if PyObject_Hash() is called again */ + assert(entry->me_hash != -1); + } + if (!splitted) { + assert(entry->me_value != NULL); } } @@ -505,7 +500,8 @@ static int #endif -static PyDictKeysObject *new_keys_object(Py_ssize_t size) +static PyDictKeysObject * +new_keys_object(Py_ssize_t size) { PyDictKeysObject *dk; Py_ssize_t es, usable; @@ -548,7 +544,9 @@ static PyDictKeysObject *new_keys_object dk->dk_lookup = lookdict_unicode_nodummy; dk->dk_nentries = 0; memset(&dk->dk_indices.as_1[0], 0xff, es * size); - memset(DK_ENTRIES(dk), 0, sizeof(PyDictKeyEntry) * usable); +#if Py_DEBUG + memset(DK_ENTRIES(dk), 0xcc, sizeof(PyDictKeyEntry) * usable); +#endif return dk; } @@ -604,17 +602,14 @@ static PyObject * new_dict_with_shared_keys(PyDictKeysObject *keys) { PyObject **values; - Py_ssize_t i, size; - - size = USABLE_FRACTION(DK_SIZE(keys)); + + Py_ssize_t size = USABLE_FRACTION(DK_SIZE(keys)); values = new_values(size); if (values == NULL) { DK_DECREF(keys); return PyErr_NoMemory(); } - for (i = 0; i < size; i++) { - values[i] = NULL; - } + memset(values, 0, sizeof(PyObject*)*size); return new_dict(keys, values); } @@ -1092,7 +1087,6 @@ find_empty_slot(PyDictObject *mp, PyObje } ep = &ep0[mp->ma_keys->dk_nentries]; *hashpos = i & mask; - assert(ep->me_value == NULL); *value_addr = &ep->me_value; } @@ -1160,7 +1154,7 @@ insertdict(PyDictObject *mp, PyObject *k ep->me_key = key; ep->me_hash = hash; if (mp->ma_values) { - assert (mp->ma_values[mp->ma_keys->dk_nentries] == NULL); + ep->me_value = NULL; mp->ma_values[mp->ma_keys->dk_nentries] = value; } else { @@ -1347,10 +1341,13 @@ make_keys_shared(PyObject *op) "Not enough memory to allocate new values array"); return NULL; } - for (i = 0; i < size; i++) { + for (i = 0; i < mp->ma_keys->dk_nentries; i++) { values[i] = ep0[i].me_value; ep0[i].me_value = NULL; } + for (; i < size; i++) { + values[i] = NULL; + } mp->ma_keys->dk_lookup = lookdict_split; mp->ma_values = values; } @@ -2821,7 +2818,8 @@ PyDict_SetDefault(PyObject *d, PyObject MAINTAIN_TRACKING(mp, key, value); ep->me_key = key; ep->me_hash = hash; - if (mp->ma_values) { + if (_PyDict_HasSplitTable(mp)) { + ep->me_value = NULL; assert(mp->ma_values[mp->ma_keys->dk_nentries] == NULL); mp->ma_values[mp->ma_keys->dk_nentries] = value; }