From 13a38ac01fdaa9e69c13f17b3137c21aafcc96ed Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Tue, 26 Jul 2022 21:26:42 +0200 Subject: [PATCH] gh-93678: Address stack exhaustion on WASI Commit 75c0c1b9 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. --- Lib/test/test_compile.py | 2 ++ Lib/test/test_dynamic.py | 11 +++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 11940bec492d89..e6194460b787d3 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -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) @@ -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) diff --git a/Lib/test/test_dynamic.py b/Lib/test/test_dynamic.py index 3e0fcf4d158f8a..e896fc703c9a8b 100644 --- a/Lib/test/test_dynamic.py +++ b/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 @@ -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()