@@ -246,6 +246,79 @@ def loop():
246246 #This should not raise
247247 loop ()
248248
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+
249322class ExceptionTest (unittest .TestCase ):
250323 # Tests for the issue #23353: check that the currently handled exception
251324 # is correctly saved/restored in PyEval_EvalFrameEx().
0 commit comments