summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/micropython/viper_large_jump.py20
-rw-r--r--tests/micropython/viper_large_jump.py.exp1
-rw-r--r--tests/stress/recursive_iternext.py64
3 files changed, 43 insertions, 42 deletions
diff --git a/tests/micropython/viper_large_jump.py b/tests/micropython/viper_large_jump.py
new file mode 100644
index 000000000..1c5913dec
--- /dev/null
+++ b/tests/micropython/viper_large_jump.py
@@ -0,0 +1,20 @@
+COUNT = 600
+
+
+try:
+ code = """
+@micropython.viper
+def f() -> int:
+ x = 0
+ while x < 10:
+"""
+ for i in range(COUNT):
+ code += " x += 1\n"
+ code += " return x"
+ exec(code)
+except MemoryError:
+ print("SKIP-TOO-LARGE")
+ raise SystemExit
+
+
+print(f())
diff --git a/tests/micropython/viper_large_jump.py.exp b/tests/micropython/viper_large_jump.py.exp
new file mode 100644
index 000000000..e9f960cf4
--- /dev/null
+++ b/tests/micropython/viper_large_jump.py.exp
@@ -0,0 +1 @@
+600
diff --git a/tests/stress/recursive_iternext.py b/tests/stress/recursive_iternext.py
index bbc389e72..c737f1e36 100644
--- a/tests/stress/recursive_iternext.py
+++ b/tests/stress/recursive_iternext.py
@@ -1,4 +1,8 @@
# This tests that recursion with iternext doesn't lead to segfault.
+#
+# This test segfaults CPython, but that's not a bug as CPython doesn't enforce
+# limits on C recursion - see
+# https://github.com/python/cpython/issues/58218#issuecomment-1093570209
try:
enumerate
filter
@@ -9,49 +13,25 @@ except:
print("SKIP")
raise SystemExit
-# We need to pick an N that is large enough to hit the recursion
-# limit, but not too large that we run out of heap memory.
-try:
- # large stack/heap, eg unix
- [0] * 80000
- N = 5000
-except:
- try:
- # medium, eg pyboard
- [0] * 10000
- N = 1000
- except:
- # small, eg esp8266
- N = 100
-
-try:
- x = (1, 2)
- for i in range(N):
- x = enumerate(x)
- tuple(x)
-except RuntimeError:
- print("RuntimeError")
-try:
+# Progressively build a bigger nested iterator structure (10 at a time for speed),
+# and then try to evaluate it via tuple(x) which makes deep recursive function calls.
+#
+# Eventually this should raise a RuntimeError as MicroPython runs out of stack.
+# It shouldn't ever raise a MemoryError, if it does then somehow MicroPython has
+# run out of heap (for the nested structure) before running out of stack.
+def recurse_iternext(nested_fn):
x = (1, 2)
- for i in range(N):
- x = filter(None, x)
- tuple(x)
-except RuntimeError:
- print("RuntimeError")
+ while True:
+ for _ in range(10):
+ x = nested_fn(x)
+ try:
+ tuple(x)
+ except RuntimeError:
+ print("RuntimeError")
+ break
-try:
- x = (1, 2)
- for i in range(N):
- x = map(max, x, ())
- tuple(x)
-except RuntimeError:
- print("RuntimeError")
-try:
- x = (1, 2)
- for i in range(N):
- x = zip(x)
- tuple(x)
-except RuntimeError:
- print("RuntimeError")
+# Test on various nested iterator structures
+for nested_fn in [enumerate, lambda x: filter(None, x), lambda x: map(max, x, ()), zip]:
+ recurse_iternext(nested_fn)