Skip to content

Commit 831c59b

Browse files
committed
chore: resolve review comment
1 parent 1c4ba11 commit 831c59b

File tree

2 files changed

+18
-14
lines changed

2 files changed

+18
-14
lines changed

Lib/test/test_ordered_dict.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -993,8 +993,8 @@ def test_copy_concurrent_deletion_by_del_in__getitem__(self):
993993
class MyOD(self.OrderedDict):
994994
call_count = 0
995995
def __getitem__(self, key):
996-
MyOD.call_count += 1
997-
if MyOD.call_count == 1:
996+
self.call_count += 1
997+
if self.call_count == 1:
998998
del self[3]
999999
return super().__getitem__(key)
10001000

@@ -1005,9 +1005,9 @@ def test_copy_concurrent_deletion_by_pop_in__getitem__(self):
10051005
class MyOD(self.OrderedDict):
10061006
call_count = 0
10071007
def __getitem__(self, key):
1008-
MyOD.call_count += 1
1009-
if MyOD.call_count == 1:
1010-
self.pop(3, None)
1008+
self.call_count += 1
1009+
if self.call_count == 1:
1010+
self.pop(3)
10111011
return super().__getitem__(key)
10121012

10131013
od = MyOD([(1, 'one'), (2, 'two'), (3, 'three')])
@@ -1017,10 +1017,10 @@ def test_copy_concurrent_deletion_and_set_in__getitem__(self):
10171017
class MyOD(self.OrderedDict):
10181018
call_count = 0
10191019
def __getitem__(self, key):
1020-
MyOD.call_count += 1
1021-
if MyOD.call_count == 1:
1020+
self.call_count += 1
1021+
if self.call_count == 1:
10221022
del self[3]
1023-
elif MyOD.call_count == 2:
1023+
elif self.call_count == 2:
10241024
self['new_key'] = 'new_value'
10251025
return super().__getitem__(key)
10261026

@@ -1029,11 +1029,12 @@ def __getitem__(self, key):
10291029

10301030
def test_copy_concurrent_mutation_in__setitem__(self):
10311031
od = None
1032-
10331032
class MyOD(self.OrderedDict):
1033+
call_count = 0
10341034
def __setitem__(self, key, value):
1035-
if od is not None and len(od) > 1:
1036-
del od[3]
1035+
self.call_count += 1
1036+
if od is not None and len(od) > 1 and self.call_count == 1:
1037+
del od[1]
10371038
return super().__setitem__(key, value)
10381039

10391040
od = MyOD([(1, 'one'), (2, 'two'), (3, 'three')])

Objects/odictobject.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1268,15 +1268,18 @@ OrderedDict_copy_impl(PyObject *od)
12681268
else {
12691269
PyODictObject *self = _PyODictObject_CAST(od);
12701270
size_t state = self->od_state;
1271-
_ODictNode *cur;
12721271

1273-
_odict_FOREACH(od, cur) {
1274-
PyObject *key = Py_NewRef(_odictnode_KEY(cur));
1272+
_odict_FOREACH(od, node) {
1273+
PyObject *key = Py_NewRef(_odictnode_KEY(node));
12751274
PyObject *value = PyObject_GetItem(od, key);
12761275
if (value == NULL) {
12771276
Py_DECREF(key);
1277+
if (self->od_state != state) {
1278+
goto invalid_state;
1279+
}
12781280
goto fail;
12791281
}
1282+
12801283
int rc = PyObject_SetItem(od_copy, key, value);
12811284
Py_DECREF(key);
12821285
Py_DECREF(value);

0 commit comments

Comments
 (0)