File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 55import textwrap
66import threading
77import unittest
8+ import warnings
89import weakref
910try :
1011 import _testcapi
@@ -222,6 +223,30 @@ def test_f_lineno_del_segfault(self):
222223 with self .assertRaises (AttributeError ):
223224 del f .f_lineno
224225
226+ def test_f_lineno_deep_stack_swap (self ):
227+ fors = " " .join (f"for v{ i } in range(1)" for i in range (11 ))
228+ params = ", " .join (f"v{ i } =None" for i in range (11 ))
229+ ns = {}
230+ exec (f"def f({ params } ):\n return [0 { fors } ]\n " , ns )
231+ f = ns ["f" ]
232+
233+ jumped = []
234+
235+ def tracer (frame , event , arg ):
236+ if (event == 'line' and frame .f_code is f .__code__
237+ and not jumped ):
238+ jumped .append (None )
239+ frame .f_lineno = frame .f_lineno
240+ return tracer
241+
242+ with warnings .catch_warnings ():
243+ warnings .simplefilter ('ignore' , RuntimeWarning )
244+ sys .settrace (tracer )
245+ try :
246+ self .assertEqual (f (), [0 ])
247+ finally :
248+ sys .settrace (None )
249+
225250 def test_f_trace (self ):
226251 f , _ , _ = self .make_frames ()
227252 def tracer (* args ):
Original file line number Diff line number Diff line change @@ -1320,7 +1320,8 @@ stack_swap(int64_t stack, int n)
13201320 Kind to_swap = peek (stack , n );
13211321 Kind top = top_of_stack (stack );
13221322 int shift = BITS_PER_BLOCK * (n - 1 );
1323- int64_t replaced_low = (stack & ~(MASK << shift )) | (top << shift );
1323+ int64_t replaced_low = (stack & ~((int64_t )MASK << shift ))
1324+ | ((int64_t )top << shift );
13241325 int64_t replaced_top = (replaced_low & ~MASK ) | to_swap ;
13251326 return replaced_top ;
13261327}
You can’t perform that action at this time.
0 commit comments