Skip to content

Commit 3e3102e

Browse files
committed
Add test for generator caller frame
1 parent fc3a29a commit 3e3102e

File tree

1 file changed

+30
-0
lines changed

1 file changed

+30
-0
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_generators.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,36 @@ def f():
256256
# self.assertTrue(isinstance(cm.exception.value, StopIteration))
257257
# self.assertEqual(cm.exception.value.value, 2)
258258

259+
def test_generator_caller_frame(self):
260+
def gen():
261+
yield sys._getframe(1)
262+
yield sys._getframe(1)
263+
264+
def callnext(g):
265+
next(g)
266+
return next(g)
267+
268+
def callsend(g):
269+
next(g)
270+
return g.send(1)
271+
272+
self.assertEqual(callnext(gen()).f_code.co_name, 'callnext')
273+
self.assertEqual(callsend(gen()).f_code.co_name, 'callsend')
274+
275+
# Force a megamorphic call to the genrator function
276+
def genfn(i):
277+
l = {}
278+
exec(f"def f{i}(): yield {i}", l)
279+
return l[f'f{i}']
280+
281+
fns = [genfn(i) for i in range(100)]
282+
fns.append(gen)
283+
for fn in fns:
284+
g = fn()
285+
self.assertEqual(callnext(g).f_code.co_name, 'callnext')
286+
for fn in fns:
287+
g = fn()
288+
self.assertEqual(callsend(g).f_code.co_name, 'callsend')
259289

260290
if sys.version_info.minor == 4 and sys.version_info.micro < 3:
261291
del ExceptionTest

0 commit comments

Comments
 (0)