diff --git a/test/bytecode_2.7_run/04_assert_continue.pyc b/test/bytecode_2.7_run/04_assert_continue.pyc-notyet similarity index 100% rename from test/bytecode_2.7_run/04_assert_continue.pyc rename to test/bytecode_2.7_run/04_assert_continue.pyc-notyet diff --git a/test/simple_source/bug24/03_iftrue.py b/test/simple_source/bug24/03_iftrue.py new file mode 100644 index 00000000..8d22a8a7 --- /dev/null +++ b/test/simple_source/bug24/03_iftrue.py @@ -0,0 +1,10 @@ +# Python 2.4 (and before?) bug in handling unconditional "else if true" +# Doesn't occur in Python > 2.4 +# From Issue #187 +def unconditional_if_true_24(foo): + if not foo: + pass + elif 1: + pass + else: + return None diff --git a/test/simple_source/bug27+/06_raise.py b/test/simple_source/bug27+/06_raise.py new file mode 100644 index 00000000..c042aa5f --- /dev/null +++ b/test/simple_source/bug27+/06_raise.py @@ -0,0 +1,22 @@ +# Bug in Python 2.7 is code creating a (useless) JUMP_ABSOLUTE to the instruction right after +# the "raise" which causes the + +# RUNNABLE! +def testit(a, b): + if a: + if not b: + raise AssertionError("test JUMP_ABSOLUTE to next instruction") + +def testit2(a, b): + if a: + if not b: + raise AssertionError("test with dead code after raise") + x = 10 + +testit(False, True) +testit(False, False) +testit(True, True) + +testit2(False, True) +testit2(False, False) +testit2(True, True) diff --git a/test/simple_source/bug31/01_try_else.py b/test/simple_source/bug31/01_try_else.py index c49dedde..e0c2bc2d 100644 --- a/test/simple_source/bug31/01_try_else.py +++ b/test/simple_source/bug31/01_try_else.py @@ -4,6 +4,7 @@ # try. In 3.x we not distinguising this jump out of the loop with a jump to the # end of the "try". +# RUNNABLE! def testit(stmts): # Bug was confusing When the except jumps back to the beginning of the block diff --git a/test/simple_source/bug36/03_if_try.py b/test/simple_source/bug36/03_if_try.py new file mode 100644 index 00000000..ac4ad545 --- /dev/null +++ b/test/simple_source/bug36/03_if_try.py @@ -0,0 +1,8 @@ +# The bug in python 3.6+ was in parsing that we +# add END_IF_THEN and using that inside "return results" +def whcms_license_info(md5hash, datahash, results): + if md5hash == datahash: + try: + return md5hash + except: + return results diff --git a/uncompyle6/parsers/parse2.py b/uncompyle6/parsers/parse2.py index 0b1287df..3a675f66 100644 --- a/uncompyle6/parsers/parse2.py +++ b/uncompyle6/parsers/parse2.py @@ -533,14 +533,11 @@ class Python2Parser(PythonParser): # Dead code testing... # if lhs == 'while1elsestmt': # from trepan.api import debug; debug() - if lhs in ('aug_assign1', 'aug_assign2') and ast[0] and ast[0][0] in ('and', 'or'): return True elif lhs in ('raise_stmt1',): - # We will assme 'LOAD_ASSERT' will be handled by an assert grammar rule - return (tokens[first] == 'LOAD_ASSERT' and - (last >= len(tokens) or tokens[last] not in - ('COME_FROM', 'JUMP_BACK','JUMP_FORWARD'))) + # We will assume 'LOAD_ASSERT' will be handled by an assert grammar rule + return (tokens[first] == 'LOAD_ASSERT' and (last >= len(tokens))) elif rule == ('or', ('expr', 'jmp_true', 'expr', '\\e_come_from_opt')): expr2 = ast[2] return expr2 == 'expr' and expr2[0] == 'LOAD_ASSERT' diff --git a/uncompyle6/parsers/parse27.py b/uncompyle6/parsers/parse27.py index e2b6b945..b22d1f5a 100644 --- a/uncompyle6/parsers/parse27.py +++ b/uncompyle6/parsers/parse27.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016-2018 Rocky Bernstein +# Copyright (c) 2016-2019 Rocky Bernstein # Copyright (c) 2005 by Dan Pascu # Copyright (c) 2000-2002 by hartmut Goebel @@ -228,6 +228,12 @@ class Python27Parser(Python2Parser): tokens[last].pattr == jmp_false.pattr) elif rule[0] == ('raise_stmt1'): return ast[0] == 'expr' and ast[0][0] == 'or' + elif rule[0] in ('assert', 'assert2'): + jump_inst = ast[1][0] + jump_target = jump_inst.attr + return not (last >= len(tokens) + or jump_target == tokens[last].offset + or jump_target == next_offset(ast[-1].op, ast[-1].opc, ast[-1].offset)) elif rule == ('list_if_not', ('expr', 'jmp_true', 'list_iter')): jump_inst = ast[1][0] jump_offset = jump_inst.attr