You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-03 00:45:53 +08:00
Pypy 3.6 fixes and tests
This commit is contained in:
@@ -100,7 +100,7 @@ check-bytecode-3:
|
|||||||
--bytecode-3.1 --bytecode-3.2 --bytecode-3.3 \
|
--bytecode-3.1 --bytecode-3.2 --bytecode-3.3 \
|
||||||
--bytecode-3.4 --bytecode-3.5 --bytecode-3.6 \
|
--bytecode-3.4 --bytecode-3.5 --bytecode-3.6 \
|
||||||
--bytecode-3.7 --bytecode-3.8 \
|
--bytecode-3.7 --bytecode-3.8 \
|
||||||
--bytecode-pypy3.2
|
--bytecode-pypy3.2 --bytecode-pypy3.6
|
||||||
|
|
||||||
#: Check deparsing on selected bytecode 3.x
|
#: Check deparsing on selected bytecode 3.x
|
||||||
check-bytecode-3-short:
|
check-bytecode-3-short:
|
||||||
|
Binary file not shown.
Binary file not shown.
BIN
test/bytecode_pypy3.6/04_class_kwargs.pyc
Normal file
BIN
test/bytecode_pypy3.6/04_class_kwargs.pyc
Normal file
Binary file not shown.
@@ -1453,25 +1453,80 @@ class FragmentsWalker(pysource.SourceWalker, object):
|
|||||||
# as a custom rule
|
# as a custom rule
|
||||||
start = len(self.f.getvalue())
|
start = len(self.f.getvalue())
|
||||||
n = len(node) - 1
|
n = len(node) - 1
|
||||||
|
|
||||||
|
if node.kind != "expr":
|
||||||
|
if node == "kwarg":
|
||||||
|
self.template_engine(("(%[0]{attr}=%c)", 1), node)
|
||||||
|
return
|
||||||
|
|
||||||
|
kwargs = None
|
||||||
assert node[n].kind.startswith("CALL_FUNCTION")
|
assert node[n].kind.startswith("CALL_FUNCTION")
|
||||||
|
|
||||||
|
if node[n].kind.startswith("CALL_FUNCTION_KW"):
|
||||||
|
if self.is_pypy:
|
||||||
|
# FIXME: this doesn't handle positional and keyword args
|
||||||
|
# properly. Need to do something more like that below
|
||||||
|
# in the non-PYPY 3.6 case.
|
||||||
|
self.template_engine(('(%[0]{attr}=%c)', 1), node[n-1])
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
kwargs = node[n - 1].attr
|
||||||
|
|
||||||
|
assert isinstance(kwargs, tuple)
|
||||||
|
i = n - (len(kwargs) + 1)
|
||||||
|
j = 1 + n - node[n].attr
|
||||||
|
else:
|
||||||
|
i = start = n - 2
|
||||||
|
for i in range(start, 0, -1):
|
||||||
|
if not node[i].kind in ["expr", "call", "LOAD_CLASSNAME"]:
|
||||||
|
break
|
||||||
|
pass
|
||||||
|
|
||||||
|
if i == start:
|
||||||
|
return
|
||||||
|
i += 2
|
||||||
|
|
||||||
for i in range(n - 2, 0, -1):
|
for i in range(n - 2, 0, -1):
|
||||||
if not node[i].kind in ["expr", "LOAD_CLASSNAME"]:
|
if not node[i].kind in ["expr", "LOAD_CLASSNAME"]:
|
||||||
break
|
break
|
||||||
pass
|
pass
|
||||||
|
|
||||||
if i == n - 2:
|
|
||||||
return
|
|
||||||
self.write("(")
|
|
||||||
line_separator = ", "
|
line_separator = ", "
|
||||||
sep = ""
|
sep = ""
|
||||||
i += 1
|
i += 1
|
||||||
while i < n:
|
self.write("(")
|
||||||
|
if kwargs:
|
||||||
|
# 3.6+ does this
|
||||||
|
while j < i:
|
||||||
|
self.write(sep)
|
||||||
|
value = self.traverse(node[j])
|
||||||
|
self.write("%s" % value)
|
||||||
|
sep = line_separator
|
||||||
|
j += 1
|
||||||
|
|
||||||
|
j = 0
|
||||||
|
while i < l:
|
||||||
|
self.write(sep)
|
||||||
|
value = self.traverse(node[i])
|
||||||
|
self.write("%s=%s" % (kwargs[j], value))
|
||||||
|
sep = line_separator
|
||||||
|
j += 1
|
||||||
|
i += 1
|
||||||
|
else:
|
||||||
|
while i < l:
|
||||||
value = self.traverse(node[i])
|
value = self.traverse(node[i])
|
||||||
self.node_append(sep, value, node[i])
|
|
||||||
i += 1
|
i += 1
|
||||||
self.write(sep, value)
|
self.write(sep, value)
|
||||||
sep = line_separator
|
sep = line_separator
|
||||||
|
pass
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
if self.version >= 3.6 and node[0] == "LOAD_CONST":
|
||||||
|
return
|
||||||
|
value = self.traverse(node[0])
|
||||||
|
self.write("(")
|
||||||
|
self.write(value)
|
||||||
|
pass
|
||||||
|
|
||||||
self.write(")")
|
self.write(")")
|
||||||
self.set_pos_info(node, start, len(self.f.getvalue()))
|
self.set_pos_info(node, start, len(self.f.getvalue()))
|
||||||
|
@@ -1566,8 +1566,6 @@ class SourceWalker(GenericASTTraversal, object):
|
|||||||
assert node[n].kind.startswith("CALL_FUNCTION")
|
assert node[n].kind.startswith("CALL_FUNCTION")
|
||||||
|
|
||||||
if node[n].kind.startswith("CALL_FUNCTION_KW"):
|
if node[n].kind.startswith("CALL_FUNCTION_KW"):
|
||||||
# 3.6+ starts doing this
|
|
||||||
kwargs = node[n - 1].attr
|
|
||||||
if self.is_pypy:
|
if self.is_pypy:
|
||||||
# FIXME: this doesn't handle positional and keyword args
|
# FIXME: this doesn't handle positional and keyword args
|
||||||
# properly. Need to do something more like that below
|
# properly. Need to do something more like that below
|
||||||
@@ -1575,7 +1573,7 @@ class SourceWalker(GenericASTTraversal, object):
|
|||||||
self.template_engine(('(%[0]{attr}=%c)', 1), node[n-1])
|
self.template_engine(('(%[0]{attr}=%c)', 1), node[n-1])
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
kwargs = node[n-1].attr
|
kwargs = node[n - 1].attr
|
||||||
|
|
||||||
assert isinstance(kwargs, tuple)
|
assert isinstance(kwargs, tuple)
|
||||||
i = n - (len(kwargs) + 1)
|
i = n - (len(kwargs) + 1)
|
||||||
|
Reference in New Issue
Block a user