|
22 | 22 |
|
23 | 23 | from __future__ import print_function |
24 | 24 |
|
25 | | -import inspect |
| 25 | +import inspect, sys |
26 | 26 | from collections import namedtuple |
27 | 27 | from array import array |
28 | 28 |
|
29 | 29 | from xdis.code import iscode |
30 | 30 | from xdis.bytecode import findlinestarts |
31 | 31 |
|
32 | 32 | import uncompyle6.scanner as scan |
| 33 | +from uncompyle6 import PYTHON3 |
| 34 | + |
| 35 | +if PYTHON3: |
| 36 | + intern = sys.intern |
33 | 37 |
|
34 | 38 | class Scanner2(scan.Scanner): |
35 | | - def __init__(self, version, show_asm=None): |
| 39 | + def __init__(self, version, show_asm=None, is_pypy=False): |
36 | 40 | scan.Scanner.__init__(self, version, show_asm) |
37 | 41 | self.pop_jump_if = frozenset([self.opc.PJIF, self.opc.PJIT]) |
38 | 42 | self.jump_forward = frozenset([self.opc.JUMP_ABSOLUTE, self.opc.JUMP_FORWARD]) |
@@ -164,6 +168,18 @@ def unmangle(name): |
164 | 168 | elif op in self.opc.hasjrel: |
165 | 169 | pattr = repr(offset + 3 + oparg) |
166 | 170 | elif op in self.opc.hasjabs: |
| 171 | + if self.version == 2.7 and op == self.opc.JUMP_ABSOLUTE: |
| 172 | + target = self.get_target(offset) |
| 173 | + # FIXME: this is a hack to catch stuff like: |
| 174 | + # for ... |
| 175 | + # try: ... |
| 176 | + # except: continue |
| 177 | + # the "continue" is not on a new line. |
| 178 | + n = len(tokens) |
| 179 | + if (n > 2 and |
| 180 | + tokens[-1].type == 'JUMP_BACK' and |
| 181 | + self.code[offset+3] == self.opc.END_FINALLY): |
| 182 | + tokens[-1].type = intern('CONTINUE') |
167 | 183 | pattr = repr(oparg) |
168 | 184 | elif op in self.opc.haslocal: |
169 | 185 | pattr = varnames[oparg] |
|
0 commit comments