From a309a77ea7c559ff29a522ee06eca6a56eac65cc Mon Sep 17 00:00:00 2001 From: rocky Date: Thu, 17 Dec 2015 18:49:16 -0500 Subject: [PATCH] Python3: remove "return None" at end of main for uncompyle. Fix up verify for Python3. First automated Python 3.4 tests via "makecheck-3.4" in test directory. --- .travis.yml | 2 +- Makefile | 9 +- circle.yml | 2 +- pytest/test_disasm.py | 4 +- pytest/testdata/if-2.7.right | 13 + pytest/testdata/ifelse-2.7.right | 16 + pytest/testdata/test1.right | 88 - test/Makefile | 22 +- test/bytecode_2.5/test_applyEquiv.pyc | Bin 844 -> 0 bytes test/bytecode_2.5/test_augmentedAssign.pyc | Bin 1323 -> 0 bytes test/bytecode_2.5/test_class.pyc | Bin 1884 -> 0 bytes test/bytecode_2.5/test_del.pyc | Bin 796 -> 0 bytes test/bytecode_2.5/test_docstring.pyc | Bin 1518 -> 0 bytes test/bytecode_2.5/test_exceptions.pyc | Bin 2777 -> 0 bytes test/bytecode_2.5/test_exec.pyc | Bin 193 -> 0 bytes test/bytecode_2.5/test_expressions.pyc | Bin 341 -> 0 bytes test/bytecode_2.5/test_extendedImport.pyc | Bin 540 -> 0 bytes test/bytecode_2.5/test_functions.pyc | Bin 2438 -> 0 bytes test/bytecode_2.5/test_global.pyc | Bin 840 -> 0 bytes test/bytecode_2.5/test_globals.pyc | Bin 312 -> 0 bytes test/bytecode_2.5/test_import.pyc | Bin 754 -> 0 bytes test/bytecode_2.5/test_import_as.pyc | Bin 888 -> 0 bytes test/bytecode_2.5/test_integers.pyc | Bin 721 -> 0 bytes test/bytecode_2.5/test_iterators.pyc | Bin 216 -> 0 bytes test/bytecode_2.5/test_lambda.pyc | Bin 994 -> 0 bytes test/bytecode_2.5/test_listComprehensions.pyc | Bin 1158 -> 0 bytes test/bytecode_2.5/test_loops.pyc | Bin 742 -> 0 bytes test/bytecode_2.5/test_misc.pyc | Bin 1001 -> 0 bytes test/bytecode_2.5/test_nested_scopes.pyc | Bin 4012 -> 0 bytes test/bytecode_2.5/test_prettyprint.pyc | Bin 2586 -> 0 bytes test/bytecode_2.5/test_slices.pyc | Bin 1033 -> 0 bytes test/bytecode_2.5/test_tuple_params.pyc | Bin 1171 -> 0 bytes test/bytecode_2.5/test_tuples.pyc | Bin 791 -> 0 bytes test/bytecode_2.5/test_yield.pyc | Bin 720 -> 0 bytes test/bytecode_2.7/README | 1 + test/bytecode_2.7/keyword.pyc | Bin 182 -> 0 bytes test/bytecode_2.7/positional.pyc | Bin 159 -> 0 bytes test/bytecode_2.7/test1.pyc | Bin 1821 -> 0 bytes test/bytecode_3.2/add.cpython-32.pyc | Bin 0 -> 125 bytes test/bytecode_3.2/and.cpython-32.pyc | Bin 0 -> 125 bytes test/bytecode_3.4/README | 1 + test/bytecode_3.4/add.pyc | Bin 0 -> 136 bytes test/bytecode_3.4/and.pyc | Bin 0 -> 136 bytes test/bytecode_3.4/keyword.pyc | Bin 158 -> 0 bytes test/bytecode_3.4/positional.pyc | Bin 144 -> 0 bytes test/ok_2.7/bsddb/__init__.py | 455 ------ test/ok_2.7/bsddb/db.py | 60 - test/ok_2.7/bsddb/dbobj.py | 266 --- test/ok_2.7/bsddb/dbrecio.py | 190 --- test/ok_2.7/bsddb/dbshelve.py | 381 ----- test/ok_2.7/bsddb/dbutils.py | 83 - test/ok_2.7/compiler/__init__.py | 31 - test/ok_2.7/compiler/ast.py | 1419 ----------------- test/ok_2.7/compiler/consts.py | 23 - test/ok_2.7/compiler/future.py | 74 - test/ok_2.7/compiler/misc.py | 73 - test/ok_2.7/compiler/syntax.py | 46 - test/ok_2.7/ctypes/_endian.py | 64 - test/ok_2.7/ctypes/util.py | 287 ---- test/ok_2.7/ctypes/wintypes.py | 185 --- test/ok_2.7/curses/__init__.py | 59 - test/ok_2.7/curses/ascii.py | 99 -- test/ok_2.7/curses/has_key.py | 192 --- test/ok_2.7/curses/panel.py | 8 - test/ok_2.7/curses/wrapper.py | 50 - test/ok_2.7/dircache.py | 41 - test/ok_2.7/dis.py | 224 --- test/ok_lib2.6/README | 2 + test/{ok_2.6 => ok_lib2.6}/anydbm.py | 0 test/ok_lib2.7/README | 2 + test/{ok_2.7 => ok_lib2.7}/aifc.py | 0 test/ok_lib2.7/aifc.pyc | Bin 0 -> 33373 bytes test/{ok_2.7 => ok_lib2.7}/antigravity.py | 0 test/ok_lib2.7/antigravity.pyc | Bin 0 -> 243 bytes test/{ok_2.7 => ok_lib2.7}/anydbm.py | 0 test/ok_lib2.7/anydbm.pyc | Bin 0 -> 2920 bytes test/{ok_2.7 => ok_lib2.7}/asynchat.py | 0 test/ok_lib2.7/asynchat.pyc | Bin 0 -> 9840 bytes test/{ok_2.7 => ok_lib2.7}/asyncore.py | 0 test/{ok_2.7 => ok_lib2.7}/atexit.py | 0 test/ok_lib2.7/atexit.pyc | Bin 0 -> 2443 bytes test/{ok_2.7 => ok_lib2.7}/audiodev.py | 0 test/ok_lib2.7/audiodev.pyc | Bin 0 -> 9548 bytes test/{ok_2.7 => ok_lib2.7}/base64.py | 0 test/ok_lib2.7/base64.pyc | Bin 0 -> 11608 bytes test/{ok_2.7 => ok_lib2.7}/binhex.py | 0 test/ok_lib2.7/binhex.pyc | Bin 0 -> 17440 bytes test/{ok_2.7 => ok_lib2.7}/bisect.py | 0 test/ok_lib2.7/bisect.pyc | Bin 0 -> 3271 bytes test/{ok_2.7 => ok_lib2.7}/calendar.py | 0 test/ok_lib2.7/calendar.pyc | Bin 0 -> 30945 bytes test/{ok_2.7 => ok_lib2.7}/cgitb.py | 0 test/ok_lib2.7/cgitb.pyc | Bin 0 -> 12904 bytes test/{ok_2.7 => ok_lib2.7}/chunk.py | 0 test/ok_lib2.7/chunk.pyc | Bin 0 -> 6031 bytes test/{ok_2.7 => ok_lib2.7}/codeop.py | 0 test/ok_lib2.7/codeop.pyc | Bin 0 -> 6997 bytes test/{ok_2.7 => ok_lib2.7}/colorsys.py | 0 test/ok_lib2.7/colorsys.pyc | Bin 0 -> 4311 bytes test/{ok_2.7 => ok_lib2.7}/commands.py | 0 test/ok_lib2.7/commands.pyc | Bin 0 -> 2709 bytes test/{ok_2.7 => ok_lib2.7}/compileall.py | 0 test/ok_lib2.7/compileall.pyc | Bin 0 -> 7256 bytes test/simple-source/operation_binary/add.py | 5 + test/simple-source/operation_binary/and.py | 5 + .../operation_binary/divide_floor.py | 1 + .../operation_binary/divide_true.py | 1 + test/simple-source/operation_binary/modulo.py | 1 + test/test_pythonlib.py | 8 +- uncompyle6/__init__.py | 2 +- uncompyle6/deparser.py | 12 +- uncompyle6/disas.py | 6 +- uncompyle6/opcodes/opcode_34.py | 5 + uncompyle6/parsers/spark.py | 9 +- uncompyle6/scanners/scanner27.py | 4 +- uncompyle6/scanners/scanner34.py | 5 + uncompyle6/verify.py | 15 +- uncompyle6/walker.py | 8 +- 118 files changed, 129 insertions(+), 4430 deletions(-) create mode 100644 pytest/testdata/if-2.7.right create mode 100644 pytest/testdata/ifelse-2.7.right delete mode 100644 pytest/testdata/test1.right delete mode 100644 test/bytecode_2.5/test_applyEquiv.pyc delete mode 100644 test/bytecode_2.5/test_augmentedAssign.pyc delete mode 100644 test/bytecode_2.5/test_class.pyc delete mode 100644 test/bytecode_2.5/test_del.pyc delete mode 100644 test/bytecode_2.5/test_docstring.pyc delete mode 100644 test/bytecode_2.5/test_exceptions.pyc delete mode 100644 test/bytecode_2.5/test_exec.pyc delete mode 100644 test/bytecode_2.5/test_expressions.pyc delete mode 100644 test/bytecode_2.5/test_extendedImport.pyc delete mode 100644 test/bytecode_2.5/test_functions.pyc delete mode 100644 test/bytecode_2.5/test_global.pyc delete mode 100644 test/bytecode_2.5/test_globals.pyc delete mode 100644 test/bytecode_2.5/test_import.pyc delete mode 100644 test/bytecode_2.5/test_import_as.pyc delete mode 100644 test/bytecode_2.5/test_integers.pyc delete mode 100644 test/bytecode_2.5/test_iterators.pyc delete mode 100644 test/bytecode_2.5/test_lambda.pyc delete mode 100644 test/bytecode_2.5/test_listComprehensions.pyc delete mode 100644 test/bytecode_2.5/test_loops.pyc delete mode 100644 test/bytecode_2.5/test_misc.pyc delete mode 100644 test/bytecode_2.5/test_nested_scopes.pyc delete mode 100644 test/bytecode_2.5/test_prettyprint.pyc delete mode 100644 test/bytecode_2.5/test_slices.pyc delete mode 100644 test/bytecode_2.5/test_tuple_params.pyc delete mode 100644 test/bytecode_2.5/test_tuples.pyc delete mode 100644 test/bytecode_2.5/test_yield.pyc create mode 100644 test/bytecode_2.7/README delete mode 100644 test/bytecode_2.7/keyword.pyc delete mode 100644 test/bytecode_2.7/positional.pyc delete mode 100644 test/bytecode_2.7/test1.pyc create mode 100644 test/bytecode_3.2/add.cpython-32.pyc create mode 100644 test/bytecode_3.2/and.cpython-32.pyc create mode 100644 test/bytecode_3.4/README create mode 100644 test/bytecode_3.4/add.pyc create mode 100644 test/bytecode_3.4/and.pyc delete mode 100644 test/bytecode_3.4/keyword.pyc delete mode 100644 test/bytecode_3.4/positional.pyc delete mode 100644 test/ok_2.7/bsddb/__init__.py delete mode 100644 test/ok_2.7/bsddb/db.py delete mode 100644 test/ok_2.7/bsddb/dbobj.py delete mode 100644 test/ok_2.7/bsddb/dbrecio.py delete mode 100644 test/ok_2.7/bsddb/dbshelve.py delete mode 100644 test/ok_2.7/bsddb/dbutils.py delete mode 100644 test/ok_2.7/compiler/__init__.py delete mode 100644 test/ok_2.7/compiler/ast.py delete mode 100644 test/ok_2.7/compiler/consts.py delete mode 100644 test/ok_2.7/compiler/future.py delete mode 100644 test/ok_2.7/compiler/misc.py delete mode 100644 test/ok_2.7/compiler/syntax.py delete mode 100644 test/ok_2.7/ctypes/_endian.py delete mode 100644 test/ok_2.7/ctypes/util.py delete mode 100644 test/ok_2.7/ctypes/wintypes.py delete mode 100644 test/ok_2.7/curses/__init__.py delete mode 100644 test/ok_2.7/curses/ascii.py delete mode 100644 test/ok_2.7/curses/has_key.py delete mode 100644 test/ok_2.7/curses/panel.py delete mode 100644 test/ok_2.7/curses/wrapper.py delete mode 100644 test/ok_2.7/dircache.py delete mode 100644 test/ok_2.7/dis.py create mode 100644 test/ok_lib2.6/README rename test/{ok_2.6 => ok_lib2.6}/anydbm.py (100%) create mode 100644 test/ok_lib2.7/README rename test/{ok_2.7 => ok_lib2.7}/aifc.py (100%) create mode 100644 test/ok_lib2.7/aifc.pyc rename test/{ok_2.7 => ok_lib2.7}/antigravity.py (100%) create mode 100644 test/ok_lib2.7/antigravity.pyc rename test/{ok_2.7 => ok_lib2.7}/anydbm.py (100%) create mode 100644 test/ok_lib2.7/anydbm.pyc rename test/{ok_2.7 => ok_lib2.7}/asynchat.py (100%) create mode 100644 test/ok_lib2.7/asynchat.pyc rename test/{ok_2.7 => ok_lib2.7}/asyncore.py (100%) rename test/{ok_2.7 => ok_lib2.7}/atexit.py (100%) create mode 100644 test/ok_lib2.7/atexit.pyc rename test/{ok_2.7 => ok_lib2.7}/audiodev.py (100%) create mode 100644 test/ok_lib2.7/audiodev.pyc rename test/{ok_2.7 => ok_lib2.7}/base64.py (100%) create mode 100644 test/ok_lib2.7/base64.pyc rename test/{ok_2.7 => ok_lib2.7}/binhex.py (100%) create mode 100644 test/ok_lib2.7/binhex.pyc rename test/{ok_2.7 => ok_lib2.7}/bisect.py (100%) create mode 100644 test/ok_lib2.7/bisect.pyc rename test/{ok_2.7 => ok_lib2.7}/calendar.py (100%) create mode 100644 test/ok_lib2.7/calendar.pyc rename test/{ok_2.7 => ok_lib2.7}/cgitb.py (100%) create mode 100644 test/ok_lib2.7/cgitb.pyc rename test/{ok_2.7 => ok_lib2.7}/chunk.py (100%) create mode 100644 test/ok_lib2.7/chunk.pyc rename test/{ok_2.7 => ok_lib2.7}/codeop.py (100%) create mode 100644 test/ok_lib2.7/codeop.pyc rename test/{ok_2.7 => ok_lib2.7}/colorsys.py (100%) create mode 100644 test/ok_lib2.7/colorsys.pyc rename test/{ok_2.7 => ok_lib2.7}/commands.py (100%) create mode 100644 test/ok_lib2.7/commands.pyc rename test/{ok_2.7 => ok_lib2.7}/compileall.py (100%) create mode 100644 test/ok_lib2.7/compileall.pyc create mode 100644 test/simple-source/operation_binary/add.py create mode 100644 test/simple-source/operation_binary/and.py create mode 100644 test/simple-source/operation_binary/divide_floor.py create mode 100644 test/simple-source/operation_binary/divide_true.py create mode 100644 test/simple-source/operation_binary/modulo.py diff --git a/.travis.yml b/.travis.yml index 1d1e836c..da733a9d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,4 +6,4 @@ python: - '2.7' script: -- python ./setup.py develop && COMPILE='--compile' make test +- python ./setup.py develop && COMPILE='--compile' make check-2.7 diff --git a/Makefile b/Makefile index 7379af4c..1a5b711c 100644 --- a/Makefile +++ b/Makefile @@ -17,11 +17,16 @@ PHONY=check clean pytest dist distclean lint flake8 test test-unit test-function all: check #: Same as "check" -test check: pytest check-short +test check: pytest check-long + +#: Run tests +check-long: pytest + $(MAKE) -C test check-2.7 #: Run tests check-short: pytest - $(MAKE) -C test $@ + $(MAKE) -C test check-short-2.7 + #: check that disassembly exactly matches Python lib's dis check-disasm: diff --git a/circle.yml b/circle.yml index 91e316f4..832f2be5 100644 --- a/circle.yml +++ b/circle.yml @@ -9,4 +9,4 @@ dependencies: - pip install -r test-requirements.txt test: override: - - python ./setup.py develop && make check + - python ./setup.py develop && make check-2.7 diff --git a/pytest/test_disasm.py b/pytest/test_disasm.py index 9b299ee1..d0a36caa 100644 --- a/pytest/test_disasm.py +++ b/pytest/test_disasm.py @@ -13,11 +13,11 @@ os.chdir(src_dir) @pytest.mark.parametrize(("test_tuple", "function_to_test"), [ ( - ('../test/bytecode_2.5/test_import.pyc', 'testdata/test_import_25.right',), + ('../test/bytecode_2.7/if.pyc', 'testdata/if-2.7.right',), disassemble_file ), ( - ('../test/bytecode_2.7/test1.pyc', 'testdata/test1.right',), + ('../test/bytecode_2.7/ifelse.pyc', 'testdata/ifelse-2.7.right',), disassemble_file ), ]) diff --git a/pytest/testdata/if-2.7.right b/pytest/testdata/if-2.7.right new file mode 100644 index 00000000..19a3ac61 --- /dev/null +++ b/pytest/testdata/if-2.7.right @@ -0,0 +1,13 @@ +# Python 2.7 +# Embedded file name: ./source_3.4/branching/if.py + + 1 0 LOAD_NAME 'a' + 3 POP_JUMP_IF_FALSE '15' + + 2 6 LOAD_NAME 'c' + 9 STORE_NAME 'b' + 12 JUMP_FORWARD '15' + 15_0 COME_FROM '12' + 15 LOAD_CONST '' + 18 RETURN_VALUE '' + diff --git a/pytest/testdata/ifelse-2.7.right b/pytest/testdata/ifelse-2.7.right new file mode 100644 index 00000000..120b901b --- /dev/null +++ b/pytest/testdata/ifelse-2.7.right @@ -0,0 +1,16 @@ +# Python 2.7 +# Embedded file name: ./source_3.4/branching/ifelse.py + + 1 0 LOAD_NAME 'a' + 3 POP_JUMP_IF_FALSE '15' + + 2 6 LOAD_NAME 'c' + 9 STORE_NAME 'b' + 12 JUMP_FORWARD '21' + + 4 15 LOAD_NAME 'e' + 18 STORE_NAME 'd' + 21_0 COME_FROM '12' + 21 LOAD_CONST '' + 24 RETURN_VALUE '' + diff --git a/pytest/testdata/test1.right b/pytest/testdata/test1.right deleted file mode 100644 index 224c13d9..00000000 --- a/pytest/testdata/test1.right +++ /dev/null @@ -1,88 +0,0 @@ -# Python 2.7 -# Embedded file name: /src/external-vcs/github/rocky/python-uncompyle6/__pkginfo__.py - - 1 0 LOAD_CONST 'uncompyle6 packaging information' - 3 STORE_NAME '__doc__' - - 13 6 LOAD_CONST '\nCopyright (C) 2015 Rocky Bernstein .\n' - 9 STORE_NAME 'copyright' - - 15 12 LOAD_CONST 'Development Status :: 3 - Alpha' - - 16 15 LOAD_CONST 'Intended Audience :: Developers' - - 17 18 LOAD_CONST 'Operating System :: OS Independent' - - 18 21 LOAD_CONST 'Programming Language :: Python' - - 19 24 LOAD_CONST 'Topic :: Software Development :: Debuggers' - - 20 27 LOAD_CONST 'Topic :: Software Development :: Libraries :: Python Modules' - 30 BUILD_LIST_6 '' - 33 STORE_NAME 'classifiers' - - 24 36 LOAD_CONST 'Rocky Bernstein' - 39 STORE_NAME 'author' - - 25 42 LOAD_CONST 'rb@dustyfeet.com' - 45 STORE_NAME 'author_email' - - 26 48 LOAD_CONST '' - 51 STORE_NAME 'ftp_url' - - 28 54 LOAD_CONST 'python-debugger@googlegroups.com' - 57 STORE_NAME 'mailing_list' - - 29 60 LOAD_CONST 'uncompyle6' - 63 STORE_NAME 'modname' - - 30 66 LOAD_CONST 'uncompyle6' - 69 LOAD_CONST 'uncompyle6.opcodes' - 72 BUILD_LIST_2 '' - 75 STORE_NAME 'packages' - - 31 78 LOAD_CONST '' - 81 STORE_NAME 'py_modules' - - 32 84 LOAD_CONST 'Python byte-code disassembler and source-code converter' - 87 STORE_NAME 'short_desc' - - 33 90 LOAD_CONST 'bin/uncompyle6' - 93 LOAD_CONST 'bin/pydisassemble' - 96 BUILD_LIST_2 '' - 99 STORE_NAME 'scripts' - - 35 102 LOAD_CONST -1 - 105 LOAD_CONST '' - 108 IMPORT_NAME 'os.path' - 111 STORE_NAME 'os' - - 38 114 LOAD_CONST '' - 117 MAKE_FUNCTION_0 '' - 120 STORE_NAME 'get_srcdir' - - 43 123 BUILD_MAP '' - 126 STORE_NAME 'ns' - - 44 129 LOAD_CONST '2.0' - 132 STORE_NAME 'version' - - 45 135 LOAD_CONST 'https://github.com/rocky/python-uncompyle6/' - 138 STORE_NAME 'web' - - 48 141 LOAD_NAME 'True' - 144 STORE_NAME 'zip_safe' - - 51 147 LOAD_CONST '' - 150 MAKE_FUNCTION_0 '' - 153 STORE_NAME 'read' - - 54 156 LOAD_NAME 'read' - 159 LOAD_CONST 'README.rst' - 162 CALL_FUNCTION_1 '' - 165 LOAD_CONST '\n' - 168 BINARY_ADD '' - 169 STORE_NAME 'long_description' - 172 LOAD_CONST '' - 175 RETURN_VALUE '' - diff --git a/test/Makefile b/test/Makefile index 3538081f..da2ad2aa 100644 --- a/test/Makefile +++ b/test/Makefile @@ -3,11 +3,20 @@ PHONY=check clean dist distclean test test-unit test-functional rmChangeLog clea GIT2CL ?= git2cl PYTHON ?= python +PYTHON_VERSION = $(shell $(PYTHON) -V | cut -d ' ' -f 2 | cut -d'.' -f1,2) +NATIVE_CHECK = check-$(PYTHON_VERSION) + # Set COMPILE='--compile' to force compilation before check COMPILE ?= -#: Run all tests -check: check-short check-2.7-ok +#: Run working tests from Python 2.7 +check-2.7: check-short-2.7 check-bytecode check-2.7-ok + +#: Run working tests from Python 3.4 +check-3.4: check-short-2.7 check-bytecode check-native-short + +check: + @echo "For now, use check-2.7 or check.3.4" && false ## FIXME: there is a bug in our code that I don't ## find in uncompyle2 that causes this to fail. @@ -24,9 +33,12 @@ check-disasm: check-bytecode: $(PYTHON) test_pythonlib.py --bytecode-2.5 -#: Run quick tests -check-short: - $(PYTHON) test_pythonlib.py --base-2.7 --verify $(COMPILE) +#: short tests for bytecodes only for this version of Python +check-native-short: + $(PYTHON) test_pythonlib.py --bytecode-$(PYTHON_VERSION) --verify $(COMPILE) + +check-short-2.7: + $(PYTHON) test_pythonlib.py --bytecode-2.7 --verify $(COMPILE) #: Run longer Python 2.7's lib files known to be okay check-2.7-ok: diff --git a/test/bytecode_2.5/test_applyEquiv.pyc b/test/bytecode_2.5/test_applyEquiv.pyc deleted file mode 100644 index 4e71ba1b8222b650908ab13d6438925db76dc730..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 844 zcma)4OG*Pl5PdaCG+zt~E?l}ATzCQz1to%@knG$@OefO#nP^Y^KwQP8dJ&iITzC>s z;R$?I6QU7B6RPIbuU~alzkJln&+l)W9gKe!em5v#i^>7_zyX065V*)dgl+_vgUiDe z;AY@v4Hw}`aAmj(M){n$Dq3-k2ifsLpt4H|b5ujX10$fZL#9@&!9CMyfzYSjvyhoH zG*7PEm&YL{f~hc1ly*aU*zWgFZ?`W7{%W;(G|y;N?0ZSPMD)TOW9ZdE0qxrWpeG56BUdELd4($a2H{M)yudBG$jH{A9))h zE`swnTO=jo;esa(axGS)wwBS(lE*2Q&y*>zWM1y`M<5ch<>*HC{4zD00&cv%6u&|h z>#&*>G!5y*Qyt5BlC37zIW$daDH{TMN%H3^o4QJUC}D{TQjm(2rAnz$>eO{vkVWx& zs#jXC4S40YCflZuyb>Dhc)Lc{kQQVeE6-OqhJJZnLC;=0OWfeJyKe7GYfCx)=RN`8 C0e!Uq diff --git a/test/bytecode_2.5/test_augmentedAssign.pyc b/test/bytecode_2.5/test_augmentedAssign.pyc deleted file mode 100644 index a4456cab5bfb3337f3bb73203af43a23b6e7378d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1323 zcmaJ>O>fgc5S_L2={9X?#Ycn$+Y_NxlLLoP6c80it%Ove7O7Gs6gl3FN@Msb~za8!`hm4k4QCrlaEqaO~`RHtugl~~&Q612}-I>Jo z!y{3ca&@F@az;(VTP1}@qC`HUw$(rb2t-#~cjZ&u-kIZOx5qR5=@Kr=8JxF9!2nzZLZ42Q94=m~xH3g>-6sIgsjOp5Ros%r-0o*Wp`_U)2 zY={b7zgs3=QWtxo!lCQ!WnzoEDv6Rjd{2AQ5?}mo>VfIc^4ybJ`swADY>SRXS~~>6hmZjN|71 zNJdJEgDeaDsF{rU-X725JoO}3GE+Qpm6B=12XV^h+1xehnd5vI2H7khUgD;T#{;g0 zk_+j@qhuUT8)bQ*WYcjLF!EjgeyoOZ#QS3<_qCt|PHGnuZjePcsa1pCPi zbE)(};29)!BVV2XAf?rX=O+7n5?q+zLY2U{Ng^Y0q9rfH8t;FKvkLM%qgdpje5GfX z;ZKT67A{s|4i*1h);imuD%)fa*c#Za>AHve1{JL;TW70m6V)}+9TxTu!)2|pYH<_z GL-rR4`}wQ@ diff --git a/test/bytecode_2.5/test_class.pyc b/test/bytecode_2.5/test_class.pyc deleted file mode 100644 index c1043cf733f24ec871d808aa290a525b7b8cf780..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1884 zcmcIk%Wl&^6dlKT8Wn+xgm_3;f<-n-)NO?jNf)rHkjsW_EY~w8mK;0sOcZ4ef5VbJ zU&22i@dcbSj*~(wnjn$L<2%>)+{d|h=IhTR@5}dZ<5+BdF5a*4=mi!j#1yL|WLLqkNu$ad6 za|T)Wu)ylgTcl9goa;N#jZcPQNYcZwkFDqvWtv#D%92V&y*{G;YCBCAni_kTCX6hc z{bILair7g}?7{|g@Yj$o3;?;0*Ctw@scurqqqz!0!|@Blc_Eh>wgE8#t#+QRbiJa0 zwX;r5^S0A-_p5~g$2ZV;Ydto%2Ml-!bsUcIfy`L~9_}JlT+mZs7q-Kee+XT`2+oiu zy4^VL^jv!cCjW6}$@S!)xqixQ59N9?yo}0GAT{WCIK%VV_*(trkw4KQ=zE^G` zRMHJI*}=Cbc(yZXDL%VSF%QKb*8*+>X1w1NGo3Sz)q&Nr`4#E~r21Ie3U{N$w%uMU zFRACXleTky1;OkLxd=m9#5mRvML>C5V-cttmw_ZTMm-f{O) JtLJ$5{{l(G=~}PC)^8N(X@w>6nN_3gQWd*8=%9 z9kchB^jGv3^iGx?0epPCdwh2kdH3&F{QmprO9A~ir1>+Aa7Um4t_UOe6@iZ7>o-Gl z0;g9o=m9N%(wy$Y7kbD%;oOBDZTWkB&<79UOpBf$fj)$DvfAoX&<{W#!)-zvANIlL z#7}zui1oKr?J;QLPZ&weaJdmN?U9zW17Ur_p}xO0Tq3P76NXvTdmGMp{R!N}=^mgj4!S-6`wFUpK0f zg>qw*xsgrlEG5CF4D=hp#taF=fB<=UrtI52&+UYhKv^qx(Q{?raFpNE<;=chPR|MK zh+xvWb-Owddri0?ayHAfFR~1|c;2Bxw&9zr4002f-WlEw_YjVHNq^Vl+YMOX-p#;YG|vEKPfo1hyVZp diff --git a/test/bytecode_2.5/test_docstring.pyc b/test/bytecode_2.5/test_docstring.pyc deleted file mode 100644 index c1fa3d3503c7283e973bc987677de81f9508f8f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1518 zcmcIkO>fgc5FOh|r~^esd`KLSj0DIBgk*;kLWnO3PB}O|B)P0Y>{3f@Ty>WN5L@ZQ+LGK3Z?5oO1-yEC)zz47|X_wC{5Z(pA+rTGPTKE<#PVRDf9hmkId|{FfB`v*5(2ZDbwJjn-)o4^`;tv!VqTH~F>@#rVn^Nw5d%l_ zPEaxcHzwE!#+Y(dI%6J1n^~5u+CeyBD)U>BZea!@Y5J!s|DsiYUF!vltEw|aX@pKv7OxfY2A%@KLJLS0Arw|WM<tNh&orWs*njLLXxvJj@FqTc2vXN0$dVVO7Z!mY3u_I}rw_piQ99f>=E`i`F# zh#D$Tdl}9n5IZ#+jqc&GmWPE^= rX4@UVo`&BtGzPAy$k}ChZDI8`T%4q$P(V}y!c9sMMI=EWBwA5bNK}>bU>=J4Vuh}eT$-ecjg(03 z6Z`<*!6WZ{317hvz?rdQJE_yA7u@b-Z10Ze%sG4c`KMz3`2A~rm%=N9-#2L9cNmR- zMW2aw;287`jv}2A#~_^*CqsHpoGj^_ICG@);^asd#L1H`ic=tMic=(A62~N67NuxZ5C|<&3gzlL^wr9MBCj8DW#A# zZZP}<(mq1+gdjYk<(aU4e^_+}yUu~{awx9=vl3o4_*CP^zJh6s{TMvuSKd{A<#@gw zM(B0Drw2oyD>$gv`A5D%Dx*wk7f$&)e=$nA>g;%O_=TVGvmiVbu5z##aU_`Y|JpiO95wzu`+K$7NX~NlUcD2JJdwq*5 zd``5DM;MzxyO=~9F*kvB3Uh^!xfC_t2+@wX2{5)-Uo8uhZjrMX(<9S)5n#;~4jGFQ zG^UF39l9lmtfz}|iBuNsCd7(G4$Ga0b#m(6M98FAt1(s6&@!un*2=>>AD7MgON{k+ z;T|d1RAcIm`1}u`@8hdeKu-!fh3!kh-&mg&e+wN?C%rm_^b>SGn$?lcW9m~Szkoy@ zOkM%~Ox8uz(A?r`T!9%=!)Oxl4!~8H)ocyUp&UW@Okm0pfaQIM)FHNV2tR(TsGAQu z;9!DHKiuj$Ud!cK>!pLj8>(@ycuAIxezzuX*qpf0Kd*0dmtaO$u+gK9!0eqG+_!P{_t*+nu)CwQV_jNnGuEmP`$)n|z&j zAgjQJ*G!9d0*g-(78l0i$!~G}!+_m($FXgnV7+p4s P1^k(zHQ|-fiWT(_ypf|} diff --git a/test/bytecode_2.5/test_exec.pyc b/test/bytecode_2.5/test_exec.pyc deleted file mode 100644 index 9415ebcafda3d4f694316a4c0bc868a344f3ced6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193 zcmdn|iI;2joqdkU3{b!fq#b~`SQkj7Ffc?hFr)$*j0`NHKsuF?p_u`hnaTtb2nEUq zYcPSdu>pxh1zQC}BR>t0StT4GBDJ_AIX@+}gdNC9&&f|p%qcDbsm#ew1~N5(ECvKo o%md_tw8W=Yq$cYXR2GBGu*uC&Da}c>;{>w7wy-gAFmf{j0QdnS%>V!Z diff --git a/test/bytecode_2.5/test_expressions.pyc b/test/bytecode_2.5/test_expressions.pyc deleted file mode 100644 index e13879b93f5eecc4e2b17910405ed4369ae339d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 341 zcmdn|iI;2joqdkU3{b!bq#b~`m={Q-Ffg<*Fhl_vj10jVOhA!jkUR*p0I@R=7rOw7 z5(b7Eup-H3Mi_^Q0mMmRX0Q{7O0z&jSP>#@5D|8uNU#P6&>+7|Ai_ixa*Sum5pjw;U{FKt1R6DR)Afo^^ CWH&(o diff --git a/test/bytecode_2.5/test_extendedImport.pyc b/test/bytecode_2.5/test_extendedImport.pyc deleted file mode 100644 index 4734a333cb09e430744f1e08b1d4553a782fc800..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 540 zcmYLGyH3L}6g^JgCFu*P6C)CtI&@+{2oO@~P>@mim}%zWYZletWFXTDNpa-Ag7U&P|nJVMn74w-E=*nw5I8nD?P%pYfgc5FOib66d3#E#+HCNC@SCs-z8w145u4iiA|8?JYuz9B&E{p{Z&|EmCsJ z58=*{JHLcq!7pIm*iPKYCMn8=SUa8_ujjpanqB9|?`rA$ub*!`ihdT~U-R(4vC%|R zqBc8*I0k7`9Fw#qjzu~rPL8xKj!imGxMFMVu1p zsyJoR8{$+**Tkuk-X^_CQ-j(Yq_^m}ev?Vgs2e;v;Nj;&>c@3Nj_Pb^!T6gT3wnOg zIT@XLL4SDa@1A`POpabQ9JW4OGCX96M`ms;2mtDye{9Z?{sz*l@bVZ0SQyBY34#SG ziL|#G(q4^UjFH%#m2-%Anp8;;e<_H?X)gEOEo6&CV|Rw~4)IKsJU{(>!LqH2)7?S7 z1Wv5m`z##M&E}`7z-GmAygPH4KJ@4#jfYxM3nH2FVL^bEC&QuKyY6{-AGiucR^!le z@AKNY)Fg7Iq(D|Bm@*7n>>5S4x)1q;u(G?7BxU=wm}Dx5?LyGQtXV)ati z*am5=@(6lrd9$4ZK^86y8OSL2ubN3Ep9Agl&?iNr9w8#`zSzkz!HrwUd9=x=Ox} zJtU3(zf|!2#nlRq>d;*dYbmCVkDuZ}3J;W=kg^3uV0`IS6=nlQ7H`A54TEohx(kC- mNZ~lH^GKNVFT9W3FTV`+XwZ8le5gg5S^7>xnAm?3OyB;5Qr$)x|dQ~a!5|0NICT)*4lNfR@Msb2xCZ2?Z4?U z_xzIniS`$CW|i0}6e5_nU+=w{oz?B1nf&?d?o$c(pP=z0g-;0#z!yRRT7Zc_M_@+q zgEmKCNAMj$pnx-s;OyLtAy1yM@Hc@(>#?}1-BQ24N7^ruKa_5X07f}xs}4TRmPTX)9&hfC*N0S7g8R!iLce?9j;xYmOHfb z(wPTYRohPH)~YpP`z}ql+wJ1Y*`=+C)%d=~g|X@0D-8u2w{2>tjna*gT=A;!sFF@q z4XrjBE7!=1`&LZ|LMM5}aZ2Ie5Ks@PZ#MwfF!T+mZ`8YUYH^-K#JC7To^j+9{+M7d zr2gNCNAha{uXT8$JQ)#j&~wtg{?(wTtQZpS`5|9*M8^pWs1PdtF#VR$8Upy2eE!d4 z26oB&e#|@(N7Y*z5Bjg+LK$ZX$T0uiF1QlQ#Kmc1Uyva)w2BsBONrQVnL3SZ!yOQLa; znLFp)nLGDav2c4nIx~C^@!e+V8dCsV0gnaYOb9G^1O;3GQiNVVNMYor*=h2UwHRH7 zt}q?J9wv^LPv4RM9J%5etiC(cwk@or;U2BvW+4MWNOT8#QvrE~0SuA^WVs+MV#MLuI& HHf8Az#XB)$ diff --git a/test/bytecode_2.5/test_import.pyc b/test/bytecode_2.5/test_import.pyc deleted file mode 100644 index ed2d9003d456c8f3acb5c04c060ea8b384120ed6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 754 zcmY*W&59F25U!d0ZF-Y+5%J`q4}w8R0(+80L`B%WtSm`jVNk+kx{?g(nI5}qHqP0L zPvXU+cb~+E5MMy6CyA>K{ngj?`%TTaUw!fQ$M;tW?9VaVmweq91_cl?2B1RN1Q0RV z@erc$!2k6(AZi@^O^8}GZ@{Jvx&u)M0$<;R&C&j?yAX9j3y8!n)`Cq4vyV>zkKq$Q z+VlA4{X=-iBl{4Y0QRAOfhTZr`QbC%u(0W%?e+d-5QL8AX;v6ZqoR_-p>(FS2}&Q3 zMNEV?mrG;iE=f9y2{X*e2{Buz?vT%{h%HI8l(a^vFfmzC>3t(tri3FQ?%bRo%j=5P zCYOtfaF`f%C`&b3F-4SXqT+l!-fp*}mB9sS&dOb>X{2!cx7WDVr_46jCRQ@emGFX> zrDY{7Jm*&yQ)+UN{^s*`5b&o{hv5pHi&r>kFrV-R@~iQk71BMX$=Vo)^MxsM729f8 z>C2xEe7J5hpDUBh=j5BX%2CMHI67hTI(B$Dn_W-Q-lC-kzJwP$s@Hy%W_V+HF_xP9 zKt0|rlV@jVJ2_nrWSmFFXgBeLC%%0>ccslD){a{2;4YaXAK%n?J75ZT;Jljuf3`bf f*YnJ%QsWCh$K7XWhrQr&*b7gCM}Y`Wp%?rCZ-2aB diff --git a/test/bytecode_2.5/test_import_as.pyc b/test/bytecode_2.5/test_import_as.pyc deleted file mode 100644 index db35409e3bdbc1a06d7d60036599b3277b222827..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 888 zcmZ8fO>fgc5FI;h+PW=GOIwiOum_~(Kpd$jgb;!XlwJZ=9jU?sS<Ptk_<&J8AH_ zH~tFZ#GPNlui(l7X16s(Sn`{%w@+`!{`Pa*`|{)a%LHy7kK+q|^;d=zAY^nPbz$y6 z=r(x^!j&fH{%VuAAzW+nb;vd#^laIJ`6lFB5N?BG+0K!AS0~p{vz(crlU~u~JGhDF0pu1*l|6=e6HAPub zNkvht{i+tdp3rik5)@`8s+b5>DJD{hqidq@eGzMMq$wsWuq5qyqgke#bDUMNA|WS& zW++ljWKq@mji6p+gudt9wwWJ`vzlhI6yut(m&mj^mgT6t08z|{s;B+_a=G-U633V` ztJI5}{1p3twffd)Dwkz0<5a|D>KWscg<>a4WF=QcOqndb>^DDex(;uF%sz&wbv(sx zi}Q1Sf!Yj4IYrvxG?_`MF&fK7nZ~NthS=-%cne{Yk?h7#Ry z%oWrmd2)PweI?^+7z}8GW5GOa;I#k% diff --git a/test/bytecode_2.5/test_integers.pyc b/test/bytecode_2.5/test_integers.pyc deleted file mode 100644 index 882fcdd1463130ed099fcd28b46049022e1d6f13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 721 zcmZuvO^?$s5FMv&wrf6?V~;*Th1B+r5Q0;CLP+J*OO(db)>_Ao?1@TlNcTNs#~;a;pO56{AK%_oa2^AWulbE%88pC#QGm|iR=|eI05%!u zVUMgZA02*58L;y&_NQH5Pdkk^jbZRzJ(YK*Ol}f59i7+^|^Fdu~QocW!c(E~S z%0SBR6dh1$tbE;c_B=nfhHx&|&NK~@qVg8GS@5-LIy!i#tl7qAv0tpHY#Gxgq`d3G z?MwCU4S{){;5+9j{b+wNV+AtkX|iN6z2ZO#ibDIUC@B3Z zv5VBVpq#V1{J=MOqQ)gUWYv1N?@7QWOj&?Ch)+2E{|m)2i!W=hTZ^wG^Z1k@&mInP XaeA)BV=)#ZagzyFZiM7F#a#RW0Ft?Q diff --git a/test/bytecode_2.5/test_iterators.pyc b/test/bytecode_2.5/test_iterators.pyc deleted file mode 100644 index 86b2b52c54ff25135a419a71748859d5441b891f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmdn|iI;2joqdkU3{b!dq#b~`7(`S^Fr+dtq%bfvGcvfuaxp|PGNdvxxEJy=gnLxT zg5?;|Q2reK|%nl?%GEx;>^HTgYn1GxTkab0gdFiPo zj6hbV29RJt5XFK(Zb@o!NqlBWYEfcIeo?VrL1i%qP}C+jKczG$)edAzF&~iNWng3E KU}9tf)64+sFC>@% diff --git a/test/bytecode_2.5/test_lambda.pyc b/test/bytecode_2.5/test_lambda.pyc deleted file mode 100644 index ab80c35b00e88df291fc3af1580f0704b0d3457c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 994 zcmcIi%T5A85bT-Zt*F6+egYSXA3%)8yNC5=Ow7Uzr~xI+crcNZ{*6cPeu-b<7g#mR zy7-7(WZAB*sWe^Pz5DXsY&^fc9`$8@mGC@7_-lX@u_8|(O01Gc+*;0b)OFPLf?~cX zw!|ZnZ8;~EoK#7imO-p$YjWDI!>+FY41+jE_$J^XzXt|+5F`U820~hheuJX(;bN4I zdp7M%?n4byH#;8C#Utd3KGCm))2H7a4)8lSGE*|sGBXmO#L-DGu96)x6WP3<*b0mE zFQ;u53>whckL^t(4kPydY&Bt>2Ez02rq~DdxDVDwf8W=TP+wkp4OwyepM!5_g%=0M z)Qdi}NH}9OOUh&wz;au@#1&1%*Ii7+HT~17Hdj@6D=&P~<}w3eoK6DwIZbbdE>yuL k>BxoPirq%`%h&B|$nK7B?cK;_U-vqMUDZ-8U03{l0Q$dzbpQYW diff --git a/test/bytecode_2.5/test_listComprehensions.pyc b/test/bytecode_2.5/test_listComprehensions.pyc deleted file mode 100644 index afd1c511313e2b4af09ee67e2d8d6d4f3d79ebc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1158 zcmah{%T5$g5Ixo1^Pb@;kg!5y%s>bU-~)p(8ZfY8fg9}3!~lJ1o4^cBH;E+RM&pK0 zab?___#L`+%fc`4)Sc;>i5n-W>Z&`ZPMx}Szx`=czx?|C@({h>EWa;k>6QZ+AOt=N zd_e?wz5^rJY&GD!Fic!bBr^ycY;A8_fQPWr2Y6k;8Un8mD0CSnEdvu5q2S0N&l?1V zKCC$Cz1bSKU>*_d;Lb$y89}iREe%8OTPS6FD%+NpVF;n#vX=fp@)bde)mCq1xcHte zW|IPr9dt$^hX3bHZz0Jof=XUm9WGtWOC3!2%BNUP3>#a9Njv1cNHQ-$H7BVJlk5yg zwEsE@29qqo=Oj7X^vsY*lH}vvkpD)KHa~3%YHSl0;nxw4z;ASSI094W&CJ0ch0$ek z7h^CyWsDW!2 zS3K5NIEAE!55i{3u+yYNQ;95dYLZNox508ND>6tg4)jd1@4Hw=NcHt+Ce7ZS#A&wC zIXyc!?@T+5JMDDo>@riiM<@GPX4-cZu7f~g)fy{nTvk`1+p)d>9akkZ?cmyYa1YH1 zrkT>5@3$jkCGYL+?JB?3828k#w0gm69z4v0M=gsy?g1X>=TGurts8LcWs703(gQzj z?b@qSRhPS}V{j)n`p?CrI`^~FPIz%*p6mGO0$tsi6A`rsv<2D>qjh=3Z$rjp)hSBR IS#c`vU-QMcl>h($ diff --git a/test/bytecode_2.5/test_loops.pyc b/test/bytecode_2.5/test_loops.pyc deleted file mode 100644 index e1a10313063ed161a0454a94577cb7c0e9c8dadf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 742 zcmZ`%L2KJE82#kbP9yNChh0X|spOKRy|rbGjdr9k7=;!Jfni+hOQYgQjwO@i+*|+3 zj=S%d40`B4*e}>8&rUPC8T6#@>3vVnLf?PI{M*kTA2Vpah~^J8>{|vP0VV*eGe8EC z!2^TyuZJ)R00WQ#+y`K~z!rO;88FXvYAytJ*)U_;ypcOFzPMN&ZQJa>wwbgxKB?cHyeO>u>3q zfIGA<$&D%Ouvm-1Kv+|i84AyfB6SW+EvBXvwTAQSnX;{hRz+GmVWz^(P)N+oyjbT= zv#pfFA?GhN=~HpJb~B^J?b_iWGqP<{IhOniQOukxPDi8Vayh&+c#Aoyw5@VClsMXW zjp|I&EOl;DDN-%D4>_$$N>U1?shX!w8O;@^|5P0hA%WW=_>@~zG=rj-0$=)m*L4Y! zM4Bu~oL82qzC-5)s!sqfU}Gx(x;g7_^xfRZD#!OdTHAAiD2O3qG3(L@*=`UrwqdC1 RM63fb;~PbrfuP z0_VWHAutAp0;fCB9+Z!Bf#)Au82ZoxX$2b4&Pxa4WEX?e_fQ+e={t^(uBxG{R~D?L zMlMz1blcbYR2{dwl=zZ$zq@zx8UwY7VHLUx)j(@jhfr(i?qvZfO;Xei^rM?RQ;Xp6 zI5lBj%*I7B4M$0~W5XjI7W2#sI$bV;t!Er`mw*PMd1)QAf+3A8oZ=(yM;;xI7%rs4 zK}~`)fipn5HTEOU*K=rnQnUHgh1v?!_2gsBgovaBvqqZL#>#1GMi2APwnh#q(=4@8 za(crBAx0d>!scadOXY!7@GdWEGr`q1wkWG{Sj_JK*DZ8jNV!hjMcs%SUo@2^Q!S-k zC6AQTnVL_?jCss>gB1*B4e0!kiA9yUCn2+6X&YcO%rD7#ke zs(ES!>2KkYcO?D?zk)vi-*;xOsc#QpduPth&YYR^edn_N{qMELZ-4#qRZrqi8U2^I z!avdY_!&7C85%hRsN<**m0x)6CLR<}SU5jwEz zxF)#{xvq+4AE+Jbb_ZLy6}vO1o!EO0hBwhfI7z#3oI7U|oE>;KuW=GZF_{*R14}D8 zZqnSaqDodvsg*p6TKO6TSP3$(n81t4@WKH2ULN9WyJUsxJRunuIWRcQgAlbtttbU<4t9Re!!K`%ycGf0J9zpb+bPU2G=O5pFhm*KQj9YR{ z>bYf%@Cxsv`4vASedHq}zo-lE!{(QW+OoXVkoA#5n6;|1cL{newN!i1OQM#&y5w~T z^Z`!1oa+aen2YJL`btE<=+jX$Q|GWr8z!yJZFC8092(FaG_!;&kjAY}>U_Ahn|gHC z9K5Tz)jbz%2W9VLYRLIwHcQ4h_%^0syNwCJwhtf+z*yZg>owr=H6um@Y()t8#;>6{e87RZl5jN0_TT{-zfd`h`bgwzIa+`7M<3yvF zb%(6RoboBJT|WO1O-uy~RFWDHDHY(%C7?}r9`@u9iF}^(DO3&w5kpxrfBw6-Wh1@PjsE#dzG^v}kx}Tv7>s)2lk(L&6 zs@u_L=e(mRz{^+#Velm!DYDc59VbG@b z`x>&`tt>Z@cNAel&1)A|$ZUsKSDOj|HRyc~gz;jO#WVp;E>*}Hgt=hj=Mpjn?(%OH z1W!#p?VJSJ!`b*nb*y+W?3{G{&ch?fAud}%6{-GU7zO7M|J4i!_}9~kqVqv_6b1Ts zO1BDwVc)xj2@2n%rFJD7{lTgKJ$lPrDXc+`-`NkeglFEl#r-3i-fs6t(dayAw>{k1 zyyX#5kG|y58jtfluJHJB=-psLmTU!ikJ1NdvV*EL8zU_p4^AHYqhaunt`&ZSW~1bk Y+^T*Z*L7F%b=}%()veS7Uz4`xUoVwh2LJ#7 diff --git a/test/bytecode_2.5/test_prettyprint.pyc b/test/bytecode_2.5/test_prettyprint.pyc deleted file mode 100644 index 551dcfe6925d410788a6d8babe01fb1a95b66cbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2586 zcmcIlJ#XVi5FJvoY|@rL@6PuXfTe)MRxG3ngu`9Zq%sUTl^TWOt}Nnck|0+wRJgkI zY4R^prVNlDkvhL3e;|2pDOtAR5 zf&OjjyK4KPXw8p#?JT@@@z-mj_5?|&eNhK;(Ud_;)Duxpt@4?uLn_sCQ7`Q7`W^c* z>^JV)Ls{E%*Aw+pegr?hXh#x9bVEKk;(Rw>tu0rZqF#x5Eg!@IgCDboMQiDc)w*4Q zob%3SEX*Ma;~QO>VNq&hW<{A~=D3&zM@L?jPs>;b+zpDz7+q$;I4`M4vWvh>ba2bb z_dIVr&Eh1_qBJqHARh-x$N6P3OSSKRKS`=!9uZOzm4+4!a${BhRW(hFKKA{k8un3e zHZzkv3q~`ekK$Y{+>%t6{<+q{#F*miZujcy>i8npBb~x3tEQd8j6!)W!Vc8FJhtV8cHDUtHt|L|D-5F=aG zUT^hN#O8Bk^_YL4{UhSr-r0f=$F~^OZvfk^9CS1^!Y10Li-y^+dl zp1Y6_*vzicH3fa<3GzP;*MK44U;9Ob{0c%|58(#EBlrY-E)up0+k_p$E@6+bPdFej zYWNgj31f5;c8*c~4EPj;k*&s(tvOX7<2F?X3wm%p+@^#~Fx^kcM8}ePm%Cbbm%9$j zU`X_7p6L*?bV#68sU$Xrt2C+1$&J)Aq}NP~RG%!xUI$9CP_ZfxTqM?*_rkkxet<>w z6+oP(l+H{-k~>=f!`FN`RCzocT7$w~vi2C3UsC>M zeYAf)5HD-P(w^CC`i$4KE|*9A&l*%4aO_{^YMSad{K~2n&~mrjmRnZ>HE7=?hZpBTIJU8KgIBnhvDKHxgMdv_oI zki5er;~A%qfD1i`E9!jMeUS!!L<5%*LmY+D6c~EdN}Zpp;1<3>l@hATV?=M&#CcVN zq`aA#a0eo<%6(LBqT&pd#=_03Rk=PL7A9g(4y~ywj4I~ekf^+yt7;Wz&Z^Rk!%5&$ zqoT}1k|5=Vh3IqjrN)j|5zh;!@2Z#*y&NK{S&Y@ket)@K_NETUSQ5&HMHzb<`}bUZ z?m@eyEnTivZnaEJO%|Sndu1%`=6N*E%5Y56;VvuhraqsmBDW_|jZyi9H8eFaXK8?v zai|71EYX`RC13~O+N4Zqk{PJd#h!VYQgpc?w#f{m&+QaLy81UX6qT2y>85Ntax?RY z=9Ik9Av3U!6>_-Spa?@5z%u?T#`Q-d?TXPTwumhK<~c@E4cE?MQUMzi_ScZj6=Btv sbEg+2e&Rka2-C`1*{+bHy|zz9{T_;g?5*gEH(67(#ZI;-Izlq$FQgCKtpET3 diff --git a/test/bytecode_2.5/test_tuple_params.pyc b/test/bytecode_2.5/test_tuple_params.pyc deleted file mode 100644 index 89c2ae749a61b0a58f36ceb1d0cc4a9da1b4f7cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1171 zcmbVLU2oGc6uoKMZuL4OJ|tfK7$LPqJR*b`gVzaVJWWVZ8ha#C8b`6CE@*w*zu}R0 zehI&VU%)+X*Fpu-SSz1i+sF4FAK!lac`UyE_7m~WNsWBaCnbC^Aaz9N(J?ah10vzHb%|^1QYUrVqzgN(J2{z1YuYB$ z65Fy)ozqPvFHM87NK0N~uI5!M&82i*%~T{2;$vRe+tVB|(RoU)rP7&M)LpqrYum!< zsSvwm=BM&Q=WX)vN=-Bjt>HrLFn zRc2Y0CRH-6l<@M~#^t(^MddHz3R8&;-X8D>d7Q$T#|+m!`V`WtPpbi~*ji%S*f2Va z7$^eYVV-)NyB^2W7k-j?yzf~WV~ld~05D{@tJJp-n7oymA?I56?kx zszPj^Etk99Zt>ZfwQ0y@L)YL!o8@t>Wo$~joo!s9RbjQ{E;pU0PQ0ouscnI^v$7Vn z(>h_Ki~-{w<0;{77N;3m^c;Q4h`;-9Io=_T2zjnundiuT6_M-6 zuXswC%Mgs`b9&{y^BHB}7J(gi??~WFeX(`AYs`x=#o?SVOon18CSposN@FSpLW(iH G=i)C9Uzef) diff --git a/test/bytecode_2.5/test_yield.pyc b/test/bytecode_2.5/test_yield.pyc deleted file mode 100644 index c649bf323c4f0dc0b7011108237e3104f211ba8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 720 zcmaKpu};G<5QhIt($W?xIv`*GiGd*#yZ}NVA%Pe=6hWm*C@PI979oY$6+wat-iDE# zC*di00k}H~42UN2@3VcezyJL5-fTR-z3vV$c`DrRaC5gTDSw1ZAS3h$lm>VLdI8c< zgAnC1Oo%kXBVq5ffnEd?VgF_m-2+*u$U?6IQ-Q7G5!jy|9i&wp#WQ@i{op4ij(me< zXmV5Z{itvQnG3iHs&KnwmV01y2r5_LbztcWX%-KJd%_9bETPL;HsH8i`%Vl0q-~>{ zi&rp+9Mz5^R${HRh1^_=1vEn~RH;ri?SGs~hB{s6pj@4>Ysu#){`j62*kco21s8}mTji4#ML>&w zJ~Y30x#HPrcwT@fl{bmay_@9;S7iY;nbgX@R`A+-X?j&jaz6Is!X!yY64hfz?yys5 t@siDZY7ui&`d@&5isWki$JW&-9cN}++_*)SR#30iBY~(9(Hu4O{RB(yb^HJT diff --git a/test/bytecode_2.7/README b/test/bytecode_2.7/README new file mode 100644 index 00000000..f4b40fd9 --- /dev/null +++ b/test/bytecode_2.7/README @@ -0,0 +1 @@ +These are byte-compiled programs compiled by Python 2.7 diff --git a/test/bytecode_2.7/keyword.pyc b/test/bytecode_2.7/keyword.pyc deleted file mode 100644 index 01229cf8d1dd1b8a73c38393a6db2abf0028a7a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmZSn%**xPCnGGG0SZ`wv;zRUF4Fl5TCOXCwASY2~EQjoOnQ{D0XO7kfNw0q!p^vrj=dsa4)Cz?fSgV-R@~; zFU1I+$|E0!@5Tp!nLWE{kdSz&&o?(a|Mxeu+y3izuX|qol)>uPq3#oq}qjqR6R(xK;D96o2l$W-h!kXv^|iwAtB)% zkUK%%2YHuO1<6Uc2ftI&9neHc{s|N@aUVz@z`dU z%lHT740@$aeBxMenwxrPUH)X)!_Ud{sk%~ytx9ElJn_QU7#|}))KMrN;_&7CMqHhdvW zUW+_Ld%g5?+RFnnd1EV`vHQf%{9EDFI#sAKWS-V}&WTU{kNFEdb;4;CHrC{cUs_og z3UP-5{0k?%OENb-l{Nb1OesGk{6iMjgDnoyB4W{V z z1EQhPX)0|-{p^w;TVF%|7Ox7LX+6_4xSop@H63#2Ief#Wsua2i+q$r(nU$HZ(%Kcl zinVl8q=iNwa+Owwq2g(4ZbOBkx79Kw9iQp2M9!1aY0H8eW=>Zg18;H26W0LEHHT5A zJCcW%jv3OO>UkvIs%fa~jjL4{&0lntqL`_GkLPQmuv8pp;qc^l-G`4ixxCerW^Ydz kc|0Q0>33S~X#I3IIuSiBrhVq3eyiW^ZU$+))9$wa0pW|$jQ{`u diff --git a/test/bytecode_3.2/add.cpython-32.pyc b/test/bytecode_3.2/add.cpython-32.pyc new file mode 100644 index 0000000000000000000000000000000000000000..112809eb3fdd0f170958e6e46c05273184f0d065 GIT binary patch literal 125 zcmd1d;pKYy$1@4aiMQNzp5)Ead<)ZF2KdN^?@}K>CV-m;nIcV-R-$ literal 0 HcmV?d00001 diff --git a/test/bytecode_3.2/and.cpython-32.pyc b/test/bytecode_3.2/and.cpython-32.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0677927dc5a8abde7dfa0cf68209ea089c6b9ac8 GIT binary patch literal 125 zcmd1d;pLj7 z#hAE~p@;>j1Wf!=EzZm>$Vt^L&Mz%WPSwvZNG(b%$;{7-Ps+?oEUMH`Oi9rzsJz8t RlbfGXnv-hB2(kf)831&8Aiw|s literal 0 HcmV?d00001 diff --git a/test/bytecode_3.4/and.pyc b/test/bytecode_3.4/and.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ba3c38674f3d28fdad8087ac34c641647411be9 GIT binary patch literal 136 zcmaFI!^`#GCnJoDfq~&M5W@izkmUfx#e6^_6^Ixa9HN*QQWzM5H5vUhnQt*B-C|6> z#hAE~p@;>j1Wf!=EzZm>$Vt^L&Mz%WPSwvZNG(b%$;{7-Ps+?oEUMH`%uCTLsJz8t RlbfGXnv-hB2(kf)832SPAoBnK literal 0 HcmV?d00001 diff --git a/test/bytecode_3.4/keyword.pyc b/test/bytecode_3.4/keyword.pyc deleted file mode 100644 index aa97f8b41b87b8eec476ecad280992533b627e4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmaFI!^`#GCnHRNfq~&M5W@j0kmUfx#gafGm4P7zNHQ{{FfybvF*GwUMKLp^Ffjyc zGT&lMzQvg8r^#}QG3gd#$}PsUTa1Y-8H(6}+Q7sw_2SIjf}B*{;{4L0@l+|<01V*TvY%JTf86upAVTO2mI`6;D2sdkJYdx4k%07z&jH~;_u diff --git a/test/bytecode_3.4/positional.pyc b/test/bytecode_3.4/positional.pyc deleted file mode 100644 index caf301e12e4d23cea6b147ae52ec868a4e870c43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmaFI!^`#GCnJo5fq~&M5W@j8kmUfx#ezU06^IxaQkfWyN!2aRFD*(=)lW{$$%#)aN-xb#%_}L^FUT*>EXmBz ZOU%(LsJz8tlbfGXnv-hB2(k%?831)-BX$4) diff --git a/test/ok_2.7/bsddb/__init__.py b/test/ok_2.7/bsddb/__init__.py deleted file mode 100644 index 13c9c27a..00000000 --- a/test/ok_2.7/bsddb/__init__.py +++ /dev/null @@ -1,455 +0,0 @@ -#---------------------------------------------------------------------- -# Copyright (c) 1999-2001, Digital Creations, Fredericksburg, VA, USA -# and Andrew Kuchling. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# o Redistributions of source code must retain the above copyright -# notice, this list of conditions, and the disclaimer that follows. -# -# o Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions, and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# -# o Neither the name of Digital Creations nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS AND CONTRIBUTORS *AS -# IS* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL -# CREATIONS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -# DAMAGE. -#---------------------------------------------------------------------- - - -"""Support for Berkeley DB 4.3 through 5.3 with a simple interface. - -For the full featured object oriented interface use the bsddb.db module -instead. It mirrors the Oracle Berkeley DB C API. -""" - -import sys -absolute_import = (sys.version_info[0] >= 3) - -if (sys.version_info >= (2, 6)) and (sys.version_info < (3, 0)) : - import warnings - if sys.py3kwarning and (__name__ != 'bsddb3') : - warnings.warnpy3k("in 3.x, the bsddb module has been removed; " - "please use the pybsddb project instead", - DeprecationWarning, 2) - warnings.filterwarnings("ignore", ".*CObject.*", DeprecationWarning, - "bsddb.__init__") - -try: - if __name__ == 'bsddb3': - # import _pybsddb binary as it should be the more recent version from - # a standalone pybsddb addon package than the version included with - # python as bsddb._bsddb. - if absolute_import : - # Because this syntaxis is not valid before Python 2.5 - exec("from . import _pybsddb") - else : - import _pybsddb - _bsddb = _pybsddb - from bsddb3.dbutils import DeadlockWrap as _DeadlockWrap - else: - import _bsddb - from bsddb.dbutils import DeadlockWrap as _DeadlockWrap -except ImportError: - # Remove ourselves from sys.modules - import sys - del sys.modules[__name__] - raise - -# bsddb3 calls it db, but provide _db for backwards compatibility -db = _db = _bsddb -__version__ = db.__version__ - -error = db.DBError # So bsddb.error will mean something... - -#---------------------------------------------------------------------- - -import sys, os - -from weakref import ref - -if sys.version_info < (2, 6) : - import UserDict - MutableMapping = UserDict.DictMixin -else : - import collections - MutableMapping = collections.MutableMapping - -class _iter_mixin(MutableMapping): - def _make_iter_cursor(self): - cur = _DeadlockWrap(self.db.cursor) - key = id(cur) - self._cursor_refs[key] = ref(cur, self._gen_cref_cleaner(key)) - return cur - - def _gen_cref_cleaner(self, key): - # use generate the function for the weakref callback here - # to ensure that we do not hold a strict reference to cur - # in the callback. - return lambda ref: self._cursor_refs.pop(key, None) - - def __iter__(self): - self._kill_iteration = False - self._in_iter += 1 - try: - try: - cur = self._make_iter_cursor() - - # FIXME-20031102-greg: race condition. cursor could - # be closed by another thread before this call. - - # since we're only returning keys, we call the cursor - # methods with flags=0, dlen=0, dofs=0 - key = _DeadlockWrap(cur.first, 0,0,0)[0] - yield key - - next = getattr(cur, "next") - while 1: - try: - key = _DeadlockWrap(next, 0,0,0)[0] - yield key - except _bsddb.DBCursorClosedError: - if self._kill_iteration: - raise RuntimeError('Database changed size ' - 'during iteration.') - cur = self._make_iter_cursor() - # FIXME-20031101-greg: race condition. cursor could - # be closed by another thread before this call. - _DeadlockWrap(cur.set, key,0,0,0) - next = getattr(cur, "next") - except _bsddb.DBNotFoundError: - pass - except _bsddb.DBCursorClosedError: - # the database was modified during iteration. abort. - pass -# When Python 2.4 not supported in bsddb3, we can change this to "finally" - except : - self._in_iter -= 1 - raise - - self._in_iter -= 1 - - def iteritems(self): - if not self.db: - return - self._kill_iteration = False - self._in_iter += 1 - try: - try: - cur = self._make_iter_cursor() - - # FIXME-20031102-greg: race condition. cursor could - # be closed by another thread before this call. - - kv = _DeadlockWrap(cur.first) - key = kv[0] - yield kv - - next = getattr(cur, "next") - while 1: - try: - kv = _DeadlockWrap(next) - key = kv[0] - yield kv - except _bsddb.DBCursorClosedError: - if self._kill_iteration: - raise RuntimeError('Database changed size ' - 'during iteration.') - cur = self._make_iter_cursor() - # FIXME-20031101-greg: race condition. cursor could - # be closed by another thread before this call. - _DeadlockWrap(cur.set, key,0,0,0) - next = getattr(cur, "next") - except _bsddb.DBNotFoundError: - pass - except _bsddb.DBCursorClosedError: - # the database was modified during iteration. abort. - pass -# When Python 2.4 not supported in bsddb3, we can change this to "finally" - except : - self._in_iter -= 1 - raise - - self._in_iter -= 1 - - -class _DBWithCursor(_iter_mixin): - """ - A simple wrapper around DB that makes it look like the bsddbobject in - the old module. It uses a cursor as needed to provide DB traversal. - """ - def __init__(self, db): - self.db = db - self.db.set_get_returns_none(0) - - # FIXME-20031101-greg: I believe there is still the potential - # for deadlocks in a multithreaded environment if someone - # attempts to use the any of the cursor interfaces in one - # thread while doing a put or delete in another thread. The - # reason is that _checkCursor and _closeCursors are not atomic - # operations. Doing our own locking around self.dbc, - # self.saved_dbc_key and self._cursor_refs could prevent this. - # TODO: A test case demonstrating the problem needs to be written. - - # self.dbc is a DBCursor object used to implement the - # first/next/previous/last/set_location methods. - self.dbc = None - self.saved_dbc_key = None - - # a collection of all DBCursor objects currently allocated - # by the _iter_mixin interface. - self._cursor_refs = {} - self._in_iter = 0 - self._kill_iteration = False - - def __del__(self): - self.close() - - def _checkCursor(self): - if self.dbc is None: - self.dbc = _DeadlockWrap(self.db.cursor) - if self.saved_dbc_key is not None: - _DeadlockWrap(self.dbc.set, self.saved_dbc_key) - self.saved_dbc_key = None - - # This method is needed for all non-cursor DB calls to avoid - # Berkeley DB deadlocks (due to being opened with DB_INIT_LOCK - # and DB_THREAD to be thread safe) when intermixing database - # operations that use the cursor internally with those that don't. - def _closeCursors(self, save=1): - if self.dbc: - c = self.dbc - self.dbc = None - if save: - try: - self.saved_dbc_key = _DeadlockWrap(c.current, 0,0,0)[0] - except db.DBError: - pass - _DeadlockWrap(c.close) - del c - for cref in self._cursor_refs.values(): - c = cref() - if c is not None: - _DeadlockWrap(c.close) - - def _checkOpen(self): - if self.db is None: - raise error, "BSDDB object has already been closed" - - def isOpen(self): - return self.db is not None - - def __len__(self): - self._checkOpen() - return _DeadlockWrap(lambda: len(self.db)) # len(self.db) - - if sys.version_info >= (2, 6) : - def __repr__(self) : - if self.isOpen() : - return repr(dict(_DeadlockWrap(self.db.items))) - return repr(dict()) - - def __getitem__(self, key): - self._checkOpen() - return _DeadlockWrap(lambda: self.db[key]) # self.db[key] - - def __setitem__(self, key, value): - self._checkOpen() - self._closeCursors() - if self._in_iter and key not in self: - self._kill_iteration = True - def wrapF(): - self.db[key] = value - _DeadlockWrap(wrapF) # self.db[key] = value - - def __delitem__(self, key): - self._checkOpen() - self._closeCursors() - if self._in_iter and key in self: - self._kill_iteration = True - def wrapF(): - del self.db[key] - _DeadlockWrap(wrapF) # del self.db[key] - - def close(self): - self._closeCursors(save=0) - if self.dbc is not None: - _DeadlockWrap(self.dbc.close) - v = 0 - if self.db is not None: - v = _DeadlockWrap(self.db.close) - self.dbc = None - self.db = None - return v - - def keys(self): - self._checkOpen() - return _DeadlockWrap(self.db.keys) - - def has_key(self, key): - self._checkOpen() - return _DeadlockWrap(self.db.has_key, key) - - def set_location(self, key): - self._checkOpen() - self._checkCursor() - return _DeadlockWrap(self.dbc.set_range, key) - - def next(self): # Renamed by "2to3" - self._checkOpen() - self._checkCursor() - rv = _DeadlockWrap(getattr(self.dbc, "next")) - return rv - - if sys.version_info[0] >= 3 : # For "2to3" conversion - next = __next__ - - def previous(self): - self._checkOpen() - self._checkCursor() - rv = _DeadlockWrap(self.dbc.prev) - return rv - - def first(self): - self._checkOpen() - # fix 1725856: don't needlessly try to restore our cursor position - self.saved_dbc_key = None - self._checkCursor() - rv = _DeadlockWrap(self.dbc.first) - return rv - - def last(self): - self._checkOpen() - # fix 1725856: don't needlessly try to restore our cursor position - self.saved_dbc_key = None - self._checkCursor() - rv = _DeadlockWrap(self.dbc.last) - return rv - - def sync(self): - self._checkOpen() - return _DeadlockWrap(self.db.sync) - - -#---------------------------------------------------------------------- -# Compatibility object factory functions - -def hashopen(file, flag='c', mode=0666, pgsize=None, ffactor=None, nelem=None, - cachesize=None, lorder=None, hflags=0): - - flags = _checkflag(flag, file) - e = _openDBEnv(cachesize) - d = db.DB(e) - d.set_flags(hflags) - if pgsize is not None: d.set_pagesize(pgsize) - if lorder is not None: d.set_lorder(lorder) - if ffactor is not None: d.set_h_ffactor(ffactor) - if nelem is not None: d.set_h_nelem(nelem) - d.open(file, db.DB_HASH, flags, mode) - return _DBWithCursor(d) - -#---------------------------------------------------------------------- - -def btopen(file, flag='c', mode=0666, - btflags=0, cachesize=None, maxkeypage=None, minkeypage=None, - pgsize=None, lorder=None): - - flags = _checkflag(flag, file) - e = _openDBEnv(cachesize) - d = db.DB(e) - if pgsize is not None: d.set_pagesize(pgsize) - if lorder is not None: d.set_lorder(lorder) - d.set_flags(btflags) - if minkeypage is not None: d.set_bt_minkey(minkeypage) - if maxkeypage is not None: d.set_bt_maxkey(maxkeypage) - d.open(file, db.DB_BTREE, flags, mode) - return _DBWithCursor(d) - -#---------------------------------------------------------------------- - - -def rnopen(file, flag='c', mode=0666, - rnflags=0, cachesize=None, pgsize=None, lorder=None, - rlen=None, delim=None, source=None, pad=None): - - flags = _checkflag(flag, file) - e = _openDBEnv(cachesize) - d = db.DB(e) - if pgsize is not None: d.set_pagesize(pgsize) - if lorder is not None: d.set_lorder(lorder) - d.set_flags(rnflags) - if delim is not None: d.set_re_delim(delim) - if rlen is not None: d.set_re_len(rlen) - if source is not None: d.set_re_source(source) - if pad is not None: d.set_re_pad(pad) - d.open(file, db.DB_RECNO, flags, mode) - return _DBWithCursor(d) - -#---------------------------------------------------------------------- - -def _openDBEnv(cachesize): - e = db.DBEnv() - if cachesize is not None: - if cachesize >= 20480: - e.set_cachesize(0, cachesize) - else: - raise error, "cachesize must be >= 20480" - e.set_lk_detect(db.DB_LOCK_DEFAULT) - e.open('.', db.DB_PRIVATE | db.DB_CREATE | db.DB_THREAD | db.DB_INIT_LOCK | db.DB_INIT_MPOOL) - return e - -def _checkflag(flag, file): - if flag == 'r': - flags = db.DB_RDONLY - elif flag == 'rw': - flags = 0 - elif flag == 'w': - flags = db.DB_CREATE - elif flag == 'c': - flags = db.DB_CREATE - elif flag == 'n': - flags = db.DB_CREATE - #flags = db.DB_CREATE | db.DB_TRUNCATE - # we used db.DB_TRUNCATE flag for this before but Berkeley DB - # 4.2.52 changed to disallowed truncate with txn environments. - if file is not None and os.path.isfile(file): - os.unlink(file) - else: - raise error, "flags should be one of 'r', 'w', 'c' or 'n'" - return flags | db.DB_THREAD - -#---------------------------------------------------------------------- - - -# This is a silly little hack that allows apps to continue to use the -# DB_THREAD flag even on systems without threads without freaking out -# Berkeley DB. -# -# This assumes that if Python was built with thread support then -# Berkeley DB was too. - -try: - # 2to3 automatically changes "import thread" to "import _thread" - import thread as T - del T - -except ImportError: - db.DB_THREAD = 0 - -#---------------------------------------------------------------------- diff --git a/test/ok_2.7/bsddb/db.py b/test/ok_2.7/bsddb/db.py deleted file mode 100644 index c3aee307..00000000 --- a/test/ok_2.7/bsddb/db.py +++ /dev/null @@ -1,60 +0,0 @@ -#---------------------------------------------------------------------- -# Copyright (c) 1999-2001, Digital Creations, Fredericksburg, VA, USA -# and Andrew Kuchling. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# o Redistributions of source code must retain the above copyright -# notice, this list of conditions, and the disclaimer that follows. -# -# o Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions, and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# -# o Neither the name of Digital Creations nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS AND CONTRIBUTORS *AS -# IS* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL -# CREATIONS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -# DAMAGE. -#---------------------------------------------------------------------- - - -# This module is just a placeholder for possible future expansion, in -# case we ever want to augment the stuff in _db in any way. For now -# it just simply imports everything from _db. - -import sys -absolute_import = (sys.version_info[0] >= 3) - -if not absolute_import : - if __name__.startswith('bsddb3.') : - # import _pybsddb binary as it should be the more recent version from - # a standalone pybsddb addon package than the version included with - # python as bsddb._bsddb. - from _pybsddb import * - from _pybsddb import __version__ - else: - from _bsddb import * - from _bsddb import __version__ -else : - # Because this syntaxis is not valid before Python 2.5 - if __name__.startswith('bsddb3.') : - exec("from ._pybsddb import *") - exec("from ._pybsddb import __version__") - else : - exec("from ._bsddb import *") - exec("from ._bsddb import __version__") diff --git a/test/ok_2.7/bsddb/dbobj.py b/test/ok_2.7/bsddb/dbobj.py deleted file mode 100644 index 1400fe15..00000000 --- a/test/ok_2.7/bsddb/dbobj.py +++ /dev/null @@ -1,266 +0,0 @@ -#------------------------------------------------------------------------- -# This file contains real Python object wrappers for DB and DBEnv -# C "objects" that can be usefully subclassed. The previous SWIG -# based interface allowed this thanks to SWIG's shadow classes. -# -- Gregory P. Smith -#------------------------------------------------------------------------- -# -# (C) Copyright 2001 Autonomous Zone Industries -# -# License: This is free software. You may use this software for any -# purpose including modification/redistribution, so long as -# this header remains intact and that you do not claim any -# rights of ownership or authorship of this software. This -# software has been tested, but no warranty is expressed or -# implied. -# - -# -# TODO it would be *really nice* to have an automatic shadow class populator -# so that new methods don't need to be added here manually after being -# added to _bsddb.c. -# - -import sys -absolute_import = (sys.version_info[0] >= 3) -if absolute_import : - # Because this syntaxis is not valid before Python 2.5 - exec("from . import db") -else : - import db - -if sys.version_info < (2, 6) : - from UserDict import DictMixin as MutableMapping -else : - import collections - MutableMapping = collections.MutableMapping - -class DBEnv: - def __init__(self, *args, **kwargs): - self._cobj = db.DBEnv(*args, **kwargs) - - def close(self, *args, **kwargs): - return self._cobj.close(*args, **kwargs) - def open(self, *args, **kwargs): - return self._cobj.open(*args, **kwargs) - def remove(self, *args, **kwargs): - return self._cobj.remove(*args, **kwargs) - def set_shm_key(self, *args, **kwargs): - return self._cobj.set_shm_key(*args, **kwargs) - def set_cachesize(self, *args, **kwargs): - return self._cobj.set_cachesize(*args, **kwargs) - def set_data_dir(self, *args, **kwargs): - return self._cobj.set_data_dir(*args, **kwargs) - def set_flags(self, *args, **kwargs): - return self._cobj.set_flags(*args, **kwargs) - def set_lg_bsize(self, *args, **kwargs): - return self._cobj.set_lg_bsize(*args, **kwargs) - def set_lg_dir(self, *args, **kwargs): - return self._cobj.set_lg_dir(*args, **kwargs) - def set_lg_max(self, *args, **kwargs): - return self._cobj.set_lg_max(*args, **kwargs) - def set_lk_detect(self, *args, **kwargs): - return self._cobj.set_lk_detect(*args, **kwargs) - if db.version() < (4,5): - def set_lk_max(self, *args, **kwargs): - return self._cobj.set_lk_max(*args, **kwargs) - def set_lk_max_locks(self, *args, **kwargs): - return self._cobj.set_lk_max_locks(*args, **kwargs) - def set_lk_max_lockers(self, *args, **kwargs): - return self._cobj.set_lk_max_lockers(*args, **kwargs) - def set_lk_max_objects(self, *args, **kwargs): - return self._cobj.set_lk_max_objects(*args, **kwargs) - def set_mp_mmapsize(self, *args, **kwargs): - return self._cobj.set_mp_mmapsize(*args, **kwargs) - def set_timeout(self, *args, **kwargs): - return self._cobj.set_timeout(*args, **kwargs) - def set_tmp_dir(self, *args, **kwargs): - return self._cobj.set_tmp_dir(*args, **kwargs) - def txn_begin(self, *args, **kwargs): - return self._cobj.txn_begin(*args, **kwargs) - def txn_checkpoint(self, *args, **kwargs): - return self._cobj.txn_checkpoint(*args, **kwargs) - def txn_stat(self, *args, **kwargs): - return self._cobj.txn_stat(*args, **kwargs) - def set_tx_max(self, *args, **kwargs): - return self._cobj.set_tx_max(*args, **kwargs) - def set_tx_timestamp(self, *args, **kwargs): - return self._cobj.set_tx_timestamp(*args, **kwargs) - def lock_detect(self, *args, **kwargs): - return self._cobj.lock_detect(*args, **kwargs) - def lock_get(self, *args, **kwargs): - return self._cobj.lock_get(*args, **kwargs) - def lock_id(self, *args, **kwargs): - return self._cobj.lock_id(*args, **kwargs) - def lock_put(self, *args, **kwargs): - return self._cobj.lock_put(*args, **kwargs) - def lock_stat(self, *args, **kwargs): - return self._cobj.lock_stat(*args, **kwargs) - def log_archive(self, *args, **kwargs): - return self._cobj.log_archive(*args, **kwargs) - - def set_get_returns_none(self, *args, **kwargs): - return self._cobj.set_get_returns_none(*args, **kwargs) - - def log_stat(self, *args, **kwargs): - return self._cobj.log_stat(*args, **kwargs) - - def dbremove(self, *args, **kwargs): - return self._cobj.dbremove(*args, **kwargs) - def dbrename(self, *args, **kwargs): - return self._cobj.dbrename(*args, **kwargs) - def set_encrypt(self, *args, **kwargs): - return self._cobj.set_encrypt(*args, **kwargs) - - if db.version() >= (4,4): - def fileid_reset(self, *args, **kwargs): - return self._cobj.fileid_reset(*args, **kwargs) - - def lsn_reset(self, *args, **kwargs): - return self._cobj.lsn_reset(*args, **kwargs) - - -class DB(MutableMapping): - def __init__(self, dbenv, *args, **kwargs): - # give it the proper DBEnv C object that its expecting - self._cobj = db.DB(*((dbenv._cobj,) + args), **kwargs) - - # TODO are there other dict methods that need to be overridden? - def __len__(self): - return len(self._cobj) - def __getitem__(self, arg): - return self._cobj[arg] - def __setitem__(self, key, value): - self._cobj[key] = value - def __delitem__(self, arg): - del self._cobj[arg] - - if sys.version_info >= (2, 6) : - def __iter__(self) : - return self._cobj.__iter__() - - def append(self, *args, **kwargs): - return self._cobj.append(*args, **kwargs) - def associate(self, *args, **kwargs): - return self._cobj.associate(*args, **kwargs) - def close(self, *args, **kwargs): - return self._cobj.close(*args, **kwargs) - def consume(self, *args, **kwargs): - return self._cobj.consume(*args, **kwargs) - def consume_wait(self, *args, **kwargs): - return self._cobj.consume_wait(*args, **kwargs) - def cursor(self, *args, **kwargs): - return self._cobj.cursor(*args, **kwargs) - def delete(self, *args, **kwargs): - return self._cobj.delete(*args, **kwargs) - def fd(self, *args, **kwargs): - return self._cobj.fd(*args, **kwargs) - def get(self, *args, **kwargs): - return self._cobj.get(*args, **kwargs) - def pget(self, *args, **kwargs): - return self._cobj.pget(*args, **kwargs) - def get_both(self, *args, **kwargs): - return self._cobj.get_both(*args, **kwargs) - def get_byteswapped(self, *args, **kwargs): - return self._cobj.get_byteswapped(*args, **kwargs) - def get_size(self, *args, **kwargs): - return self._cobj.get_size(*args, **kwargs) - def get_type(self, *args, **kwargs): - return self._cobj.get_type(*args, **kwargs) - def join(self, *args, **kwargs): - return self._cobj.join(*args, **kwargs) - def key_range(self, *args, **kwargs): - return self._cobj.key_range(*args, **kwargs) - def has_key(self, *args, **kwargs): - return self._cobj.has_key(*args, **kwargs) - def items(self, *args, **kwargs): - return self._cobj.items(*args, **kwargs) - def keys(self, *args, **kwargs): - return self._cobj.keys(*args, **kwargs) - def open(self, *args, **kwargs): - return self._cobj.open(*args, **kwargs) - def put(self, *args, **kwargs): - return self._cobj.put(*args, **kwargs) - def remove(self, *args, **kwargs): - return self._cobj.remove(*args, **kwargs) - def rename(self, *args, **kwargs): - return self._cobj.rename(*args, **kwargs) - def set_bt_minkey(self, *args, **kwargs): - return self._cobj.set_bt_minkey(*args, **kwargs) - def set_bt_compare(self, *args, **kwargs): - return self._cobj.set_bt_compare(*args, **kwargs) - def set_cachesize(self, *args, **kwargs): - return self._cobj.set_cachesize(*args, **kwargs) - def set_dup_compare(self, *args, **kwargs) : - return self._cobj.set_dup_compare(*args, **kwargs) - def set_flags(self, *args, **kwargs): - return self._cobj.set_flags(*args, **kwargs) - def set_h_ffactor(self, *args, **kwargs): - return self._cobj.set_h_ffactor(*args, **kwargs) - def set_h_nelem(self, *args, **kwargs): - return self._cobj.set_h_nelem(*args, **kwargs) - def set_lorder(self, *args, **kwargs): - return self._cobj.set_lorder(*args, **kwargs) - def set_pagesize(self, *args, **kwargs): - return self._cobj.set_pagesize(*args, **kwargs) - def set_re_delim(self, *args, **kwargs): - return self._cobj.set_re_delim(*args, **kwargs) - def set_re_len(self, *args, **kwargs): - return self._cobj.set_re_len(*args, **kwargs) - def set_re_pad(self, *args, **kwargs): - return self._cobj.set_re_pad(*args, **kwargs) - def set_re_source(self, *args, **kwargs): - return self._cobj.set_re_source(*args, **kwargs) - def set_q_extentsize(self, *args, **kwargs): - return self._cobj.set_q_extentsize(*args, **kwargs) - def stat(self, *args, **kwargs): - return self._cobj.stat(*args, **kwargs) - def sync(self, *args, **kwargs): - return self._cobj.sync(*args, **kwargs) - def type(self, *args, **kwargs): - return self._cobj.type(*args, **kwargs) - def upgrade(self, *args, **kwargs): - return self._cobj.upgrade(*args, **kwargs) - def values(self, *args, **kwargs): - return self._cobj.values(*args, **kwargs) - def verify(self, *args, **kwargs): - return self._cobj.verify(*args, **kwargs) - def set_get_returns_none(self, *args, **kwargs): - return self._cobj.set_get_returns_none(*args, **kwargs) - - def set_encrypt(self, *args, **kwargs): - return self._cobj.set_encrypt(*args, **kwargs) - - -class DBSequence: - def __init__(self, *args, **kwargs): - self._cobj = db.DBSequence(*args, **kwargs) - - def close(self, *args, **kwargs): - return self._cobj.close(*args, **kwargs) - def get(self, *args, **kwargs): - return self._cobj.get(*args, **kwargs) - def get_dbp(self, *args, **kwargs): - return self._cobj.get_dbp(*args, **kwargs) - def get_key(self, *args, **kwargs): - return self._cobj.get_key(*args, **kwargs) - def init_value(self, *args, **kwargs): - return self._cobj.init_value(*args, **kwargs) - def open(self, *args, **kwargs): - return self._cobj.open(*args, **kwargs) - def remove(self, *args, **kwargs): - return self._cobj.remove(*args, **kwargs) - def stat(self, *args, **kwargs): - return self._cobj.stat(*args, **kwargs) - def set_cachesize(self, *args, **kwargs): - return self._cobj.set_cachesize(*args, **kwargs) - def set_flags(self, *args, **kwargs): - return self._cobj.set_flags(*args, **kwargs) - def set_range(self, *args, **kwargs): - return self._cobj.set_range(*args, **kwargs) - def get_cachesize(self, *args, **kwargs): - return self._cobj.get_cachesize(*args, **kwargs) - def get_flags(self, *args, **kwargs): - return self._cobj.get_flags(*args, **kwargs) - def get_range(self, *args, **kwargs): - return self._cobj.get_range(*args, **kwargs) diff --git a/test/ok_2.7/bsddb/dbrecio.py b/test/ok_2.7/bsddb/dbrecio.py deleted file mode 100644 index d439f325..00000000 --- a/test/ok_2.7/bsddb/dbrecio.py +++ /dev/null @@ -1,190 +0,0 @@ - -""" -File-like objects that read from or write to a bsddb record. - -This implements (nearly) all stdio methods. - -f = DBRecIO(db, key, txn=None) -f.close() # explicitly release resources held -flag = f.isatty() # always false -pos = f.tell() # get current position -f.seek(pos) # set current position -f.seek(pos, mode) # mode 0: absolute; 1: relative; 2: relative to EOF -buf = f.read() # read until EOF -buf = f.read(n) # read up to n bytes -f.truncate([size]) # truncate file at to at most size (default: current pos) -f.write(buf) # write at current position -f.writelines(list) # for line in list: f.write(line) - -Notes: -- fileno() is left unimplemented so that code which uses it triggers - an exception early. -- There's a simple test set (see end of this file) - not yet updated - for DBRecIO. -- readline() is not implemented yet. - - -From: - Itamar Shtull-Trauring -""" - -import errno -import string - -class DBRecIO: - def __init__(self, db, key, txn=None): - self.db = db - self.key = key - self.txn = txn - self.len = None - self.pos = 0 - self.closed = 0 - self.softspace = 0 - - def close(self): - if not self.closed: - self.closed = 1 - del self.db, self.txn - - def isatty(self): - if self.closed: - raise ValueError, "I/O operation on closed file" - return 0 - - def seek(self, pos, mode = 0): - if self.closed: - raise ValueError, "I/O operation on closed file" - if mode == 1: - pos = pos + self.pos - elif mode == 2: - pos = pos + self.len - self.pos = max(0, pos) - - def tell(self): - if self.closed: - raise ValueError, "I/O operation on closed file" - return self.pos - - def read(self, n = -1): - if self.closed: - raise ValueError, "I/O operation on closed file" - if n < 0: - newpos = self.len - else: - newpos = min(self.pos+n, self.len) - - dlen = newpos - self.pos - - r = self.db.get(self.key, txn=self.txn, dlen=dlen, doff=self.pos) - self.pos = newpos - return r - - __fixme = """ - def readline(self, length=None): - if self.closed: - raise ValueError, "I/O operation on closed file" - if self.buflist: - self.buf = self.buf + string.joinfields(self.buflist, '') - self.buflist = [] - i = string.find(self.buf, '\n', self.pos) - if i < 0: - newpos = self.len - else: - newpos = i+1 - if length is not None: - if self.pos + length < newpos: - newpos = self.pos + length - r = self.buf[self.pos:newpos] - self.pos = newpos - return r - - def readlines(self, sizehint = 0): - total = 0 - lines = [] - line = self.readline() - while line: - lines.append(line) - total += len(line) - if 0 < sizehint <= total: - break - line = self.readline() - return lines - """ - - def truncate(self, size=None): - if self.closed: - raise ValueError, "I/O operation on closed file" - if size is None: - size = self.pos - elif size < 0: - raise IOError(errno.EINVAL, - "Negative size not allowed") - elif size < self.pos: - self.pos = size - self.db.put(self.key, "", txn=self.txn, dlen=self.len-size, doff=size) - - def write(self, s): - if self.closed: - raise ValueError, "I/O operation on closed file" - if not s: return - if self.pos > self.len: - self.buflist.append('\0'*(self.pos - self.len)) - self.len = self.pos - newpos = self.pos + len(s) - self.db.put(self.key, s, txn=self.txn, dlen=len(s), doff=self.pos) - self.pos = newpos - - def writelines(self, list): - self.write(string.joinfields(list, '')) - - def flush(self): - if self.closed: - raise ValueError, "I/O operation on closed file" - - -""" -# A little test suite - -def _test(): - import sys - if sys.argv[1:]: - file = sys.argv[1] - else: - file = '/etc/passwd' - lines = open(file, 'r').readlines() - text = open(file, 'r').read() - f = StringIO() - for line in lines[:-2]: - f.write(line) - f.writelines(lines[-2:]) - if f.getvalue() != text: - raise RuntimeError, 'write failed' - length = f.tell() - print 'File length =', length - f.seek(len(lines[0])) - f.write(lines[1]) - f.seek(0) - print 'First line =', repr(f.readline()) - here = f.tell() - line = f.readline() - print 'Second line =', repr(line) - f.seek(-len(line), 1) - line2 = f.read(len(line)) - if line != line2: - raise RuntimeError, 'bad result after seek back' - f.seek(len(line2), 1) - list = f.readlines() - line = list[-1] - f.seek(f.tell() - len(line)) - line2 = f.read() - if line != line2: - raise RuntimeError, 'bad result after seek back from EOF' - print 'Read', len(list), 'more lines' - print 'File length =', f.tell() - if f.tell() != length: - raise RuntimeError, 'bad length' - f.close() - -if __name__ == '__main__': - _test() -""" diff --git a/test/ok_2.7/bsddb/dbshelve.py b/test/ok_2.7/bsddb/dbshelve.py deleted file mode 100644 index 7d0daa2f..00000000 --- a/test/ok_2.7/bsddb/dbshelve.py +++ /dev/null @@ -1,381 +0,0 @@ -#------------------------------------------------------------------------ -# Copyright (c) 1997-2001 by Total Control Software -# All Rights Reserved -#------------------------------------------------------------------------ -# -# Module Name: dbShelve.py -# -# Description: A reimplementation of the standard shelve.py that -# forces the use of cPickle, and DB. -# -# Creation Date: 11/3/97 3:39:04PM -# -# License: This is free software. You may use this software for any -# purpose including modification/redistribution, so long as -# this header remains intact and that you do not claim any -# rights of ownership or authorship of this software. This -# software has been tested, but no warranty is expressed or -# implied. -# -# 13-Dec-2000: Updated to be used with the new bsddb3 package. -# Added DBShelfCursor class. -# -#------------------------------------------------------------------------ - -"""Manage shelves of pickled objects using bsddb database files for the -storage. -""" - -#------------------------------------------------------------------------ - -import sys -absolute_import = (sys.version_info[0] >= 3) -if absolute_import : - # Because this syntaxis is not valid before Python 2.5 - exec("from . import db") -else : - import db - -if sys.version_info[0] >= 3 : - import cPickle # Will be converted to "pickle" by "2to3" -else : - if sys.version_info < (2, 6) : - import cPickle - else : - # When we drop support for python 2.4 - # we could use: (in 2.5 we need a __future__ statement) - # - # with warnings.catch_warnings(): - # warnings.filterwarnings(...) - # ... - # - # We can not use "with" as is, because it would be invalid syntax - # in python 2.4 and (with no __future__) 2.5. - # Here we simulate "with" following PEP 343 : - import warnings - w = warnings.catch_warnings() - w.__enter__() - try : - warnings.filterwarnings('ignore', - message='the cPickle module has been removed in Python 3.0', - category=DeprecationWarning) - import cPickle - finally : - w.__exit__() - del w - -HIGHEST_PROTOCOL = cPickle.HIGHEST_PROTOCOL -def _dumps(object, protocol): - return cPickle.dumps(object, protocol=protocol) - -if sys.version_info < (2, 6) : - from UserDict import DictMixin as MutableMapping -else : - import collections - MutableMapping = collections.MutableMapping - -#------------------------------------------------------------------------ - - -def open(filename, flags=db.DB_CREATE, mode=0660, filetype=db.DB_HASH, - dbenv=None, dbname=None): - """ - A simple factory function for compatibility with the standard - shleve.py module. It can be used like this, where key is a string - and data is a pickleable object: - - from bsddb import dbshelve - db = dbshelve.open(filename) - - db[key] = data - - db.close() - """ - if type(flags) == type(''): - sflag = flags - if sflag == 'r': - flags = db.DB_RDONLY - elif sflag == 'rw': - flags = 0 - elif sflag == 'w': - flags = db.DB_CREATE - elif sflag == 'c': - flags = db.DB_CREATE - elif sflag == 'n': - flags = db.DB_TRUNCATE | db.DB_CREATE - else: - raise db.DBError, "flags should be one of 'r', 'w', 'c' or 'n' or use the bsddb.db.DB_* flags" - - d = DBShelf(dbenv) - d.open(filename, dbname, filetype, flags, mode) - return d - -#--------------------------------------------------------------------------- - -class DBShelveError(db.DBError): pass - - -class DBShelf(MutableMapping): - """A shelf to hold pickled objects, built upon a bsddb DB object. It - automatically pickles/unpickles data objects going to/from the DB. - """ - def __init__(self, dbenv=None): - self.db = db.DB(dbenv) - self._closed = True - if HIGHEST_PROTOCOL: - self.protocol = HIGHEST_PROTOCOL - else: - self.protocol = 1 - - - def __del__(self): - self.close() - - - def __getattr__(self, name): - """Many methods we can just pass through to the DB object. - (See below) - """ - return getattr(self.db, name) - - - #----------------------------------- - # Dictionary access methods - - def __len__(self): - return len(self.db) - - - def __getitem__(self, key): - data = self.db[key] - return cPickle.loads(data) - - - def __setitem__(self, key, value): - data = _dumps(value, self.protocol) - self.db[key] = data - - - def __delitem__(self, key): - del self.db[key] - - - def keys(self, txn=None): - if txn is not None: - return self.db.keys(txn) - else: - return self.db.keys() - - if sys.version_info >= (2, 6) : - def __iter__(self) : # XXX: Load all keys in memory :-( - for k in self.db.keys() : - yield k - - # Do this when "DB" support iteration - # Or is it enough to pass thru "getattr"? - # - # def __iter__(self) : - # return self.db.__iter__() - - - def open(self, *args, **kwargs): - self.db.open(*args, **kwargs) - self._closed = False - - - def close(self, *args, **kwargs): - self.db.close(*args, **kwargs) - self._closed = True - - - def __repr__(self): - if self._closed: - return '' % (id(self)) - else: - return repr(dict(self.iteritems())) - - - def items(self, txn=None): - if txn is not None: - items = self.db.items(txn) - else: - items = self.db.items() - newitems = [] - - for k, v in items: - newitems.append( (k, cPickle.loads(v)) ) - return newitems - - def values(self, txn=None): - if txn is not None: - values = self.db.values(txn) - else: - values = self.db.values() - - return map(cPickle.loads, values) - - #----------------------------------- - # Other methods - - def __append(self, value, txn=None): - data = _dumps(value, self.protocol) - return self.db.append(data, txn) - - def append(self, value, txn=None): - if self.get_type() == db.DB_RECNO: - return self.__append(value, txn=txn) - raise DBShelveError, "append() only supported when dbshelve opened with filetype=dbshelve.db.DB_RECNO" - - - def associate(self, secondaryDB, callback, flags=0): - def _shelf_callback(priKey, priData, realCallback=callback): - # Safe in Python 2.x because expresion short circuit - if sys.version_info[0] < 3 or isinstance(priData, bytes) : - data = cPickle.loads(priData) - else : - data = cPickle.loads(bytes(priData, "iso8859-1")) # 8 bits - return realCallback(priKey, data) - - return self.db.associate(secondaryDB, _shelf_callback, flags) - - - #def get(self, key, default=None, txn=None, flags=0): - def get(self, *args, **kw): - # We do it with *args and **kw so if the default value wasn't - # given nothing is passed to the extension module. That way - # an exception can be raised if set_get_returns_none is turned - # off. - data = self.db.get(*args, **kw) - try: - return cPickle.loads(data) - except (EOFError, TypeError, cPickle.UnpicklingError): - return data # we may be getting the default value, or None, - # so it doesn't need unpickled. - - def get_both(self, key, value, txn=None, flags=0): - data = _dumps(value, self.protocol) - data = self.db.get(key, data, txn, flags) - return cPickle.loads(data) - - - def cursor(self, txn=None, flags=0): - c = DBShelfCursor(self.db.cursor(txn, flags)) - c.protocol = self.protocol - return c - - - def put(self, key, value, txn=None, flags=0): - data = _dumps(value, self.protocol) - return self.db.put(key, data, txn, flags) - - - def join(self, cursorList, flags=0): - raise NotImplementedError - - - #---------------------------------------------- - # Methods allowed to pass-through to self.db - # - # close, delete, fd, get_byteswapped, get_type, has_key, - # key_range, open, remove, rename, stat, sync, - # upgrade, verify, and all set_* methods. - - -#--------------------------------------------------------------------------- - -class DBShelfCursor: - """ - """ - def __init__(self, cursor): - self.dbc = cursor - - def __del__(self): - self.close() - - - def __getattr__(self, name): - """Some methods we can just pass through to the cursor object. (See below)""" - return getattr(self.dbc, name) - - - #---------------------------------------------- - - def dup(self, flags=0): - c = DBShelfCursor(self.dbc.dup(flags)) - c.protocol = self.protocol - return c - - - def put(self, key, value, flags=0): - data = _dumps(value, self.protocol) - return self.dbc.put(key, data, flags) - - - def get(self, *args): - count = len(args) # a method overloading hack - method = getattr(self, 'get_%d' % count) - method(*args) - - def get_1(self, flags): - rec = self.dbc.get(flags) - return self._extract(rec) - - def get_2(self, key, flags): - rec = self.dbc.get(key, flags) - return self._extract(rec) - - def get_3(self, key, value, flags): - data = _dumps(value, self.protocol) - rec = self.dbc.get(key, flags) - return self._extract(rec) - - - def current(self, flags=0): return self.get_1(flags|db.DB_CURRENT) - def first(self, flags=0): return self.get_1(flags|db.DB_FIRST) - def last(self, flags=0): return self.get_1(flags|db.DB_LAST) - def next(self, flags=0): return self.get_1(flags|db.DB_NEXT) - def prev(self, flags=0): return self.get_1(flags|db.DB_PREV) - def consume(self, flags=0): return self.get_1(flags|db.DB_CONSUME) - def next_dup(self, flags=0): return self.get_1(flags|db.DB_NEXT_DUP) - def next_nodup(self, flags=0): return self.get_1(flags|db.DB_NEXT_NODUP) - def prev_nodup(self, flags=0): return self.get_1(flags|db.DB_PREV_NODUP) - - - def get_both(self, key, value, flags=0): - data = _dumps(value, self.protocol) - rec = self.dbc.get_both(key, flags) - return self._extract(rec) - - - def set(self, key, flags=0): - rec = self.dbc.set(key, flags) - return self._extract(rec) - - def set_range(self, key, flags=0): - rec = self.dbc.set_range(key, flags) - return self._extract(rec) - - def set_recno(self, recno, flags=0): - rec = self.dbc.set_recno(recno, flags) - return self._extract(rec) - - set_both = get_both - - def _extract(self, rec): - if rec is None: - return None - else: - key, data = rec - # Safe in Python 2.x because expresion short circuit - if sys.version_info[0] < 3 or isinstance(data, bytes) : - return key, cPickle.loads(data) - else : - return key, cPickle.loads(bytes(data, "iso8859-1")) # 8 bits - - #---------------------------------------------- - # Methods allowed to pass-through to self.dbc - # - # close, count, delete, get_recno, join_item - - -#--------------------------------------------------------------------------- diff --git a/test/ok_2.7/bsddb/dbutils.py b/test/ok_2.7/bsddb/dbutils.py deleted file mode 100644 index 02a686f5..00000000 --- a/test/ok_2.7/bsddb/dbutils.py +++ /dev/null @@ -1,83 +0,0 @@ -#------------------------------------------------------------------------ -# -# Copyright (C) 2000 Autonomous Zone Industries -# -# License: This is free software. You may use this software for any -# purpose including modification/redistribution, so long as -# this header remains intact and that you do not claim any -# rights of ownership or authorship of this software. This -# software has been tested, but no warranty is expressed or -# implied. -# -# Author: Gregory P. Smith -# -# Note: I don't know how useful this is in reality since when a -# DBLockDeadlockError happens the current transaction is supposed to be -# aborted. If it doesn't then when the operation is attempted again -# the deadlock is still happening... -# --Robin -# -#------------------------------------------------------------------------ - - -# -# import the time.sleep function in a namespace safe way to allow -# "from bsddb.dbutils import *" -# -from time import sleep as _sleep - -import sys -absolute_import = (sys.version_info[0] >= 3) -if absolute_import : - # Because this syntaxis is not valid before Python 2.5 - exec("from . import db") -else : - import db - -# always sleep at least N seconds between retrys -_deadlock_MinSleepTime = 1.0/128 -# never sleep more than N seconds between retrys -_deadlock_MaxSleepTime = 3.14159 - -# Assign a file object to this for a "sleeping" message to be written to it -# each retry -_deadlock_VerboseFile = None - - -def DeadlockWrap(function, *_args, **_kwargs): - """DeadlockWrap(function, *_args, **_kwargs) - automatically retries - function in case of a database deadlock. - - This is a function intended to be used to wrap database calls such - that they perform retrys with exponentially backing off sleeps in - between when a DBLockDeadlockError exception is raised. - - A 'max_retries' parameter may optionally be passed to prevent it - from retrying forever (in which case the exception will be reraised). - - d = DB(...) - d.open(...) - DeadlockWrap(d.put, "foo", data="bar") # set key "foo" to "bar" - """ - sleeptime = _deadlock_MinSleepTime - max_retries = _kwargs.get('max_retries', -1) - if 'max_retries' in _kwargs: - del _kwargs['max_retries'] - while True: - try: - return function(*_args, **_kwargs) - except db.DBLockDeadlockError: - if _deadlock_VerboseFile: - _deadlock_VerboseFile.write( - 'dbutils.DeadlockWrap: sleeping %1.3f\n' % sleeptime) - _sleep(sleeptime) - # exponential backoff in the sleep time - sleeptime *= 2 - if sleeptime > _deadlock_MaxSleepTime: - sleeptime = _deadlock_MaxSleepTime - max_retries -= 1 - if max_retries == -1: - raise - - -#------------------------------------------------------------------------ diff --git a/test/ok_2.7/compiler/__init__.py b/test/ok_2.7/compiler/__init__.py deleted file mode 100644 index 2a6f64fa..00000000 --- a/test/ok_2.7/compiler/__init__.py +++ /dev/null @@ -1,31 +0,0 @@ -"""Package for parsing and compiling Python source code - -There are several functions defined at the top level that are imported -from modules contained in the package. - -parse(buf, mode="exec") -> AST - Converts a string containing Python source code to an abstract - syntax tree (AST). The AST is defined in compiler.ast. - -parseFile(path) -> AST - The same as parse(open(path)) - -walk(ast, visitor, verbose=None) - Does a pre-order walk over the ast using the visitor instance. - See compiler.visitor for details. - -compile(source, filename, mode, flags=None, dont_inherit=None) - Returns a code object. A replacement for the builtin compile() function. - -compileFile(filename) - Generates a .pyc file by compiling filename. -""" - -import warnings - -warnings.warn("The compiler package is deprecated and removed in Python 3.x.", - DeprecationWarning, stacklevel=2) - -from compiler.transformer import parse, parseFile -from compiler.visitor import walk -from compiler.pycodegen import compile, compileFile diff --git a/test/ok_2.7/compiler/ast.py b/test/ok_2.7/compiler/ast.py deleted file mode 100644 index 4c3fc161..00000000 --- a/test/ok_2.7/compiler/ast.py +++ /dev/null @@ -1,1419 +0,0 @@ -"""Python abstract syntax node definitions - -This file is automatically generated by Tools/compiler/astgen.py -""" -from compiler.consts import CO_VARARGS, CO_VARKEYWORDS - -def flatten(seq): - l = [] - for elt in seq: - t = type(elt) - if t is tuple or t is list: - for elt2 in flatten(elt): - l.append(elt2) - else: - l.append(elt) - return l - -def flatten_nodes(seq): - return [n for n in flatten(seq) if isinstance(n, Node)] - -nodes = {} - -class Node: - """Abstract base class for ast nodes.""" - def getChildren(self): - pass # implemented by subclasses - def __iter__(self): - for n in self.getChildren(): - yield n - def asList(self): # for backwards compatibility - return self.getChildren() - def getChildNodes(self): - pass # implemented by subclasses - -class EmptyNode(Node): - pass - -class Expression(Node): - # Expression is an artificial node class to support "eval" - nodes["expression"] = "Expression" - def __init__(self, node): - self.node = node - - def getChildren(self): - return self.node, - - def getChildNodes(self): - return self.node, - - def __repr__(self): - return "Expression(%s)" % (repr(self.node)) - -class Add(Node): - def __init__(self, leftright, lineno=None): - self.left = leftright[0] - self.right = leftright[1] - self.lineno = lineno - - def getChildren(self): - return self.left, self.right - - def getChildNodes(self): - return self.left, self.right - - def __repr__(self): - return "Add((%s, %s))" % (repr(self.left), repr(self.right)) - -class And(Node): - def __init__(self, nodes, lineno=None): - self.nodes = nodes - self.lineno = lineno - - def getChildren(self): - return tuple(flatten(self.nodes)) - - def getChildNodes(self): - nodelist = [] - nodelist.extend(flatten_nodes(self.nodes)) - return tuple(nodelist) - - def __repr__(self): - return "And(%s)" % (repr(self.nodes),) - -class AssAttr(Node): - def __init__(self, expr, attrname, flags, lineno=None): - self.expr = expr - self.attrname = attrname - self.flags = flags - self.lineno = lineno - - def getChildren(self): - return self.expr, self.attrname, self.flags - - def getChildNodes(self): - return self.expr, - - def __repr__(self): - return "AssAttr(%s, %s, %s)" % (repr(self.expr), repr(self.attrname), repr(self.flags)) - -class AssList(Node): - def __init__(self, nodes, lineno=None): - self.nodes = nodes - self.lineno = lineno - - def getChildren(self): - return tuple(flatten(self.nodes)) - - def getChildNodes(self): - nodelist = [] - nodelist.extend(flatten_nodes(self.nodes)) - return tuple(nodelist) - - def __repr__(self): - return "AssList(%s)" % (repr(self.nodes),) - -class AssName(Node): - def __init__(self, name, flags, lineno=None): - self.name = name - self.flags = flags - self.lineno = lineno - - def getChildren(self): - return self.name, self.flags - - def getChildNodes(self): - return () - - def __repr__(self): - return "AssName(%s, %s)" % (repr(self.name), repr(self.flags)) - -class AssTuple(Node): - def __init__(self, nodes, lineno=None): - self.nodes = nodes - self.lineno = lineno - - def getChildren(self): - return tuple(flatten(self.nodes)) - - def getChildNodes(self): - nodelist = [] - nodelist.extend(flatten_nodes(self.nodes)) - return tuple(nodelist) - - def __repr__(self): - return "AssTuple(%s)" % (repr(self.nodes),) - -class Assert(Node): - def __init__(self, test, fail, lineno=None): - self.test = test - self.fail = fail - self.lineno = lineno - - def getChildren(self): - children = [] - children.append(self.test) - children.append(self.fail) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - nodelist.append(self.test) - if self.fail is not None: - nodelist.append(self.fail) - return tuple(nodelist) - - def __repr__(self): - return "Assert(%s, %s)" % (repr(self.test), repr(self.fail)) - -class Assign(Node): - def __init__(self, nodes, expr, lineno=None): - self.nodes = nodes - self.expr = expr - self.lineno = lineno - - def getChildren(self): - children = [] - children.extend(flatten(self.nodes)) - children.append(self.expr) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - nodelist.extend(flatten_nodes(self.nodes)) - nodelist.append(self.expr) - return tuple(nodelist) - - def __repr__(self): - return "Assign(%s, %s)" % (repr(self.nodes), repr(self.expr)) - -class AugAssign(Node): - def __init__(self, node, op, expr, lineno=None): - self.node = node - self.op = op - self.expr = expr - self.lineno = lineno - - def getChildren(self): - return self.node, self.op, self.expr - - def getChildNodes(self): - return self.node, self.expr - - def __repr__(self): - return "AugAssign(%s, %s, %s)" % (repr(self.node), repr(self.op), repr(self.expr)) - -class Backquote(Node): - def __init__(self, expr, lineno=None): - self.expr = expr - self.lineno = lineno - - def getChildren(self): - return self.expr, - - def getChildNodes(self): - return self.expr, - - def __repr__(self): - return "Backquote(%s)" % (repr(self.expr),) - -class Bitand(Node): - def __init__(self, nodes, lineno=None): - self.nodes = nodes - self.lineno = lineno - - def getChildren(self): - return tuple(flatten(self.nodes)) - - def getChildNodes(self): - nodelist = [] - nodelist.extend(flatten_nodes(self.nodes)) - return tuple(nodelist) - - def __repr__(self): - return "Bitand(%s)" % (repr(self.nodes),) - -class Bitor(Node): - def __init__(self, nodes, lineno=None): - self.nodes = nodes - self.lineno = lineno - - def getChildren(self): - return tuple(flatten(self.nodes)) - - def getChildNodes(self): - nodelist = [] - nodelist.extend(flatten_nodes(self.nodes)) - return tuple(nodelist) - - def __repr__(self): - return "Bitor(%s)" % (repr(self.nodes),) - -class Bitxor(Node): - def __init__(self, nodes, lineno=None): - self.nodes = nodes - self.lineno = lineno - - def getChildren(self): - return tuple(flatten(self.nodes)) - - def getChildNodes(self): - nodelist = [] - nodelist.extend(flatten_nodes(self.nodes)) - return tuple(nodelist) - - def __repr__(self): - return "Bitxor(%s)" % (repr(self.nodes),) - -class Break(Node): - def __init__(self, lineno=None): - self.lineno = lineno - - def getChildren(self): - return () - - def getChildNodes(self): - return () - - def __repr__(self): - return "Break()" - -class CallFunc(Node): - def __init__(self, node, args, star_args = None, dstar_args = None, lineno=None): - self.node = node - self.args = args - self.star_args = star_args - self.dstar_args = dstar_args - self.lineno = lineno - - def getChildren(self): - children = [] - children.append(self.node) - children.extend(flatten(self.args)) - children.append(self.star_args) - children.append(self.dstar_args) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - nodelist.append(self.node) - nodelist.extend(flatten_nodes(self.args)) - if self.star_args is not None: - nodelist.append(self.star_args) - if self.dstar_args is not None: - nodelist.append(self.dstar_args) - return tuple(nodelist) - - def __repr__(self): - return "CallFunc(%s, %s, %s, %s)" % (repr(self.node), repr(self.args), repr(self.star_args), repr(self.dstar_args)) - -class Class(Node): - def __init__(self, name, bases, doc, code, decorators = None, lineno=None): - self.name = name - self.bases = bases - self.doc = doc - self.code = code - self.decorators = decorators - self.lineno = lineno - - def getChildren(self): - children = [] - children.append(self.name) - children.extend(flatten(self.bases)) - children.append(self.doc) - children.append(self.code) - children.append(self.decorators) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - nodelist.extend(flatten_nodes(self.bases)) - nodelist.append(self.code) - if self.decorators is not None: - nodelist.append(self.decorators) - return tuple(nodelist) - - def __repr__(self): - return "Class(%s, %s, %s, %s, %s)" % (repr(self.name), repr(self.bases), repr(self.doc), repr(self.code), repr(self.decorators)) - -class Compare(Node): - def __init__(self, expr, ops, lineno=None): - self.expr = expr - self.ops = ops - self.lineno = lineno - - def getChildren(self): - children = [] - children.append(self.expr) - children.extend(flatten(self.ops)) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - nodelist.append(self.expr) - nodelist.extend(flatten_nodes(self.ops)) - return tuple(nodelist) - - def __repr__(self): - return "Compare(%s, %s)" % (repr(self.expr), repr(self.ops)) - -class Const(Node): - def __init__(self, value, lineno=None): - self.value = value - self.lineno = lineno - - def getChildren(self): - return self.value, - - def getChildNodes(self): - return () - - def __repr__(self): - return "Const(%s)" % (repr(self.value),) - -class Continue(Node): - def __init__(self, lineno=None): - self.lineno = lineno - - def getChildren(self): - return () - - def getChildNodes(self): - return () - - def __repr__(self): - return "Continue()" - -class Decorators(Node): - def __init__(self, nodes, lineno=None): - self.nodes = nodes - self.lineno = lineno - - def getChildren(self): - return tuple(flatten(self.nodes)) - - def getChildNodes(self): - nodelist = [] - nodelist.extend(flatten_nodes(self.nodes)) - return tuple(nodelist) - - def __repr__(self): - return "Decorators(%s)" % (repr(self.nodes),) - -class Dict(Node): - def __init__(self, items, lineno=None): - self.items = items - self.lineno = lineno - - def getChildren(self): - return tuple(flatten(self.items)) - - def getChildNodes(self): - nodelist = [] - nodelist.extend(flatten_nodes(self.items)) - return tuple(nodelist) - - def __repr__(self): - return "Dict(%s)" % (repr(self.items),) - -class Discard(Node): - def __init__(self, expr, lineno=None): - self.expr = expr - self.lineno = lineno - - def getChildren(self): - return self.expr, - - def getChildNodes(self): - return self.expr, - - def __repr__(self): - return "Discard(%s)" % (repr(self.expr),) - -class Div(Node): - def __init__(self, leftright, lineno=None): - self.left = leftright[0] - self.right = leftright[1] - self.lineno = lineno - - def getChildren(self): - return self.left, self.right - - def getChildNodes(self): - return self.left, self.right - - def __repr__(self): - return "Div((%s, %s))" % (repr(self.left), repr(self.right)) - -class Ellipsis(Node): - def __init__(self, lineno=None): - self.lineno = lineno - - def getChildren(self): - return () - - def getChildNodes(self): - return () - - def __repr__(self): - return "Ellipsis()" - -class Exec(Node): - def __init__(self, expr, locals, globals, lineno=None): - self.expr = expr - self.locals = locals - self.globals = globals - self.lineno = lineno - - def getChildren(self): - children = [] - children.append(self.expr) - children.append(self.locals) - children.append(self.globals) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - nodelist.append(self.expr) - if self.locals is not None: - nodelist.append(self.locals) - if self.globals is not None: - nodelist.append(self.globals) - return tuple(nodelist) - - def __repr__(self): - return "Exec(%s, %s, %s)" % (repr(self.expr), repr(self.locals), repr(self.globals)) - -class FloorDiv(Node): - def __init__(self, leftright, lineno=None): - self.left = leftright[0] - self.right = leftright[1] - self.lineno = lineno - - def getChildren(self): - return self.left, self.right - - def getChildNodes(self): - return self.left, self.right - - def __repr__(self): - return "FloorDiv((%s, %s))" % (repr(self.left), repr(self.right)) - -class For(Node): - def __init__(self, assign, list, body, else_, lineno=None): - self.assign = assign - self.list = list - self.body = body - self.else_ = else_ - self.lineno = lineno - - def getChildren(self): - children = [] - children.append(self.assign) - children.append(self.list) - children.append(self.body) - children.append(self.else_) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - nodelist.append(self.assign) - nodelist.append(self.list) - nodelist.append(self.body) - if self.else_ is not None: - nodelist.append(self.else_) - return tuple(nodelist) - - def __repr__(self): - return "For(%s, %s, %s, %s)" % (repr(self.assign), repr(self.list), repr(self.body), repr(self.else_)) - -class From(Node): - def __init__(self, modname, names, level, lineno=None): - self.modname = modname - self.names = names - self.level = level - self.lineno = lineno - - def getChildren(self): - return self.modname, self.names, self.level - - def getChildNodes(self): - return () - - def __repr__(self): - return "From(%s, %s, %s)" % (repr(self.modname), repr(self.names), repr(self.level)) - -class Function(Node): - def __init__(self, decorators, name, argnames, defaults, flags, doc, code, lineno=None): - self.decorators = decorators - self.name = name - self.argnames = argnames - self.defaults = defaults - self.flags = flags - self.doc = doc - self.code = code - self.lineno = lineno - self.varargs = self.kwargs = None - if flags & CO_VARARGS: - self.varargs = 1 - if flags & CO_VARKEYWORDS: - self.kwargs = 1 - - - def getChildren(self): - children = [] - children.append(self.decorators) - children.append(self.name) - children.append(self.argnames) - children.extend(flatten(self.defaults)) - children.append(self.flags) - children.append(self.doc) - children.append(self.code) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - if self.decorators is not None: - nodelist.append(self.decorators) - nodelist.extend(flatten_nodes(self.defaults)) - nodelist.append(self.code) - return tuple(nodelist) - - def __repr__(self): - return "Function(%s, %s, %s, %s, %s, %s, %s)" % (repr(self.decorators), repr(self.name), repr(self.argnames), repr(self.defaults), repr(self.flags), repr(self.doc), repr(self.code)) - -class GenExpr(Node): - def __init__(self, code, lineno=None): - self.code = code - self.lineno = lineno - self.argnames = ['.0'] - self.varargs = self.kwargs = None - - - def getChildren(self): - return self.code, - - def getChildNodes(self): - return self.code, - - def __repr__(self): - return "GenExpr(%s)" % (repr(self.code),) - -class GenExprFor(Node): - def __init__(self, assign, iter, ifs, lineno=None): - self.assign = assign - self.iter = iter - self.ifs = ifs - self.lineno = lineno - self.is_outmost = False - - def getChildren(self): - children = [] - children.append(self.assign) - children.append(self.iter) - children.extend(flatten(self.ifs)) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - nodelist.append(self.assign) - nodelist.append(self.iter) - nodelist.extend(flatten_nodes(self.ifs)) - return tuple(nodelist) - - def __repr__(self): - return "GenExprFor(%s, %s, %s)" % (repr(self.assign), repr(self.iter), repr(self.ifs)) - -class GenExprIf(Node): - def __init__(self, test, lineno=None): - self.test = test - self.lineno = lineno - - def getChildren(self): - return self.test, - - def getChildNodes(self): - return self.test, - - def __repr__(self): - return "GenExprIf(%s)" % (repr(self.test),) - -class GenExprInner(Node): - def __init__(self, expr, quals, lineno=None): - self.expr = expr - self.quals = quals - self.lineno = lineno - - def getChildren(self): - children = [] - children.append(self.expr) - children.extend(flatten(self.quals)) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - nodelist.append(self.expr) - nodelist.extend(flatten_nodes(self.quals)) - return tuple(nodelist) - - def __repr__(self): - return "GenExprInner(%s, %s)" % (repr(self.expr), repr(self.quals)) - -class Getattr(Node): - def __init__(self, expr, attrname, lineno=None): - self.expr = expr - self.attrname = attrname - self.lineno = lineno - - def getChildren(self): - return self.expr, self.attrname - - def getChildNodes(self): - return self.expr, - - def __repr__(self): - return "Getattr(%s, %s)" % (repr(self.expr), repr(self.attrname)) - -class Global(Node): - def __init__(self, names, lineno=None): - self.names = names - self.lineno = lineno - - def getChildren(self): - return self.names, - - def getChildNodes(self): - return () - - def __repr__(self): - return "Global(%s)" % (repr(self.names),) - -class If(Node): - def __init__(self, tests, else_, lineno=None): - self.tests = tests - self.else_ = else_ - self.lineno = lineno - - def getChildren(self): - children = [] - children.extend(flatten(self.tests)) - children.append(self.else_) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - nodelist.extend(flatten_nodes(self.tests)) - if self.else_ is not None: - nodelist.append(self.else_) - return tuple(nodelist) - - def __repr__(self): - return "If(%s, %s)" % (repr(self.tests), repr(self.else_)) - -class IfExp(Node): - def __init__(self, test, then, else_, lineno=None): - self.test = test - self.then = then - self.else_ = else_ - self.lineno = lineno - - def getChildren(self): - return self.test, self.then, self.else_ - - def getChildNodes(self): - return self.test, self.then, self.else_ - - def __repr__(self): - return "IfExp(%s, %s, %s)" % (repr(self.test), repr(self.then), repr(self.else_)) - -class Import(Node): - def __init__(self, names, lineno=None): - self.names = names - self.lineno = lineno - - def getChildren(self): - return self.names, - - def getChildNodes(self): - return () - - def __repr__(self): - return "Import(%s)" % (repr(self.names),) - -class Invert(Node): - def __init__(self, expr, lineno=None): - self.expr = expr - self.lineno = lineno - - def getChildren(self): - return self.expr, - - def getChildNodes(self): - return self.expr, - - def __repr__(self): - return "Invert(%s)" % (repr(self.expr),) - -class Keyword(Node): - def __init__(self, name, expr, lineno=None): - self.name = name - self.expr = expr - self.lineno = lineno - - def getChildren(self): - return self.name, self.expr - - def getChildNodes(self): - return self.expr, - - def __repr__(self): - return "Keyword(%s, %s)" % (repr(self.name), repr(self.expr)) - -class Lambda(Node): - def __init__(self, argnames, defaults, flags, code, lineno=None): - self.argnames = argnames - self.defaults = defaults - self.flags = flags - self.code = code - self.lineno = lineno - self.varargs = self.kwargs = None - if flags & CO_VARARGS: - self.varargs = 1 - if flags & CO_VARKEYWORDS: - self.kwargs = 1 - - - def getChildren(self): - children = [] - children.append(self.argnames) - children.extend(flatten(self.defaults)) - children.append(self.flags) - children.append(self.code) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - nodelist.extend(flatten_nodes(self.defaults)) - nodelist.append(self.code) - return tuple(nodelist) - - def __repr__(self): - return "Lambda(%s, %s, %s, %s)" % (repr(self.argnames), repr(self.defaults), repr(self.flags), repr(self.code)) - -class LeftShift(Node): - def __init__(self, leftright, lineno=None): - self.left = leftright[0] - self.right = leftright[1] - self.lineno = lineno - - def getChildren(self): - return self.left, self.right - - def getChildNodes(self): - return self.left, self.right - - def __repr__(self): - return "LeftShift((%s, %s))" % (repr(self.left), repr(self.right)) - -class List(Node): - def __init__(self, nodes, lineno=None): - self.nodes = nodes - self.lineno = lineno - - def getChildren(self): - return tuple(flatten(self.nodes)) - - def getChildNodes(self): - nodelist = [] - nodelist.extend(flatten_nodes(self.nodes)) - return tuple(nodelist) - - def __repr__(self): - return "List(%s)" % (repr(self.nodes),) - -class ListComp(Node): - def __init__(self, expr, quals, lineno=None): - self.expr = expr - self.quals = quals - self.lineno = lineno - - def getChildren(self): - children = [] - children.append(self.expr) - children.extend(flatten(self.quals)) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - nodelist.append(self.expr) - nodelist.extend(flatten_nodes(self.quals)) - return tuple(nodelist) - - def __repr__(self): - return "ListComp(%s, %s)" % (repr(self.expr), repr(self.quals)) - -class ListCompFor(Node): - def __init__(self, assign, list, ifs, lineno=None): - self.assign = assign - self.list = list - self.ifs = ifs - self.lineno = lineno - - def getChildren(self): - children = [] - children.append(self.assign) - children.append(self.list) - children.extend(flatten(self.ifs)) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - nodelist.append(self.assign) - nodelist.append(self.list) - nodelist.extend(flatten_nodes(self.ifs)) - return tuple(nodelist) - - def __repr__(self): - return "ListCompFor(%s, %s, %s)" % (repr(self.assign), repr(self.list), repr(self.ifs)) - -class ListCompIf(Node): - def __init__(self, test, lineno=None): - self.test = test - self.lineno = lineno - - def getChildren(self): - return self.test, - - def getChildNodes(self): - return self.test, - - def __repr__(self): - return "ListCompIf(%s)" % (repr(self.test),) - -class SetComp(Node): - def __init__(self, expr, quals, lineno=None): - self.expr = expr - self.quals = quals - self.lineno = lineno - - def getChildren(self): - children = [] - children.append(self.expr) - children.extend(flatten(self.quals)) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - nodelist.append(self.expr) - nodelist.extend(flatten_nodes(self.quals)) - return tuple(nodelist) - - def __repr__(self): - return "SetComp(%s, %s)" % (repr(self.expr), repr(self.quals)) - -class DictComp(Node): - def __init__(self, key, value, quals, lineno=None): - self.key = key - self.value = value - self.quals = quals - self.lineno = lineno - - def getChildren(self): - children = [] - children.append(self.key) - children.append(self.value) - children.extend(flatten(self.quals)) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - nodelist.append(self.key) - nodelist.append(self.value) - nodelist.extend(flatten_nodes(self.quals)) - return tuple(nodelist) - - def __repr__(self): - return "DictComp(%s, %s, %s)" % (repr(self.key), repr(self.value), repr(self.quals)) - -class Mod(Node): - def __init__(self, leftright, lineno=None): - self.left = leftright[0] - self.right = leftright[1] - self.lineno = lineno - - def getChildren(self): - return self.left, self.right - - def getChildNodes(self): - return self.left, self.right - - def __repr__(self): - return "Mod((%s, %s))" % (repr(self.left), repr(self.right)) - -class Module(Node): - def __init__(self, doc, node, lineno=None): - self.doc = doc - self.node = node - self.lineno = lineno - - def getChildren(self): - return self.doc, self.node - - def getChildNodes(self): - return self.node, - - def __repr__(self): - return "Module(%s, %s)" % (repr(self.doc), repr(self.node)) - -class Mul(Node): - def __init__(self, leftright, lineno=None): - self.left = leftright[0] - self.right = leftright[1] - self.lineno = lineno - - def getChildren(self): - return self.left, self.right - - def getChildNodes(self): - return self.left, self.right - - def __repr__(self): - return "Mul((%s, %s))" % (repr(self.left), repr(self.right)) - -class Name(Node): - def __init__(self, name, lineno=None): - self.name = name - self.lineno = lineno - - def getChildren(self): - return self.name, - - def getChildNodes(self): - return () - - def __repr__(self): - return "Name(%s)" % (repr(self.name),) - -class Not(Node): - def __init__(self, expr, lineno=None): - self.expr = expr - self.lineno = lineno - - def getChildren(self): - return self.expr, - - def getChildNodes(self): - return self.expr, - - def __repr__(self): - return "Not(%s)" % (repr(self.expr),) - -class Or(Node): - def __init__(self, nodes, lineno=None): - self.nodes = nodes - self.lineno = lineno - - def getChildren(self): - return tuple(flatten(self.nodes)) - - def getChildNodes(self): - nodelist = [] - nodelist.extend(flatten_nodes(self.nodes)) - return tuple(nodelist) - - def __repr__(self): - return "Or(%s)" % (repr(self.nodes),) - -class Pass(Node): - def __init__(self, lineno=None): - self.lineno = lineno - - def getChildren(self): - return () - - def getChildNodes(self): - return () - - def __repr__(self): - return "Pass()" - -class Power(Node): - def __init__(self, leftright, lineno=None): - self.left = leftright[0] - self.right = leftright[1] - self.lineno = lineno - - def getChildren(self): - return self.left, self.right - - def getChildNodes(self): - return self.left, self.right - - def __repr__(self): - return "Power((%s, %s))" % (repr(self.left), repr(self.right)) - -class Print(Node): - def __init__(self, nodes, dest, lineno=None): - self.nodes = nodes - self.dest = dest - self.lineno = lineno - - def getChildren(self): - children = [] - children.extend(flatten(self.nodes)) - children.append(self.dest) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - nodelist.extend(flatten_nodes(self.nodes)) - if self.dest is not None: - nodelist.append(self.dest) - return tuple(nodelist) - - def __repr__(self): - return "Print(%s, %s)" % (repr(self.nodes), repr(self.dest)) - -class Printnl(Node): - def __init__(self, nodes, dest, lineno=None): - self.nodes = nodes - self.dest = dest - self.lineno = lineno - - def getChildren(self): - children = [] - children.extend(flatten(self.nodes)) - children.append(self.dest) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - nodelist.extend(flatten_nodes(self.nodes)) - if self.dest is not None: - nodelist.append(self.dest) - return tuple(nodelist) - - def __repr__(self): - return "Printnl(%s, %s)" % (repr(self.nodes), repr(self.dest)) - -class Raise(Node): - def __init__(self, expr1, expr2, expr3, lineno=None): - self.expr1 = expr1 - self.expr2 = expr2 - self.expr3 = expr3 - self.lineno = lineno - - def getChildren(self): - children = [] - children.append(self.expr1) - children.append(self.expr2) - children.append(self.expr3) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - if self.expr1 is not None: - nodelist.append(self.expr1) - if self.expr2 is not None: - nodelist.append(self.expr2) - if self.expr3 is not None: - nodelist.append(self.expr3) - return tuple(nodelist) - - def __repr__(self): - return "Raise(%s, %s, %s)" % (repr(self.expr1), repr(self.expr2), repr(self.expr3)) - -class Return(Node): - def __init__(self, value, lineno=None): - self.value = value - self.lineno = lineno - - def getChildren(self): - return self.value, - - def getChildNodes(self): - return self.value, - - def __repr__(self): - return "Return(%s)" % (repr(self.value),) - -class RightShift(Node): - def __init__(self, leftright, lineno=None): - self.left = leftright[0] - self.right = leftright[1] - self.lineno = lineno - - def getChildren(self): - return self.left, self.right - - def getChildNodes(self): - return self.left, self.right - - def __repr__(self): - return "RightShift((%s, %s))" % (repr(self.left), repr(self.right)) - -class Set(Node): - def __init__(self, nodes, lineno=None): - self.nodes = nodes - self.lineno = lineno - - def getChildren(self): - return tuple(flatten(self.nodes)) - - def getChildNodes(self): - nodelist = [] - nodelist.extend(flatten_nodes(self.nodes)) - return tuple(nodelist) - - def __repr__(self): - return "Set(%s)" % (repr(self.nodes),) - -class Slice(Node): - def __init__(self, expr, flags, lower, upper, lineno=None): - self.expr = expr - self.flags = flags - self.lower = lower - self.upper = upper - self.lineno = lineno - - def getChildren(self): - children = [] - children.append(self.expr) - children.append(self.flags) - children.append(self.lower) - children.append(self.upper) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - nodelist.append(self.expr) - if self.lower is not None: - nodelist.append(self.lower) - if self.upper is not None: - nodelist.append(self.upper) - return tuple(nodelist) - - def __repr__(self): - return "Slice(%s, %s, %s, %s)" % (repr(self.expr), repr(self.flags), repr(self.lower), repr(self.upper)) - -class Sliceobj(Node): - def __init__(self, nodes, lineno=None): - self.nodes = nodes - self.lineno = lineno - - def getChildren(self): - return tuple(flatten(self.nodes)) - - def getChildNodes(self): - nodelist = [] - nodelist.extend(flatten_nodes(self.nodes)) - return tuple(nodelist) - - def __repr__(self): - return "Sliceobj(%s)" % (repr(self.nodes),) - -class Stmt(Node): - def __init__(self, nodes, lineno=None): - self.nodes = nodes - self.lineno = lineno - - def getChildren(self): - return tuple(flatten(self.nodes)) - - def getChildNodes(self): - nodelist = [] - nodelist.extend(flatten_nodes(self.nodes)) - return tuple(nodelist) - - def __repr__(self): - return "Stmt(%s)" % (repr(self.nodes),) - -class Sub(Node): - def __init__(self, leftright, lineno=None): - self.left = leftright[0] - self.right = leftright[1] - self.lineno = lineno - - def getChildren(self): - return self.left, self.right - - def getChildNodes(self): - return self.left, self.right - - def __repr__(self): - return "Sub((%s, %s))" % (repr(self.left), repr(self.right)) - -class Subscript(Node): - def __init__(self, expr, flags, subs, lineno=None): - self.expr = expr - self.flags = flags - self.subs = subs - self.lineno = lineno - - def getChildren(self): - children = [] - children.append(self.expr) - children.append(self.flags) - children.extend(flatten(self.subs)) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - nodelist.append(self.expr) - nodelist.extend(flatten_nodes(self.subs)) - return tuple(nodelist) - - def __repr__(self): - return "Subscript(%s, %s, %s)" % (repr(self.expr), repr(self.flags), repr(self.subs)) - -class TryExcept(Node): - def __init__(self, body, handlers, else_, lineno=None): - self.body = body - self.handlers = handlers - self.else_ = else_ - self.lineno = lineno - - def getChildren(self): - children = [] - children.append(self.body) - children.extend(flatten(self.handlers)) - children.append(self.else_) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - nodelist.append(self.body) - nodelist.extend(flatten_nodes(self.handlers)) - if self.else_ is not None: - nodelist.append(self.else_) - return tuple(nodelist) - - def __repr__(self): - return "TryExcept(%s, %s, %s)" % (repr(self.body), repr(self.handlers), repr(self.else_)) - -class TryFinally(Node): - def __init__(self, body, final, lineno=None): - self.body = body - self.final = final - self.lineno = lineno - - def getChildren(self): - return self.body, self.final - - def getChildNodes(self): - return self.body, self.final - - def __repr__(self): - return "TryFinally(%s, %s)" % (repr(self.body), repr(self.final)) - -class Tuple(Node): - def __init__(self, nodes, lineno=None): - self.nodes = nodes - self.lineno = lineno - - def getChildren(self): - return tuple(flatten(self.nodes)) - - def getChildNodes(self): - nodelist = [] - nodelist.extend(flatten_nodes(self.nodes)) - return tuple(nodelist) - - def __repr__(self): - return "Tuple(%s)" % (repr(self.nodes),) - -class UnaryAdd(Node): - def __init__(self, expr, lineno=None): - self.expr = expr - self.lineno = lineno - - def getChildren(self): - return self.expr, - - def getChildNodes(self): - return self.expr, - - def __repr__(self): - return "UnaryAdd(%s)" % (repr(self.expr),) - -class UnarySub(Node): - def __init__(self, expr, lineno=None): - self.expr = expr - self.lineno = lineno - - def getChildren(self): - return self.expr, - - def getChildNodes(self): - return self.expr, - - def __repr__(self): - return "UnarySub(%s)" % (repr(self.expr),) - -class While(Node): - def __init__(self, test, body, else_, lineno=None): - self.test = test - self.body = body - self.else_ = else_ - self.lineno = lineno - - def getChildren(self): - children = [] - children.append(self.test) - children.append(self.body) - children.append(self.else_) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - nodelist.append(self.test) - nodelist.append(self.body) - if self.else_ is not None: - nodelist.append(self.else_) - return tuple(nodelist) - - def __repr__(self): - return "While(%s, %s, %s)" % (repr(self.test), repr(self.body), repr(self.else_)) - -class With(Node): - def __init__(self, expr, vars, body, lineno=None): - self.expr = expr - self.vars = vars - self.body = body - self.lineno = lineno - - def getChildren(self): - children = [] - children.append(self.expr) - children.append(self.vars) - children.append(self.body) - return tuple(children) - - def getChildNodes(self): - nodelist = [] - nodelist.append(self.expr) - if self.vars is not None: - nodelist.append(self.vars) - nodelist.append(self.body) - return tuple(nodelist) - - def __repr__(self): - return "With(%s, %s, %s)" % (repr(self.expr), repr(self.vars), repr(self.body)) - -class Yield(Node): - def __init__(self, value, lineno=None): - self.value = value - self.lineno = lineno - - def getChildren(self): - return self.value, - - def getChildNodes(self): - return self.value, - - def __repr__(self): - return "Yield(%s)" % (repr(self.value),) - -for name, obj in globals().items(): - if isinstance(obj, type) and issubclass(obj, Node): - nodes[name.lower()] = obj diff --git a/test/ok_2.7/compiler/consts.py b/test/ok_2.7/compiler/consts.py deleted file mode 100644 index c60b1d0b..00000000 --- a/test/ok_2.7/compiler/consts.py +++ /dev/null @@ -1,23 +0,0 @@ -# operation flags -OP_ASSIGN = 'OP_ASSIGN' -OP_DELETE = 'OP_DELETE' -OP_APPLY = 'OP_APPLY' - -SC_LOCAL = 1 -SC_GLOBAL_IMPLICIT = 2 -SC_GLOBAL_EXPLICIT = 3 -SC_FREE = 4 -SC_CELL = 5 -SC_UNKNOWN = 6 - -CO_OPTIMIZED = 0x0001 -CO_NEWLOCALS = 0x0002 -CO_VARARGS = 0x0004 -CO_VARKEYWORDS = 0x0008 -CO_NESTED = 0x0010 -CO_GENERATOR = 0x0020 -CO_GENERATOR_ALLOWED = 0 -CO_FUTURE_DIVISION = 0x2000 -CO_FUTURE_ABSIMPORT = 0x4000 -CO_FUTURE_WITH_STATEMENT = 0x8000 -CO_FUTURE_PRINT_FUNCTION = 0x10000 diff --git a/test/ok_2.7/compiler/future.py b/test/ok_2.7/compiler/future.py deleted file mode 100644 index fd5e5dfb..00000000 --- a/test/ok_2.7/compiler/future.py +++ /dev/null @@ -1,74 +0,0 @@ -"""Parser for future statements - -""" - -from compiler import ast, walk - -def is_future(stmt): - """Return true if statement is a well-formed future statement""" - if not isinstance(stmt, ast.From): - return 0 - if stmt.modname == "__future__": - return 1 - else: - return 0 - -class FutureParser: - - features = ("nested_scopes", "generators", "division", - "absolute_import", "with_statement", "print_function", - "unicode_literals") - - def __init__(self): - self.found = {} # set - - def visitModule(self, node): - stmt = node.node - for s in stmt.nodes: - if not self.check_stmt(s): - break - - def check_stmt(self, stmt): - if is_future(stmt): - for name, asname in stmt.names: - if name in self.features: - self.found[name] = 1 - else: - raise SyntaxError, \ - "future feature %s is not defined" % name - stmt.valid_future = 1 - return 1 - return 0 - - def get_features(self): - """Return list of features enabled by future statements""" - return self.found.keys() - -class BadFutureParser: - """Check for invalid future statements""" - - def visitFrom(self, node): - if hasattr(node, 'valid_future'): - return - if node.modname != "__future__": - return - raise SyntaxError, "invalid future statement " + repr(node) - -def find_futures(node): - p1 = FutureParser() - p2 = BadFutureParser() - walk(node, p1) - walk(node, p2) - return p1.get_features() - -if __name__ == "__main__": - import sys - from compiler import parseFile, walk - - for file in sys.argv[1:]: - print file - tree = parseFile(file) - v = FutureParser() - walk(tree, v) - print v.found - print diff --git a/test/ok_2.7/compiler/misc.py b/test/ok_2.7/compiler/misc.py deleted file mode 100644 index 588c7fbd..00000000 --- a/test/ok_2.7/compiler/misc.py +++ /dev/null @@ -1,73 +0,0 @@ - -def flatten(tup): - elts = [] - for elt in tup: - if isinstance(elt, tuple): - elts = elts + flatten(elt) - else: - elts.append(elt) - return elts - -class Set: - def __init__(self): - self.elts = {} - def __len__(self): - return len(self.elts) - def __contains__(self, elt): - return elt in self.elts - def add(self, elt): - self.elts[elt] = elt - def elements(self): - return self.elts.keys() - def has_elt(self, elt): - return elt in self.elts - def remove(self, elt): - del self.elts[elt] - def copy(self): - c = Set() - c.elts.update(self.elts) - return c - -class Stack: - def __init__(self): - self.stack = [] - self.pop = self.stack.pop - def __len__(self): - return len(self.stack) - def push(self, elt): - self.stack.append(elt) - def top(self): - return self.stack[-1] - def __getitem__(self, index): # needed by visitContinue() - return self.stack[index] - -MANGLE_LEN = 256 # magic constant from compile.c - -def mangle(name, klass): - if not name.startswith('__'): - return name - if len(name) + 2 >= MANGLE_LEN: - return name - if name.endswith('__'): - return name - try: - i = 0 - while klass[i] == '_': - i = i + 1 - except IndexError: - return name - klass = klass[i:] - - tlen = len(klass) + len(name) - if tlen > MANGLE_LEN: - klass = klass[:MANGLE_LEN-tlen] - - return "_%s%s" % (klass, name) - -def set_filename(filename, tree): - """Set the filename attribute to filename on every node in tree""" - worklist = [tree] - while worklist: - node = worklist.pop(0) - node.filename = filename - worklist.extend(node.getChildNodes()) diff --git a/test/ok_2.7/compiler/syntax.py b/test/ok_2.7/compiler/syntax.py deleted file mode 100644 index a45d9c2c..00000000 --- a/test/ok_2.7/compiler/syntax.py +++ /dev/null @@ -1,46 +0,0 @@ -"""Check for errs in the AST. - -The Python parser does not catch all syntax errors. Others, like -assignments with invalid targets, are caught in the code generation -phase. - -The compiler package catches some errors in the transformer module. -But it seems clearer to write checkers that use the AST to detect -errors. -""" - -from compiler import ast, walk - -def check(tree, multi=None): - v = SyntaxErrorChecker(multi) - walk(tree, v) - return v.errors - -class SyntaxErrorChecker: - """A visitor to find syntax errors in the AST.""" - - def __init__(self, multi=None): - """Create new visitor object. - - If optional argument multi is not None, then print messages - for each error rather than raising a SyntaxError for the - first. - """ - self.multi = multi - self.errors = 0 - - def error(self, node, msg): - self.errors = self.errors + 1 - if self.multi is not None: - print "%s:%s: %s" % (node.filename, node.lineno, msg) - else: - raise SyntaxError, "%s (%s:%s)" % (msg, node.filename, node.lineno) - - def visitAssign(self, node): - # the transformer module handles many of these - pass -## for target in node.nodes: -## if isinstance(target, ast.AssList): -## if target.lineno is None: -## target.lineno = node.lineno -## self.error(target, "can't assign to list comprehension") diff --git a/test/ok_2.7/ctypes/_endian.py b/test/ok_2.7/ctypes/_endian.py deleted file mode 100644 index f80e675a..00000000 --- a/test/ok_2.7/ctypes/_endian.py +++ /dev/null @@ -1,64 +0,0 @@ -###################################################################### -# This file should be kept compatible with Python 2.3, see PEP 291. # -###################################################################### -import sys -from ctypes import * - -_array_type = type(Array) - -def _other_endian(typ): - """Return the type with the 'other' byte order. Simple types like - c_int and so on already have __ctype_be__ and __ctype_le__ - attributes which contain the types, for more complicated types - arrays and structures are supported. - """ - # check _OTHER_ENDIAN attribute (present if typ is primitive type) - if hasattr(typ, _OTHER_ENDIAN): - return getattr(typ, _OTHER_ENDIAN) - # if typ is array - if isinstance(typ, _array_type): - return _other_endian(typ._type_) * typ._length_ - # if typ is structure - if issubclass(typ, Structure): - return typ - raise TypeError("This type does not support other endian: %s" % typ) - -class _swapped_meta(type(Structure)): - def __setattr__(self, attrname, value): - if attrname == "_fields_": - fields = [] - for desc in value: - name = desc[0] - typ = desc[1] - rest = desc[2:] - fields.append((name, _other_endian(typ)) + rest) - value = fields - super(_swapped_meta, self).__setattr__(attrname, value) - -################################################################ - -# Note: The Structure metaclass checks for the *presence* (not the -# value!) of a _swapped_bytes_ attribute to determine the bit order in -# structures containing bit fields. - -if sys.byteorder == "little": - _OTHER_ENDIAN = "__ctype_be__" - - LittleEndianStructure = Structure - - class BigEndianStructure(Structure): - """Structure with big endian byte order""" - __metaclass__ = _swapped_meta - _swappedbytes_ = None - -elif sys.byteorder == "big": - _OTHER_ENDIAN = "__ctype_le__" - - BigEndianStructure = Structure - class LittleEndianStructure(Structure): - """Structure with little endian byte order""" - __metaclass__ = _swapped_meta - _swappedbytes_ = None - -else: - raise RuntimeError("Invalid byteorder") diff --git a/test/ok_2.7/ctypes/util.py b/test/ok_2.7/ctypes/util.py deleted file mode 100644 index 3430b73a..00000000 --- a/test/ok_2.7/ctypes/util.py +++ /dev/null @@ -1,287 +0,0 @@ -###################################################################### -# This file should be kept compatible with Python 2.3, see PEP 291. # -###################################################################### -import sys, os - -# find_library(name) returns the pathname of a library, or None. -if os.name == "nt": - - def _get_build_version(): - """Return the version of MSVC that was used to build Python. - - For Python 2.3 and up, the version number is included in - sys.version. For earlier versions, assume the compiler is MSVC 6. - """ - # This function was copied from Lib/distutils/msvccompiler.py - prefix = "MSC v." - i = sys.version.find(prefix) - if i == -1: - return 6 - i = i + len(prefix) - s, rest = sys.version[i:].split(" ", 1) - majorVersion = int(s[:-2]) - 6 - minorVersion = int(s[2:3]) / 10.0 - # I don't think paths are affected by minor version in version 6 - if majorVersion == 6: - minorVersion = 0 - if majorVersion >= 6: - return majorVersion + minorVersion - # else we don't know what version of the compiler this is - return None - - def find_msvcrt(): - """Return the name of the VC runtime dll""" - version = _get_build_version() - if version is None: - # better be safe than sorry - return None - if version <= 6: - clibname = 'msvcrt' - else: - clibname = 'msvcr%d' % (version * 10) - - # If python was built with in debug mode - import imp - if imp.get_suffixes()[0][0] == '_d.pyd': - clibname += 'd' - return clibname+'.dll' - - def find_library(name): - if name in ('c', 'm'): - return find_msvcrt() - # See MSDN for the REAL search order. - for directory in os.environ['PATH'].split(os.pathsep): - fname = os.path.join(directory, name) - if os.path.isfile(fname): - return fname - if fname.lower().endswith(".dll"): - continue - fname = fname + ".dll" - if os.path.isfile(fname): - return fname - return None - -if os.name == "ce": - # search path according to MSDN: - # - absolute path specified by filename - # - The .exe launch directory - # - the Windows directory - # - ROM dll files (where are they?) - # - OEM specified search path: HKLM\Loader\SystemPath - def find_library(name): - return name - -if os.name == "posix" and sys.platform == "darwin": - from ctypes.macholib.dyld import dyld_find as _dyld_find - def find_library(name): - possible = ['lib%s.dylib' % name, - '%s.dylib' % name, - '%s.framework/%s' % (name, name)] - for name in possible: - try: - return _dyld_find(name) - except ValueError: - continue - return None - -elif os.name == "posix": - # Andreas Degert's find functions, using gcc, /sbin/ldconfig, objdump - import re, tempfile, errno - - def _findLib_gcc(name): - expr = r'[^\(\)\s]*lib%s\.[^\(\)\s]*' % re.escape(name) - fdout, ccout = tempfile.mkstemp() - os.close(fdout) - cmd = 'if type gcc >/dev/null 2>&1; then CC=gcc; elif type cc >/dev/null 2>&1; then CC=cc;else exit 10; fi;' \ - 'LANG=C LC_ALL=C $CC -Wl,-t -o ' + ccout + ' 2>&1 -l' + name - try: - f = os.popen(cmd) - try: - trace = f.read() - finally: - rv = f.close() - finally: - try: - os.unlink(ccout) - except OSError, e: - if e.errno != errno.ENOENT: - raise - if rv == 10: - raise OSError, 'gcc or cc command not found' - res = re.search(expr, trace) - if not res: - return None - return res.group(0) - - - if sys.platform == "sunos5": - # use /usr/ccs/bin/dump on solaris - def _get_soname(f): - if not f: - return None - cmd = "/usr/ccs/bin/dump -Lpv 2>/dev/null " + f - f = os.popen(cmd) - try: - data = f.read() - finally: - f.close() - res = re.search(r'\[.*\]\sSONAME\s+([^\s]+)', data) - if not res: - return None - return res.group(1) - else: - def _get_soname(f): - # assuming GNU binutils / ELF - if not f: - return None - cmd = 'if ! type objdump >/dev/null 2>&1; then exit 10; fi;' \ - "objdump -p -j .dynamic 2>/dev/null " + f - f = os.popen(cmd) - dump = f.read() - rv = f.close() - if rv == 10: - raise OSError, 'objdump command not found' - f = os.popen(cmd) - try: - data = f.read() - finally: - f.close() - res = re.search(r'\sSONAME\s+([^\s]+)', data) - if not res: - return None - return res.group(1) - - if (sys.platform.startswith("freebsd") - or sys.platform.startswith("openbsd") - or sys.platform.startswith("dragonfly")): - - def _num_version(libname): - # "libxyz.so.MAJOR.MINOR" => [ MAJOR, MINOR ] - parts = libname.split(".") - nums = [] - try: - while parts: - nums.insert(0, int(parts.pop())) - except ValueError: - pass - return nums or [ sys.maxint ] - - def find_library(name): - ename = re.escape(name) - expr = r':-l%s\.\S+ => \S*/(lib%s\.\S+)' % (ename, ename) - f = os.popen('/sbin/ldconfig -r 2>/dev/null') - try: - data = f.read() - finally: - f.close() - res = re.findall(expr, data) - if not res: - return _get_soname(_findLib_gcc(name)) - res.sort(cmp= lambda x,y: cmp(_num_version(x), _num_version(y))) - return res[-1] - - elif sys.platform == "sunos5": - - def _findLib_crle(name, is64): - if not os.path.exists('/usr/bin/crle'): - return None - - if is64: - cmd = 'env LC_ALL=C /usr/bin/crle -64 2>/dev/null' - else: - cmd = 'env LC_ALL=C /usr/bin/crle 2>/dev/null' - - for line in os.popen(cmd).readlines(): - line = line.strip() - if line.startswith('Default Library Path (ELF):'): - paths = line.split()[4] - - if not paths: - return None - - for dir in paths.split(":"): - libfile = os.path.join(dir, "lib%s.so" % name) - if os.path.exists(libfile): - return libfile - - return None - - def find_library(name, is64 = False): - return _get_soname(_findLib_crle(name, is64) or _findLib_gcc(name)) - - else: - - def _findSoname_ldconfig(name): - import struct - # XXX this code assumes that we know all unames and that a single - # ABI is supported per uname; instead we should find what the - # ABI is (e.g. check ABI of current process) or simply ask libc - # to load the library for us - uname = os.uname()[4] - # ARM has a variety of unames, e.g. armv7l - if uname.startswith("arm"): - uname = "arm" - if struct.calcsize('l') == 4: - machine = uname + '-32' - else: - machine = uname + '-64' - mach_map = { - 'x86_64-64': 'libc6,x86-64', - 'ppc64-64': 'libc6,64bit', - 'sparc64-64': 'libc6,64bit', - 's390x-64': 'libc6,64bit', - 'ia64-64': 'libc6,IA-64', - # this actually breaks on biarch or multiarch as the first - # library wins; uname doesn't tell us which ABI we're using - 'arm-32': 'libc6(,hard-float)?', - } - abi_type = mach_map.get(machine, 'libc6') - - # XXX assuming GLIBC's ldconfig (with option -p) - expr = r'\s+(lib%s\.[^\s]+)\s+\(%s' % (re.escape(name), abi_type) - f = os.popen('/sbin/ldconfig -p 2>/dev/null') - try: - data = f.read() - finally: - f.close() - res = re.search(expr, data) - if not res: - return None - return res.group(1) - - def find_library(name): - return _findSoname_ldconfig(name) or _get_soname(_findLib_gcc(name)) - -################################################################ -# test code - -def test(): - from ctypes import cdll - if os.name == "nt": - print cdll.msvcrt - print cdll.load("msvcrt") - print find_library("msvcrt") - - if os.name == "posix": - # find and load_version - print find_library("m") - print find_library("c") - print find_library("bz2") - - # getattr -## print cdll.m -## print cdll.bz2 - - # load - if sys.platform == "darwin": - print cdll.LoadLibrary("libm.dylib") - print cdll.LoadLibrary("libcrypto.dylib") - print cdll.LoadLibrary("libSystem.dylib") - print cdll.LoadLibrary("System.framework/System") - else: - print cdll.LoadLibrary("libm.so") - print cdll.LoadLibrary("libcrypt.so") - print find_library("crypt") - -if __name__ == "__main__": - test() diff --git a/test/ok_2.7/ctypes/wintypes.py b/test/ok_2.7/ctypes/wintypes.py deleted file mode 100644 index dafbb78b..00000000 --- a/test/ok_2.7/ctypes/wintypes.py +++ /dev/null @@ -1,185 +0,0 @@ -###################################################################### -# This file should be kept compatible with Python 2.3, see PEP 291. # -###################################################################### - -# The most useful windows datatypes -from ctypes import * - -BYTE = c_byte -WORD = c_ushort -DWORD = c_ulong - -WCHAR = c_wchar -UINT = c_uint -INT = c_int - -DOUBLE = c_double -FLOAT = c_float - -BOOLEAN = BYTE -BOOL = c_long - -from ctypes import _SimpleCData -class VARIANT_BOOL(_SimpleCData): - _type_ = "v" - def __repr__(self): - return "%s(%r)" % (self.__class__.__name__, self.value) - -ULONG = c_ulong -LONG = c_long - -USHORT = c_ushort -SHORT = c_short - -# in the windows header files, these are structures. -_LARGE_INTEGER = LARGE_INTEGER = c_longlong -_ULARGE_INTEGER = ULARGE_INTEGER = c_ulonglong - -LPCOLESTR = LPOLESTR = OLESTR = c_wchar_p -LPCWSTR = LPWSTR = c_wchar_p -LPCSTR = LPSTR = c_char_p -LPCVOID = LPVOID = c_void_p - -# WPARAM is defined as UINT_PTR (unsigned type) -# LPARAM is defined as LONG_PTR (signed type) -if sizeof(c_long) == sizeof(c_void_p): - WPARAM = c_ulong - LPARAM = c_long -elif sizeof(c_longlong) == sizeof(c_void_p): - WPARAM = c_ulonglong - LPARAM = c_longlong - -ATOM = WORD -LANGID = WORD - -COLORREF = DWORD -LGRPID = DWORD -LCTYPE = DWORD - -LCID = DWORD - -################################################################ -# HANDLE types -HANDLE = c_void_p # in the header files: void * - -HACCEL = HANDLE -HBITMAP = HANDLE -HBRUSH = HANDLE -HCOLORSPACE = HANDLE -HDC = HANDLE -HDESK = HANDLE -HDWP = HANDLE -HENHMETAFILE = HANDLE -HFONT = HANDLE -HGDIOBJ = HANDLE -HGLOBAL = HANDLE -HHOOK = HANDLE -HICON = HANDLE -HINSTANCE = HANDLE -HKEY = HANDLE -HKL = HANDLE -HLOCAL = HANDLE -HMENU = HANDLE -HMETAFILE = HANDLE -HMODULE = HANDLE -HMONITOR = HANDLE -HPALETTE = HANDLE -HPEN = HANDLE -HRGN = HANDLE -HRSRC = HANDLE -HSTR = HANDLE -HTASK = HANDLE -HWINSTA = HANDLE -HWND = HANDLE -SC_HANDLE = HANDLE -SERVICE_STATUS_HANDLE = HANDLE - -################################################################ -# Some important structure definitions - -class RECT(Structure): - _fields_ = [("left", c_long), - ("top", c_long), - ("right", c_long), - ("bottom", c_long)] -tagRECT = _RECTL = RECTL = RECT - -class _SMALL_RECT(Structure): - _fields_ = [('Left', c_short), - ('Top', c_short), - ('Right', c_short), - ('Bottom', c_short)] -SMALL_RECT = _SMALL_RECT - -class _COORD(Structure): - _fields_ = [('X', c_short), - ('Y', c_short)] - -class POINT(Structure): - _fields_ = [("x", c_long), - ("y", c_long)] -tagPOINT = _POINTL = POINTL = POINT - -class SIZE(Structure): - _fields_ = [("cx", c_long), - ("cy", c_long)] -tagSIZE = SIZEL = SIZE - -def RGB(red, green, blue): - return red + (green << 8) + (blue << 16) - -class FILETIME(Structure): - _fields_ = [("dwLowDateTime", DWORD), - ("dwHighDateTime", DWORD)] -_FILETIME = FILETIME - -class MSG(Structure): - _fields_ = [("hWnd", HWND), - ("message", c_uint), - ("wParam", WPARAM), - ("lParam", LPARAM), - ("time", DWORD), - ("pt", POINT)] -tagMSG = MSG -MAX_PATH = 260 - -class WIN32_FIND_DATAA(Structure): - _fields_ = [("dwFileAttributes", DWORD), - ("ftCreationTime", FILETIME), - ("ftLastAccessTime", FILETIME), - ("ftLastWriteTime", FILETIME), - ("nFileSizeHigh", DWORD), - ("nFileSizeLow", DWORD), - ("dwReserved0", DWORD), - ("dwReserved1", DWORD), - ("cFileName", c_char * MAX_PATH), - ("cAlternateFileName", c_char * 14)] - -class WIN32_FIND_DATAW(Structure): - _fields_ = [("dwFileAttributes", DWORD), - ("ftCreationTime", FILETIME), - ("ftLastAccessTime", FILETIME), - ("ftLastWriteTime", FILETIME), - ("nFileSizeHigh", DWORD), - ("nFileSizeLow", DWORD), - ("dwReserved0", DWORD), - ("dwReserved1", DWORD), - ("cFileName", c_wchar * MAX_PATH), - ("cAlternateFileName", c_wchar * 14)] - -__all__ = ['ATOM', 'BOOL', 'BOOLEAN', 'BYTE', 'COLORREF', 'DOUBLE', 'DWORD', - 'FILETIME', 'FLOAT', 'HACCEL', 'HANDLE', 'HBITMAP', 'HBRUSH', - 'HCOLORSPACE', 'HDC', 'HDESK', 'HDWP', 'HENHMETAFILE', 'HFONT', - 'HGDIOBJ', 'HGLOBAL', 'HHOOK', 'HICON', 'HINSTANCE', 'HKEY', - 'HKL', 'HLOCAL', 'HMENU', 'HMETAFILE', 'HMODULE', 'HMONITOR', - 'HPALETTE', 'HPEN', 'HRGN', 'HRSRC', 'HSTR', 'HTASK', 'HWINSTA', - 'HWND', 'INT', 'LANGID', 'LARGE_INTEGER', 'LCID', 'LCTYPE', - 'LGRPID', 'LONG', 'LPARAM', 'LPCOLESTR', 'LPCSTR', 'LPCVOID', - 'LPCWSTR', 'LPOLESTR', 'LPSTR', 'LPVOID', 'LPWSTR', 'MAX_PATH', - 'MSG', 'OLESTR', 'POINT', 'POINTL', 'RECT', 'RECTL', 'RGB', - 'SC_HANDLE', 'SERVICE_STATUS_HANDLE', 'SHORT', 'SIZE', 'SIZEL', - 'SMALL_RECT', 'UINT', 'ULARGE_INTEGER', 'ULONG', 'USHORT', - 'VARIANT_BOOL', 'WCHAR', 'WIN32_FIND_DATAA', 'WIN32_FIND_DATAW', - 'WORD', 'WPARAM', '_COORD', '_FILETIME', '_LARGE_INTEGER', - '_POINTL', '_RECTL', '_SMALL_RECT', '_ULARGE_INTEGER', 'tagMSG', - 'tagPOINT', 'tagRECT', 'tagSIZE'] diff --git a/test/ok_2.7/curses/__init__.py b/test/ok_2.7/curses/__init__.py deleted file mode 100644 index ecf59de3..00000000 --- a/test/ok_2.7/curses/__init__.py +++ /dev/null @@ -1,59 +0,0 @@ -"""curses - -The main package for curses support for Python. Normally used by importing -the package, and perhaps a particular module inside it. - - import curses - from curses import textpad - curses.initscr() - ... - -""" - -__revision__ = "$Id$" - -from _curses import * -from curses.wrapper import wrapper -import os as _os -import sys as _sys - -# Some constants, most notably the ACS_* ones, are only added to the C -# _curses module's dictionary after initscr() is called. (Some -# versions of SGI's curses don't define values for those constants -# until initscr() has been called.) This wrapper function calls the -# underlying C initscr(), and then copies the constants from the -# _curses module to the curses package's dictionary. Don't do 'from -# curses import *' if you'll be needing the ACS_* constants. - -def initscr(): - import _curses, curses - # we call setupterm() here because it raises an error - # instead of calling exit() in error cases. - setupterm(term=_os.environ.get("TERM", "unknown"), - fd=_sys.__stdout__.fileno()) - stdscr = _curses.initscr() - for key, value in _curses.__dict__.items(): - if key[0:4] == 'ACS_' or key in ('LINES', 'COLS'): - setattr(curses, key, value) - - return stdscr - -# This is a similar wrapper for start_color(), which adds the COLORS and -# COLOR_PAIRS variables which are only available after start_color() is -# called. - -def start_color(): - import _curses, curses - retval = _curses.start_color() - if hasattr(_curses, 'COLORS'): - curses.COLORS = _curses.COLORS - if hasattr(_curses, 'COLOR_PAIRS'): - curses.COLOR_PAIRS = _curses.COLOR_PAIRS - return retval - -# Import Python has_key() implementation if _curses doesn't contain has_key() - -try: - has_key -except NameError: - from has_key import has_key diff --git a/test/ok_2.7/curses/ascii.py b/test/ok_2.7/curses/ascii.py deleted file mode 100644 index 800fd8b4..00000000 --- a/test/ok_2.7/curses/ascii.py +++ /dev/null @@ -1,99 +0,0 @@ -"""Constants and membership tests for ASCII characters""" - -NUL = 0x00 # ^@ -SOH = 0x01 # ^A -STX = 0x02 # ^B -ETX = 0x03 # ^C -EOT = 0x04 # ^D -ENQ = 0x05 # ^E -ACK = 0x06 # ^F -BEL = 0x07 # ^G -BS = 0x08 # ^H -TAB = 0x09 # ^I -HT = 0x09 # ^I -LF = 0x0a # ^J -NL = 0x0a # ^J -VT = 0x0b # ^K -FF = 0x0c # ^L -CR = 0x0d # ^M -SO = 0x0e # ^N -SI = 0x0f # ^O -DLE = 0x10 # ^P -DC1 = 0x11 # ^Q -DC2 = 0x12 # ^R -DC3 = 0x13 # ^S -DC4 = 0x14 # ^T -NAK = 0x15 # ^U -SYN = 0x16 # ^V -ETB = 0x17 # ^W -CAN = 0x18 # ^X -EM = 0x19 # ^Y -SUB = 0x1a # ^Z -ESC = 0x1b # ^[ -FS = 0x1c # ^\ -GS = 0x1d # ^] -RS = 0x1e # ^^ -US = 0x1f # ^_ -SP = 0x20 # space -DEL = 0x7f # delete - -controlnames = [ -"NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL", -"BS", "HT", "LF", "VT", "FF", "CR", "SO", "SI", -"DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB", -"CAN", "EM", "SUB", "ESC", "FS", "GS", "RS", "US", -"SP" -] - -def _ctoi(c): - if type(c) == type(""): - return ord(c) - else: - return c - -def isalnum(c): return isalpha(c) or isdigit(c) -def isalpha(c): return isupper(c) or islower(c) -def isascii(c): return _ctoi(c) <= 127 # ? -def isblank(c): return _ctoi(c) in (8,32) -def iscntrl(c): return _ctoi(c) <= 31 -def isdigit(c): return _ctoi(c) >= 48 and _ctoi(c) <= 57 -def isgraph(c): return _ctoi(c) >= 33 and _ctoi(c) <= 126 -def islower(c): return _ctoi(c) >= 97 and _ctoi(c) <= 122 -def isprint(c): return _ctoi(c) >= 32 and _ctoi(c) <= 126 -def ispunct(c): return _ctoi(c) != 32 and not isalnum(c) -def isspace(c): return _ctoi(c) in (9, 10, 11, 12, 13, 32) -def isupper(c): return _ctoi(c) >= 65 and _ctoi(c) <= 90 -def isxdigit(c): return isdigit(c) or \ - (_ctoi(c) >= 65 and _ctoi(c) <= 70) or (_ctoi(c) >= 97 and _ctoi(c) <= 102) -def isctrl(c): return _ctoi(c) < 32 -def ismeta(c): return _ctoi(c) > 127 - -def ascii(c): - if type(c) == type(""): - return chr(_ctoi(c) & 0x7f) - else: - return _ctoi(c) & 0x7f - -def ctrl(c): - if type(c) == type(""): - return chr(_ctoi(c) & 0x1f) - else: - return _ctoi(c) & 0x1f - -def alt(c): - if type(c) == type(""): - return chr(_ctoi(c) | 0x80) - else: - return _ctoi(c) | 0x80 - -def unctrl(c): - bits = _ctoi(c) - if bits == 0x7f: - rep = "^?" - elif isprint(bits & 0x7f): - rep = chr(bits & 0x7f) - else: - rep = "^" + chr(((bits & 0x7f) | 0x20) + 0x20) - if bits & 0x80: - return "!" + rep - return rep diff --git a/test/ok_2.7/curses/has_key.py b/test/ok_2.7/curses/has_key.py deleted file mode 100644 index 1dd5a3bd..00000000 --- a/test/ok_2.7/curses/has_key.py +++ /dev/null @@ -1,192 +0,0 @@ - -# -# Emulation of has_key() function for platforms that don't use ncurses -# - -import _curses - -# Table mapping curses keys to the terminfo capability name - -_capability_names = { - _curses.KEY_A1: 'ka1', - _curses.KEY_A3: 'ka3', - _curses.KEY_B2: 'kb2', - _curses.KEY_BACKSPACE: 'kbs', - _curses.KEY_BEG: 'kbeg', - _curses.KEY_BTAB: 'kcbt', - _curses.KEY_C1: 'kc1', - _curses.KEY_C3: 'kc3', - _curses.KEY_CANCEL: 'kcan', - _curses.KEY_CATAB: 'ktbc', - _curses.KEY_CLEAR: 'kclr', - _curses.KEY_CLOSE: 'kclo', - _curses.KEY_COMMAND: 'kcmd', - _curses.KEY_COPY: 'kcpy', - _curses.KEY_CREATE: 'kcrt', - _curses.KEY_CTAB: 'kctab', - _curses.KEY_DC: 'kdch1', - _curses.KEY_DL: 'kdl1', - _curses.KEY_DOWN: 'kcud1', - _curses.KEY_EIC: 'krmir', - _curses.KEY_END: 'kend', - _curses.KEY_ENTER: 'kent', - _curses.KEY_EOL: 'kel', - _curses.KEY_EOS: 'ked', - _curses.KEY_EXIT: 'kext', - _curses.KEY_F0: 'kf0', - _curses.KEY_F1: 'kf1', - _curses.KEY_F10: 'kf10', - _curses.KEY_F11: 'kf11', - _curses.KEY_F12: 'kf12', - _curses.KEY_F13: 'kf13', - _curses.KEY_F14: 'kf14', - _curses.KEY_F15: 'kf15', - _curses.KEY_F16: 'kf16', - _curses.KEY_F17: 'kf17', - _curses.KEY_F18: 'kf18', - _curses.KEY_F19: 'kf19', - _curses.KEY_F2: 'kf2', - _curses.KEY_F20: 'kf20', - _curses.KEY_F21: 'kf21', - _curses.KEY_F22: 'kf22', - _curses.KEY_F23: 'kf23', - _curses.KEY_F24: 'kf24', - _curses.KEY_F25: 'kf25', - _curses.KEY_F26: 'kf26', - _curses.KEY_F27: 'kf27', - _curses.KEY_F28: 'kf28', - _curses.KEY_F29: 'kf29', - _curses.KEY_F3: 'kf3', - _curses.KEY_F30: 'kf30', - _curses.KEY_F31: 'kf31', - _curses.KEY_F32: 'kf32', - _curses.KEY_F33: 'kf33', - _curses.KEY_F34: 'kf34', - _curses.KEY_F35: 'kf35', - _curses.KEY_F36: 'kf36', - _curses.KEY_F37: 'kf37', - _curses.KEY_F38: 'kf38', - _curses.KEY_F39: 'kf39', - _curses.KEY_F4: 'kf4', - _curses.KEY_F40: 'kf40', - _curses.KEY_F41: 'kf41', - _curses.KEY_F42: 'kf42', - _curses.KEY_F43: 'kf43', - _curses.KEY_F44: 'kf44', - _curses.KEY_F45: 'kf45', - _curses.KEY_F46: 'kf46', - _curses.KEY_F47: 'kf47', - _curses.KEY_F48: 'kf48', - _curses.KEY_F49: 'kf49', - _curses.KEY_F5: 'kf5', - _curses.KEY_F50: 'kf50', - _curses.KEY_F51: 'kf51', - _curses.KEY_F52: 'kf52', - _curses.KEY_F53: 'kf53', - _curses.KEY_F54: 'kf54', - _curses.KEY_F55: 'kf55', - _curses.KEY_F56: 'kf56', - _curses.KEY_F57: 'kf57', - _curses.KEY_F58: 'kf58', - _curses.KEY_F59: 'kf59', - _curses.KEY_F6: 'kf6', - _curses.KEY_F60: 'kf60', - _curses.KEY_F61: 'kf61', - _curses.KEY_F62: 'kf62', - _curses.KEY_F63: 'kf63', - _curses.KEY_F7: 'kf7', - _curses.KEY_F8: 'kf8', - _curses.KEY_F9: 'kf9', - _curses.KEY_FIND: 'kfnd', - _curses.KEY_HELP: 'khlp', - _curses.KEY_HOME: 'khome', - _curses.KEY_IC: 'kich1', - _curses.KEY_IL: 'kil1', - _curses.KEY_LEFT: 'kcub1', - _curses.KEY_LL: 'kll', - _curses.KEY_MARK: 'kmrk', - _curses.KEY_MESSAGE: 'kmsg', - _curses.KEY_MOVE: 'kmov', - _curses.KEY_NEXT: 'knxt', - _curses.KEY_NPAGE: 'knp', - _curses.KEY_OPEN: 'kopn', - _curses.KEY_OPTIONS: 'kopt', - _curses.KEY_PPAGE: 'kpp', - _curses.KEY_PREVIOUS: 'kprv', - _curses.KEY_PRINT: 'kprt', - _curses.KEY_REDO: 'krdo', - _curses.KEY_REFERENCE: 'kref', - _curses.KEY_REFRESH: 'krfr', - _curses.KEY_REPLACE: 'krpl', - _curses.KEY_RESTART: 'krst', - _curses.KEY_RESUME: 'kres', - _curses.KEY_RIGHT: 'kcuf1', - _curses.KEY_SAVE: 'ksav', - _curses.KEY_SBEG: 'kBEG', - _curses.KEY_SCANCEL: 'kCAN', - _curses.KEY_SCOMMAND: 'kCMD', - _curses.KEY_SCOPY: 'kCPY', - _curses.KEY_SCREATE: 'kCRT', - _curses.KEY_SDC: 'kDC', - _curses.KEY_SDL: 'kDL', - _curses.KEY_SELECT: 'kslt', - _curses.KEY_SEND: 'kEND', - _curses.KEY_SEOL: 'kEOL', - _curses.KEY_SEXIT: 'kEXT', - _curses.KEY_SF: 'kind', - _curses.KEY_SFIND: 'kFND', - _curses.KEY_SHELP: 'kHLP', - _curses.KEY_SHOME: 'kHOM', - _curses.KEY_SIC: 'kIC', - _curses.KEY_SLEFT: 'kLFT', - _curses.KEY_SMESSAGE: 'kMSG', - _curses.KEY_SMOVE: 'kMOV', - _curses.KEY_SNEXT: 'kNXT', - _curses.KEY_SOPTIONS: 'kOPT', - _curses.KEY_SPREVIOUS: 'kPRV', - _curses.KEY_SPRINT: 'kPRT', - _curses.KEY_SR: 'kri', - _curses.KEY_SREDO: 'kRDO', - _curses.KEY_SREPLACE: 'kRPL', - _curses.KEY_SRIGHT: 'kRIT', - _curses.KEY_SRSUME: 'kRES', - _curses.KEY_SSAVE: 'kSAV', - _curses.KEY_SSUSPEND: 'kSPD', - _curses.KEY_STAB: 'khts', - _curses.KEY_SUNDO: 'kUND', - _curses.KEY_SUSPEND: 'kspd', - _curses.KEY_UNDO: 'kund', - _curses.KEY_UP: 'kcuu1' - } - -def has_key(ch): - if isinstance(ch, str): - ch = ord(ch) - - # Figure out the correct capability name for the keycode. - capability_name = _capability_names.get(ch) - if capability_name is None: - return False - - #Check the current terminal description for that capability; - #if present, return true, else return false. - if _curses.tigetstr( capability_name ): - return True - else: - return False - -if __name__ == '__main__': - # Compare the output of this implementation and the ncurses has_key, - # on platforms where has_key is already available - try: - L = [] - _curses.initscr() - for key in _capability_names.keys(): - system = key in _curses - python = has_key(key) - if system != python: - L.append( 'Mismatch for key %s, system=%i, Python=%i' - % (_curses.keyname( key ), system, python) ) - finally: - _curses.endwin() - for i in L: print i diff --git a/test/ok_2.7/curses/panel.py b/test/ok_2.7/curses/panel.py deleted file mode 100644 index aacca851..00000000 --- a/test/ok_2.7/curses/panel.py +++ /dev/null @@ -1,8 +0,0 @@ -"""curses.panel - -Module for using panels with curses. -""" - -__revision__ = "$Id$" - -from _curses_panel import * diff --git a/test/ok_2.7/curses/wrapper.py b/test/ok_2.7/curses/wrapper.py deleted file mode 100644 index 5183ce74..00000000 --- a/test/ok_2.7/curses/wrapper.py +++ /dev/null @@ -1,50 +0,0 @@ -"""curses.wrapper - -Contains one function, wrapper(), which runs another function which -should be the rest of your curses-based application. If the -application raises an exception, wrapper() will restore the terminal -to a sane state so you can read the resulting traceback. - -""" - -import curses - -def wrapper(func, *args, **kwds): - """Wrapper function that initializes curses and calls another function, - restoring normal keyboard/screen behavior on error. - The callable object 'func' is then passed the main window 'stdscr' - as its first argument, followed by any other arguments passed to - wrapper(). - """ - - try: - # Initialize curses - stdscr = curses.initscr() - - # Turn off echoing of keys, and enter cbreak mode, - # where no buffering is performed on keyboard input - curses.noecho() - curses.cbreak() - - # In keypad mode, escape sequences for special keys - # (like the cursor keys) will be interpreted and - # a special value like curses.KEY_LEFT will be returned - stdscr.keypad(1) - - # Start color, too. Harmless if the terminal doesn't have - # color; user can test with has_color() later on. The try/catch - # works around a minor bit of over-conscientiousness in the curses - # module -- the error return from C start_color() is ignorable. - try: - curses.start_color() - except: - pass - - return func(stdscr, *args, **kwds) - finally: - # Set everything back to normal - if 'stdscr' in locals(): - stdscr.keypad(0) - curses.echo() - curses.nocbreak() - curses.endwin() diff --git a/test/ok_2.7/dircache.py b/test/ok_2.7/dircache.py deleted file mode 100644 index 7e4f0b50..00000000 --- a/test/ok_2.7/dircache.py +++ /dev/null @@ -1,41 +0,0 @@ -"""Read and cache directory listings. - -The listdir() routine returns a sorted list of the files in a directory, -using a cache to avoid reading the directory more often than necessary. -The annotate() routine appends slashes to directories.""" -from warnings import warnpy3k -warnpy3k("the dircache module has been removed in Python 3.0", stacklevel=2) -del warnpy3k - -import os - -__all__ = ["listdir", "opendir", "annotate", "reset"] - -cache = {} - -def reset(): - """Reset the cache completely.""" - global cache - cache = {} - -def listdir(path): - """List directory contents, using cache.""" - try: - cached_mtime, list = cache[path] - del cache[path] - except KeyError: - cached_mtime, list = -1, [] - mtime = os.stat(path).st_mtime - if mtime != cached_mtime: - list = os.listdir(path) - list.sort() - cache[path] = mtime, list - return list - -opendir = listdir # XXX backward compatibility - -def annotate(head, list): - """Add '/' suffixes to directories.""" - for i in range(len(list)): - if os.path.isdir(os.path.join(head, list[i])): - list[i] = list[i] + '/' diff --git a/test/ok_2.7/dis.py b/test/ok_2.7/dis.py deleted file mode 100644 index 5aa09c95..00000000 --- a/test/ok_2.7/dis.py +++ /dev/null @@ -1,224 +0,0 @@ -"""Disassembler of Python byte code into mnemonics.""" - -import sys -import types - -from opcode import * -from opcode import __all__ as _opcodes_all - -__all__ = ["dis", "disassemble", "distb", "disco", - "findlinestarts", "findlabels"] + _opcodes_all -del _opcodes_all - -_have_code = (types.MethodType, types.FunctionType, types.CodeType, - types.ClassType, type) - -def dis(x=None): - """Disassemble classes, methods, functions, or code. - - With no argument, disassemble the last traceback. - - """ - if x is None: - distb() - return - if isinstance(x, types.InstanceType): - x = x.__class__ - if hasattr(x, 'im_func'): - x = x.im_func - if hasattr(x, 'func_code'): - x = x.func_code - if hasattr(x, '__dict__'): - items = x.__dict__.items() - items.sort() - for name, x1 in items: - if isinstance(x1, _have_code): - print "Disassembly of %s:" % name - try: - dis(x1) - except TypeError, msg: - print "Sorry:", msg - print - elif hasattr(x, 'co_code'): - disassemble(x) - elif isinstance(x, str): - disassemble_string(x) - else: - raise TypeError, \ - "don't know how to disassemble %s objects" % \ - type(x).__name__ - -def distb(tb=None): - """Disassemble a traceback (default: last traceback).""" - if tb is None: - try: - tb = sys.last_traceback - except AttributeError: - raise RuntimeError, "no last traceback to disassemble" - while tb.tb_next: tb = tb.tb_next - disassemble(tb.tb_frame.f_code, tb.tb_lasti) - -def disassemble(co, lasti=-1): - """Disassemble a code object.""" - code = co.co_code - labels = findlabels(code) - linestarts = dict(findlinestarts(co)) - n = len(code) - i = 0 - extended_arg = 0 - free = None - while i < n: - c = code[i] - op = ord(c) - if i in linestarts: - if i > 0: - print - print "%3d" % linestarts[i], - else: - print ' ', - - if i == lasti: print '-->', - else: print ' ', - if i in labels: print '>>', - else: print ' ', - print repr(i).rjust(4), - print opname[op].ljust(20), - i = i+1 - if op >= HAVE_ARGUMENT: - oparg = ord(code[i]) + ord(code[i+1])*256 + extended_arg - extended_arg = 0 - i = i+2 - if op == EXTENDED_ARG: - extended_arg = oparg*65536L - print repr(oparg).rjust(5), - if op in hasconst: - print '(' + repr(co.co_consts[oparg]) + ')', - elif op in hasname: - print '(' + co.co_names[oparg] + ')', - elif op in hasjrel: - print '(to ' + repr(i + oparg) + ')', - elif op in haslocal: - print '(' + co.co_varnames[oparg] + ')', - elif op in hascompare: - print '(' + cmp_op[oparg] + ')', - elif op in hasfree: - if free is None: - free = co.co_cellvars + co.co_freevars - print '(' + free[oparg] + ')', - print - -def disassemble_string(code, lasti=-1, varnames=None, names=None, - constants=None): - labels = findlabels(code) - n = len(code) - i = 0 - while i < n: - c = code[i] - op = ord(c) - if i == lasti: print '-->', - else: print ' ', - if i in labels: print '>>', - else: print ' ', - print repr(i).rjust(4), - print opname[op].ljust(15), - i = i+1 - if op >= HAVE_ARGUMENT: - oparg = ord(code[i]) + ord(code[i+1])*256 - i = i+2 - print repr(oparg).rjust(5), - if op in hasconst: - if constants: - print '(' + repr(constants[oparg]) + ')', - else: - print '(%d)'%oparg, - elif op in hasname: - if names is not None: - print '(' + names[oparg] + ')', - else: - print '(%d)'%oparg, - elif op in hasjrel: - print '(to ' + repr(i + oparg) + ')', - elif op in haslocal: - if varnames: - print '(' + varnames[oparg] + ')', - else: - print '(%d)' % oparg, - elif op in hascompare: - print '(' + cmp_op[oparg] + ')', - print - -disco = disassemble # XXX For backwards compatibility - -def findlabels(code): - """Detect all offsets in a byte code which are jump targets. - - Return the list of offsets. - - """ - labels = [] - n = len(code) - i = 0 - while i < n: - c = code[i] - op = ord(c) - i = i+1 - if op >= HAVE_ARGUMENT: - oparg = ord(code[i]) + ord(code[i+1])*256 - i = i+2 - label = -1 - if op in hasjrel: - label = i+oparg - elif op in hasjabs: - label = oparg - if label >= 0: - if label not in labels: - labels.append(label) - return labels - -def findlinestarts(code): - """Find the offsets in a byte code which are start of lines in the source. - - Generate pairs (offset, lineno) as described in Python/compile.c. - - """ - byte_increments = [ord(c) for c in code.co_lnotab[0::2]] - line_increments = [ord(c) for c in code.co_lnotab[1::2]] - - lastlineno = None - lineno = code.co_firstlineno - addr = 0 - for byte_incr, line_incr in zip(byte_increments, line_increments): - if byte_incr: - if lineno != lastlineno: - yield (addr, lineno) - lastlineno = lineno - addr += byte_incr - lineno += line_incr - if lineno != lastlineno: - yield (addr, lineno) - -def _test(): - """Simple test program to disassemble a file.""" - if sys.argv[1:]: - if sys.argv[2:]: - sys.stderr.write("usage: python dis.py [-|file]\n") - sys.exit(2) - fn = sys.argv[1] - if not fn or fn == "-": - fn = None - else: - fn = None - if fn is None: - f = sys.stdin - else: - f = open(fn) - source = f.read() - if fn is not None: - f.close() - else: - fn = "" - code = compile(source, fn, "exec") - dis(code) - -if __name__ == "__main__": - _test() diff --git a/test/ok_lib2.6/README b/test/ok_lib2.6/README new file mode 100644 index 00000000..bcc9516a --- /dev/null +++ b/test/ok_lib2.6/README @@ -0,0 +1,2 @@ +These are programs from the Python 2.6 standard library that are known +to decompile ok. diff --git a/test/ok_2.6/anydbm.py b/test/ok_lib2.6/anydbm.py similarity index 100% rename from test/ok_2.6/anydbm.py rename to test/ok_lib2.6/anydbm.py diff --git a/test/ok_lib2.7/README b/test/ok_lib2.7/README new file mode 100644 index 00000000..67a6a850 --- /dev/null +++ b/test/ok_lib2.7/README @@ -0,0 +1,2 @@ +These are programs from the Python 2.7 standard library that are known +to decompile ok. diff --git a/test/ok_2.7/aifc.py b/test/ok_lib2.7/aifc.py similarity index 100% rename from test/ok_2.7/aifc.py rename to test/ok_lib2.7/aifc.py diff --git a/test/ok_lib2.7/aifc.pyc b/test/ok_lib2.7/aifc.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41d073dad64fbd89f5d006cc88bf0026b8ab2b74 GIT binary patch literal 33373 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 Io6yGp1+Dc=MF0Q* literal 0 HcmV?d00001 diff --git a/test/ok_2.7/antigravity.py b/test/ok_lib2.7/antigravity.py similarity index 100% rename from test/ok_2.7/antigravity.py rename to test/ok_lib2.7/antigravity.py diff --git a/test/ok_lib2.7/antigravity.pyc b/test/ok_lib2.7/antigravity.pyc new file mode 100644 index 0000000000000000000000000000000000000000..003ec47e64aff255f917ec9fec7f63b9ab0ae3a3 GIT binary patch literal 243 zcmYLDv1-FW43+H;!L(b~?p|y`LK`R{WDj%+fzTz`XJI?G@64U-#B-PaQok!7kjfB< zklvHT<4M8wCHy=5?iJj_7v4y@H-TKzg9hLmfB;S&s@zd z9LG{BA=(Qr5D&rwAn^!14-Wv}Icq!p6IZphv%53rZ_a$@J6ru{EB@=zuRkO-|J886 zh0Fhq!4S1EMr0%EMPw@Uoah7LjmsMISBmjmqwyQ&XMyApWe zl$ngWc%KXI#>OHjWAmVjTm_g4v$4g7l+i(VwYREk)4Z=ZcGzzii-e3)e(uiHbdV+k z(~U=knPj$!bcv0G^PE{|{ zebuNZb)Kl_^`@F?ul(31X)m>AcWF(co~BtAcddFkMz*R?b(-mJnx$dJf$>}!vsaB^ zaf)UUyY3dJHZGj8uE|Fn6tXA^y&}tsDevV16^)^taqN;VrJYqiIEeV>^@}q#KSAm- zg8(@NOm-ktKvZ6JP;8?y(unNTI+vQ|$`U~fa4qgT7kPzpb15el;iq)So`4LO+S8@U z(wWmKPUt&3yW<=(oAz)LOCt*>i#x)dBm-7_!I4ENEWAK)2T9KWjdD-2J);&|6K{U$ z?tdIfAa8IdIJhaX17b!T1~;)BIiDqGP>|-A#xvlKQ@)Qi-)NSpK#`y@WQpO4dS2p_ z#Z<%Ngg-)2-JPJItipNtw8*{U(@6$8@1sEAPvF6bkpfVt`OJ<`L^_Bxa1hT?)kAv4 zhs_hzJwrts2HTuh0Ifn5u!+*_j`p&2XyaGR?Z;siyaZ?zZb`rqX1->&TIVGYa74%V z8+fKh1w-KJPAAtR+v$W@UP{1sI;9k*NS^#%Jhi+_TJ{V<STn#^w!_5z!1e3i~u=>#LOsdKcSD!Rx9N5!$;18FjI%}H%ZsVI!G4g=LsPayyv zy~bVP8t8^=?%tSDq%+V-f5NE3GI;QsO2DU}x4Nq{5BKyW3r%Fop~$t_EAk9flqA-B z=`UhyxjJd6D8&$*@w?Lug1*V19m&%N7aP*rENdIJIv9!pAgT>qenis99>{VRMeCXV~OgBJ`{D&A!w`{CQG0BXy zy_fpbQG*eE%tb4Oa)b|za0zdn`8lI@rMTv$Tz+JrvbhN4vx4>IjgeG705kFcU0a%F zA!j{sBUOln3odw@H1IC`e1Xef#z0%!(Pp$+dB3_*;XD4(QR5vfNP0URQzY047tNis z#0vP!y>hrhVZM|U2K2}Lk#@Yr`b>)=a4hCH869j&GIuE7Vbb4(hV+;}bVMagK-b3{ zk0lYf%mFmn*es8=3hJNMIGd literal 0 HcmV?d00001 diff --git a/test/ok_2.7/asynchat.py b/test/ok_lib2.7/asynchat.py similarity index 100% rename from test/ok_2.7/asynchat.py rename to test/ok_lib2.7/asynchat.py diff --git a/test/ok_lib2.7/asynchat.pyc b/test/ok_lib2.7/asynchat.pyc new file mode 100644 index 0000000000000000000000000000000000000000..173d731402ecfbe9ffd276399704561dfc57a2b1 GIT binary patch literal 9840 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 S?4CM4_4ZV|vcEDq?)@*X|08Yy literal 0 HcmV?d00001 diff --git a/test/ok_2.7/bisect.py b/test/ok_lib2.7/bisect.py similarity index 100% rename from test/ok_2.7/bisect.py rename to test/ok_lib2.7/bisect.py diff --git a/test/ok_lib2.7/bisect.pyc b/test/ok_lib2.7/bisect.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90621ec279a859f5ead69ef9cdb3cf9d58e41cb7 GIT binary patch literal 3271 zcmeHJOK;pZ5FTmQuT2~`XcG5v;ZZJi1 z1?-?`dg!VDr#~vlp+BJghFYyr8!dc@5g#gmBWg&_jL2_3PUp|f-XBkY`#z?{vx4`R zXvRV$L@$dNsp?MJkKjUdI~rD!3KN33GuZyDz>^Tgv`cerEQvT?me}gZ2o`{0?#C zv&RWh^)VrO1pLaQUpy)>gn(CQvQE`KvOXOV4;^=SX!aE^!~|YAU-Y+=4t;dor6Z5$ z9(CzM9?iIiRX=^souo_K$3A~N!JOwEx74FoK6&u9AFOg*Zy(wI8e#aKw8%|hAl^#q>X5wAAbj7rI5&W2z^x5kAng-w;H z^f=5PYHUPSiXc%VS!Y&!y5j;$^@%D|MId)}#IURpDy+Le zOr~SS9whr5Dq)nY;#4JlH|$QxY~#maJ+I*#Q;M>d}D`cP>fW7>n*3-};y58?-z z)#{t7!ZxsOuPl`1(?tlDce449IzUTCT~R5Pn8 z{P>;2*o0$%sUC(^8BgZnbZ%3GR~K=aPv@Ds7g}X(SWX6a`=5nFhr&K4U4AtX0g>5`c%ieb!D5pg&l!bs1OT`N?(~|hSlWc4 zN?pzzVVp$_vxtEoG2&ewM4TuQXGFvq60NaVhqyTSH_6bz{{whx;D6;j@V_XAZs-|A z%?v&LCowPS`ac-@HGX5aCDAjWzX*oT)M!c2+`sJndihj?DzspCz=U`tj^jo9fp&FHZ#V}znLH|Gfp1b;B^e^a__s?P4 z6(6VAm(j2P!V~aq;i{xh_5v=kEME|VK~lzpL35RGsohprC~G1&i|>-gQN%tYE_<4# xjn=YuH=kmGtJh9$o3~zZ@n!ZPFOxb`5BYE0b+hVky^nSi?Z(!v4r;AU?{BUDAbkJ; literal 0 HcmV?d00001 diff --git a/test/ok_2.7/calendar.py b/test/ok_lib2.7/calendar.py similarity index 100% rename from test/ok_2.7/calendar.py rename to test/ok_lib2.7/calendar.py diff --git a/test/ok_lib2.7/calendar.pyc b/test/ok_lib2.7/calendar.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05886b2c4dea4a9e1e2b86c928072f2417f0e1c5 GIT binary patch literal 30945 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 KAM{zj^Zx+H`ZF&8 literal 0 HcmV?d00001 diff --git a/test/ok_2.7/cgitb.py b/test/ok_lib2.7/cgitb.py similarity index 100% rename from test/ok_2.7/cgitb.py rename to test/ok_lib2.7/cgitb.py diff --git a/test/ok_lib2.7/cgitb.pyc b/test/ok_lib2.7/cgitb.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b977482e3536fddecb65327ca2f24e1ac0c7a23 GIT binary patch literal 12904 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 literal 0 HcmV?d00001 diff --git a/test/ok_2.7/colorsys.py b/test/ok_lib2.7/colorsys.py similarity index 100% rename from test/ok_2.7/colorsys.py rename to test/ok_lib2.7/colorsys.py diff --git a/test/ok_lib2.7/colorsys.pyc b/test/ok_lib2.7/colorsys.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e71c1343490968ee6b34f06dd679e99384c951e6 GIT binary patch literal 4311 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 OxYoYbUTLqjSN{Sy%a}3% literal 0 HcmV?d00001 diff --git a/test/ok_2.7/compileall.py b/test/ok_lib2.7/compileall.py similarity index 100% rename from test/ok_2.7/compileall.py rename to test/ok_lib2.7/compileall.py diff --git a/test/ok_lib2.7/compileall.pyc b/test/ok_lib2.7/compileall.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a5c7c6bbd3da965002115a44a1205e4102ef8443 GIT binary patch literal 7256 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 2 and not noneInNames: - if tokens[-1] == Token('RETURN_VALUE'): - if tokens[-2] != Token('LOAD_CONST'): + if tokens[-1].type == 'RETURN_VALUE': + if tokens[-2].type != 'LOAD_CONST': tokens.append(Token('RETURN_LAST')) if len(tokens) == 0: return diff --git a/uncompyle6/disas.py b/uncompyle6/disas.py index 0daff2d3..cb8766c9 100644 --- a/uncompyle6/disas.py +++ b/uncompyle6/disas.py @@ -28,8 +28,8 @@ def check_object_path(path): path = importlib.util.cache_from_source(path) return path if not path.endswith(".pyc") and not path.endswith(".pyo"): - raise FileNotFoundError("path %s must point to a .py or .pyc file" % - path) + raise ValueError("path %s must point to a .py or .pyc file" % + path) return path def disco(version, co, out=None): @@ -134,7 +134,7 @@ def disassemble_files(in_base, out_base, files, outfile=None): else: # uncompyle successfull if outfile: outstream.close() - if not outfile: print('\n# okay decompyling', infile) + if not outfile: print('\n# okay disassembling', infile) sys.stdout.flush() if outfile: diff --git a/uncompyle6/opcodes/opcode_34.py b/uncompyle6/opcodes/opcode_34.py index b34b21b2..c7a7cc98 100644 --- a/uncompyle6/opcodes/opcode_34.py +++ b/uncompyle6/opcodes/opcode_34.py @@ -42,6 +42,10 @@ def jabs_op(name, op): def_op(name, op) hasjabs.append(op) +def updateGlobal(): + # JUMP_OPs are used in verification + globals().update({'JUMP_OPs': map(lambda op: opname[op], hasjrel + hasjabs)}) + # Instruction opcodes for compiled code # Blank lines correspond to available opcodes @@ -189,4 +193,5 @@ hasfree.append(148) def_op('EXTENDED_ARG', 144) EXTENDED_ARG = 144 +updateGlobal() del def_op, name_op, jrel_op, jabs_op diff --git a/uncompyle6/parsers/spark.py b/uncompyle6/parsers/spark.py index cd7b877b..ac772ef2 100644 --- a/uncompyle6/parsers/spark.py +++ b/uncompyle6/parsers/spark.py @@ -44,6 +44,8 @@ class _State: self.T, self.complete, self.items = [], [], items self.stateno = stateno +# DEFAULT_DEBUG = {'rules': True, 'transition': False} +DEFAULT_DEBUG = {'rules': False, 'transition': False} class GenericParser: ''' An Earley parser, as per J. Earley, "An Efficient Context-Free @@ -56,7 +58,7 @@ class GenericParser: Parsing", unpublished paper, 2001. ''' - def __init__(self, start, debug=False): + def __init__(self, start, debug=DEFAULT_DEBUG): self.rules = {} self.rule2func = {} self.rule2name = {} @@ -401,10 +403,11 @@ class GenericParser: return rv def gotoT(self, state, t): - if self.debug: print("Terminal", t) + if self.debug['rules']: print("Terminal", t, state) return [self.goto(state, t)] def gotoST(self, state, st): + if self.debug['transition']: print("GotoST", st, state) rv = [] for t in self.states[state].T: if st == t: @@ -567,7 +570,7 @@ class GenericParser: return self.rule2func[self.new2old[rule]](attr) def buildTree(self, nt, item, tokens, k): - if self.debug: + if self.debug['rules']: print("NT", nt) state, parent = item diff --git a/uncompyle6/scanners/scanner27.py b/uncompyle6/scanners/scanner27.py index d3c4c418..4635ebf0 100644 --- a/uncompyle6/scanners/scanner27.py +++ b/uncompyle6/scanners/scanner27.py @@ -17,7 +17,7 @@ import dis, inspect from collections import namedtuple from array import array -from uncompyle6.opcodes.opcode_27 import * +from uncompyle6.opcodes.opcode_27 import * # NOQA import uncompyle6.scanner as scan class Scanner27(scan.Scanner): @@ -40,7 +40,7 @@ class Scanner27(scan.Scanner): self.code = array('B', co.co_code[:n]) self.prev = [0] - # mapping adresses of instru & arg + # mapping addresses of instruction & argument for i in self.op_range(0, n): op = self.code[i] self.prev.append(i) diff --git a/uncompyle6/scanners/scanner34.py b/uncompyle6/scanners/scanner34.py index def66073..67b77a25 100644 --- a/uncompyle6/scanners/scanner34.py +++ b/uncompyle6/scanners/scanner34.py @@ -21,9 +21,14 @@ from collections import namedtuple from uncompyle6 import PYTHON_VERSION from uncompyle6.scanner import Token, L65536 +import uncompyle6.opcodes.opcode_34 # Get all the opcodes into globals +JUMP_OPs = uncompyle6.opcodes.opcode_34.JUMP_OPs globals().update(dis.opmap) + from uncompyle6.opcodes.opcode_34 import * + + import uncompyle6.scanner as scan diff --git a/uncompyle6/verify.py b/uncompyle6/verify.py index df8cea35..0874179f 100755 --- a/uncompyle6/verify.py +++ b/uncompyle6/verify.py @@ -14,13 +14,14 @@ import uncompyle6.scanner as scanner # FIXME: DRY if (sys.version_info >= (3, 0)): truediv = operator.truediv - - def cmp(a, b): - return (a > b) - (a < b) from functools import reduce else: truediv = operator.div + +def code_equal(a, b): + return a.co_code == b.co_code + BIN_OP_FUNCS = { 'BINARY_POWER': operator.pow, 'BINARY_MULTIPLY': operator.mul, @@ -151,7 +152,7 @@ def cmp_code_objects(version, code_obj1, code_obj2, name=''): name = '%s.%s' % (name, code_obj1.co_name) if name == '.?': name = '__main__' - if isinstance(code_obj1, object) and cmp(code_obj1, code_obj2): + if isinstance(code_obj1, object) and code_equal(code_obj1, code_obj2): # use the new style code-classes' __cmp__ method, which # should be faster and more sophisticated # if this compare fails, we use the old routine to @@ -186,9 +187,9 @@ def cmp_code_objects(version, code_obj1, code_obj2, name=''): elif version == 3.4: import uncompyle6.scanners.scanner34 as scan scanner = scan.Scanner34() - scanner.setShowAsm( showasm=False ) + global JUMP_OPs - JUMP_OPs = scan.JUMP_OPs + ['JUMP_BACK'] + JUMP_OPs = list(scan.JUMP_OPs) + ['JUMP_BACK'] # use changed Token class # we (re)set this here to save exception handling, @@ -227,7 +228,7 @@ def cmp_code_objects(version, code_obj1, code_obj2, name=''): raise CmpErrorCode(name, tokens1[idx1].offset, tokens1[idx1], tokens2[idx2], tokens1, tokens2) - if tokens1[i1] != tokens2[i2]: + if tokens1[i1].type != tokens2[i2].type: if tokens1[i1].type == 'LOAD_CONST' == tokens2[i2].type: i = 1 while tokens1[i1+i].type == 'LOAD_CONST': diff --git a/uncompyle6/walker.py b/uncompyle6/walker.py index 37dd9d4d..f5b194d3 100644 --- a/uncompyle6/walker.py +++ b/uncompyle6/walker.py @@ -1406,9 +1406,13 @@ class Walker(GenericASTTraversal, object): self.print_(repr(ast)) return ast + # The bytecode for the end of the main routine has a + # "return None". However you can't issue a "return" statement in + # main. So as the old cigarette slogan goes: I'd rather switch (the token stream) + # than fight (with the grammar to not emit "return None"). if len(tokens) >= 2 and not noneInNames: - if tokens[-1] == Token('RETURN_VALUE'): - if tokens[-2] == Token('LOAD_CONST'): + if tokens[-1].type == 'RETURN_VALUE': + if tokens[-2].type == 'LOAD_CONST': del tokens[-2:] else: tokens.append(Token('RETURN_LAST'))