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:
rocky
2016-05-16 21:31:02 -04:00
parent 09bf364d89
commit f69c76c351
3 changed files with 31 additions and 17 deletions

View File

@@ -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:

View File

@@ -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)

View File

@@ -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