diff --git a/test/bytecode_3.6/02_tryfinally_return.pyc b/test/bytecode_3.6/02_tryfinally_return.pyc new file mode 100644 index 00000000..10f1367e Binary files /dev/null and b/test/bytecode_3.6/02_tryfinally_return.pyc differ diff --git a/test/simple_source/bug36/02_tryfinally_return.py b/test/simple_source/bug36/02_tryfinally_return.py new file mode 100644 index 00000000..67b65baf --- /dev/null +++ b/test/simple_source/bug36/02_tryfinally_return.py @@ -0,0 +1,6 @@ +# Python 3.6 sometimes omits END_FINALLY. See issue #182 +def foo(): + try: + x = 1 + finally: + return diff --git a/uncompyle6/parsers/parse36.py b/uncompyle6/parsers/parse36.py index d0bf2059..f34002d2 100644 --- a/uncompyle6/parsers/parse36.py +++ b/uncompyle6/parsers/parse36.py @@ -106,6 +106,10 @@ class Python36Parser(Python35Parser): COME_FROM_FINALLY suite_stmts_opt END_FINALLY except_suite_finalize ::= SETUP_FINALLY returns COME_FROM_FINALLY suite_stmts_opt END_FINALLY _jump + + stmt ::= tryfinally_return_stmt + tryfinally_return_stmt ::= SETUP_FINALLY suite_stmts_opt POP_BLOCK LOAD_CONST + COME_FROM_FINALLY """ def customize_grammar_rules(self, tokens, customize): diff --git a/uncompyle6/semantics/customize3.py b/uncompyle6/semantics/customize3.py index 1c7f0974..71d37881 100644 --- a/uncompyle6/semantics/customize3.py +++ b/uncompyle6/semantics/customize3.py @@ -507,6 +507,9 @@ def customize_for_version3(self, version): 'try_except36': ( '%|try:\n%+%c%-%c\n\n', 1, 2 ), 'except_return': ( '%|except:\n%+%c%-', 3 ), 'unpack_list': ( '*%c', (0, 'list') ), + 'tryfinally_return_stmt': + ( '%|try:\n%+%c%-%|finally:\n%+%|return%-\n\n', 1 ), + 'call_ex' : ( '%c(%p)', (0, 'expr'), (1, 100)),