11from test .test_json import CTest
2+ from test .support import gc_collect
23
34
45class 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