diff --git a/test/bytecode_2.7/05_for_try_except.pyc b/test/bytecode_2.7/05_for_try_except.pyc new file mode 100644 index 00000000..decefe67 Binary files /dev/null and b/test/bytecode_2.7/05_for_try_except.pyc differ diff --git a/test/simple_source/bug27+/05_for_try_except.py b/test/simple_source/bug27+/05_for_try_except.py new file mode 100644 index 00000000..f96bd16f --- /dev/null +++ b/test/simple_source/bug27+/05_for_try_except.py @@ -0,0 +1,11 @@ +# Issue #38 in Python 2.7 +# Problem is distinguishing 'continue' from 'jump_back' +# in assembly instructions. + +# Here, we hack looking for two jump backs +# followed by the end of the except. This +# is a big hack. + +for a in [__name__]: + try:len(a) + except:continue diff --git a/uncompyle6/scanners/scanner2.py b/uncompyle6/scanners/scanner2.py index 6b49dba2..28ead94a 100755 --- a/uncompyle6/scanners/scanner2.py +++ b/uncompyle6/scanners/scanner2.py @@ -32,7 +32,7 @@ from xdis.bytecode import findlinestarts import uncompyle6.scanner as scan class Scanner2(scan.Scanner): - def __init__(self, version, show_asm=None): + def __init__(self, version, show_asm=None, is_pypy=False): scan.Scanner.__init__(self, version, show_asm) self.pop_jump_if = frozenset([self.opc.PJIF, self.opc.PJIT]) self.jump_forward = frozenset([self.opc.JUMP_ABSOLUTE, self.opc.JUMP_FORWARD]) @@ -164,6 +164,18 @@ class Scanner2(scan.Scanner): elif op in self.opc.hasjrel: pattr = repr(offset + 3 + oparg) elif op in self.opc.hasjabs: + if self.version == 2.7 and op == self.opc.JUMP_ABSOLUTE: + target = self.get_target(offset) + # FIXME: this is a hack to catch stuff like: + # for ... + # try: ... + # except: continue + # the "continue" is not on a new line. + n = len(tokens) + if (n > 2 and + tokens[-1].type == 'JUMP_BACK' and + self.code[offset+3] == self.opc.END_FINALLY): + tokens[-1].type = intern('CONTINUE') pattr = repr(oparg) elif op in self.opc.haslocal: pattr = varnames[oparg]