From 10b95cd9a844c274b0ebce3e605932eccc814f1b Mon Sep 17 00:00:00 2001 From: rocky Date: Sun, 19 Jun 2016 02:31:19 -0400 Subject: [PATCH] Fix * in multi-target assignment --- test/bytecode_3.4/04_multi_assign.pyc | Bin 0 -> 181 bytes test/simple_source/stmts/04_multi_assign.py | 3 +++ uncompyle6/parsers/parse3.py | 15 ++++++++------- uncompyle6/scanners/scanner3.py | 13 +++++++++++-- uncompyle6/semantics/pysource.py | 14 ++++++++++++++ 5 files changed, 36 insertions(+), 9 deletions(-) create mode 100644 test/bytecode_3.4/04_multi_assign.pyc create mode 100644 test/simple_source/stmts/04_multi_assign.py diff --git a/test/bytecode_3.4/04_multi_assign.pyc b/test/bytecode_3.4/04_multi_assign.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6c35efe392ba29c1fb7763b6351187eabb0ae90 GIT binary patch literal 181 zcmaFI!^<_pDlOcdfq~&M5W@j8kmUfx#qvNRm4P9Sks%6*m>_J%C}xHz7KSKRh7<;d zU`<9pO}1MsiACwfx44sYisSQ(;)_#r(r&R7r52amVobcnm~@LVc_l*;JJ2vN@k^~Z zGq)foHNH5%v?w`Mzqll~q*&j;BtEw^rzA5zvA8%hJx{No@)n0pZhlH>PO2Rf$T1*- GhY> 8) & 0xff + pattr = "%d before vararg, %d after" % (before_args, after_args) + argval = (before_args, after_args) + opname = '%s_%d+%d' % (opname, before_args, after_args) elif opname == 'JUMP_ABSOLUTE': pattr = inst.argval target = self.get_target(inst.offset) @@ -171,7 +180,7 @@ class Scanner3(scan.Scanner): tokens.append( Token( type_ = opname, - attr = inst.argval, + attr = argval, pattr = pattr, offset = inst.offset, linestart = inst.starts_line, @@ -308,7 +317,7 @@ class Scanner3(scan.Scanner): designator_ops = set([ STORE_FAST, STORE_NAME, STORE_GLOBAL, STORE_DEREF, STORE_ATTR, - STORE_SUBSCR, UNPACK_SEQUENCE, JUMP_ABSOLUTE + STORE_SUBSCR, UNPACK_SEQUENCE, JUMP_ABSOLUTE, UNPACK_EX ]) # Compose preliminary list of indices with statements, diff --git a/uncompyle6/semantics/pysource.py b/uncompyle6/semantics/pysource.py index ea932203..3e063d6f 100644 --- a/uncompyle6/semantics/pysource.py +++ b/uncompyle6/semantics/pysource.py @@ -1432,6 +1432,20 @@ class SourceWalker(GenericASTTraversal, object): self.prune() def n_unpack(self, node): + if node[0].type.startswith('UNPACK_EX'): + # Python 3+ + before_count, after_count = node[0].attr + for i in range(before_count+1): + self.preorder(node[i]) + if i != 0: + self.write(', ') + self.write('*') + for i in range(1, after_count+2): + self.preorder(node[before_count+i]) + if i != after_count + 1: + self.write(', ') + self.prune() + return for n in node[1:]: if n[0].type == 'unpack': n[0].type = 'unpack_w_parens'