Python 3.0-3.2 *args processing

This commit is contained in:
rocky
2016-09-08 03:54:57 -04:00
parent b7f1f1b028
commit 2d11ffb669
2 changed files with 8 additions and 4 deletions

View File

@@ -619,7 +619,7 @@ class Python3Parser(PythonParser):
# FIXME: kwarg processing is missing here. # FIXME: kwarg processing is missing here.
# Note order of kwargs and pos args changed between 3.3-3.4 # Note order of kwargs and pos args changed between 3.3-3.4
if self.version <= 3.2: 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)) % ('expr ' * args_pos, opname))
elif self.version == 3.3: elif self.version == 3.3:
rule = ('mkfunc ::= kwargs %sload_closure LOAD_CONST LOAD_CONST %s' rule = ('mkfunc ::= kwargs %sload_closure LOAD_CONST LOAD_CONST %s'

View File

@@ -2002,7 +2002,7 @@ class SourceWalker(GenericASTTraversal, object):
args_node = node[-1] args_node = node[-1]
if isinstance(args_node.attr, tuple): if isinstance(args_node.attr, tuple):
if self.version == 3.3: if self.version <= 3.3:
# positional args are after kwargs # positional args are after kwargs
defparams = node[1:args_node.attr[0]+1] defparams = node[1:args_node.attr[0]+1]
else: else:
@@ -2049,6 +2049,7 @@ class SourceWalker(GenericASTTraversal, object):
return return
kw_pairs = args_node.attr[1] if self.version >= 3.0 else 0 kw_pairs = args_node.attr[1] if self.version >= 3.0 else 0
indent = self.indent
# build parameters # build parameters
if not 3.0 <= self.version <= 3.2: if not 3.0 <= self.version <= 3.2:
@@ -2064,8 +2065,6 @@ class SourceWalker(GenericASTTraversal, object):
argc += 1 argc += 1
# dump parameter list (with default values) # dump parameter list (with default values)
indent = self.indent
if isLambda: if isLambda:
self.write("lambda ", ", ".join(params)) self.write("lambda ", ", ".join(params))
else: else:
@@ -2077,6 +2076,11 @@ class SourceWalker(GenericASTTraversal, object):
self.write("lambda ") self.write("lambda ")
else: else:
self.write("(") 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) i = len(paramnames) - len(defparams)
self.write(",".join(paramnames[:i])) self.write(",".join(paramnames[:i]))
suffix = ', ' if i > 0 else '' suffix = ', ' if i > 0 else ''