diff options
author | Damien George <damien.p.george@gmail.com> | 2015-10-15 17:48:28 +0100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2015-10-15 17:48:28 +0100 |
commit | 4bf3f2d3c0d7769b5a771e58a06c13ee527e657d (patch) | |
tree | be188238e0056d7eff5df5957c8b8173cee3ff96 /tests | |
parent | 556c8a9a4f430f56faec4c03c4cb571359f1e773 (diff) | |
download | micropython-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.py | 49 | ||||
-rw-r--r-- | tests/basics/with_return.py | 47 |
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()) |