You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-03 00:45:53 +08:00
Fix a number of small bugs...
test_peynv.py: make Python3 compatible marsh.py: remove duplicate test scanner3.py: fix opcode typo
This commit is contained in:
@@ -19,7 +19,9 @@ Step 2: Run the test:
|
|||||||
test_pyenvlib --mylib --verify # decompile verify 'mylib'
|
test_pyenvlib --mylib --verify # decompile verify 'mylib'
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from uncompyle6 import main, verify
|
from __future__ import print_function
|
||||||
|
|
||||||
|
from uncompyle6 import main, verify, PYTHON3
|
||||||
import os, time, shutil
|
import os, time, shutil
|
||||||
from fnmatch import fnmatch
|
from fnmatch import fnmatch
|
||||||
import glob
|
import glob
|
||||||
@@ -44,12 +46,13 @@ test_options = {
|
|||||||
'2.5': (os.path.join(lib_prefix, 'python2.5'), PYC, 'python-lib2.5'),
|
'2.5': (os.path.join(lib_prefix, 'python2.5'), PYC, 'python-lib2.5'),
|
||||||
'2.6.9': (os.path.join(lib_prefix, '2.6.9', 'python2.6'), PYC, 'python-lib2.6'),
|
'2.6.9': (os.path.join(lib_prefix, '2.6.9', 'python2.6'), PYC, 'python-lib2.6'),
|
||||||
'2.7.10': (os.path.join(lib_prefix, '2.7.10', 'lib', 'python2.7'), PYC, 'python-lib2.7'),
|
'2.7.10': (os.path.join(lib_prefix, '2.7.10', 'lib', 'python2.7'), PYC, 'python-lib2.7'),
|
||||||
'2.7.11': (os.path.join(lib_prefix, '2.7.11', 'lib', 'python2.7'), PYC, 'python-lib2.7')
|
'2.7.11': (os.path.join(lib_prefix, '2.7.11', 'lib', 'python2.7'), PYC, 'python-lib2.7'),
|
||||||
|
'3.4.2': (os.path.join(lib_prefix, '3.4.2', 'lib', 'python3.4'), PYC, 'python-lib3.4')
|
||||||
}
|
}
|
||||||
|
|
||||||
#-----
|
#-----
|
||||||
|
|
||||||
def do_tests(src_dir, patterns, target_dir, start_with=None, do_verify=0):
|
def do_tests(src_dir, patterns, target_dir, start_with=None, do_verify=False):
|
||||||
|
|
||||||
def visitor(files, dirname, names):
|
def visitor(files, dirname, names):
|
||||||
files.extend(
|
files.extend(
|
||||||
@@ -61,7 +64,17 @@ def do_tests(src_dir, patterns, target_dir, start_with=None, do_verify=0):
|
|||||||
files = []
|
files = []
|
||||||
cwd = os.getcwd()
|
cwd = os.getcwd()
|
||||||
os.chdir(src_dir)
|
os.chdir(src_dir)
|
||||||
os.path.walk(os.curdir, visitor, files)
|
if PYTHON3:
|
||||||
|
for root, dirname, names in os.walk(os.curdir):
|
||||||
|
files.extend(
|
||||||
|
[os.path.normpath(os.path.join(root, n))
|
||||||
|
for n in names
|
||||||
|
for pat in patterns
|
||||||
|
if fnmatch(n, pat)])
|
||||||
|
pass
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
os.path.walk(os.curdir, visitor, files)
|
||||||
os.chdir(cwd)
|
os.chdir(cwd)
|
||||||
files.sort()
|
files.sort()
|
||||||
|
|
||||||
@@ -69,13 +82,13 @@ def do_tests(src_dir, patterns, target_dir, start_with=None, do_verify=0):
|
|||||||
try:
|
try:
|
||||||
start_with = files.index(start_with)
|
start_with = files.index(start_with)
|
||||||
files = files[start_with:]
|
files = files[start_with:]
|
||||||
print '>>> starting with file', files[0]
|
print('>>> starting with file', files[0])
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
print time.ctime()
|
print(time.ctime())
|
||||||
main.main(src_dir, target_dir, files, [], do_verify=do_verify)
|
main.main(src_dir, target_dir, files, [], do_verify=do_verify)
|
||||||
print time.ctime()
|
print(time.ctime())
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
import getopt, sys
|
import getopt, sys
|
||||||
@@ -84,7 +97,8 @@ if __name__ == '__main__':
|
|||||||
test_dirs = []
|
test_dirs = []
|
||||||
start_with = None
|
start_with = None
|
||||||
|
|
||||||
test_options_keys = test_options.keys(); test_options_keys.sort()
|
test_options_keys = list(test_options.keys())
|
||||||
|
test_options_keys.sort()
|
||||||
opts, args = getopt.getopt(sys.argv[1:], '',
|
opts, args = getopt.getopt(sys.argv[1:], '',
|
||||||
['start-with=', 'verify', 'all', ] \
|
['start-with=', 'verify', 'all', ] \
|
||||||
+ test_options_keys )
|
+ test_options_keys )
|
||||||
@@ -106,7 +120,7 @@ if __name__ == '__main__':
|
|||||||
shutil.rmtree(target_dir, ignore_errors=1)
|
shutil.rmtree(target_dir, ignore_errors=1)
|
||||||
do_tests(src_dir, pattern, target_dir, start_with, do_verify)
|
do_tests(src_dir, pattern, target_dir, start_with, do_verify)
|
||||||
else:
|
else:
|
||||||
print '### skipping', src_dir
|
print('### skipping', src_dir)
|
||||||
|
|
||||||
# python 1.5:
|
# python 1.5:
|
||||||
|
|
||||||
|
@@ -251,8 +251,6 @@ def load_code_internal(fp, magic_int, bytes_for_s=False,
|
|||||||
strsize = unpack('i', fp.read(4))[0]
|
strsize = unpack('i', fp.read(4))[0]
|
||||||
unicodestring = fp.read(strsize)
|
unicodestring = fp.read(strsize)
|
||||||
return unicodestring.decode('utf-8')
|
return unicodestring.decode('utf-8')
|
||||||
elif marshalType in ['<', '>']:
|
|
||||||
raise KeyError(marshalType)
|
|
||||||
elif marshalType == '?':
|
elif marshalType == '?':
|
||||||
# unknown
|
# unknown
|
||||||
raise KeyError(marshalType)
|
raise KeyError(marshalType)
|
||||||
|
@@ -36,8 +36,10 @@ from uncompyle6 import PYTHON3
|
|||||||
|
|
||||||
# Get all the opcodes into globals
|
# Get all the opcodes into globals
|
||||||
import uncompyle6.opcodes.opcode_33 as op3
|
import uncompyle6.opcodes.opcode_33 as op3
|
||||||
|
|
||||||
globals().update(op3.opmap)
|
globals().update(op3.opmap)
|
||||||
|
|
||||||
|
POP_JUMP_TF = (POP_JUMP_IF_TRUE, POP_JUMP_IF_FALSE)
|
||||||
|
|
||||||
import uncompyle6.scanner as scan
|
import uncompyle6.scanner as scan
|
||||||
|
|
||||||
@@ -677,7 +679,7 @@ class Scanner3(scan.Scanner):
|
|||||||
jump_back = self.last_instr(start, end, RETURN_VALUE) + 1
|
jump_back = self.last_instr(start, end, RETURN_VALUE) + 1
|
||||||
if not jump_back:
|
if not jump_back:
|
||||||
return
|
return
|
||||||
if code[self.prev_op[next_line_byte]] not in (PJIF, PJIT):
|
if code[self.prev_op[next_line_byte]] not in POP_JUMP_TF:
|
||||||
loop_type = 'for'
|
loop_type = 'for'
|
||||||
else:
|
else:
|
||||||
loop_type = 'while'
|
loop_type = 'while'
|
||||||
@@ -718,7 +720,7 @@ class Scanner3(scan.Scanner):
|
|||||||
self.structs.append({'type': loop_type + '-else',
|
self.structs.append({'type': loop_type + '-else',
|
||||||
'start': jump_back+3,
|
'start': jump_back+3,
|
||||||
'end': end})
|
'end': end})
|
||||||
elif op in (POP_JUMP_IF_FALSE, POP_JUMP_IF_TRUE):
|
elif op in POP_JUMP_TF:
|
||||||
start = offset + self.op_size(op)
|
start = offset + self.op_size(op)
|
||||||
target = self.get_target(offset)
|
target = self.get_target(offset)
|
||||||
rtarget = self.restrict_to_parent(target, parent)
|
rtarget = self.restrict_to_parent(target, parent)
|
||||||
@@ -757,11 +759,11 @@ class Scanner3(scan.Scanner):
|
|||||||
if (code[prev_op[prev_op[rtarget]]] == JUMP_ABSOLUTE and self.remove_mid_line_ifs([offset]) and
|
if (code[prev_op[prev_op[rtarget]]] == JUMP_ABSOLUTE and self.remove_mid_line_ifs([offset]) and
|
||||||
target == self.get_target(prev_op[prev_op[rtarget]]) and
|
target == self.get_target(prev_op[prev_op[rtarget]]) and
|
||||||
(prev_op[prev_op[rtarget]] not in self.stmts or self.get_target(prev_op[prev_op[rtarget]]) > prev_op[prev_op[rtarget]]) and
|
(prev_op[prev_op[rtarget]] not in self.stmts or self.get_target(prev_op[prev_op[rtarget]]) > prev_op[prev_op[rtarget]]) and
|
||||||
1 == len(self.remove_mid_line_ifs(self.rem_or(start, prev_op[prev_op[rtarget]], (POP_JUMP_IF_FALSE, POP_JUMP_IF_TRUE), target)))):
|
1 == len(self.remove_mid_line_ifs(self.rem_or(start, prev_op[prev_op[rtarget]], POP_JUMP_TF, target)))):
|
||||||
pass
|
pass
|
||||||
elif (code[prev_op[prev_op[rtarget]]] == RETURN_VALUE and self.remove_mid_line_ifs([offset]) and
|
elif (code[prev_op[prev_op[rtarget]]] == RETURN_VALUE and self.remove_mid_line_ifs([offset]) and
|
||||||
1 == (len(set(self.remove_mid_line_ifs(self.rem_or(start, prev_op[prev_op[rtarget]],
|
1 == (len(set(self.remove_mid_line_ifs(self.rem_or(start, prev_op[prev_op[rtarget]],
|
||||||
(POP_JUMP_IF_FALSE, POP_JUMP_IF_TRUE), target))) |
|
POP_JUMP_TF, target))) |
|
||||||
set(self.remove_mid_line_ifs(self.rem_or(start, prev_op[prev_op[rtarget]],
|
set(self.remove_mid_line_ifs(self.rem_or(start, prev_op[prev_op[rtarget]],
|
||||||
(POP_JUMP_IF_FALSE, POP_JUMP_IF_TRUE, JUMP_ABSOLUTE),
|
(POP_JUMP_IF_FALSE, POP_JUMP_IF_TRUE, JUMP_ABSOLUTE),
|
||||||
prev_op[rtarget], True)))))):
|
prev_op[rtarget], True)))))):
|
||||||
@@ -898,8 +900,8 @@ class Scanner3(scan.Scanner):
|
|||||||
# For each offset, if line number of current and next op
|
# For each offset, if line number of current and next op
|
||||||
# is the same
|
# is the same
|
||||||
if self.lines[if_].l_no == self.lines[if_+3].l_no:
|
if self.lines[if_].l_no == self.lines[if_+3].l_no:
|
||||||
# Check if last op on line is PJIT or PJIF, and if it is - skip it
|
# Skip last op on line if it is some sort of POP_JUMP.
|
||||||
if self.code[self.prev_op[self.lines[if_].next]] in (POP_JUMP_IF_TRUE, POP_JUMP_IF_FALSE):
|
if self.code[self.prev_op[self.lines[if_].next]] in POP_JUMP_TF:
|
||||||
continue
|
continue
|
||||||
filtered.append(if_)
|
filtered.append(if_)
|
||||||
return filtered
|
return filtered
|
||||||
|
Reference in New Issue
Block a user