Correct kw+pos args semantics on 3.3

Sync fragment make_function code
This commit is contained in:
rocky
2016-06-19 21:41:40 -04:00
parent 8b50dda9ef
commit efb4012087
3 changed files with 23 additions and 8 deletions

Binary file not shown.

View File

@@ -1429,17 +1429,26 @@ class FragmentsWalker(pysource.SourceWalker, object):
else: else:
return name return name
# node[-1] == MAKE_FUNCTION_n # MAKE_FUNCTION_... or MAKE_CLOSURE_...
assert node[-1].type.startswith('MAKE_')
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:
# positional args are after kwargs
defparams = node[1:args_node.attr[0]+1]
else:
# positional args are before kwargs
defparams = node[:args_node.attr[0]] defparams = node[:args_node.attr[0]]
kw_args, annotate_args = args_node.attr pos_aargs, kw_args, annotate_args = args_node.attr
else: else:
defparams = node[:args_node.attr] defparams = node[:args_node.attr]
kw_args = (0, 0) kw_args, annotate_args = (0, 0)
pass pass
if self.version > 3.0 and isLambda and iscode(node[-3].attr):
code = node[-3].attr
else:
code = node[code_index].attr code = node[code_index].attr
assert iscode(code) assert iscode(code)

View File

@@ -1697,10 +1697,16 @@ class SourceWalker(GenericASTTraversal, object):
else: else:
return name return name
# node[-1] == MAKE_FUNCTION_n # MAKE_FUNCTION_... or MAKE_CLOSURE_...
assert node[-1].type.startswith('MAKE_')
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:
# positional args are after kwargs
defparams = node[1:args_node.attr[0]+1]
else:
# positional args are before kwargs
defparams = node[:args_node.attr[0]] defparams = node[:args_node.attr[0]]
pos_args, kw_args, annotate_args = args_node.attr pos_args, kw_args, annotate_args = args_node.attr
else: else: