@@ -246,6 +246,79 @@ def loop():
246
246
#This should not raise
247
247
loop ()
248
248
249
+
250
+ class ModifyUnderlyingIterableTest (unittest .TestCase ):
251
+ iterables = [
252
+ range (0 ),
253
+ range (20 ),
254
+ [1 , 2 , 3 ],
255
+ (2 ,),
256
+ {13 , 48 , 211 },
257
+ frozenset ((15 , 8 , 6 )),
258
+ {1 : 2 , 3 : 4 },
259
+ ]
260
+
261
+ non_iterables = [
262
+ None ,
263
+ 42 ,
264
+ 3.0 ,
265
+ 2j ,
266
+ ]
267
+
268
+ def genexpr (self ):
269
+ return (x for x in range (10 ))
270
+
271
+ def genfunc (self ):
272
+ def gen (it ):
273
+ for x in it :
274
+ yield x
275
+ return gen (range (10 ))
276
+
277
+ def process_tests (self , get_generator ):
278
+ for obj in self .iterables :
279
+ g_obj = get_generator (obj )
280
+ with self .subTest (g_obj = g_obj , obj = obj ):
281
+ self .assertListEqual (list (g_obj ), list (obj ))
282
+
283
+ g_iter = get_generator (iter (obj ))
284
+ with self .subTest (g_iter = g_iter , obj = obj ):
285
+ self .assertListEqual (list (g_iter ), list (obj ))
286
+
287
+ err_regex = "'.*' object is not iterable"
288
+ for obj in self .non_iterables :
289
+ g_obj = get_generator (obj )
290
+ with self .subTest (g_obj = g_obj ):
291
+ self .assertRaisesRegex (TypeError , err_regex , list , g_obj )
292
+
293
+ def test_modify_f_locals (self ):
294
+ def modify_f_locals (g , local , obj ):
295
+ g .gi_frame .f_locals [local ] = obj
296
+ return g
297
+
298
+ def get_generator_genexpr (obj ):
299
+ return modify_f_locals (self .genexpr (), '.0' , obj )
300
+
301
+ def get_generator_genfunc (obj ):
302
+ return modify_f_locals (self .genfunc (), 'it' , obj )
303
+
304
+ self .process_tests (get_generator_genexpr )
305
+ self .process_tests (get_generator_genfunc )
306
+
307
+ def test_new_gen_from_gi_code (self ):
308
+ def new_gen_from_gi_code (g , obj ):
309
+ generator_func = types .FunctionType (g .gi_code , {})
310
+ return generator_func (obj )
311
+
312
+ def get_generator_genexpr (obj ):
313
+ return new_gen_from_gi_code (self .genexpr (), obj )
314
+
315
+ def get_generator_genfunc (obj ):
316
+ return new_gen_from_gi_code (self .genfunc (), obj )
317
+
318
+ self .process_tests (get_generator_genexpr )
319
+ self .process_tests (get_generator_genfunc )
320
+
321
+
249
322
class ExceptionTest (unittest .TestCase ):
250
323
# Tests for the issue #23353: check that the currently handled exception
251
324
# is correctly saved/restored in PyEval_EvalFrameEx().
0 commit comments