From 281f429223de2d57faf5f1b9322d33dcd82fb62e Mon Sep 17 00:00:00 2001 From: rocky Date: Mon, 25 Jul 2016 17:50:19 -0400 Subject: [PATCH] Handle PyPy BUILD_MAP_0 where actual kw_args > 0 --- test/bytecode_pypy2.7/03_map.pyc | Bin 0 -> 738 bytes uncompyle6/parser.py | 4 +++- uncompyle6/parsers/parse2.py | 14 +++++++++++--- 3 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 test/bytecode_pypy2.7/03_map.pyc diff --git a/test/bytecode_pypy2.7/03_map.pyc b/test/bytecode_pypy2.7/03_map.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20147c35cb6e1a9748dee652b946ae0e8f010a69 GIT binary patch literal 738 zcmYMxSyR(s7{&2Z%33IUSqlg%78i;w6c+?h+!a(d<)%|Onc~h06xgfu zfoY{598dMGyb$u{D+c>?7uUUh|j-TG;TZq literal 0 HcmV?d00001 diff --git a/uncompyle6/parser.py b/uncompyle6/parser.py index bafc121c..e985beb6 100644 --- a/uncompyle6/parser.py +++ b/uncompyle6/parser.py @@ -69,7 +69,9 @@ class PythonParser(GenericASTBuilder): return token.type def nonterminal(self, nt, args): - collect = ('stmts', 'exprlist', 'kvlist', '_stmts', 'print_items', 'kwargs') + collect = ('stmts', 'exprlist', 'kvlist', '_stmts', 'print_items', 'kwargs', + # PYPY: + 'kvlist_n') if nt in collect and len(args) > 1: # diff --git a/uncompyle6/parsers/parse2.py b/uncompyle6/parsers/parse2.py index d500382f..3a1d7f20 100644 --- a/uncompyle6/parsers/parse2.py +++ b/uncompyle6/parsers/parse2.py @@ -280,9 +280,17 @@ class Python2Parser(PythonParser): opname_base, v, customize) continue elif opname_base == 'BUILD_MAP': - kvlist_n = "kvlist_%s" % v - rule = kvlist_n + ' ::= ' + ' kv3' * v - self.add_unique_rule(rule, opname_base, v, customize) + if v == 0: # and self.is_pypy: + # PyPy sometimes has no count. Sigh. + kvlist_n = 'kvlist_n' + rule = 'kvlist_n ::= kvlist_n kv3' + self.add_unique_rule(rule, opname_base, v, customize) + rule = 'kvlist_n ::=' + self.add_unique_rule(rule, opname_base, v, customize) + else: + kvlist_n = "kvlist_%s" % v + rule = kvlist_n + ' ::= ' + ' kv3' * v + self.add_unique_rule(rule, opname_base, v, customize) rule = "mapexpr ::= %s %s" % (opname, kvlist_n) self.add_unique_rule(rule, opname_base, v, customize) elif opname_base in ('UNPACK_TUPLE', 'UNPACK_SEQUENCE'):