From 2d11ffb669bb57aebcac72c3d645d9de619fda8f Mon Sep 17 00:00:00 2001 From: rocky Date: Thu, 8 Sep 2016 03:54:57 -0400 Subject: [PATCH] Python 3.0-3.2 *args processing --- uncompyle6/parsers/parse3.py | 2 +- uncompyle6/semantics/pysource.py | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/uncompyle6/parsers/parse3.py b/uncompyle6/parsers/parse3.py index 529f809d..18923a4a 100644 --- a/uncompyle6/parsers/parse3.py +++ b/uncompyle6/parsers/parse3.py @@ -619,7 +619,7 @@ class Python3Parser(PythonParser): # FIXME: kwarg processing is missing here. # Note order of kwargs and pos args changed between 3.3-3.4 if self.version <= 3.2: - rule = ('mkfunc ::= %sload_closure LOAD_CONST kwargs %s' + rule = ('mkfunc ::= kwargs %sload_closure LOAD_CONST kwargs %s' % ('expr ' * args_pos, opname)) elif self.version == 3.3: rule = ('mkfunc ::= kwargs %sload_closure LOAD_CONST LOAD_CONST %s' diff --git a/uncompyle6/semantics/pysource.py b/uncompyle6/semantics/pysource.py index 76f639bf..6fb3a8ec 100644 --- a/uncompyle6/semantics/pysource.py +++ b/uncompyle6/semantics/pysource.py @@ -2002,7 +2002,7 @@ class SourceWalker(GenericASTTraversal, object): args_node = node[-1] if isinstance(args_node.attr, tuple): - if self.version == 3.3: + if self.version <= 3.3: # positional args are after kwargs defparams = node[1:args_node.attr[0]+1] else: @@ -2049,6 +2049,7 @@ class SourceWalker(GenericASTTraversal, object): return kw_pairs = args_node.attr[1] if self.version >= 3.0 else 0 + indent = self.indent # build parameters if not 3.0 <= self.version <= 3.2: @@ -2064,8 +2065,6 @@ class SourceWalker(GenericASTTraversal, object): argc += 1 # dump parameter list (with default values) - indent = self.indent - if isLambda: self.write("lambda ", ", ".join(params)) else: @@ -2077,6 +2076,11 @@ class SourceWalker(GenericASTTraversal, object): self.write("lambda ") else: self.write("(") + + if 4 & code.co_flags: # flag 2 -> variable number of args + self.write('*%s' % code.co_varnames[argc + kw_pairs]) + argc += 1 + i = len(paramnames) - len(defparams) self.write(",".join(paramnames[:i])) suffix = ', ' if i > 0 else ''