Improve BUILD_xxx_UNPACK slightly

This commit is contained in:
rocky
2017-01-10 04:33:45 -05:00
parent ad345ef94a
commit a760188724
4 changed files with 46 additions and 19 deletions

Binary file not shown.

View File

@@ -0,0 +1,9 @@
# Bug in Python 3.5 is getting the two star'd arguments right.
def sum(a,b,c,d):
return a + b + c + d
args=(1,2)
sum(*args, *args)
# FIXME: this is handled incorrectly
# (*c,) = (3,4)

View File

@@ -485,8 +485,15 @@ class Python3Parser(PythonParser):
# build_class (see load_build_class)
build_list ::= {expr}^n BUILD_LIST_n
build_list ::= {expr}^n BUILD_TUPLE_n
# Even the below say _list, in the semantic rules we
# disambiguate tuples, and sets from lists
build_list ::= {expr}^n BUILD_LIST_n
build_list ::= {expr}^n BUILD_TUPLE_n
build_list ::= {expr}^n BUILD_SET_n
build_list ::= {expr}^n BUILD_LIST_UNPACK_n
build_list ::= {expr}^n BUILD_SET_UNPACK_n
build_list ::= {expr}^n BUILD_TUPLE_UNPACK_n
load_closure ::= {LOAD_CLOSURE}^n BUILD_TUPLE_n
# call_function (see custom_classfunc_rule)

View File

@@ -1493,23 +1493,29 @@ class SourceWalker(GenericASTTraversal, object):
self.prec = 100
lastnode = node.pop()
lastnodetype = lastnode.type
# If this build list is inside a CALL_FUNCTION_VAR,
# then the first * has already been printed.
# Until I have a better way to check for CALL_FUNCTION_VAR,
# will assume that if the text ends in *.
last_was_star = self.f.getvalue().endswith('*')
have_star = False
if lastnodetype.startswith('BUILD_LIST'):
# 3.5+ has BUILD_LIST_UNPACK
if lastnodetype == 'BUILD_LIST_UNPACK':
# FIXME: need to handle range of BUILD_LIST_UNPACK
have_star = True
endchar = ''
else:
self.write('['); endchar = ']'
elif lastnodetype.startswith('BUILD_TUPLE'):
self.write('('); endchar = ')'
elif lastnodetype.startswith('BUILD_SET'):
self.write('{'); endchar = '}'
elif lastnodetype.startswith('ROT_TWO'):
self.write('('); endchar = ')'
if lastnodetype.endswith('UNPACK'):
# FIXME: need to handle range of BUILD_LIST_UNPACK
have_star = True
endchar = ''
else:
raise 'Internal Error: n_build_list expects list or tuple'
if lastnodetype.startswith('BUILD_LIST'):
self.write('['); endchar = ']'
elif lastnodetype.startswith('BUILD_TUPLE'):
self.write('('); endchar = ')'
elif lastnodetype.startswith('BUILD_SET'):
self.write('{'); endchar = '}'
elif lastnodetype.startswith('ROT_TWO'):
self.write('('); endchar = ')'
else:
raise 'Internal Error: n_build_list expects list or tuple'
flat_elems = []
for elem in node:
@@ -1536,8 +1542,13 @@ class SourceWalker(GenericASTTraversal, object):
sep += '\n' + self.indent + INDENT_PER_LEVEL[:-1]
else:
if sep != '': sep += ' '
if have_star:
sep += '*'
if not last_was_star:
if have_star:
sep += '*'
pass
pass
else:
last_was_star = False
self.write(sep, value)
sep = ','
if lastnode.attr == 1 and lastnodetype.startswith('BUILD_TUPLE'):