summaryrefslogtreecommitdiffstatshomepage
path: root/tests
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2015-10-15 17:48:28 +0100
committerDamien George <damien.p.george@gmail.com>2015-10-15 17:48:28 +0100
commit4bf3f2d3c0d7769b5a771e58a06c13ee527e657d (patch)
treebe188238e0056d7eff5df5957c8b8173cee3ff96 /tests
parent556c8a9a4f430f56faec4c03c4cb571359f1e773 (diff)
downloadmicropython-4bf3f2d3c0d7769b5a771e58a06c13ee527e657d.tar.gz
micropython-4bf3f2d3c0d7769b5a771e58a06c13ee527e657d.zip
py: Fix with+for+return bug by popping for-iter when unwinding exc stack.
Addresses issue #1182.
Diffstat (limited to 'tests')
-rw-r--r--tests/basics/try_finally_return.py49
-rw-r--r--tests/basics/with_return.py47
2 files changed, 92 insertions, 4 deletions
diff --git a/tests/basics/try_finally_return.py b/tests/basics/try_finally_return.py
index 4adf3f0977..31a507e8d0 100644
--- a/tests/basics/try_finally_return.py
+++ b/tests/basics/try_finally_return.py
@@ -21,3 +21,52 @@ def func3():
print("finally 3")
print(func3())
+
+# for loop within try-finally
+def f():
+ try:
+ for i in [1, 2]:
+ return i
+ finally:
+ print('finally')
+print(f())
+
+# multiple for loops within try-finally
+def f():
+ try:
+ for i in [1, 2]:
+ for j in [3, 4]:
+ return (i, j)
+ finally:
+ print('finally')
+print(f())
+
+# multiple for loops and nested try-finally's
+def f():
+ try:
+ for i in [1, 2]:
+ for j in [3, 4]:
+ try:
+ for k in [5, 6]:
+ for l in [7, 8]:
+ return (i, j, k, l)
+ finally:
+ print('finally 2')
+ finally:
+ print('finally 1')
+print(f())
+
+# multiple for loops that are optimised, and nested try-finally's
+def f():
+ try:
+ for i in range(1, 3):
+ for j in range(3, 5):
+ try:
+ for k in range(5, 7):
+ for l in range(7, 9):
+ return (i, j, k, l)
+ finally:
+ print('finally 2')
+ finally:
+ print('finally 1')
+print(f())
diff --git a/tests/basics/with_return.py b/tests/basics/with_return.py
index cb0135c8b3..fd848f1331 100644
--- a/tests/basics/with_return.py
+++ b/tests/basics/with_return.py
@@ -1,14 +1,53 @@
class CtxMgr:
+ def __init__(self, id):
+ self.id = id
def __enter__(self):
- print("__enter__")
+ print("__enter__", self.id)
return self
def __exit__(self, a, b, c):
- print("__exit__", repr(a), repr(b))
+ print("__exit__", self.id, repr(a), repr(b))
+# simple case
def foo():
- with CtxMgr():
+ with CtxMgr(1):
return 4
-
print(foo())
+
+# for loop within with (iterator needs removing upon return)
+def f():
+ with CtxMgr(1):
+ for i in [1, 2]:
+ return i
+print(f())
+
+# multiple for loops within with
+def f():
+ with CtxMgr(1):
+ for i in [1, 2]:
+ for j in [3, 4]:
+ return (i, j)
+print(f())
+
+# multiple for loops within nested withs
+def f():
+ with CtxMgr(1):
+ for i in [1, 2]:
+ for j in [3, 4]:
+ with CtxMgr(2):
+ for k in [5, 6]:
+ for l in [7, 8]:
+ return (i, j, k, l)
+print(f())
+
+# multiple for loops that are optimised, and nested withs
+def f():
+ with CtxMgr(1):
+ for i in range(1, 3):
+ for j in range(3, 5):
+ with CtxMgr(2):
+ for k in range(5, 7):
+ for l in range(7, 9):
+ return (i, j, k, l)
+print(f())