diff --git a/Makefile b/Makefile index 4b214c2d..bed6ab6d 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ RM ?= rm LINT = flake8 #EXTRA_DIST=ipython/ipy_trepan.py trepan -PHONY=check clean dist distclean test test-unit test-functional rmChangeLog clean_pyc nosetests +PHONY=check clean dist distclean lint flake8 test test-unit test-functional rmChangeLog clean_pyc nosetests #: Default target - same as "check" all: check @@ -46,7 +46,9 @@ sdist: #: Style check. Set env var LINT to pyflakes, flake, or flake8 -lint: +lint: flake8 + +flake8: $(LINT) uncompyle6 #: Create binary egg distribution diff --git a/test/Makefile b/test/Makefile index 626232da..17eb0c3c 100644 --- a/test/Makefile +++ b/test/Makefile @@ -28,11 +28,14 @@ check-short: check-2.7-ok: $(PYTHON) test_pythonlib.py --ok-2.7 --verify $(COMPILE) -clean: clean-py-dis clean-dis +clean: clean-py-dis clean-dis clean-unverified clean-dis: find . -name '*_dis' -exec rm -v '{}' ';' +clean-unverified: + find . -name '*_unverified' -exec rm -v '{}' ';' + #: Clean temporary compile/decompile/verify direcotries in /tmp clean-py-dis: rm -fr /tmp/py-dis-* || true diff --git a/test/base-tests/python2.7/test_applyEquiv.pyc_dis_unverified b/test/base-tests/python2.7/test_applyEquiv.pyc_dis_unverified deleted file mode 100644 index 986adb39..00000000 --- a/test/base-tests/python2.7/test_applyEquiv.pyc_dis_unverified +++ /dev/null @@ -1,28 +0,0 @@ -# Embedded file name: /src/external-vcs/github/rocky/uncompyle6/test/base-tests/python2/test_applyEquiv.py - - -def kwfunc(**kwargs): - print kwargs.items() - - -def argsfunc(*args): - print args - - -def no_apply(*args, **kwargs): - print args - print kwargs.items() - argsfunc(34) - foo = argsfunc(*args) - argsfunc(*args) - argsfunc(34, *args) - kwfunc(**kwargs) - kwfunc(x=11, **kwargs) - no_apply(*args, **kwargs) - no_apply(34, *args, **kwargs) - no_apply(x=11, *args, **kwargs) - no_apply(34, x=11, *args, **kwargs) - no_apply(42, 34, x=11, *args, **kwargs) - - -no_apply(1, 2, 4, 8, a=2, b=3, c=5) \ No newline at end of file diff --git a/test/base-tests/python2.7/test_augmentedAssign.pyc_dis_unverified b/test/base-tests/python2.7/test_augmentedAssign.pyc_dis_unverified deleted file mode 100644 index 90541b2d..00000000 --- a/test/base-tests/python2.7/test_augmentedAssign.pyc_dis_unverified +++ /dev/null @@ -1,57 +0,0 @@ -# Embedded file name: /src/external-vcs/github/rocky/uncompyle6/test/base-tests/python2/test_augmentedAssign.py -raise "This program can't be run" -a = 1 -b = 2 -a += b -print a -a -= b -print a -a *= b -print a -a -= a -print a -a += 21 -print a -l = [1, 2, 3] -l[1] *= 3 -print l[1] -l[1][2][3] = 7 -l[1][2][3] *= 3 -l[:] += [9] -print l -l[:2] += [9] -print l -l[1:] += [9] -print l -l[1:4] += [9] -print l -l += [42, 43] -print l -a.value = 1 -a.value += 1 -a.b.val = 1 -a.b.val += 1 -l = [] -for i in range(3): - lj = [] - for j in range(3): - lk = [] - for k in range(3): - lk.append(0) - - lj.append(lk) - - l.append(lj) - -i = j = k = 1 - -def f(): - global i - i += 1 - return i - - -l[i][j][k] = 1 -i = 1 -l[f()][j][k] += 1 -print i, l \ No newline at end of file diff --git a/test/base-tests/python2.7/test_class.pyc_dis_unverified b/test/base-tests/python2.7/test_class.pyc_dis_unverified deleted file mode 100644 index 43dfff39..00000000 --- a/test/base-tests/python2.7/test_class.pyc_dis_unverified +++ /dev/null @@ -1,39 +0,0 @@ -# Embedded file name: /src/external-vcs/github/rocky/uncompyle6/test/base-tests/python2/test_class.py - - -class A: - - class A1: - - def __init__(self): - print 'A1.__init__' - - def foo(self): - print 'A1.foo' - - def __init__(self): - print 'A.__init__' - - def foo(self): - print 'A.foo' - - -class B: - - def __init__(self): - print 'B.__init__' - - def bar(self): - print 'B.bar' - - -class C(A, B): - - def foobar(self): - print 'C.foobar' - - -c = C() -c.foo() -c.bar() -c.foobar() \ No newline at end of file diff --git a/test/base-tests/python2.7/test_divide_future.pyc_dis_unverified b/test/base-tests/python2.7/test_divide_future.pyc_dis_unverified deleted file mode 100644 index 9f7bc79f..00000000 --- a/test/base-tests/python2.7/test_divide_future.pyc_dis_unverified +++ /dev/null @@ -1,6 +0,0 @@ -# Embedded file name: /src/external-vcs/github/rocky/uncompyle6/test/base-tests/python2/test_divide_future.py -from __future__ import division -print ' 1 // 2 =', 0 -print '1.0 // 2.0 =', 0.0 -print ' 1 / 2 =', 0.5 -print '1.0 / 2.0 =', 0.5 \ No newline at end of file diff --git a/test/base-tests/python2.7/test_exceptions.pyc_dis_unverified b/test/base-tests/python2.7/test_exceptions.pyc_dis_unverified deleted file mode 100644 index fdc00732..00000000 --- a/test/base-tests/python2.7/test_exceptions.pyc_dis_unverified +++ /dev/null @@ -1,118 +0,0 @@ -# Embedded file name: /src/external-vcs/github/rocky/uncompyle6/test/base-tests/python2/test_exceptions.py -import dis - -def x11(): - try: - a = 'try except' - except: - a = 2 - - b = '--------' - - -def x12(): - try: - a = 'try except else(pass)' - except: - a = 2 - - b = '--------' - - -def x13(): - try: - a = 'try except else(a=3)' - except: - a = 2 - else: - a = 3 - - b = '--------' - - -def x21(): - try: - a = 'try KeyError' - except KeyError: - a = 8 - - b = '--------' - - -def x22(): - try: - a = 'try (IdxErr, KeyError) else(pass)' - except (IndexError, KeyError): - a = 8 - - b = '--------' - - -def x23(): - try: - a = 'try KeyError else(a=9)' - except KeyError: - a = 8 - else: - a = 9 - - b = '--------' - - -def x31(): - try: - a = 'try KeyError IndexError' - except KeyError: - a = 8 - except IndexError: - a = 9 - - b = '--------' - - -def x32(): - try: - a = 'try KeyError IndexError else(pass)' - except KeyError: - a = 8 - except IndexError: - a = 9 - - b = '--------' - - -def x33(): - try: - a = 'try KeyError IndexError else(a=9)' - except KeyError: - a = 8 - except IndexError: - a = 9 - else: - a = 9 - - b = '#################' - - -def x41(): - if a == 1: - a = 1 - elif b == 1: - b = 1 - else: - c = 1 - b = '#################' - - -def x42(): - if a == 1: - a = 1 - elif b == 1: - b = 1 - else: - c = 1 - xxx = 'mmm' - - -if __name__ == '__main__': - dis.dis(xx) \ No newline at end of file diff --git a/test/base-tests/compile_tests b/test/base_tests/compile_tests similarity index 100% rename from test/base-tests/compile_tests rename to test/base_tests/compile_tests diff --git a/test/base-tests/python2.7/test_applyEquiv.py b/test/base_tests/python2.7/test_applyEquiv.py similarity index 100% rename from test/base-tests/python2.7/test_applyEquiv.py rename to test/base_tests/python2.7/test_applyEquiv.py diff --git a/test/base-tests/python2.7/test_augmentedAssign.py b/test/base_tests/python2.7/test_augmentedAssign.py similarity index 100% rename from test/base-tests/python2.7/test_augmentedAssign.py rename to test/base_tests/python2.7/test_augmentedAssign.py diff --git a/test/base-tests/python2.7/test_class.py b/test/base_tests/python2.7/test_class.py similarity index 100% rename from test/base-tests/python2.7/test_class.py rename to test/base_tests/python2.7/test_class.py diff --git a/test/base-tests/python2.7/test_del.py b/test/base_tests/python2.7/test_del.py similarity index 100% rename from test/base-tests/python2.7/test_del.py rename to test/base_tests/python2.7/test_del.py diff --git a/test/base-tests/python2.7/test_divide_future.py b/test/base_tests/python2.7/test_divide_future.py similarity index 100% rename from test/base-tests/python2.7/test_divide_future.py rename to test/base_tests/python2.7/test_divide_future.py diff --git a/test/base-tests/python2.7/test_divide_no_future.py b/test/base_tests/python2.7/test_divide_no_future.py similarity index 100% rename from test/base-tests/python2.7/test_divide_no_future.py rename to test/base_tests/python2.7/test_divide_no_future.py diff --git a/test/base-tests/python2.7/test_docstring.py b/test/base_tests/python2.7/test_docstring.py similarity index 100% rename from test/base-tests/python2.7/test_docstring.py rename to test/base_tests/python2.7/test_docstring.py diff --git a/test/base-tests/python2.7/test_empty.py b/test/base_tests/python2.7/test_empty.py similarity index 100% rename from test/base-tests/python2.7/test_empty.py rename to test/base_tests/python2.7/test_empty.py diff --git a/test/base-tests/python2.7/test_exceptions.py b/test/base_tests/python2.7/test_exceptions.py similarity index 100% rename from test/base-tests/python2.7/test_exceptions.py rename to test/base_tests/python2.7/test_exceptions.py diff --git a/test/base-tests/python2.7/test_exec.py b/test/base_tests/python2.7/test_exec.py similarity index 100% rename from test/base-tests/python2.7/test_exec.py rename to test/base_tests/python2.7/test_exec.py diff --git a/test/base-tests/python2.7/test_expressions.py b/test/base_tests/python2.7/test_expressions.py similarity index 100% rename from test/base-tests/python2.7/test_expressions.py rename to test/base_tests/python2.7/test_expressions.py diff --git a/test/base-tests/python2.7/test_extendedImport.py b/test/base_tests/python2.7/test_extendedImport.py similarity index 100% rename from test/base-tests/python2.7/test_extendedImport.py rename to test/base_tests/python2.7/test_extendedImport.py diff --git a/test/base-tests/python2.7/test_extendedPrint.py b/test/base_tests/python2.7/test_extendedPrint.py similarity index 100% rename from test/base-tests/python2.7/test_extendedPrint.py rename to test/base_tests/python2.7/test_extendedPrint.py diff --git a/test/base-tests/python2.7/test_extendedarg.py-notyet b/test/base_tests/python2.7/test_extendedarg.py-notyet similarity index 100% rename from test/base-tests/python2.7/test_extendedarg.py-notyet rename to test/base_tests/python2.7/test_extendedarg.py-notyet diff --git a/test/base-tests/python2.7/test_functions.py b/test/base_tests/python2.7/test_functions.py similarity index 100% rename from test/base-tests/python2.7/test_functions.py rename to test/base_tests/python2.7/test_functions.py diff --git a/test/base-tests/python2.7/test_global.py b/test/base_tests/python2.7/test_global.py similarity index 100% rename from test/base-tests/python2.7/test_global.py rename to test/base_tests/python2.7/test_global.py diff --git a/test/base-tests/python2.7/test_globals.py b/test/base_tests/python2.7/test_globals.py similarity index 100% rename from test/base-tests/python2.7/test_globals.py rename to test/base_tests/python2.7/test_globals.py diff --git a/test/base-tests/python2.7/test_import.py b/test/base_tests/python2.7/test_import.py similarity index 100% rename from test/base-tests/python2.7/test_import.py rename to test/base_tests/python2.7/test_import.py diff --git a/test/base-tests/python2.7/test_import_as.py b/test/base_tests/python2.7/test_import_as.py similarity index 100% rename from test/base-tests/python2.7/test_import_as.py rename to test/base_tests/python2.7/test_import_as.py diff --git a/test/base-tests/python2.7/test_integers.py b/test/base_tests/python2.7/test_integers.py similarity index 100% rename from test/base-tests/python2.7/test_integers.py rename to test/base_tests/python2.7/test_integers.py diff --git a/test/base-tests/python2.7/test_iterators.py b/test/base_tests/python2.7/test_iterators.py similarity index 100% rename from test/base-tests/python2.7/test_iterators.py rename to test/base_tests/python2.7/test_iterators.py diff --git a/test/base-tests/python2.7/test_lambda.py b/test/base_tests/python2.7/test_lambda.py similarity index 100% rename from test/base-tests/python2.7/test_lambda.py rename to test/base_tests/python2.7/test_lambda.py diff --git a/test/base-tests/python2.7/test_listComprehensions.py b/test/base_tests/python2.7/test_listComprehensions.py similarity index 100% rename from test/base-tests/python2.7/test_listComprehensions.py rename to test/base_tests/python2.7/test_listComprehensions.py diff --git a/test/base-tests/python2.7/test_loops.py b/test/base_tests/python2.7/test_loops.py similarity index 100% rename from test/base-tests/python2.7/test_loops.py rename to test/base_tests/python2.7/test_loops.py diff --git a/test/base-tests/python2.7/test_loops2.py b/test/base_tests/python2.7/test_loops2.py similarity index 100% rename from test/base-tests/python2.7/test_loops2.py rename to test/base_tests/python2.7/test_loops2.py diff --git a/test/base-tests/python2.7/test_mine.py b/test/base_tests/python2.7/test_mine.py similarity index 100% rename from test/base-tests/python2.7/test_mine.py rename to test/base_tests/python2.7/test_mine.py diff --git a/test/base-tests/python2.7/test_misc.py b/test/base_tests/python2.7/test_misc.py similarity index 100% rename from test/base-tests/python2.7/test_misc.py rename to test/base_tests/python2.7/test_misc.py diff --git a/test/base-tests/python2.7/test_nested_elif.py b/test/base_tests/python2.7/test_nested_elif.py similarity index 100% rename from test/base-tests/python2.7/test_nested_elif.py rename to test/base_tests/python2.7/test_nested_elif.py diff --git a/test/base-tests/python2.7/test_nested_scopes.py b/test/base_tests/python2.7/test_nested_scopes.py similarity index 100% rename from test/base-tests/python2.7/test_nested_scopes.py rename to test/base_tests/python2.7/test_nested_scopes.py diff --git a/test/base-tests/python2.7/test_prettyprint.py b/test/base_tests/python2.7/test_prettyprint.py similarity index 100% rename from test/base-tests/python2.7/test_prettyprint.py rename to test/base_tests/python2.7/test_prettyprint.py diff --git a/test/base-tests/python2.7/test_print.py b/test/base_tests/python2.7/test_print.py similarity index 100% rename from test/base-tests/python2.7/test_print.py rename to test/base_tests/python2.7/test_print.py diff --git a/test/base-tests/python2.7/test_print_to.py b/test/base_tests/python2.7/test_print_to.py similarity index 100% rename from test/base-tests/python2.7/test_print_to.py rename to test/base_tests/python2.7/test_print_to.py diff --git a/test/base-tests/python2.7/test_single_stmt.py b/test/base_tests/python2.7/test_single_stmt.py similarity index 100% rename from test/base-tests/python2.7/test_single_stmt.py rename to test/base_tests/python2.7/test_single_stmt.py diff --git a/test/base-tests/python2.7/test_slices.py b/test/base_tests/python2.7/test_slices.py similarity index 100% rename from test/base-tests/python2.7/test_slices.py rename to test/base_tests/python2.7/test_slices.py diff --git a/test/base-tests/python2.7/test_tuple_params.py-notyet b/test/base_tests/python2.7/test_tuple_params.py-notyet similarity index 100% rename from test/base-tests/python2.7/test_tuple_params.py-notyet rename to test/base_tests/python2.7/test_tuple_params.py-notyet diff --git a/test/base-tests/python2.7/test_tuples.py-notyet b/test/base_tests/python2.7/test_tuples.py-notyet similarity index 100% rename from test/base-tests/python2.7/test_tuples.py-notyet rename to test/base_tests/python2.7/test_tuples.py-notyet diff --git a/test/base-tests/python2.7/test_yield.py b/test/base_tests/python2.7/test_yield.py similarity index 100% rename from test/base-tests/python2.7/test_yield.py rename to test/base_tests/python2.7/test_yield.py diff --git a/test/base_tests/python3.4/__init__.py b/test/base_tests/python3.4/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/test/test_pythonlib.py b/test/test_pythonlib.py index 41e7217c..8f0b8df4 100755 --- a/test/test_pythonlib.py +++ b/test/test_pythonlib.py @@ -70,7 +70,7 @@ test_options = { 'ok-2.7': [os.path.join(src_dir, 'ok_2.7'), PYC, 'ok-2.7', 2.7], - 'base-2.7': [os.path.join(src_dir, 'base-tests', 'python2.7'), + 'base-2.7': [os.path.join(src_dir, 'base_tests', 'python2.7'), PYC, 'base_2.7', 2.7], } diff --git a/uncompyle6/__init__.py b/uncompyle6/__init__.py index 3f3ee0eb..c5fbf234 100644 --- a/uncompyle6/__init__.py +++ b/uncompyle6/__init__.py @@ -49,7 +49,7 @@ def _load_file(filename): This function does NOT write any file! ''' fp = open(filename, 'rb') - source = fp.read()+'\n' + source = fp.read().decode('utf-8') + '\n' try: co = compile(source, filename, 'exec', dont_inherit=True) except SyntaxError: @@ -104,13 +104,13 @@ def uncompyle(version, co, out=None, showasm=0, showast=0): # Pick up appropriate scanner if version == 2.7: - import uncompyle6.scanner27 as scan + import uncompyle6.scanners.scanner27 as scan scanner = scan.Scanner27() elif version == 2.6: - import uncompyle6.scanner26 as scan + import uncompyle6.scanners.scanner26 as scan scanner = scan.Scanner26() elif version == 2.5: - import uncompyle6.scanner25 as scan + import uncompyle6.scanners.scanner25 as scan scanner = scan.Scanner25() scanner.setShowAsm(showasm, out) tokens, customize = scanner.disassemble(co) diff --git a/uncompyle6/opcodes/opcode_23.py b/uncompyle6/opcodes/opcode_23.py index b38c4a68..e10cfcfb 100755 --- a/uncompyle6/opcodes/opcode_23.py +++ b/uncompyle6/opcodes/opcode_23.py @@ -1,4 +1,3 @@ - """ opcode module - potentially shared between dis and other modules which operate on bytecodes (e.g. peephole optimizers). @@ -41,6 +40,7 @@ def jabs_op(name, op): hasjabs.append(op) # Instruction opcodes for compiled code +# Blank lines correspond to available opcodes def_op('STOP_CODE', 0) def_op('POP_TOP', 1) diff --git a/uncompyle6/opcodes/opcode_24.py b/uncompyle6/opcodes/opcode_24.py index 9517c431..94ddf22d 100755 --- a/uncompyle6/opcodes/opcode_24.py +++ b/uncompyle6/opcodes/opcode_24.py @@ -1,4 +1,3 @@ - """ opcode module - potentially shared between dis and other modules which operate on bytecodes (e.g. peephole optimizers). @@ -41,6 +40,7 @@ def jabs_op(name, op): hasjabs.append(op) # Instruction opcodes for compiled code +# Blank lines correspond to available opcodes def_op('STOP_CODE', 0) def_op('POP_TOP', 1) diff --git a/uncompyle6/opcodes/opcode_25.py b/uncompyle6/opcodes/opcode_25.py index 4b6f4d71..3a8bf589 100755 --- a/uncompyle6/opcodes/opcode_25.py +++ b/uncompyle6/opcodes/opcode_25.py @@ -1,7 +1,7 @@ -''' +""" opcode module - potentially shared between dis and other modules which operate on bytecodes (e.g. peephole optimizers). -''' +""" cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is', 'is not', 'exception match', 'BAD') diff --git a/uncompyle6/opcodes/opcode_26.py b/uncompyle6/opcodes/opcode_26.py index 092ccfff..06a6cb5d 100755 --- a/uncompyle6/opcodes/opcode_26.py +++ b/uncompyle6/opcodes/opcode_26.py @@ -1,7 +1,7 @@ -''' +""" opcode module - potentially shared between dis and other modules which operate on bytecodes (e.g. peephole optimizers). -''' +""" cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is', 'is not', 'exception match', 'BAD') diff --git a/uncompyle6/opcodes/opcode_27.py b/uncompyle6/opcodes/opcode_27.py index a8267956..696646c2 100755 --- a/uncompyle6/opcodes/opcode_27.py +++ b/uncompyle6/opcodes/opcode_27.py @@ -1,7 +1,7 @@ -''' +""" opcode module - potentially shared between dis and other modules which operate on bytecodes (e.g. peephole optimizers). -''' +""" cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is', 'is not', 'exception match', 'BAD') diff --git a/uncompyle6/opcodes/opcode_34.py b/uncompyle6/opcodes/opcode_34.py new file mode 100644 index 00000000..8e15d13e --- /dev/null +++ b/uncompyle6/opcodes/opcode_34.py @@ -0,0 +1,180 @@ + +""" +opcode module - potentially shared between dis and other modules which +operate on bytecodes (e.g. peephole optimizers). +""" + +__all__ = ["cmp_op", "hasconst", "hasname", "hasjrel", "hasjabs", + "haslocal", "hascompare", "hasfree", "opname", "opmap", + "HAVE_ARGUMENT", "EXTENDED_ARG"] + +cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is', + 'is not', 'exception match', 'BAD') + +hasconst = [] +hasname = [] +hasjrel = [] +hasjabs = [] +haslocal = [] +hascompare = [] +hasfree = [] + +opmap = {} +opname = [''] * 256 +for op in range(256): opname[op] = '<%r>' % (op,) +del op + +def def_op(name, op): + opname[op] = name + opmap[name] = op + +def name_op(name, op): + def_op(name, op) + hasname.append(op) + +def jrel_op(name, op): + def_op(name, op) + hasjrel.append(op) + +def jabs_op(name, op): + def_op(name, op) + hasjabs.append(op) + +# Instruction opcodes for compiled code +# Blank lines correspond to available opcodes + +def_op('STOP_CODE', 0) +def_op('POP_TOP', 1) +def_op('ROT_TWO', 2) +def_op('ROT_THREE', 3) +def_op('DUP_TOP', 4) +def_op('DUP_TOP_TWO', 5) + +def_op('NOP', 9) +def_op('UNARY_POSITIVE', 10) +def_op('UNARY_NEGATIVE', 11) +def_op('UNARY_NOT', 12) + +def_op('UNARY_INVERT', 15) + +def_op('BINARY_POWER', 19) +def_op('BINARY_MULTIPLY', 20) + +def_op('BINARY_MODULO', 22) +def_op('BINARY_ADD', 23) +def_op('BINARY_SUBTRACT', 24) +def_op('BINARY_SUBSCR', 25) +def_op('BINARY_FLOOR_DIVIDE', 26) +def_op('BINARY_TRUE_DIVIDE', 27) +def_op('INPLACE_FLOOR_DIVIDE', 28) +def_op('INPLACE_TRUE_DIVIDE', 29) + +def_op('STORE_MAP', 54) +def_op('INPLACE_ADD', 55) +def_op('INPLACE_SUBTRACT', 56) +def_op('INPLACE_MULTIPLY', 57) + +def_op('INPLACE_MODULO', 59) +def_op('STORE_SUBSCR', 60) +def_op('DELETE_SUBSCR', 61) +def_op('BINARY_LSHIFT', 62) +def_op('BINARY_RSHIFT', 63) +def_op('BINARY_AND', 64) +def_op('BINARY_XOR', 65) +def_op('BINARY_OR', 66) +def_op('INPLACE_POWER', 67) +def_op('GET_ITER', 68) +def_op('STORE_LOCALS', 69) + +def_op('PRINT_EXPR', 70) +def_op('LOAD_BUILD_CLASS', 71) + +def_op('INPLACE_LSHIFT', 75) +def_op('INPLACE_RSHIFT', 76) +def_op('INPLACE_AND', 77) +def_op('INPLACE_XOR', 78) +def_op('INPLACE_OR', 79) +def_op('BREAK_LOOP', 80) +def_op('WITH_CLEANUP', 81) + +def_op('RETURN_VALUE', 83) +def_op('IMPORT_STAR', 84) + +def_op('YIELD_VALUE', 86) +def_op('POP_BLOCK', 87) +def_op('END_FINALLY', 88) +def_op('POP_EXCEPT', 89) + +HAVE_ARGUMENT = 90 # Opcodes from here have an argument: + +name_op('STORE_NAME', 90) # Index in name list +name_op('DELETE_NAME', 91) # "" +def_op('UNPACK_SEQUENCE', 92) # Number of tuple items +jrel_op('FOR_ITER', 93) +def_op('UNPACK_EX', 94) +name_op('STORE_ATTR', 95) # Index in name list +name_op('DELETE_ATTR', 96) # "" +name_op('STORE_GLOBAL', 97) # "" +name_op('DELETE_GLOBAL', 98) # "" +def_op('LOAD_CONST', 100) # Index in const list +hasconst.append(100) +name_op('LOAD_NAME', 101) # Index in name list +def_op('BUILD_TUPLE', 102) # Number of tuple items +def_op('BUILD_LIST', 103) # Number of list items +def_op('BUILD_SET', 104) # Number of set items +def_op('BUILD_MAP', 105) # Number of dict entries (upto 255) +name_op('LOAD_ATTR', 106) # Index in name list +def_op('COMPARE_OP', 107) # Comparison operator +hascompare.append(107) +name_op('IMPORT_NAME', 108) # Index in name list +name_op('IMPORT_FROM', 109) # Index in name list + +jrel_op('JUMP_FORWARD', 110) # Number of bytes to skip +jabs_op('JUMP_IF_FALSE_OR_POP', 111) # Target byte offset from beginning of code +jabs_op('JUMP_IF_TRUE_OR_POP', 112) # "" +jabs_op('JUMP_ABSOLUTE', 113) # "" +jabs_op('POP_JUMP_IF_FALSE', 114) # "" +jabs_op('POP_JUMP_IF_TRUE', 115) # "" + +name_op('LOAD_GLOBAL', 116) # Index in name list + +jabs_op('CONTINUE_LOOP', 119) # Target address +jrel_op('SETUP_LOOP', 120) # Distance to target address +jrel_op('SETUP_EXCEPT', 121) # "" +jrel_op('SETUP_FINALLY', 122) # "" + +def_op('LOAD_FAST', 124) # Local variable number +haslocal.append(124) +def_op('STORE_FAST', 125) # Local variable number +haslocal.append(125) +def_op('DELETE_FAST', 126) # Local variable number +haslocal.append(126) + +def_op('RAISE_VARARGS', 130) # Number of raise arguments (1, 2, or 3) +def_op('CALL_FUNCTION', 131) # #args + (#kwargs << 8) +def_op('MAKE_FUNCTION', 132) # Number of args with default values +def_op('BUILD_SLICE', 133) # Number of items +def_op('MAKE_CLOSURE', 134) +def_op('LOAD_CLOSURE', 135) +hasfree.append(135) +def_op('LOAD_DEREF', 136) +hasfree.append(136) +def_op('STORE_DEREF', 137) +hasfree.append(137) +def_op('DELETE_DEREF', 138) +hasfree.append(138) + +def_op('CALL_FUNCTION_VAR', 140) # #args + (#kwargs << 8) +def_op('CALL_FUNCTION_KW', 141) # #args + (#kwargs << 8) +def_op('CALL_FUNCTION_VAR_KW', 142) # #args + (#kwargs << 8) + +jrel_op('SETUP_WITH', 143) + +def_op('LIST_APPEND', 145) +def_op('SET_ADD', 146) +def_op('MAP_ADD', 147) + +def_op('EXTENDED_ARG', 144) +EXTENDED_ARG = 144 + +del def_op, name_op, jrel_op, jabs_op diff --git a/uncompyle6/scanner.py b/uncompyle6/scanner.py index bbfc9792..248ebc5c 100755 --- a/uncompyle6/scanner.py +++ b/uncompyle6/scanner.py @@ -21,7 +21,7 @@ if (sys.version_info > (3, 0)): else: L65536 = long(65536) -from uncompyle6.opcodes import opcode_25, opcode_26, opcode_27 +from uncompyle6.opcodes import opcode_25, opcode_26, opcode_27, opcode_34 class Token: @@ -84,6 +84,8 @@ class Scanner(object): self.opc = opcode_26 elif version == 2.5: self.opc = opcode_25 + elif version == 3.4: + self.opc = opcode_34 return self.resetTokenClass() diff --git a/uncompyle6/scanners/__init__.py b/uncompyle6/scanners/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/uncompyle6/scanner25.py b/uncompyle6/scanners/scanner25.py old mode 100755 new mode 100644 similarity index 99% rename from uncompyle6/scanner25.py rename to uncompyle6/scanners/scanner25.py index 731dd78b..6ec191d4 --- a/uncompyle6/scanner25.py +++ b/uncompyle6/scanners/scanner25.py @@ -78,7 +78,7 @@ class Scanner25(scan.Scanner): while j < start_byte: self.lines.append(linetuple(prev_line_no, start_byte)) j += 1 - (prev_start_byte, prev_line_no) = (start_byte, line_no) + prev_line_no = start_byte while j < codelen: self.lines.append(linetuple(prev_line_no, codelen)) j+=1 @@ -149,7 +149,7 @@ class Scanner25(scan.Scanner): # verify uses 'pattr' for comparism, since 'attr' # now holds Code(const) and thus can not be used # for comparism (todo: think about changing this) - # pattr = 'code_object @ 0x%x %s->%s' %\ + # pattr = 'code_object @ 0x%x %s->%s' % # (id(const), const.co_filename, const.co_name) pattr = '' else: diff --git a/uncompyle6/scanner26.py b/uncompyle6/scanners/scanner26.py old mode 100755 new mode 100644 similarity index 99% rename from uncompyle6/scanner26.py rename to uncompyle6/scanners/scanner26.py index 4036b6fd..70c80edd --- a/uncompyle6/scanner26.py +++ b/uncompyle6/scanners/scanner26.py @@ -10,7 +10,6 @@ import types from collections import namedtuple from array import array from operator import itemgetter -from struct import * from uncompyle6.opcodes.opcode_26 import * import dis @@ -78,8 +77,7 @@ class Scanner26(scan.Scanner): while j < start_byte: self.lines.append(linetuple(prev_line_no, start_byte)) j += 1 - last_op = self.code[self.prev[start_byte]] - (prev_start_byte, prev_line_no) = (start_byte, line_no) + prev_line_no = line_no while j < codelen: self.lines.append(linetuple(prev_line_no, codelen)) j+=1 diff --git a/uncompyle6/scanner27.py b/uncompyle6/scanners/scanner27.py old mode 100755 new mode 100644 similarity index 99% rename from uncompyle6/scanner27.py rename to uncompyle6/scanners/scanner27.py index 23ac8d28..f3076e2c --- a/uncompyle6/scanner27.py +++ b/uncompyle6/scanners/scanner27.py @@ -55,7 +55,7 @@ class Scanner27(scan.Scanner): while j < start_byte: self.lines.append(linetuple(prev_line_no, start_byte)) j += 1 - (_, prev_line_no) = (start_byte, line_no) + prev_line_no = start_byte while j < n: self.lines.append(linetuple(prev_line_no, n)) j+=1 diff --git a/uncompyle6/scanner34.py b/uncompyle6/scanners/scanner34.py old mode 100755 new mode 100644 similarity index 99% rename from uncompyle6/scanner34.py rename to uncompyle6/scanners/scanner34.py index d3c0804e..149d0e47 --- a/uncompyle6/scanner34.py +++ b/uncompyle6/scanners/scanner34.py @@ -151,7 +151,7 @@ class Scanner34(scan.Scanner): 'end': codelen-1}] # All loop entry points - #self.loops = [] + # self.loops = [] # Map fixed jumps to their real destination self.fixed_jumps = {} self.ignore_if = set() @@ -186,10 +186,9 @@ class Scanner34(scan.Scanner): targets[label] = targets.get(label, []) + [offset] return targets - def build_statement_indices(self): code = self.code - start = 0; + start = 0 end = codelen = len(code) statement_opcodes = { diff --git a/uncompyle6/verify.py b/uncompyle6/verify.py index d2a72220..1b4c640e 100755 --- a/uncompyle6/verify.py +++ b/uncompyle6/verify.py @@ -167,13 +167,13 @@ def cmp_code_objects(version, code_obj1, code_obj2, name=''): pass elif member == 'co_code': if version == 2.7: - import scanner27 as scan + import uncompyle6.scanners.scanner27 as scan scanner = scan.Scanner27() elif version == 2.6: - import scanner26 as scan + import uncompyle6.scanners.scanner26 as scan scanner = scan.Scanner26() elif version == 2.5: - import scanner25 as scan + import uncompyle65.scanners.scanner25 as scan scanner = scan.Scanner25() scanner.setShowAsm( showasm=0 ) global JUMP_OPs