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'
"""
from uncompyle6 import main, verify
from __future__ import print_function
from uncompyle6 import main, verify, PYTHON3
import os, time, shutil
from fnmatch import fnmatch
import glob
@@ -44,12 +46,13 @@ test_options = {
'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.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):
files.extend(
@@ -61,6 +64,16 @@ def do_tests(src_dir, patterns, target_dir, start_with=None, do_verify=0):
files = []
cwd = os.getcwd()
os.chdir(src_dir)
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)
files.sort()
@@ -69,13 +82,13 @@ def do_tests(src_dir, patterns, target_dir, start_with=None, do_verify=0):
try:
start_with = files.index(start_with)
files = files[start_with:]
print '>>> starting with file', files[0]
print('>>> starting with file', files[0])
except ValueError:
pass
print time.ctime()
print(time.ctime())
main.main(src_dir, target_dir, files, [], do_verify=do_verify)
print time.ctime()
print(time.ctime())
if __name__ == '__main__':
import getopt, sys
@@ -84,7 +97,8 @@ if __name__ == '__main__':
test_dirs = []
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:], '',
['start-with=', 'verify', 'all', ] \
+ test_options_keys )
@@ -106,7 +120,7 @@ if __name__ == '__main__':
shutil.rmtree(target_dir, ignore_errors=1)
do_tests(src_dir, pattern, target_dir, start_with, do_verify)
else:
print '### skipping', src_dir
print('### skipping', src_dir)
# 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]
unicodestring = fp.read(strsize)
return unicodestring.decode('utf-8')
elif marshalType in ['<', '>']:
raise KeyError(marshalType)
elif marshalType == '?':
# unknown
raise KeyError(marshalType)

View File

@@ -36,8 +36,10 @@ from uncompyle6 import PYTHON3
# Get all the opcodes into globals
import uncompyle6.opcodes.opcode_33 as op3
globals().update(op3.opmap)
POP_JUMP_TF = (POP_JUMP_IF_TRUE, POP_JUMP_IF_FALSE)
import uncompyle6.scanner as scan
@@ -677,7 +679,7 @@ class Scanner3(scan.Scanner):
jump_back = self.last_instr(start, end, RETURN_VALUE) + 1
if not jump_back:
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'
else:
loop_type = 'while'
@@ -718,7 +720,7 @@ class Scanner3(scan.Scanner):
self.structs.append({'type': loop_type + '-else',
'start': jump_back+3,
'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)
target = self.get_target(offset)
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
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
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
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]],
(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]],
(POP_JUMP_IF_FALSE, POP_JUMP_IF_TRUE, JUMP_ABSOLUTE),
prev_op[rtarget], True)))))):
@@ -898,8 +900,8 @@ class Scanner3(scan.Scanner):
# For each offset, if line number of current and next op
# is the same
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
if self.code[self.prev_op[self.lines[if_].next]] in (POP_JUMP_IF_TRUE, POP_JUMP_IF_FALSE):
# 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_TF:
continue
filtered.append(if_)
return filtered