Fix Python 3.x named param and kwargs bug

This commit is contained in:
rocky
2016-09-02 06:30:39 -04:00
parent f5eeed6759
commit 136f935e26
4 changed files with 20 additions and 7 deletions

Binary file not shown.

View File

@@ -0,0 +1,4 @@
# Python 3.6 subprocess.py bug
# Bug is getting params correct: timeout before **kwargs
def call(*popenargs, timeout=None, **kwargs):
return

View File

@@ -392,9 +392,15 @@ class Scanner2(scan.Scanner):
stmts.remove(s) stmts.remove(s)
continue continue
elif code[s] == self.opc.POP_TOP: elif code[s] == self.opc.POP_TOP:
# The POP_TOP in:
# ROT_TWO, POP_TOP or
# JUMP_IF_{FALSE,TRUE}, POP_TOP
# is part of the previous instruction and not the
# beginning of a new statement
prev = code[self.prev[s]] prev = code[self.prev[s]]
if (prev == self.opc.ROT_TWO or if (prev == self.opc.ROT_TWO or
self.version <= 2.6 and prev == self.opc.JUMP_IF_FALSE): self.version <= 2.6 and prev in
(self.opc.JUMP_IF_FALSE, self.opc.JUMP_IF_TRUE)):
stmts.remove(s) stmts.remove(s)
continue continue
elif code[s] in self.designator_ops: elif code[s] in self.designator_ops:

View File

@@ -2021,23 +2021,21 @@ class SourceWalker(GenericASTTraversal, object):
return return
# build parameters # build parameters
params = [build_param(ast, name, default) for params = [build_param(ast, name, default) for
name, default in zip_longest(paramnames, defparams, fillvalue=None)] name, default in zip_longest(paramnames, defparams, fillvalue=None)]
params.reverse() # back to correct order params.reverse() # back to correct order
kw_pairs = 0
if 4 & code.co_flags: # flag 2 -> variable number of args if 4 & code.co_flags: # flag 2 -> variable number of args
if self.version > 3.0: if self.version > 3.0:
params.append('*%s' % code.co_varnames[argc + args_node.attr[1]]) kw_pairs = args_node.attr[1]
params.append('*%s' % code.co_varnames[argc + kw_pairs])
else: else:
params.append('*%s' % code.co_varnames[argc]) params.append('*%s' % code.co_varnames[argc])
argc += 1 argc += 1
if 8 & code.co_flags: # flag 3 -> keyword args
params.append('**%s' % code.co_varnames[argc])
argc += 1
# dump parameter list (with default values) # dump parameter list (with default values)
indent = self.indent indent = self.indent
if isLambda: if isLambda:
@@ -2063,6 +2061,11 @@ class SourceWalker(GenericASTTraversal, object):
break break
pass pass
if 8 & code.co_flags: # flag 3 -> keyword args
if argc > 0:
self.write(', ')
self.write('**%s' % code.co_varnames[argc + kw_pairs])
if isLambda: if isLambda:
self.write(": ") self.write(": ")
else: else: