diff --git a/uncompyle6/scanners/scanner2.py b/uncompyle6/scanners/scanner2.py index 0e3f6ca3..5773518e 100755 --- a/uncompyle6/scanners/scanner2.py +++ b/uncompyle6/scanners/scanner2.py @@ -121,15 +121,18 @@ class Scanner2(scan.Scanner): if offset in cf: k = 0 for j in cf[offset]: - tokens.append(Token('COME_FROM', None, repr(j), - offset="%s_%d" % (offset, k))) + tokens.append(Token( + 'COME_FROM', None, repr(j), + offset="%s_%d" % (offset, k), + has_arg = True)) k += 1 op = self.code[offset] opname = self.opc.opname[op] oparg = None; pattr = None - if op >= self.opc.HAVE_ARGUMENT: + has_arg = (op >= self.opc.HAVE_ARGUMENT) + if has_arg: oparg = self.get_argument(offset) + extended_arg extended_arg = 0 if op == self.opc.EXTENDED_ARG: @@ -204,9 +207,11 @@ class Scanner2(scan.Scanner): linestart = None if offset not in replace: - tokens.append(Token(opname, oparg, pattr, offset, linestart)) + tokens.append(Token( + opname, oparg, pattr, offset, linestart, op, has_arg)) else: - tokens.append(Token(replace[offset], oparg, pattr, offset, linestart)) + tokens.append(Token( + replace[offset], oparg, pattr, offset, linestart, op, has_arg)) pass pass diff --git a/uncompyle6/scanners/scanner26.py b/uncompyle6/scanners/scanner26.py index 58f0607d..192c7521 100755 --- a/uncompyle6/scanners/scanner26.py +++ b/uncompyle6/scanners/scanner26.py @@ -179,10 +179,12 @@ class Scanner26(scan.Scanner2): k = 0 for j in cf[offset]: tokens.append(Token('COME_FROM', None, repr(j), - offset="%s_%d" % (offset, k) )) + offset="%s_%d" % (offset, k), + has_arg = True)) k += 1 - if self.op_hasArgument(op): + has_arg = (op >= self.opc.HAVE_ARGUMENT) + if has_arg: oparg = self.get_argument(offset) + extended_arg extended_arg = 0 if op == self.opc.EXTENDED_ARG: @@ -282,9 +284,11 @@ class Scanner26(scan.Scanner2): linestart = None if offset not in replace: - tokens.append(Token(op_name, oparg, pattr, offset, linestart)) + tokens.append(Token( + op_name, oparg, pattr, offset, linestart, op, has_arg)) else: - tokens.append(Token(replace[offset], oparg, pattr, offset, linestart)) + tokens.append(Token( + replace[offset], oparg, pattr, offset, linestart, op, has_arg)) pass pass diff --git a/uncompyle6/scanners/scanner3.py b/uncompyle6/scanners/scanner3.py index ce49ed87..cceb028d 100644 --- a/uncompyle6/scanners/scanner3.py +++ b/uncompyle6/scanners/scanner3.py @@ -173,7 +173,8 @@ class Scanner3(scan.Scanner): jump_idx = 0 for jump_offset in jump_targets[inst.offset]: tokens.append(Token('COME_FROM', None, repr(jump_offset), - offset='%s_%s' % (inst.offset, jump_idx))) + offset='%s_%s' % (inst.offset, jump_idx), + has_arg = True)) jump_idx += 1 pass pass @@ -221,8 +222,11 @@ class Scanner3(scan.Scanner): attr = (pos_args, name_pair_args, annotate_args), pattr = pattr, offset = inst.offset, - linestart = inst.starts_line) + linestart = inst.starts_line, + op = op, + has_arg = (op >= op3.HAVE_ARGUMENT) ) + ) continue elif op in self.varargs: pos_args = inst.argval @@ -278,6 +282,8 @@ class Scanner3(scan.Scanner): pattr = pattr, offset = inst.offset, linestart = inst.starts_line, + op = op, + has_arg = (op >= op3.HAVE_ARGUMENT) ) ) pass @@ -374,7 +380,8 @@ class Scanner3(scan.Scanner): # since 2.3 self.detect_structure(offset) - if op >= op3.HAVE_ARGUMENT: + has_arg = (op >= op3.HAVE_ARGUMENT) + if has_arg: label = self.fixed_jumps.get(offset) oparg = code[offset+1] + code[offset+2] * 256 diff --git a/uncompyle6/scanners/tok.py b/uncompyle6/scanners/tok.py index 787285d9..6b9c994f 100644 --- a/uncompyle6/scanners/tok.py +++ b/uncompyle6/scanners/tok.py @@ -20,8 +20,11 @@ class Token: # linestart = starts_line # attr = argval # pattr = argrepr - def __init__(self, type_, attr=None, pattr=None, offset=-1, linestart=None): + def __init__(self, type_, attr=None, pattr=None, offset=-1, + linestart=None, op=None, has_arg=None): self.type = intern(type_) + self.op = op + self.has_arg = has_arg self.attr = attr self.pattr = pattr self.offset = offset @@ -50,7 +53,10 @@ class Token: offset_opname = '%6s %-17s' % (self.offset, self.type) argstr = "%6d " % self.attr if isinstance(self.attr, int) else (' '*7) pattr = self.pattr if self.pattr is not None else '' - return "%s%s%s %r" % (prefix, offset_opname, argstr, pattr) + if self.has_arg: + return "%s%s%s %r" % (prefix, offset_opname, argstr, pattr) + else: + return "%s%s" % (prefix, offset_opname) def __hash__(self): return hash(self.type)