You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-04 01:09:52 +08:00
Improve BUILD_xxx_UNPACK slightly
This commit is contained in:
BIN
test/bytecode_3.5/03_double_star_unpack.pyc
Normal file
BIN
test/bytecode_3.5/03_double_star_unpack.pyc
Normal file
Binary file not shown.
9
test/simple_source/bug35/03_double_star_unpack.py
Normal file
9
test/simple_source/bug35/03_double_star_unpack.py
Normal 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)
|
@@ -485,8 +485,15 @@ class Python3Parser(PythonParser):
|
|||||||
|
|
||||||
# build_class (see load_build_class)
|
# build_class (see load_build_class)
|
||||||
|
|
||||||
build_list ::= {expr}^n BUILD_LIST_n
|
# Even the below say _list, in the semantic rules we
|
||||||
build_list ::= {expr}^n BUILD_TUPLE_n
|
# 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
|
load_closure ::= {LOAD_CLOSURE}^n BUILD_TUPLE_n
|
||||||
# call_function (see custom_classfunc_rule)
|
# call_function (see custom_classfunc_rule)
|
||||||
|
@@ -1493,23 +1493,29 @@ class SourceWalker(GenericASTTraversal, object):
|
|||||||
self.prec = 100
|
self.prec = 100
|
||||||
lastnode = node.pop()
|
lastnode = node.pop()
|
||||||
lastnodetype = lastnode.type
|
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
|
have_star = False
|
||||||
if lastnodetype.startswith('BUILD_LIST'):
|
if lastnodetype.endswith('UNPACK'):
|
||||||
# 3.5+ has BUILD_LIST_UNPACK
|
# FIXME: need to handle range of BUILD_LIST_UNPACK
|
||||||
if lastnodetype == 'BUILD_LIST_UNPACK':
|
have_star = True
|
||||||
# FIXME: need to handle range of BUILD_LIST_UNPACK
|
endchar = ''
|
||||||
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 = ')'
|
|
||||||
else:
|
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 = []
|
flat_elems = []
|
||||||
for elem in node:
|
for elem in node:
|
||||||
@@ -1536,8 +1542,13 @@ class SourceWalker(GenericASTTraversal, object):
|
|||||||
sep += '\n' + self.indent + INDENT_PER_LEVEL[:-1]
|
sep += '\n' + self.indent + INDENT_PER_LEVEL[:-1]
|
||||||
else:
|
else:
|
||||||
if sep != '': sep += ' '
|
if sep != '': sep += ' '
|
||||||
if have_star:
|
if not last_was_star:
|
||||||
sep += '*'
|
if have_star:
|
||||||
|
sep += '*'
|
||||||
|
pass
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
last_was_star = False
|
||||||
self.write(sep, value)
|
self.write(sep, value)
|
||||||
sep = ','
|
sep = ','
|
||||||
if lastnode.attr == 1 and lastnodetype.startswith('BUILD_TUPLE'):
|
if lastnode.attr == 1 and lastnodetype.startswith('BUILD_TUPLE'):
|
||||||
|
Reference in New Issue
Block a user