diff -r c3cec0f77eff Lib/test/test_collections.py --- a/Lib/test/test_collections.py Tue Oct 20 18:22:36 2015 +0300 +++ b/Lib/test/test_collections.py Wed Oct 21 22:16:04 2015 +0300 @@ -2033,6 +2033,35 @@ class OrderedDictTests: items = [('a', 1), ('c', 3), ('b', 2)] self.assertEqual(list(MyOD(items).items()), items) + def test_dict_setitem(self): + OrderedDict = self.module.OrderedDict + od = OrderedDict() + dict.__setitem__(od, 'spam', 1) + self.assertNotIn('NULL', repr(od)) + + def test_dict_delitem(self): + OrderedDict = self.module.OrderedDict + od = OrderedDict() + od['spam'] = 1 + od['ham'] = 2 + dict.__delitem__(od, 'spam') + with self.assertRaises(KeyError): + repr(od) + + def test_dict_delitem_2(self): + OrderedDict = self.module.OrderedDict + class K(str): + def __hash__(self): + return 1 + od = OrderedDict() + od[K('spam')] = 1 + od[K('ham')] = 2 + dict.__delitem__(od, K('spam')) + K.__eq__ = lambda self, other: True + r = repr(od) + self.assertIn('spam', r) + self.assertIn('ham', r) + class PurePythonOrderedDictTests(OrderedDictTests, unittest.TestCase): diff -r c3cec0f77eff Objects/odictobject.c --- a/Objects/odictobject.c Tue Oct 20 18:22:36 2015 +0300 +++ b/Objects/odictobject.c Wed Oct 21 22:16:04 2015 +0300 @@ -1459,7 +1459,6 @@ odict_repr(PyODictObject *self) _Py_IDENTIFIER(__class__); _Py_IDENTIFIER(__name__); _Py_IDENTIFIER(items); - Py_ssize_t count = -1; PyObject *pieces = NULL, *result = NULL, *cls = NULL; PyObject *classname = NULL; @@ -1474,6 +1473,7 @@ odict_repr(PyODictObject *self) } if (PyODict_CheckExact(self)) { + Py_ssize_t count = 0; _ODictNode *node; pieces = PyList_New(PyODict_SIZE(self)); if (pieces == NULL) @@ -1492,8 +1492,20 @@ odict_repr(PyODictObject *self) if (pair == NULL) goto Done; - PyList_SET_ITEM(pieces, ++count, pair); /* steals reference */ + + if (count < PyList_GET_SIZE(pieces)) + PyList_SET_ITEM(pieces, count, pair); /* steals reference */ + else { + if (PyList_Append(pieces, pair) < 0) { + Py_DECREF(pair); + goto Done; + } + Py_DECREF(pair); + } + count++; } + if (count < PyList_GET_SIZE(pieces)) + PyList_GET_SIZE(pieces) = count; } else { PyObject *items = _PyObject_CallMethodIdObjArgs((PyObject *)self,