diff --git a/test/bytecode_pypy2.7/03_map.pyc b/test/bytecode_pypy2.7/03_map.pyc new file mode 100644 index 00000000..20147c35 Binary files /dev/null and b/test/bytecode_pypy2.7/03_map.pyc differ 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'):