Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit079875e

Browse files
gh-125038: Fix crash after genexpr.gi_frame.f_locals manipulations (#125178)
1 parent91ddde4 commit079875e

File tree

4 files changed

+77
-0
lines changed

4 files changed

+77
-0
lines changed

‎Lib/test/test_dis.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -810,6 +810,7 @@ def foo(x):
810810
POP_TOP
811811
L1: RESUME 0
812812
LOAD_FAST 0 (.0)
813+
GET_ITER
813814
L2: FOR_ITER 10 (to L3)
814815
STORE_FAST 1 (z)
815816
LOAD_DEREF 2 (x)

‎Lib/test/test_generators.py‎

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,79 @@ def loop():
268268
#This should not raise
269269
loop()
270270

271+
272+
classModifyUnderlyingIterableTest(unittest.TestCase):
273+
iterables= [
274+
range(0),
275+
range(20),
276+
[1,2,3],
277+
(2,),
278+
{13,48,211},
279+
frozenset((15,8,6)),
280+
{1:2,3:4},
281+
]
282+
283+
non_iterables= [
284+
None,
285+
42,
286+
3.0,
287+
2j,
288+
]
289+
290+
defgenexpr(self):
291+
return (xforxinrange(10))
292+
293+
defgenfunc(self):
294+
defgen(it):
295+
forxinit:
296+
yieldx
297+
returngen(range(10))
298+
299+
defprocess_tests(self,get_generator):
300+
forobjinself.iterables:
301+
g_obj=get_generator(obj)
302+
withself.subTest(g_obj=g_obj,obj=obj):
303+
self.assertListEqual(list(g_obj),list(obj))
304+
305+
g_iter=get_generator(iter(obj))
306+
withself.subTest(g_iter=g_iter,obj=obj):
307+
self.assertListEqual(list(g_iter),list(obj))
308+
309+
err_regex="'.*' object is not iterable"
310+
forobjinself.non_iterables:
311+
g_obj=get_generator(obj)
312+
withself.subTest(g_obj=g_obj):
313+
self.assertRaisesRegex(TypeError,err_regex,list,g_obj)
314+
315+
deftest_modify_f_locals(self):
316+
defmodify_f_locals(g,local,obj):
317+
g.gi_frame.f_locals[local]=obj
318+
returng
319+
320+
defget_generator_genexpr(obj):
321+
returnmodify_f_locals(self.genexpr(),'.0',obj)
322+
323+
defget_generator_genfunc(obj):
324+
returnmodify_f_locals(self.genfunc(),'it',obj)
325+
326+
self.process_tests(get_generator_genexpr)
327+
self.process_tests(get_generator_genfunc)
328+
329+
deftest_new_gen_from_gi_code(self):
330+
defnew_gen_from_gi_code(g,obj):
331+
generator_func=types.FunctionType(g.gi_code, {})
332+
returngenerator_func(obj)
333+
334+
defget_generator_genexpr(obj):
335+
returnnew_gen_from_gi_code(self.genexpr(),obj)
336+
337+
defget_generator_genfunc(obj):
338+
returnnew_gen_from_gi_code(self.genfunc(),obj)
339+
340+
self.process_tests(get_generator_genexpr)
341+
self.process_tests(get_generator_genfunc)
342+
343+
271344
classExceptionTest(unittest.TestCase):
272345
# Tests for the issue #23353: check that the currently handled exception
273346
# is correctly saved/restored in PyEval_EvalFrameEx().
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix crash when iterating over a generator expression after direct changes on ``gi_frame.f_locals``.
2+
Patch by Mikhail Efimov.

‎Python/codegen.c‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4164,6 +4164,7 @@ codegen_sync_comprehension_generator(compiler *c, location loc,
41644164

41654165
if (IS_JUMP_TARGET_LABEL(start)) {
41664166
depth++;
4167+
ADDOP(c,LOC(gen->iter),GET_ITER);
41674168
USE_LABEL(c,start);
41684169
ADDOP_JUMP(c,LOC(gen->iter),FOR_ITER,anchor);
41694170
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp