Skip to content

Commit

Permalink
pythongh-93678: Address stack exhaustion on WASI
Browse files Browse the repository at this point in the history
Commit 75c0c1b added function calls that increase stack consumption
slightly. This pushed recursion tests over the call stack limit of
wasmtime and broke three tests on wasm32-wasi.

Skip two tests and lower recursion limit of the third test.
  • Loading branch information
tiran committed Jul 26, 2022
1 parent b8c5286 commit 13a38ac
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 4 deletions.
2 changes: 2 additions & 0 deletions Lib/test/test_compile.py
Expand Up @@ -108,6 +108,7 @@ def __getitem__(self, key):
exec('z = a', g, d)
self.assertEqual(d['z'], 12)

@unittest.skipIf(support.is_wasi, "exhausts limited stack on WASI")
def test_extended_arg(self):
# default: 1000 * 2.5 = 2500 repetitions
repeat = int(sys.getrecursionlimit() * 2.5)
Expand Down Expand Up @@ -542,6 +543,7 @@ def test_yet_more_evil_still_undecodable(self):
self.assertIn(b"Non-UTF-8", res.err)

@support.cpython_only
@unittest.skipIf(support.is_wasi, "exhausts limited stack on WASI")
def test_compiler_recursion_limit(self):
# Expected limit is sys.getrecursionlimit() * the scaling factor
# in symtable.c (currently 3)
Expand Down
11 changes: 7 additions & 4 deletions Lib/test/test_dynamic.py
@@ -1,6 +1,7 @@
# Test the most dynamic corner cases of Python's runtime semantics.

import builtins
import sys
import unittest

from test.support import swap_item, swap_attr
Expand Down Expand Up @@ -139,12 +140,14 @@ class MyGlobals(dict):
def __missing__(self, key):
return int(key.removeprefix("_number_"))

code = "lambda: " + "+".join(f"_number_{i}" for i in range(1000))
sum_1000 = eval(code, MyGlobals())
expected = sum(range(1000))
# 1,000 on most systems
limit = sys.getrecursionlimit()
code = "lambda: " + "+".join(f"_number_{i}" for i in range(limit))
sum_func = eval(code, MyGlobals())
expected = sum(range(limit))
# Warm up the the function for quickening (PEP 659)
for _ in range(30):
self.assertEqual(sum_1000(), expected)
self.assertEqual(sum_func(), expected)

if __name__ == "__main__":
unittest.main()

0 comments on commit 13a38ac

Please sign in to comment.