Skip to content

Commit cfee66f

Browse files
committed
Address review: use nonlocal, add gc_collect, add list mutation test
1 parent cced98b commit cfee66f

1 file changed

Lines changed: 32 additions & 12 deletions

File tree

Lib/test/test_json/test_speedups.py

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from test.test_json import CTest
2+
from test.support import gc_collect
23

34

45
class BadBool:
@@ -112,25 +113,24 @@ def test_current_indent_level(self):
112113
self.assertRaises(TypeError, enc, ['spam', {'ham': 'eggs'}], 3.0)
113114
self.assertRaises(TypeError, enc, ['spam', {'ham': 'eggs'}])
114115

115-
def test_mutate_items_during_encode(self):
116-
c_make_encoder = getattr(self.json.encoder, 'c_make_encoder', None)
117-
if c_make_encoder is None:
118-
self.skipTest("c_make_encoder not available")
119-
120-
cache = []
116+
def test_mutate_dict_items_during_encode(self):
117+
items = None
121118

122119
class BadDict(dict):
123120
def items(self):
124-
entries = [("boom", object())]
125-
cache.append(entries)
126-
return entries
121+
nonlocal items
122+
items = [("boom", object())]
123+
return items
127124

128125
def encode_str(obj):
129-
if cache:
130-
cache.pop().clear()
126+
nonlocal items
127+
if items is not None:
128+
items.clear()
129+
items = None
130+
gc_collect()
131131
return '"x"'
132132

133-
encoder = c_make_encoder(
133+
encoder = self.json.encoder.c_make_encoder(
134134
None, lambda o: "null",
135135
encode_str, None,
136136
": ", ", ", False,
@@ -141,3 +141,23 @@ def encode_str(obj):
141141
encoder(BadDict(real=1), 0)
142142
except (ValueError, RuntimeError):
143143
pass
144+
145+
def test_mutate_list_during_encode(self):
146+
lst = [object() for _ in range(10)]
147+
148+
def default(obj):
149+
lst.clear()
150+
gc_collect()
151+
return None
152+
153+
encoder = self.json.encoder.c_make_encoder(
154+
None, default,
155+
self.json.encoder.c_encode_basestring, None,
156+
": ", ", ", False,
157+
False, True
158+
)
159+
160+
try:
161+
encoder(lst, 0)
162+
except (ValueError, RuntimeError):
163+
pass

0 commit comments

Comments
 (0)