From 8333e4ae938b2460298dd4be11ecaa7f7087ab6a Mon Sep 17 00:00:00 2001 From: rocky Date: Fri, 20 Jan 2017 20:41:10 -0500 Subject: [PATCH] Handle BUILD_CONST_KEY_MAP as a varargs custom rules with BUILD_CONST_KEY_MAP are pinned to the specific number of args seen. --- uncompyle6/parsers/parse3.py | 2 +- uncompyle6/scanners/scanner3.py | 3 +++ uncompyle6/semantics/pysource.py | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/uncompyle6/parsers/parse3.py b/uncompyle6/parsers/parse3.py index d403b394..37c6bef0 100644 --- a/uncompyle6/parsers/parse3.py +++ b/uncompyle6/parsers/parse3.py @@ -617,7 +617,7 @@ class Python3Parser(PythonParser): self.add_unique_rule(rule, opname, token.attr, customize) rule = "mapexpr ::= %s %s" % (opname, kvlist_n) self.add_unique_rule(rule, opname, token.attr, customize) - elif opname == 'BUILD_CONST_KEY_MAP': + elif opname_base == 'BUILD_CONST_KEY_MAP': # This is in 3.6+ kvlist_n = 'expr ' * (token.attr) rule = "mapexpr ::= %sLOAD_CONST %s" % (kvlist_n, opname) diff --git a/uncompyle6/scanners/scanner3.py b/uncompyle6/scanners/scanner3.py index 8d2b1648..2c3af3f5 100644 --- a/uncompyle6/scanners/scanner3.py +++ b/uncompyle6/scanners/scanner3.py @@ -126,6 +126,9 @@ class Scanner3(Scanner): if is_pypy: varargs_ops.add(self.opc.CALL_METHOD) + if self.version >= 3.6: + varargs_ops.add(self.opc.BUILD_CONST_KEY_MAP) + self.varargs_ops = frozenset(varargs_ops) # FIXME: remove the above in favor of: # self.varargs_ops = frozenset(self.opc.hasvargs) diff --git a/uncompyle6/semantics/pysource.py b/uncompyle6/semantics/pysource.py index 49362578..fbd57b0e 100644 --- a/uncompyle6/semantics/pysource.py +++ b/uncompyle6/semantics/pysource.py @@ -1426,7 +1426,7 @@ class SourceWalker(GenericASTTraversal, object): i += 3 pass pass - elif node[-1].type == 'BUILD_CONST_KEY_MAP': + elif node[-1].type.startswith('BUILD_CONST_KEY_MAP'): # Python 3.6+ style const map keys = node[-2].pattr values = node[:-2]