You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-03 16:59:52 +08:00
Pypy 3.6 tolerance
This commit is contained in:
@@ -58,7 +58,7 @@ entry_points = {
|
|||||||
]}
|
]}
|
||||||
ftp_url = None
|
ftp_url = None
|
||||||
install_requires = ['spark-parser >= 1.8.7, < 1.9.0',
|
install_requires = ['spark-parser >= 1.8.7, < 1.9.0',
|
||||||
'xdis >= 4.0.0, < 4.1.0']
|
'xdis >= 4.0.1, < 4.1.0']
|
||||||
|
|
||||||
license = 'GPL3'
|
license = 'GPL3'
|
||||||
mailing_list = 'python-debugger@googlegroups.com'
|
mailing_list = 'python-debugger@googlegroups.com'
|
||||||
|
@@ -308,6 +308,12 @@ pypy-2.7 5.0 5.3 6.0:
|
|||||||
pypy-3.2 2.4:
|
pypy-3.2 2.4:
|
||||||
$(PYTHON) test_pythonlib.py --bytecode-pypy3.2 --verify
|
$(PYTHON) test_pythonlib.py --bytecode-pypy3.2 --verify
|
||||||
|
|
||||||
|
#: PyPy 5.0.x with Python 3.6 ...
|
||||||
|
7.1:
|
||||||
|
$(PYTHON) test_pythonlib.py --bytecode-pypy3.6 --verify
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
clean: clean-py-dis clean-dis clean-unverified
|
clean: clean-py-dis clean-dis clean-unverified
|
||||||
|
|
||||||
clean-dis:
|
clean-dis:
|
||||||
|
@@ -81,7 +81,7 @@ for vers in (2.7, 3.4, 3.5, 3.6):
|
|||||||
for vers in (1.3, 1.4, 1.5,
|
for vers in (1.3, 1.4, 1.5,
|
||||||
2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7,
|
2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7,
|
||||||
3.0, 3.1, 3.2, 3.3,
|
3.0, 3.1, 3.2, 3.3,
|
||||||
3.4, 3.5, 3.6, 3.7, 3.8, 'pypy3.2', 'pypy2.7'):
|
3.4, 3.5, 3.6, 3.7, 3.8, 'pypy3.2', 'pypy2.7', 'pypy3.6'):
|
||||||
bytecode = "bytecode_%s" % vers
|
bytecode = "bytecode_%s" % vers
|
||||||
key = "bytecode-%s" % vers
|
key = "bytecode-%s" % vers
|
||||||
test_options[key] = (bytecode, PYC, bytecode, vers)
|
test_options[key] = (bytecode, PYC, bytecode, vers)
|
||||||
|
@@ -171,7 +171,13 @@ class Python36Parser(Python35Parser):
|
|||||||
for i, token in enumerate(tokens):
|
for i, token in enumerate(tokens):
|
||||||
opname = token.kind
|
opname = token.kind
|
||||||
|
|
||||||
if opname == 'FORMAT_VALUE':
|
if opname == 'LOAD_ASSERT':
|
||||||
|
if 'PyPy' in customize:
|
||||||
|
rules_str = """
|
||||||
|
stmt ::= JUMP_IF_NOT_DEBUG stmts COME_FROM
|
||||||
|
"""
|
||||||
|
self.add_unique_doc_rules(rules_str, customize)
|
||||||
|
elif opname == 'FORMAT_VALUE':
|
||||||
rules_str = """
|
rules_str = """
|
||||||
expr ::= fstring_single
|
expr ::= fstring_single
|
||||||
fstring_single ::= expr FORMAT_VALUE
|
fstring_single ::= expr FORMAT_VALUE
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
# Copyright (c) 2017 by Rocky Bernstein
|
# Copyright (c) 2017, 2019 by Rocky Bernstein
|
||||||
"""
|
"""
|
||||||
Python PyPy 3.2 decompiler scanner.
|
Python PyPy 3.5 decompiler scanner.
|
||||||
|
|
||||||
Does some additional massaging of xdis-disassembled instructions to
|
Does some additional massaging of xdis-disassembled instructions to
|
||||||
make things easier for decompilation.
|
make things easier for decompilation.
|
||||||
|
@@ -19,23 +19,26 @@ JUMP_OPS = opc.JUMP_OPS
|
|||||||
|
|
||||||
class Scanner36(Scanner3):
|
class Scanner36(Scanner3):
|
||||||
|
|
||||||
def __init__(self, show_asm=None):
|
def __init__(self, show_asm=None, is_pypy=False):
|
||||||
Scanner3.__init__(self, 3.6, show_asm)
|
Scanner3.__init__(self, 3.6, show_asm, is_pypy)
|
||||||
return
|
return
|
||||||
|
|
||||||
def ingest(self, co, classname=None, code_objects={}, show_asm=None):
|
def ingest(self, co, classname=None, code_objects={}, show_asm=None):
|
||||||
tokens, customize = Scanner3.ingest(self, co, classname, code_objects, show_asm)
|
tokens, customize = Scanner3.ingest(self, co, classname, code_objects, show_asm)
|
||||||
|
not_pypy36 = not (self.version == 3.6 and self.is_pypy)
|
||||||
for t in tokens:
|
for t in tokens:
|
||||||
# The lowest bit of flags indicates whether the
|
# The lowest bit of flags indicates whether the
|
||||||
# var-keyword argument is placed at the top of the stack
|
# var-keyword argument is placed at the top of the stack
|
||||||
if t.op == self.opc.CALL_FUNCTION_EX and t.attr & 1:
|
if ( not_pypy36 and
|
||||||
|
t.op == self.opc.CALL_FUNCTION_EX and t.attr & 1):
|
||||||
t.kind = 'CALL_FUNCTION_EX_KW'
|
t.kind = 'CALL_FUNCTION_EX_KW'
|
||||||
pass
|
pass
|
||||||
elif t.op == self.opc.CALL_FUNCTION_KW:
|
elif t.op == self.opc.CALL_FUNCTION_KW:
|
||||||
t.kind = 'CALL_FUNCTION_KW_{t.attr}'.format(**locals())
|
t.kind = 'CALL_FUNCTION_KW_{t.attr}'.format(**locals())
|
||||||
elif t.op == self.opc.BUILD_MAP_UNPACK_WITH_CALL:
|
elif ( not_pypy36 and
|
||||||
|
t.op == self.opc.BUILD_MAP_UNPACK_WITH_CALL ):
|
||||||
t.kind = 'BUILD_MAP_UNPACK_WITH_CALL_%d' % t.attr
|
t.kind = 'BUILD_MAP_UNPACK_WITH_CALL_%d' % t.attr
|
||||||
elif t.op == self.opc.BUILD_TUPLE_UNPACK_WITH_CALL:
|
elif ( not_pypy36 and t.op == self.opc.BUILD_TUPLE_UNPACK_WITH_CALL ):
|
||||||
t.kind = 'BUILD_TUPLE_UNPACK_WITH_CALL_%d' % t.attr
|
t.kind = 'BUILD_TUPLE_UNPACK_WITH_CALL_%d' % t.attr
|
||||||
pass
|
pass
|
||||||
return tokens, customize
|
return tokens, customize
|
||||||
|
Reference in New Issue
Block a user