You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-04 09:22:40 +08:00
Compare commits
109 Commits
release-2.
...
release-2.
Author | SHA1 | Date | |
---|---|---|---|
|
931eb4a7e5 | ||
|
2db380a77f | ||
|
de0ec195b7 | ||
|
e0eba6998f | ||
|
e1a2860013 | ||
|
cce40bef21 | ||
|
ca10f5652f | ||
|
05898dc7cb | ||
|
37406557bc | ||
|
7929e4b57d | ||
|
5babde61c4 | ||
|
6f6f1db576 | ||
|
8d51456f59 | ||
|
a6320359c8 | ||
|
631d7be921 | ||
|
1e22734b6b | ||
|
b134d08e91 | ||
|
8a66fd0be3 | ||
|
9ae45b363f | ||
|
b287a305ea | ||
|
d823dfb5d3 | ||
|
378cca27da | ||
|
f9dc797aa0 | ||
|
8b9e0eca42 | ||
|
41f9e9e53e | ||
|
1179dc72da | ||
|
e63bcd54e9 | ||
|
73461d323e | ||
|
e37b197db9 | ||
|
196495c40e | ||
|
dddb486d78 | ||
|
ce2ae463c4 | ||
|
739ce7b1fd | ||
|
b11f6d94f7 | ||
|
debb46b0fe | ||
|
400153ea53 | ||
|
a65a8bb68e | ||
|
4a79082872 | ||
|
61c4a711a2 | ||
|
406df297df | ||
|
36ffd4c31f | ||
|
039c115679 | ||
|
15b2a742e9 | ||
|
163dfd888d | ||
|
408ba8c564 | ||
|
c58481a9eb | ||
|
845a4a2003 | ||
|
469cadd5c9 | ||
|
4377354cf9 | ||
|
6caa2c12fa | ||
|
3153a955d4 | ||
|
6f3a88d7e2 | ||
|
109737cbef | ||
|
05733c6171 | ||
|
6765a2ea97 | ||
|
c85496a92d | ||
|
e4ba73adfb | ||
|
7bf93980ce | ||
|
8241a5e3a8 | ||
|
faac11ad8c | ||
|
fe04b97c6b | ||
|
62f6220082 | ||
|
11e6eff427 | ||
|
2286aa5320 | ||
|
72ac7eb27c | ||
|
a8c5f71cfe | ||
|
feec241da8 | ||
|
c5f359f9be | ||
|
bfe8357f52 | ||
|
ceb47aba9c | ||
|
08720474bf | ||
|
119bb9bb26 | ||
|
4455b5e280 | ||
|
dcbf8d2cf7 | ||
|
b52baddab6 | ||
|
03bb54f8ea | ||
|
313e468bdc | ||
|
dc80b140c6 | ||
|
fa48c9fc61 | ||
|
0a32a16d88 | ||
|
4aa703d727 | ||
|
f3a4e6ee54 | ||
|
43f5c5dcca | ||
|
3e49aa56bb | ||
|
9cc9fc99c2 | ||
|
2ebc558b40 | ||
|
34a582b64c | ||
|
2711c8d06f | ||
|
40badefe9d | ||
|
d9ef5ff69a | ||
|
a4e839960f | ||
|
7b3c7e83ec | ||
|
1b71d0a049 | ||
|
17b0caa4f0 | ||
|
b88e97c17d | ||
|
158bdd9b04 | ||
|
b0d3a4e47b | ||
|
4ba2eb6981 | ||
|
76768c889a | ||
|
8ae7e22f2e | ||
|
7e0526d627 | ||
|
2c7fcf9e62 | ||
|
5a813621cb | ||
|
9f7d36f8fb | ||
|
4e57c3da5b | ||
|
0de3efb01a | ||
|
fff4283f73 | ||
|
551e2174cb | ||
|
f25c9b45a4 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -3,9 +3,12 @@
|
|||||||
/.cache
|
/.cache
|
||||||
/.eggs
|
/.eggs
|
||||||
/.python-version
|
/.python-version
|
||||||
|
/.tox
|
||||||
|
/README
|
||||||
/__pkginfo__.pyc
|
/__pkginfo__.pyc
|
||||||
/dist
|
/dist
|
||||||
/how-to-make-a-release.txt
|
/how-to-make-a-release.txt
|
||||||
|
/tmp
|
||||||
/uncompyle6.egg-info
|
/uncompyle6.egg-info
|
||||||
__pycache__
|
__pycache__
|
||||||
build
|
build
|
||||||
|
@@ -3,12 +3,14 @@ language: python
|
|||||||
sudo: false
|
sudo: false
|
||||||
|
|
||||||
python:
|
python:
|
||||||
- '2.6'
|
|
||||||
- '2.7'
|
|
||||||
- '3.4'
|
|
||||||
- '3.5'
|
- '3.5'
|
||||||
|
- '2.7'
|
||||||
|
- '2.6'
|
||||||
|
- '3.4'
|
||||||
|
- '3.2'
|
||||||
|
|
||||||
install:
|
install:
|
||||||
|
- pip install -r requirements.txt
|
||||||
- pip install -r requirements-dev.txt
|
- pip install -r requirements-dev.txt
|
||||||
|
|
||||||
script:
|
script:
|
||||||
|
523
ChangeLog
523
ChangeLog
@@ -1,6 +1,527 @@
|
|||||||
|
2016-05-14 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/version.py: Get ready for release 2.3.5
|
||||||
|
|
||||||
|
2016-05-13 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/semantics/fragments.py: More fragment bugs
|
||||||
|
|
||||||
|
2016-05-13 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* MANIFEST.in, Makefile, __pkginfo__.py, setup.py,
|
||||||
|
uncompyle6/semantics/fragments.py: More packaging crap. Did I tell you how much I hate python packaging? fragments.py: track recent change in class decorators.
|
||||||
|
|
||||||
|
2016-05-13 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* __pkginfo__.py, bin/pydisassemble, bin/uncompyle6, setup.py,
|
||||||
|
test/simple_source/bug26/05-ret-or.py,
|
||||||
|
test/simple_source/def/03_star_arg.py, uncompyle6/bin/__init__.py,
|
||||||
|
uncompyle6/bin/pydisassemble.py, uncompyle6/bin/uncompile.py: Python
|
||||||
|
packaging - yet again. Did I ever mention how much Python sucks at packaging?
|
||||||
|
|
||||||
|
2016-05-13 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/simple_source/def/10_classdec.py: Test for class decorator See https://github.com/rocky/python-uncompyle6/pull/15
|
||||||
|
|
||||||
|
2016-05-13 R. Bernstein <rocky@users.noreply.github.com>
|
||||||
|
|
||||||
|
* : Merge pull request #15 from Tey/master Fix for class decorators
|
||||||
|
|
||||||
|
2016-05-12 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* __pkginfo__.py: Back off spark 1.2.0 for now
|
||||||
|
|
||||||
|
2016-05-12 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/scanners/scanner26.py,
|
||||||
|
uncompyle6/scanners/scanner27.py, uncompyle6/scanners/scanner35.py:
|
||||||
|
More small changes
|
||||||
|
|
||||||
|
2016-05-12 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/test_pythonlib.py: Clean up test byte-compile directory
|
||||||
|
|
||||||
|
2016-05-12 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/simple_source/stmts/15_for_if.py, uncompyle6/main.py,
|
||||||
|
uncompyle6/parsers/parse3.py, uncompyle6/scanners/scanner3.py: Misc
|
||||||
|
changes Back off of some validation tests for now.
|
||||||
|
|
||||||
|
2016-05-12 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* __pkginfo__.py, uncompyle6/parsers/parse2.py,
|
||||||
|
uncompyle6/parsers/parse3.py, uncompyle6/scanners/scanner3.py,
|
||||||
|
uncompyle6/semantics/fragments.py, uncompyle6/semantics/pysource.py:
|
||||||
|
Misc fixups/cleanups * parse3.py Had botched if-for-else test by grammar addition * semantics/*.py: Show errorstack in failed parse when -g (requires
|
||||||
|
sparck 1.2.0) * some optimization in scanner3
|
||||||
|
|
||||||
|
2016-05-12 R. Bernstein <rocky@users.noreply.github.com>
|
||||||
|
|
||||||
|
* : Merge pull request #14 from rocky/make-function-rewrite Make function rewrite
|
||||||
|
|
||||||
|
2016-05-11 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/simple_source/def/03_py3_def.py,
|
||||||
|
uncompyle6/parsers/parse3.py, uncompyle6/scanners/dis35.py,
|
||||||
|
uncompyle6/scanners/scanner3.py, uncompyle6/scanners/scanner34.py,
|
||||||
|
uncompyle6/scanners/scanner35.py,
|
||||||
|
uncompyle6/semantics/fragments.py, uncompyle6/semantics/pysource.py:
|
||||||
|
Redo make_function for *, arg main(*, file='foo') and things like that now work
|
||||||
|
|
||||||
|
2016-05-11 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/parsers/parse3.py, uncompyle6/scanners/dis35.py,
|
||||||
|
uncompyle6/scanners/scanner3.py, uncompyle6/scanners/scanner35.py,
|
||||||
|
uncompyle6/semantics/pysource.py: WIP Make function redo
|
||||||
|
|
||||||
|
2016-05-10 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/parser.py, uncompyle6/parsers/parse2.py,
|
||||||
|
uncompyle6/parsers/parse3.py, uncompyle6/semantics/pysource.py: add
|
||||||
|
pos_arg ::= expr to make params of fns clear
|
||||||
|
|
||||||
|
2016-05-09 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/parsers/parse3.py: * call WIP
|
||||||
|
|
||||||
|
2016-05-09 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/simple_source/def/11_classbug.py,
|
||||||
|
uncompyle6/parsers/parse3.py: 3.2 class bug
|
||||||
|
|
||||||
|
2016-05-09 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/simple_source/looping/09_if_whiletrue_bug.py,
|
||||||
|
uncompyle6/parsers/parse3.py: 3.2 WhileTrue grammar bug
|
||||||
|
|
||||||
|
2016-05-09 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/simple_source/stmts/09_whiletrue_bug.py,
|
||||||
|
uncompyle6/parsers/parse3.py, uncompyle6/semantics/pysource.py:
|
||||||
|
Python 3 "while True" bug
|
||||||
|
|
||||||
|
2016-05-09 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* DECOMPYLE-2.4-CHANGELOG.txt, HISTORY.md, MANIFEST.in: Dan Pascu's
|
||||||
|
contribution via Dan
|
||||||
|
|
||||||
|
2016-05-09 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* HISTORY.md: Another history tweak
|
||||||
|
|
||||||
|
2016-05-09 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* HISTORY.md, uncompyle6/parser.py, uncompyle6/parsers/parse2.py,
|
||||||
|
uncompyle6/parsers/parse3.py, uncompyle6/scanners/scanner27.py: Some
|
||||||
|
grammar cleanup
|
||||||
|
|
||||||
|
2016-05-09 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/simple_source/def/05_closure_bug.py,
|
||||||
|
uncompyle6/parsers/parse3.py, uncompyle6/semantics/fragments.py,
|
||||||
|
uncompyle6/semantics/pysource.py: Track recent lc changes in
|
||||||
|
fragment semantics
|
||||||
|
|
||||||
|
2016-05-09 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/simple_source/def/07_closure_bug2.py: Another closure
|
||||||
|
wrapping bug
|
||||||
|
|
||||||
|
2016-05-09 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/simple_source/def/05_closure_bug.py,
|
||||||
|
uncompyle6/parsers/parse3.py: Another Python 3 closure grammar bug
|
||||||
|
|
||||||
|
2016-05-09 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* HISTORY.md: More small history tweaks
|
||||||
|
|
||||||
|
2016-05-09 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/simple_source/comprehension/11-list-if.py,
|
||||||
|
uncompyle6/parsers/parse3.py, uncompyle6/semantics/pysource.py: Fix
|
||||||
|
Python 3 list comprehansion closure bug
|
||||||
|
|
||||||
|
2016-05-08 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/simple_source/operation_logic/05_dup_top_two.py,
|
||||||
|
uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse3.py: Python 3
|
||||||
|
DUP_TOP_TWO bug
|
||||||
|
|
||||||
|
2016-05-08 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/simple_source/looping/11_if_while_bug.py,
|
||||||
|
uncompyle6/parser.py, uncompyle6/parsers/parse2.py,
|
||||||
|
uncompyle6/parsers/parse3.py: DRY parse{2,3} code Add test for last bug.
|
||||||
|
|
||||||
|
2016-05-08 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse3.py: Fix
|
||||||
|
another if/loop parse bug
|
||||||
|
|
||||||
|
2016-05-08 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* HISTORY.md, uncompyle6/main.py: Go over history yet again.
|
||||||
|
|
||||||
|
2016-05-08 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/simple_source/comprehension/10-list-ifnot.py,
|
||||||
|
uncompyle6/main.py, uncompyle6/parser.py: come_from_opt handles
|
||||||
|
and/or precidence properly main.py: give a better error message when file is not found.
|
||||||
|
|
||||||
|
2016-05-08 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/semantics/fragments.py,
|
||||||
|
uncompyle6/semantics/pysource.py: Semantic routine nonterminal typo
|
||||||
|
|
||||||
|
2016-05-08 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/simple_source/looping/11_for_if_loopback2.py,
|
||||||
|
uncompyle6/parser.py, uncompyle6/parsers/parse3.py: Yet another
|
||||||
|
Python 3.x COME_FROM grammar problem
|
||||||
|
|
||||||
|
2016-05-08 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/simple_source/looping/10_for_if_loopback.py,
|
||||||
|
uncompyle6/parser.py, uncompyle6/parsers/parse2.py,
|
||||||
|
uncompyle6/parsers/parse3.py, uncompyle6/scanners/scanner32.py: Fix
|
||||||
|
3.2 for/if loopback bug problem was handling in Python 3.2 for ... if ... else: .... jump for come from if jump for In later Python 3's a "come from" is removed. Also, start to DRY parser{,2,3} grammar rules.
|
||||||
|
|
||||||
|
2016-05-08 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* HISTORY.md, test/simple_source/branching/10_if_pass.py,
|
||||||
|
uncompyle6/scanners/scanner26.py, uncompyle6/scanners/scanner27.py,
|
||||||
|
uncompyle6/scanners/scanner3.py, uncompyle6/scanners/scanner35.py:
|
||||||
|
Fix 3.5 if..pass bug Update HISTORY.MD to include Dan Pascu. Some minor doc corrections
|
||||||
|
|
||||||
|
2016-05-08 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/scanners/scanner34.py,
|
||||||
|
uncompyle6/scanners/scanner35.py: DRY scanner 3.{4,5} code
|
||||||
|
|
||||||
|
2016-05-07 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/simple_source/def/07_classparam.py,
|
||||||
|
uncompyle6/parsers/parse3.py: Python 3 build class parsing
|
||||||
|
|
||||||
|
2016-05-07 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/simple_source/expression/05_yield_from.py,
|
||||||
|
uncompyle6/parsers/parse3.py, uncompyle6/scanners/scanner35.py,
|
||||||
|
uncompyle6/semantics/fragments.py, uncompyle6/semantics/pysource.py:
|
||||||
|
Handle Python 3 yield from Start dealing with MAKE_FUNCTION flags - not done yet.
|
||||||
|
|
||||||
|
2016-05-06 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/simple_source/comprehension/10-genexpr.py,
|
||||||
|
uncompyle6/parsers/parse3.py, uncompyle6/semantics/fragments.py,
|
||||||
|
uncompyle6/semantics/pysource.py: More Python3 deparsing - grammar rule genexpr - More Python3 docstring formatted
|
||||||
|
|
||||||
|
2016-05-06 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* bin/pydisassemble, setup.py: Administrivia setup.py: don't need to import pkg_resources pydisassemble: give an error is no file or directory is given usage should go to stderr, not stdout
|
||||||
|
|
||||||
|
2016-05-05 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* README.rst, uncompyle6/semantics/fragments.py,
|
||||||
|
uncompyle6/semantics/pysource.py: Minor tweaks
|
||||||
|
|
||||||
|
2016-05-05 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/semantics/pysource.py: All Python 2.7 lib files
|
||||||
|
decompile
|
||||||
|
|
||||||
|
2016-05-05 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/simple_source/stmts/05_try_finally_pass.py,
|
||||||
|
test/simple_source/stmts/10_if_break_finally.py,
|
||||||
|
uncompyle6/opcodes/opcode_27.py, uncompyle6/parser.py,
|
||||||
|
uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse3.py: More
|
||||||
|
Python 2 and 3 deparsing bugs fixed * while + if break * try + finall /pass
|
||||||
|
|
||||||
|
2016-05-05 rocky <rb@dustyfeet.com>
|
||||||
|
|
||||||
|
* __pkginfo__.py: Again, not GPL3 but MIT
|
||||||
|
|
||||||
|
2016-05-05 rocky <rb@dustyfeet.com>
|
||||||
|
|
||||||
|
* uncompyle6/__init__.py, uncompyle6/opcodes/opcode_27.py: Start
|
||||||
|
PYPY 2.7 tolerance
|
||||||
|
|
||||||
|
2016-05-05 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* ChangeLog, NEWS, uncompyle6/version.py: Get ready for release
|
||||||
|
2.3.4
|
||||||
|
|
||||||
|
2016-05-05 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* .travis.yml: Remove pypy3 add python 3.2 testing Reorder list for testing preference
|
||||||
|
|
||||||
|
2016-05-05 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* .travis.yml: Remove pypy
|
||||||
|
|
||||||
|
2016-05-05 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* Makefile, test/Makefile, uncompyle6/semantics/pysource.py: Fix up
|
||||||
|
3.2 tests Remove pypy
|
||||||
|
|
||||||
|
2016-05-05 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* .travis.yml: Try pypy and pypy3
|
||||||
|
|
||||||
|
2016-05-05 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/simple_source/def/05_abc_class.py,
|
||||||
|
test/simple_source/def/06_classbug.py, uncompyle6/parsers/parse3.py:
|
||||||
|
Python 3.5 abc.py bug distilled
|
||||||
|
|
||||||
|
2016-05-05 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/scanners/dis35.py, uncompyle6/scanners/scanner35.py:
|
||||||
|
Add cross-Python-protable 3.5 dis module
|
||||||
|
|
||||||
|
2016-05-04 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/simple_source/stmts/05_with.py,
|
||||||
|
uncompyle6/opcodes/opcode_35.py, uncompyle6/parser.py,
|
||||||
|
uncompyle6/parsers/parse3.py, uncompyle6/scanners/scanner35.py:
|
||||||
|
Handle 3.5 with [as] scanner35.py: Fix a small variable-name typo
|
||||||
|
|
||||||
|
2016-05-03 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* : One more test
|
||||||
|
|
||||||
|
2016-05-03 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/scanners/scanner3.py,
|
||||||
|
uncompyle6/scanners/scanner34.py, uncompyle6/scanners/scanner35.py:
|
||||||
|
Don't repeat next_except_jump
|
||||||
|
|
||||||
|
2016-05-03 rocky <rb@dustyfeet.com>
|
||||||
|
|
||||||
|
* __pkginfo__.py, requirements.txt: Wrong package name
|
||||||
|
|
||||||
|
2016-05-03 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* __pkginfo__.py, requirements.txt, setup.py: More package
|
||||||
|
administrivia
|
||||||
|
|
||||||
|
2016-05-03 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/scanner.py: Remove one more old-style Python class
|
||||||
|
|
||||||
|
2016-05-03 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/scanners/scanner27.py: DRY Python 2.7 scanner more
|
||||||
|
|
||||||
|
2016-05-03 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* MANIFEST.in: Include LICENSE in package
|
||||||
|
|
||||||
|
2016-05-03 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* ChangeLog, NEWS, uncompyle6/version.py: Get ready for release
|
||||||
|
2.3.3
|
||||||
|
|
||||||
|
2016-05-02 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* README.rst: Be more explicit that we need Python 2.6 or later
|
||||||
|
|
||||||
|
2016-05-02 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* : commit feec241da88107b97bbdfbabeb3ae7131a7aa923 Author: rocky
|
||||||
|
<rocky@gnu.org> Date: Mon May 2 21:20:17 2016 -0400
|
||||||
|
|
||||||
|
2016-05-02 rocky <rb@dustyfeet.com>
|
||||||
|
|
||||||
|
* README.rst: Note relation to other uncompyle forks Add some other minor corrections and additions as well.
|
||||||
|
|
||||||
|
2016-05-02 rocky <rb@dustyfeet.com>
|
||||||
|
|
||||||
|
* uncompyle6/__init__.py: Trivial spacing change
|
||||||
|
|
||||||
|
2016-05-02 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* ChangeLog, NEWS, __pkginfo__.py, bin/pydisassemble,
|
||||||
|
bin/uncompyle6, setup.py, uncompyle6/__init__.py,
|
||||||
|
uncompyle6/version.py: Add -V | --version and simplfy changing it
|
||||||
|
|
||||||
|
2016-05-01 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/__init__.py: Expose uncompyle_file
|
||||||
|
|
||||||
|
2016-05-01 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/Makefile, uncompyle6/semantics/pysource.py: Bug
|
||||||
|
|
||||||
|
2016-05-01 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/Makefile, test/simple_source/expression/05_const_map.py: Add
|
||||||
|
test for last fix. Drop 2.5 test until we figure out what's wrong
|
||||||
|
|
||||||
|
2016-05-01 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/parsers/parse3.py, uncompyle6/scanners/scanner35.py,
|
||||||
|
uncompyle6/semantics/pysource.py: Bug in 3.5 constant map parsing
|
||||||
|
|
||||||
|
2016-05-01 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/__init__.py: Export module load and fns load_file,
|
||||||
|
load_module
|
||||||
|
|
||||||
|
2016-05-01 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* __pkginfo__.py, setup.py, uncompyle6/marsh.py: License is MIT marsh.py: remove unused import
|
||||||
|
|
||||||
|
2016-05-01 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/parsers/parse3.py: Forgot to define Python3ParserSingle
|
||||||
|
|
||||||
|
2016-05-01 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/parser.py, uncompyle6/parsers/parse2.py,
|
||||||
|
uncompyle6/parsers/parse3.py: Start to DRY Python2 and Python3
|
||||||
|
grammars Separate out 3.2, and 3.5+ specific grammar code
|
||||||
|
|
||||||
|
2016-04-30 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* ChangeLog, NEWS, README.rst, __pkginfo__.py: Get ready for release
|
||||||
|
2.3.1
|
||||||
|
|
||||||
|
2016-04-30 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/parsers/astnode.py, uncompyle6/parsers/parse3.py,
|
||||||
|
uncompyle6/semantics/pysource.py: Python 3.0..3.2 bug in
|
||||||
|
LOAD_FAST/STORE_LOCAL LOAD_FAST '__locals__' STORE_LOCALS '' Also have to adjust doc constants for this crap astnode.py: minor format change
|
||||||
|
|
||||||
|
2016-04-30 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* test/Makefile, test/simple_source/def/06_classbug.py,
|
||||||
|
test/test_pythonlib.py: Test optimized Python code and Python 3.2
|
||||||
|
|
||||||
|
2016-04-30 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/parsers/parse3.py: Pevious commit grammar change is
|
||||||
|
Python 3.5 and up
|
||||||
|
|
||||||
|
2016-04-30 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/parsers/parse3.py: Python 3.5 if statments decompyle Sometimes it doesn't need JUMP_FORWARD _come_from _come_from For example: def handle2(module): if module == 'foo': try: module = 1 except ImportError as exc: module = exc return module And: if __name__: for i in (1, 2): x = 3
|
||||||
|
|
||||||
|
2016-04-28 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* requirements.txt, uncompyle6/parser.py,
|
||||||
|
uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse3.py,
|
||||||
|
uncompyle6/semantics/fragments.py, uncompyle6/semantics/pysource.py:
|
||||||
|
spark -> spark_parser
|
||||||
|
|
||||||
|
2016-04-28 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/parsers/spark.py: Really remove spark - Use external
|
||||||
|
package instead
|
||||||
|
|
||||||
|
2016-04-27 R. Bernstein <rocky@users.noreply.github.com>
|
||||||
|
|
||||||
|
* : Merge pull request #8 from rocky/external-spark External spark
|
||||||
|
|
||||||
|
2016-04-27 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* .travis.yml, circle.yml: Note dependencies on spark
|
||||||
|
|
||||||
|
2016-04-27 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* .gitignore, README.rst, requirements.txt, uncompyle6/parser.py,
|
||||||
|
uncompyle6/parsers/astnode.py, uncompyle6/parsers/parse2.py,
|
||||||
|
uncompyle6/parsers/parse3.py, uncompyle6/semantics/fragments.py,
|
||||||
|
uncompyle6/semantics/pysource.py: Use external spark now.
|
||||||
|
|
||||||
|
2016-04-20 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* circle.yml: Back to 2.7.8
|
||||||
|
|
||||||
|
2016-04-20 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* circle.yml: Try python 2.7.10
|
||||||
|
|
||||||
|
2016-04-19 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* README.rst: Remove link to Mysterie uncompyle2 per request
|
||||||
|
|
||||||
|
2016-04-19 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* ChangeLog, NEWS, __pkginfo__.py: Get ready for release 2.2.0
|
||||||
|
|
||||||
|
2016-04-18 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* README.rst: Another typo
|
||||||
|
|
||||||
|
2016-04-18 R. Bernstein <rocky@users.noreply.github.com>
|
||||||
|
|
||||||
|
* : Merge pull request #7 from rocky/single-compile Support single-mode compile
|
||||||
|
|
||||||
|
2016-04-18 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* README.rst: Doc typo
|
||||||
|
|
||||||
|
2016-04-18 Thomas Grainger <tom.grainger@procensus.com>
|
||||||
|
|
||||||
|
* __pkginfo__.py, setup.cfg, setup.py: declare Python3 support in
|
||||||
|
wheel and trove
|
||||||
|
|
||||||
|
2016-04-18 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* uncompyle6/parser.py, uncompyle6/parsers/parse2.py,
|
||||||
|
uncompyle6/parsers/parse3.py: Start to DRY Python 2 and Python 3
|
||||||
|
grammar code Move common code to parser.py
|
||||||
|
|
||||||
|
2016-04-18 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* pytest/test_single_compile.py, uncompyle6/parser.py,
|
||||||
|
uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse3.py: Add
|
||||||
|
simgle-mode compilation
|
||||||
|
|
||||||
|
2016-04-17 rocky <rocky@gnu.org>
|
||||||
|
|
||||||
|
* pytest/test_single_compile.py, uncompyle6/parser.py,
|
||||||
|
uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse3.py,
|
||||||
|
uncompyle6/semantics/pysource.py: Towards single compilation
|
||||||
|
|
||||||
|
2016-04-10 rocky <rb@dustyfeet.com>
|
||||||
|
|
||||||
|
* : Back off if_else_ternary pending Fails on Python 3.4 investigation Python 3.5 works though
|
||||||
|
|
||||||
|
2016-04-10 rocky <rb@dustyfeet.com>
|
||||||
|
|
||||||
|
* .gitignore: Test administrivia
|
||||||
|
|
||||||
|
2016-04-07 rocky <rb@dustyfeet.com>
|
||||||
|
|
||||||
|
* HISTORY.md, README.rst,
|
||||||
|
test/simple_source/branching/10_if_else_ternary.py,
|
||||||
|
uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse3.py: Handle
|
||||||
|
Ternary "or". Remove mention of uncompyle3 uncompyle3 removed per Mysterie's request [Fixes Issue #5]
|
||||||
|
|
||||||
|
2016-03-11 rocky <rb@dustyfeet.com>
|
||||||
|
|
||||||
|
* test/Makefile: remove uncompyle3 and make test work again * uncompyle3 removed by request * make test on python 2.7 is failing on some python3 and python3.5 bytecodes. Remove for now.
|
||||||
|
|
||||||
|
2016-02-23 R. Bernstein <rocky@users.noreply.github.com>
|
||||||
|
|
||||||
|
* : Merge pull request #3 from lelicopter/master Bug correction (parse cmd options)
|
||||||
|
|
||||||
|
2016-01-07 rocky <rb@dustyfeet.com>
|
||||||
|
|
||||||
|
* test/Makefile, test/bytecompile-tests, test/test_pythonlib.py: Add
|
||||||
|
Python 3.5 tests that we can do.
|
||||||
|
|
||||||
|
2016-01-05 R. Bernstein <rocky@users.noreply.github.com>
|
||||||
|
|
||||||
|
* HISTORY.md: Grammar fixes
|
||||||
|
|
||||||
2016-01-02 rocky <rb@dustyfeet.com>
|
2016-01-02 rocky <rb@dustyfeet.com>
|
||||||
|
|
||||||
* __pkginfo__.py: Get ready for release 2.1.3
|
* ChangeLog, NEWS, __pkginfo__.py: Get ready for release 2.1.3
|
||||||
|
|
||||||
2016-01-02 rocky <rb@dustyfeet.com>
|
2016-01-02 rocky <rb@dustyfeet.com>
|
||||||
|
|
||||||
|
78
DECOMPYLE-2.4-CHANGELOG.txt
Normal file
78
DECOMPYLE-2.4-CHANGELOG.txt
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
This is the changelog from *decompyle*'s release 2.4 passed on by Dan Pascu
|
||||||
|
Yikes - uncompyle's version number should be higher so as to put this
|
||||||
|
in the past!
|
||||||
|
|
||||||
|
|
||||||
|
release 2.4 (Dan Pascu)
|
||||||
|
- Replaced the way code structures are identified by the parser.
|
||||||
|
Previously, the scanner introduced some COME_FROM entries in the
|
||||||
|
dissasembly output to mark all the destinations of jump instructions.
|
||||||
|
Using these COME_FROM labels the parser was then able to identify the
|
||||||
|
code structures (if tests, while loops, etc). Up to python-2.3 this was
|
||||||
|
possible because the code structures were clearly defined and jump
|
||||||
|
targets were always to the same points in a given strcuture making it
|
||||||
|
easy to identify the structure. Python 2.3 however introduced optimized
|
||||||
|
jumps to increase code performance. In the previous version of decompyle
|
||||||
|
(2.3) we used a technique to identify the code structures and then used
|
||||||
|
these structures to determine where the jump targets would have been if
|
||||||
|
not optimized. Using this information we then added COME_FROM labels at
|
||||||
|
the points where they would have been if not optimized, thus emulating
|
||||||
|
the way decompyle worked with versions before python 2.3. However with
|
||||||
|
the introduction of even more optimizations in python 2.4 this technique
|
||||||
|
no longer works. Not only the jump targets are no longer an effective
|
||||||
|
mean for the parser to identify the code structures, but also trying to
|
||||||
|
emulate the old way things were solved when it clearly no longer works
|
||||||
|
is not the right solution. To solve this issue, the code to identify the
|
||||||
|
structures that we had developed in version 2.3, was used to add real
|
||||||
|
start/end points for strcuture identification, instead of the COME_FROM
|
||||||
|
labels. Now these new start/end labels are used by the parser to more
|
||||||
|
precisely identify the structures and the COME_FROM labels were removed
|
||||||
|
completely. The scanner is responsible to identify these code structures
|
||||||
|
and use any knowledge of optimizations that python applies to determine
|
||||||
|
the start/end points of any structure and then mark them with certain
|
||||||
|
keywords that are understood by the parser.
|
||||||
|
- Correctly identify certain `while 1' structures that were not
|
||||||
|
recognized in the previous version.
|
||||||
|
- Added support for new byte code constructs used by python 2.4
|
||||||
|
|
||||||
|
release 2.3.2
|
||||||
|
- tidied up copyright and changelog information for releases 2.3 and later
|
||||||
|
|
||||||
|
release 2.3.1 (Dan Pascu)
|
||||||
|
- implemented a structure detection technique that fixes problems with
|
||||||
|
optimised jumps in Python >= 2.3. In the previous release (decompyle 2.3),
|
||||||
|
these problems meant that some files were incorrectly decompiled and
|
||||||
|
others could not be decompiled at all. With this new structure detection
|
||||||
|
technique, thorough testing over the standard python libraries suggests
|
||||||
|
that decompyle 2.3.1 can handle everything that decompyle 2.2beta1 could,
|
||||||
|
plus new Python 2.3 bytecodes and constructs.
|
||||||
|
|
||||||
|
release 2.3 (Dan Pascu)
|
||||||
|
- support for Python 2.3 added
|
||||||
|
- use the marshal and disassembly code from their respective python
|
||||||
|
versions, so that decompyle can manipulate bytecode independently
|
||||||
|
of the interpreter that runs decompyle itself (for example it can
|
||||||
|
decompile python2.3 bytecode even when running under python2.2)
|
||||||
|
|
||||||
|
——————————————————
|
||||||
|
|
||||||
|
release 2.2beta1 (hartmut Goebel)
|
||||||
|
- support for Python 1.5 up to Python 2.2
|
||||||
|
- no longer requires to be run with the Python interpreter version
|
||||||
|
which generated the byte-code.
|
||||||
|
- requires Python 2.2
|
||||||
|
- pretty-prints docstrings, hashes, lists and tuples
|
||||||
|
- decompyle is now a script and a package
|
||||||
|
- added emacs mode-hint and tab-width for each file output
|
||||||
|
- enhanced test suite: more test patterns, .pyc/.pyo included
|
||||||
|
- avoids unnecessary 'global' statements
|
||||||
|
- still untested: EXTENDED_ARG
|
||||||
|
|
||||||
|
internal changes:
|
||||||
|
- major code overhoul: splitted into several modules, clean-ups
|
||||||
|
- use a list of valid magics instead of the single one from imp.py
|
||||||
|
- uses copies of 'dis.py' for every supported version. This ensures
|
||||||
|
correct disassemling of the byte-code.
|
||||||
|
- use a single Walker and a single Parser, thus saving time and memory
|
||||||
|
- use augmented assign and 'print >>' internally
|
||||||
|
- optimized 'Walker.engine', the main part of code generation
|
77
HISTORY.md
77
HISTORY.md
@@ -30,17 +30,16 @@ The last mention of a release of SPARK from John is around 2002.
|
|||||||
|
|
||||||
In the fall of 2000, Hartmut Goebel
|
In the fall of 2000, Hartmut Goebel
|
||||||
[took over maintaining the code](https://groups.google.com/forum/#!searchin/comp.lang.python/hartmut$20goebel/comp.lang.python/35s3mp4-nuY/UZALti6ujnQJ). The
|
[took over maintaining the code](https://groups.google.com/forum/#!searchin/comp.lang.python/hartmut$20goebel/comp.lang.python/35s3mp4-nuY/UZALti6ujnQJ). The
|
||||||
first subsequennt public release announcement that I can find is
|
first subsequent public release announcement that I can find is
|
||||||
["decompyle - A byte-code-decompiler version 2.2 beta 1"](https://mail.python.org/pipermail/python-announce-list/2002-February/001272.html).
|
["decompyle - A byte-code-decompiler version 2.2 beta 1"](https://mail.python.org/pipermail/python-announce-list/2002-February/001272.html).
|
||||||
|
|
||||||
From the CHANGES file found in
|
From the CHANGES file found in
|
||||||
[the tarball for that release](http://old-releases.ubuntu.com/ubuntu/pool/universe/d/decompyle2.2/decompyle2.2_2.2beta1.orig.tar.gz),
|
[the tarball for that release](http://old-releases.ubuntu.com/ubuntu/pool/universe/d/decompyle2.2/decompyle2.2_2.2beta1.orig.tar.gz),
|
||||||
it appears that Hartmut did most of the work to get this code to
|
it appears that Hartmut did most of the work to get this code to
|
||||||
accept the full Python language. He added precidence to the table
|
accept the full Python language. He added precedence to the table
|
||||||
specifiers, support for multiple versions of Python, the
|
specifiers, support for multiple versions of Python, the
|
||||||
pretty-printing of docstrings, lists and hashes. He also wrote
|
pretty-printing of docstrings, lists, and hashes. He also wrote test and verification routines of
|
||||||
extensive tests and routines to the testing and verification of
|
deparsed bytecode, and used this in an extensive set of tests that he also wrote. He could verify against the entire Python library.
|
||||||
decompiled bytecode.
|
|
||||||
|
|
||||||
decompyle2.2 was packaged for Debian (sarge) by
|
decompyle2.2 was packaged for Debian (sarge) by
|
||||||
[Ben Burton around 2002](https://packages.qa.debian.org/d/decompyle.html). As
|
[Ben Burton around 2002](https://packages.qa.debian.org/d/decompyle.html). As
|
||||||
@@ -56,27 +55,46 @@ it doesn't look like he's done anything compiler-wise since SPARK). So
|
|||||||
I hope people will use the crazy-compilers service. I wish them the
|
I hope people will use the crazy-compilers service. I wish them the
|
||||||
success that his good work deserves.
|
success that his good work deserves.
|
||||||
|
|
||||||
Next we get to
|
Dan Pascu did a bit of work around 2005 on the Python get this code to
|
||||||
["uncompyle" and PyPI](https://pypi.python.org/pypi/uncompyle/1.1) and
|
handle Python 2.3 and 2.4 bytecodes. Because of jump optimization
|
||||||
the era of git repositories. In contrast to decompyle, this now runs
|
introduced in the CPython bytecode compiler at that time, various JUMP
|
||||||
only on Python 2.7 although it accepts bytecode back to Python
|
instructions were classifed as going forward or backwards, and COME
|
||||||
2.5. Thomas Grainger is the package owner of this, although Hartmut is
|
FROM instructions were introduced. See RELEASE-2.4-CHANGELOG.txt for
|
||||||
listed as the author.
|
more details here.
|
||||||
|
|
||||||
|
Next we get to ["uncompyle" and
|
||||||
|
PyPI](https://pypi.python.org/pypi/uncompyle/1.1) and the era of
|
||||||
|
public version control. In contrast to decompyle, uncompyle at least
|
||||||
|
in its final versions, runs only on Python 2.7. However it accepts
|
||||||
|
bytecode back to Python 2.5. Thomas Grainger is the package owner of
|
||||||
|
this, although Hartmut is still listed as the author.
|
||||||
|
|
||||||
The project exists not only on
|
The project exists not only on
|
||||||
[github](https://github.com/gstarnberger/uncompyle) but also on
|
[github](https://github.com/gstarnberger/uncompyle) but also on
|
||||||
[bitbucket](https://bitbucket.org/gstarnberger/uncompyle) where the
|
[bitbucket](https://bitbucket.org/gstarnberger/uncompyle) and later
|
||||||
git history goes back to 2009. Somewhere in there the name was changed
|
the defunct [google
|
||||||
from "decompyle" to "uncompyle".
|
code](https://code.google.com/archive/p/unpyc/). The git/svn history
|
||||||
|
goes back to 2009. Somewhere in there the name was changed from
|
||||||
|
"decompyle" to "unpyc" by Keknehv, and then to "uncompyle" by Guenther Starnberger.
|
||||||
|
|
||||||
The name Thomas Grainger isn't found in (m)any of the commits in the
|
The name Thomas Grainger isn't found in (m)any of the commits in the
|
||||||
several years of active development. Guenther Starnberger, Keknehv,
|
several years of active development. First Keknehv worked on this up
|
||||||
hamled, and Eike Siewertsen are principle committers here.
|
to Python 2.5 or so while acceping Python bytecode back to 2.0 or
|
||||||
|
so. Then hamled made a few commits earler on, while Eike Siewertsen
|
||||||
|
made a few commits later on. But mostly wibiti, and Guenther
|
||||||
|
Starnberger got the code to where uncompyle2 was around 2012.
|
||||||
|
|
||||||
This project, uncompyle6, however owes its existence to uncompyle2 by
|
This project, uncompyle6, however owes its existence to the fork of
|
||||||
Myst herie (Mysterie) whose first commit seems to goes back to 2012;
|
uncompyle2 by Myst herie (Mysterie) whose first commit picks up at
|
||||||
it is also based on Hartmut's code. I chose this as it seems had been
|
2012. I chose this since it seemed to have been at that time the most
|
||||||
the most actively worked on most recently.
|
actively, if briefly, worked on. Also starting around 2012 is Dark
|
||||||
|
Fenx's uncompyle3 which I used for inspiration for Python3.
|
||||||
|
|
||||||
|
I started working on this late 2015, mostly to add fragment support.
|
||||||
|
In that decided to make this runnable on Python 3.2+ and Python 2.6+
|
||||||
|
while, handling Python bytecodes from Python versions 2.5+ and
|
||||||
|
3.2+. (I think I could go back further, but I'd consider doing that
|
||||||
|
only after code is better cleaned up and supports Python 3 better.)
|
||||||
|
|
||||||
Over the many years, code styles and Python features have
|
Over the many years, code styles and Python features have
|
||||||
changed. However brilliant the code was and still is, it hasn't really
|
changed. However brilliant the code was and still is, it hasn't really
|
||||||
@@ -91,16 +109,15 @@ Hartmut a decade an a half ago:
|
|||||||
NB. This is not a masterpiece of software, but became more like a hack.
|
NB. This is not a masterpiece of software, but became more like a hack.
|
||||||
Probably a complete rewrite would be sensefull. hG/2000-12-27
|
Probably a complete rewrite would be sensefull. hG/2000-12-27
|
||||||
|
|
||||||
One of the attempts to modernize it and make it available for Python3
|
This project deparses using a LR parse. However another approach is to
|
||||||
is [the one by Anton Vorobyov (DarkFenX)](https://github.com/DarkFenX/uncompyle3). I've
|
do something like simulate execution symbolically and build expression
|
||||||
followed some of the ideas there in this project.
|
trees off of stack results. The two important projects that work this
|
||||||
|
way are [unpyc3](https://code.google.com/p/unpyc3/) and most
|
||||||
Lastly, I should mention [unpyc](https://code.google.com/p/unpyc3/)
|
especially [pycdc](https://github.com/zrax/pycdc) The latter project
|
||||||
and most especially [pycdc](https://github.com/zrax/pycdc), largely by
|
is largely by Michael Hansen and Darryl Pogue. If they supported
|
||||||
Michael Hansen and Darryl Pogue. If they supported getting source-code
|
getting source-code fragments and I could call it from Python, I'd
|
||||||
fragments and I could call it from Python, I'd probably ditch this and
|
probably ditch this and use that. From what I've seen, the code runs
|
||||||
use that. From what I've seen, the code runs blindingly fast and spans
|
blindingly fast and spans all versions of Python.
|
||||||
all versions of Python.
|
|
||||||
|
|
||||||
Tests for the project have been, or are being, culled from all of the
|
Tests for the project have been, or are being, culled from all of the
|
||||||
projects mentioned.
|
projects mentioned.
|
||||||
|
@@ -1,9 +1,11 @@
|
|||||||
include README.rst
|
include README.rst
|
||||||
include HISTORY.md
|
|
||||||
include ChangeLog
|
include ChangeLog
|
||||||
|
include HISTORY.md
|
||||||
|
include LICENSE
|
||||||
|
include DECOMPYLE-2.4-CHANGELOG.txt
|
||||||
include __pkginfo__.py
|
include __pkginfo__.py
|
||||||
recursive-include uncompyle6 *.py
|
recursive-include uncompyle6 *.py
|
||||||
include bin/uncompyle6
|
include bin/uncompyle6
|
||||||
include bin/pydisassemble
|
include bin/pydisassemble
|
||||||
recursive-include test *.py
|
recursive-include test *.py *.pyc
|
||||||
recursive-include pytest *.py
|
recursive-include pytest *.py
|
||||||
|
11
Makefile
11
Makefile
@@ -28,7 +28,7 @@ check-2.7 check-3.3 check-3.4: pytest
|
|||||||
$(MAKE) -C test $@
|
$(MAKE) -C test $@
|
||||||
|
|
||||||
#: Tests for Python 3.5 - pytest doesn't work here
|
#: Tests for Python 3.5 - pytest doesn't work here
|
||||||
check-3.5:
|
check-3.2 check-3.5:
|
||||||
$(MAKE) -C test $@
|
$(MAKE) -C test $@
|
||||||
|
|
||||||
#:Tests for Python 2.6 (doesn't have pytest)
|
#:Tests for Python 2.6 (doesn't have pytest)
|
||||||
@@ -44,9 +44,9 @@ clean: clean_pyc
|
|||||||
$(PYTHON) ./setup.py $@
|
$(PYTHON) ./setup.py $@
|
||||||
(cd test && $(MAKE) clean)
|
(cd test && $(MAKE) clean)
|
||||||
|
|
||||||
#: Create source (tarball) and binary (egg) distribution
|
#: Create source (tarball) and wheel distribution
|
||||||
dist:
|
dist:
|
||||||
$(PYTHON) ./setup.py sdist bdist_egg
|
$(PYTHON) ./setup.py sdist bdist_wheel
|
||||||
|
|
||||||
#: Remove .pyc files
|
#: Remove .pyc files
|
||||||
clean_pyc:
|
clean_pyc:
|
||||||
@@ -73,6 +73,11 @@ bdist_egg:
|
|||||||
$(PYTHON) ./setup.py bdist_egg
|
$(PYTHON) ./setup.py bdist_egg
|
||||||
|
|
||||||
|
|
||||||
|
#: Create binary wheel distribution
|
||||||
|
bdist_wheel:
|
||||||
|
$(PYTHON) ./setup.py bdist_wheel
|
||||||
|
|
||||||
|
|
||||||
# It is too much work to figure out how to add a new command to distutils
|
# It is too much work to figure out how to add a new command to distutils
|
||||||
# to do the following. I'm sure distutils will someday get there.
|
# to do the following. I'm sure distutils will someday get there.
|
||||||
DISTCLEAN_FILES = build dist *.pyc
|
DISTCLEAN_FILES = build dist *.pyc
|
||||||
|
52
NEWS
52
NEWS
@@ -1,3 +1,55 @@
|
|||||||
|
uncompyle6 2.3.5 2016-05-14
|
||||||
|
|
||||||
|
- Python 2 class decorator fix (thanks to Tey)
|
||||||
|
- Fix fragment parsing bugs
|
||||||
|
- Fix some Python 3 parsing bugs:
|
||||||
|
* Handling single in * parameter
|
||||||
|
* "while True"
|
||||||
|
* escape from for inside if
|
||||||
|
* yield expressions
|
||||||
|
- Correct history based on info from Dan Pascu
|
||||||
|
- Fix up pip packaging, ugh.
|
||||||
|
|
||||||
|
uncompyle6 2.3.4 2016-05-5
|
||||||
|
|
||||||
|
- More Python 3.5 parsing bugs addressed
|
||||||
|
- decompiling Python 3.5 from other Python versions works
|
||||||
|
- test from Python 3.2
|
||||||
|
- remove "__module__ = __name__" in 3.0 <= Python 3.2
|
||||||
|
|
||||||
|
uncompyle6 2.3.3 2016-05-3
|
||||||
|
|
||||||
|
- Fix bug in running uncompyle6 script on Python 3
|
||||||
|
- Speed up performance on deparsing long lists by grouping in chunks of 32 and 256 items
|
||||||
|
- DRY Python expressions between Python 2 and 3
|
||||||
|
|
||||||
|
uncompyle6 2.3.2 2016-05-1
|
||||||
|
|
||||||
|
- Add --version option standalone scripts
|
||||||
|
- Correct License information in package
|
||||||
|
- expose fns uncompyle_file, load_file, and load_module
|
||||||
|
- Start to DRY Python2 and Python3 grammars Separate out 3.2, and 3.5+
|
||||||
|
specific grammar code
|
||||||
|
- Fix bug in 3.5+ constant map parsing
|
||||||
|
|
||||||
|
uncompyle6 2.3.0, 2.3.1 2016-04-30
|
||||||
|
|
||||||
|
- Require spark_parser >= 1.1.0
|
||||||
|
|
||||||
|
uncompyle6 2.2.0 2016-04-30
|
||||||
|
|
||||||
|
- Spark is no longer here but pulled separate package spark_parse
|
||||||
|
- Python 3 parsing fixes
|
||||||
|
- More tests
|
||||||
|
|
||||||
|
uncompyle6 2.2.0 2016-04-02
|
||||||
|
|
||||||
|
- Support single-mode (in addtion to exec-mode) compilation
|
||||||
|
- Start to DRY Python 2 and Python 3 grammars
|
||||||
|
- Fix bug in if else ternary construct
|
||||||
|
- Fix bug in uncomplye6 -d and -r options (via lelicopter)
|
||||||
|
|
||||||
|
|
||||||
uncompyle6 2.1.3 2016-01-02
|
uncompyle6 2.1.3 2016-01-02
|
||||||
|
|
||||||
- Limited support for decompiling Python 3.5
|
- Limited support for decompiling Python 3.5
|
||||||
|
38
README.rst
38
README.rst
@@ -1,10 +1,10 @@
|
|||||||
|downloads| |buildstatus|
|
|buildstatus|
|
||||||
|
|
||||||
uncompyle6
|
uncompyle6
|
||||||
==========
|
==========
|
||||||
|
|
||||||
A native Python bytecode Disassembler, Decompiler, Fragment Decompiler
|
A native Python bytecode Disassembler, Decompiler, Fragment Decompiler
|
||||||
and bytecode library
|
and bytecode library. Follows in the tradition of decompyle, uncompyle, and uncompyle2.
|
||||||
|
|
||||||
|
|
||||||
Introduction
|
Introduction
|
||||||
@@ -12,17 +12,22 @@ Introduction
|
|||||||
|
|
||||||
*uncompyle6* translates Python bytecode back into equivalent Python
|
*uncompyle6* translates Python bytecode back into equivalent Python
|
||||||
source code. It accepts bytecodes from Python version 2.5 to 3.4 or
|
source code. It accepts bytecodes from Python version 2.5 to 3.4 or
|
||||||
so and has been tested on Python running versions 2.6, 2.7, 3.3,
|
so. The code requires Python 2.6 or later and has been tested on Python
|
||||||
3.4 and 3.5.
|
running versions 2.6, 2.7, 3.2, 3.3, 3.4 and 3.5.
|
||||||
|
|
||||||
Why this?
|
Why this?
|
||||||
---------
|
---------
|
||||||
|
|
||||||
What makes this different other CPython bytecode decompilers? Its
|
There were a number of decompyle, uncompile, uncompyle2, uncompyle3
|
||||||
|
forks around. All of them come basically from the same code base, and
|
||||||
|
almost all of them not maintained very well. This code pulls these together
|
||||||
|
and addresses a number of open issues in those.
|
||||||
|
|
||||||
|
What makes this different from other CPython bytecode decompilers? Its
|
||||||
ability to deparse just fragments and give source-code information
|
ability to deparse just fragments and give source-code information
|
||||||
around a given bytecode offset.
|
around a given bytecode offset.
|
||||||
|
|
||||||
I using this to deparse fragments of code inside my trepan_
|
I use this to deparse fragments of code inside my trepan_
|
||||||
debuggers_. For that, I need to record text fragments for all
|
debuggers_. For that, I need to record text fragments for all
|
||||||
bytecode offsets (of interest). This purpose although largely
|
bytecode offsets (of interest). This purpose although largely
|
||||||
compatible with the original intention is yet a little bit different.
|
compatible with the original intention is yet a little bit different.
|
||||||
@@ -48,6 +53,8 @@ This uses setup.py, so it follows the standard Python routine:
|
|||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
|
pip install -r requirements.txt
|
||||||
|
pip install -r requirements-dev.txt
|
||||||
python setup.py install # may need sudo
|
python setup.py install # may need sudo
|
||||||
# or if you have pyenv:
|
# or if you have pyenv:
|
||||||
python setup.py develop
|
python setup.py develop
|
||||||
@@ -77,24 +84,27 @@ Run
|
|||||||
::
|
::
|
||||||
|
|
||||||
./bin/uncompyle6 -h
|
./bin/uncompyle6 -h
|
||||||
./bin/pydisassemble -y
|
./bin/pydisassemble -h
|
||||||
|
|
||||||
for usage help
|
for usage help.
|
||||||
|
|
||||||
|
|
||||||
Known Bugs/Restrictions
|
Known Bugs/Restrictions
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
Python 2 deparsing is probably as solid as the various versions of
|
Python 2 deparsing decompiles all of the Python 2.7.10 library and as
|
||||||
uncompyle2. Python 3 deparsing is okay but not as solid.
|
such is probably a little better than uncompyle2. Python 3 deparsing
|
||||||
|
is okay, sometimes. More work is needed to decompile all of its
|
||||||
|
library. Python 3.5 is missing some of new opcodes added, but still
|
||||||
|
often works.
|
||||||
|
|
||||||
See Also
|
See Also
|
||||||
--------
|
--------
|
||||||
|
|
||||||
* https://github.com/zrax/pycdc
|
* https://github.com/zrax/pycdc : supports all versions of Python and is written in C++
|
||||||
* https://github.com/Mysterie/uncompyle2
|
* https://code.google.com/archive/p/unpyc3/ : supports Python 3.2 only
|
||||||
* https://github.com/DarkFenX/uncompyle3
|
|
||||||
* https://code.google.com/p/unpyc3/
|
The above projects use a different decompiling technique what is used here.
|
||||||
|
|
||||||
The HISTORY file.
|
The HISTORY file.
|
||||||
|
|
||||||
|
@@ -9,13 +9,20 @@
|
|||||||
|
|
||||||
# Things that change more often go here.
|
# Things that change more often go here.
|
||||||
copyright = """
|
copyright = """
|
||||||
Copyright (C) 2015 Rocky Bernstein <rb@dustyfeet.com>.
|
Copyright (C) 2015, 2016 Rocky Bernstein <rb@dustyfeet.com>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
classifiers = ['Development Status :: 3 - Alpha',
|
classifiers = ['Development Status :: 4 - Beta',
|
||||||
'Intended Audience :: Developers',
|
'Intended Audience :: Developers',
|
||||||
'Operating System :: OS Independent',
|
'Operating System :: OS Independent',
|
||||||
'Programming Language :: Python',
|
'Programming Language :: Python',
|
||||||
|
'Programming Language :: Python :: 2',
|
||||||
|
'Programming Language :: Python :: 2.6',
|
||||||
|
'Programming Language :: Python :: 2.7',
|
||||||
|
'Programming Language :: Python :: 3',
|
||||||
|
'Programming Language :: Python :: 3.3',
|
||||||
|
'Programming Language :: Python :: 3.4',
|
||||||
|
'Programming Language :: Python :: 3.5',
|
||||||
'Topic :: Software Development :: Debuggers',
|
'Topic :: Software Development :: Debuggers',
|
||||||
'Topic :: Software Development :: Libraries :: Python Modules',
|
'Topic :: Software Development :: Libraries :: Python Modules',
|
||||||
]
|
]
|
||||||
@@ -23,30 +30,25 @@ classifiers = ['Development Status :: 3 - Alpha',
|
|||||||
# The rest in alphabetic order
|
# The rest in alphabetic order
|
||||||
author = "Rocky Bernstein, Hartmut Goebel, John Aycock, and others"
|
author = "Rocky Bernstein, Hartmut Goebel, John Aycock, and others"
|
||||||
author_email = "rb@dustyfeet.com"
|
author_email = "rb@dustyfeet.com"
|
||||||
|
entry_points={
|
||||||
|
'console_scripts': [
|
||||||
|
'uncompyle6=bin.uncompile6:main',
|
||||||
|
'pydisassemble=bin.pydisassemble:main',
|
||||||
|
]}
|
||||||
ftp_url = None
|
ftp_url = None
|
||||||
# license = 'BSDish'
|
install_requires = ['spark-parser >= 1.1.1']
|
||||||
|
license = 'MIT'
|
||||||
mailing_list = 'python-debugger@googlegroups.com'
|
mailing_list = 'python-debugger@googlegroups.com'
|
||||||
modname = 'uncompyle6'
|
modname = 'uncompyle6'
|
||||||
packages = ['uncompyle6', 'uncompyle6.opcodes', 'uncompyle6.semantics', 'uncompyle6.scanners', 'uncompyle6.parsers']
|
|
||||||
py_modules = None
|
py_modules = None
|
||||||
short_desc = 'Python byte-code disassembler and source-code converter'
|
short_desc = 'Python byte-code disassembler and source-code converter'
|
||||||
scripts = ['bin/uncompyle6', 'bin/pydisassemble']
|
|
||||||
|
|
||||||
import os.path
|
|
||||||
|
|
||||||
|
|
||||||
def get_srcdir():
|
|
||||||
filename = os.path.normcase(os.path.dirname(os.path.abspath(__file__)))
|
|
||||||
return os.path.realpath(filename)
|
|
||||||
|
|
||||||
ns = {}
|
|
||||||
version = '2.1.3'
|
|
||||||
web = 'https://github.com/rocky/python-uncompyle6/'
|
web = 'https://github.com/rocky/python-uncompyle6/'
|
||||||
|
|
||||||
# tracebacks in zip files are funky and not debuggable
|
# tracebacks in zip files are funky and not debuggable
|
||||||
zip_safe = True
|
zip_safe = True
|
||||||
|
|
||||||
|
|
||||||
|
import os.path
|
||||||
def read(*rnames):
|
def read(*rnames):
|
||||||
return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
|
return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
|
||||||
|
|
||||||
|
@@ -1,77 +1,3 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# Mode: -*- python -*-
|
from uncompyle6.bin.pydisassemble import main
|
||||||
#
|
main()
|
||||||
# Copyright (c) 2015 by Rocky Bernstein <rb@dustyfeet.com>
|
|
||||||
#
|
|
||||||
from __future__ import print_function
|
|
||||||
import sys, os, getopt
|
|
||||||
|
|
||||||
program = os.path.basename(__file__)
|
|
||||||
|
|
||||||
__doc__ = """
|
|
||||||
Usage: %s [OPTIONS]... FILE
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
%s foo.pyc
|
|
||||||
%s foo.py
|
|
||||||
%s -o foo.pydis foo.pyc
|
|
||||||
%s -o /tmp foo.pyc
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-o <path> output decompiled files to this path:
|
|
||||||
if multiple input files are decompiled, the common prefix
|
|
||||||
is stripped from these names and the remainder appended to
|
|
||||||
<path>
|
|
||||||
--help show this message
|
|
||||||
|
|
||||||
""" % ((program,) * 5)
|
|
||||||
|
|
||||||
|
|
||||||
Usage_short = \
|
|
||||||
"%s [--help] [--verify] [--showasm] [--showast] [-o <path>] FILE|DIR..." % program
|
|
||||||
|
|
||||||
from uncompyle6 import check_python_version
|
|
||||||
from uncompyle6.disas import disassemble_files
|
|
||||||
|
|
||||||
check_python_version(program)
|
|
||||||
|
|
||||||
outfile = '-'
|
|
||||||
out_base = None
|
|
||||||
|
|
||||||
|
|
||||||
try:
|
|
||||||
opts, files = getopt.getopt(sys.argv[1:], 'ho:', ['help'])
|
|
||||||
except getopt.GetoptError as e:
|
|
||||||
print('%s: %s' % (os.path.basename(sys.argv[0]), e), file=sys.stderr)
|
|
||||||
sys.exit(-1)
|
|
||||||
|
|
||||||
for opt, val in opts:
|
|
||||||
if opt in ('-h', '--help'):
|
|
||||||
print(__doc__)
|
|
||||||
sys.exit(0)
|
|
||||||
elif opt == '-o':
|
|
||||||
outfile = val
|
|
||||||
else:
|
|
||||||
print(opt)
|
|
||||||
print(Usage_short)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
# argl, commonprefix works on strings, not on path parts,
|
|
||||||
# thus we must handle the case with files in 'some/classes'
|
|
||||||
# and 'some/cmds'
|
|
||||||
src_base = os.path.commonprefix(files)
|
|
||||||
if src_base[-1:] != os.sep:
|
|
||||||
src_base = os.path.dirname(src_base)
|
|
||||||
if src_base:
|
|
||||||
sb_len = len( os.path.join(src_base, '') )
|
|
||||||
files = [f[sb_len:] for f in files]
|
|
||||||
del sb_len
|
|
||||||
|
|
||||||
if outfile == '-':
|
|
||||||
outfile = None # use stdout
|
|
||||||
elif outfile and os.path.isdir(outfile):
|
|
||||||
out_base = outfile; outfile = None
|
|
||||||
elif outfile and len(files) > 1:
|
|
||||||
out_base = outfile; outfile = None
|
|
||||||
|
|
||||||
disassemble_files(src_base, out_base, files, outfile)
|
|
||||||
|
214
bin/uncompyle6
214
bin/uncompyle6
@@ -1,213 +1,3 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# Mode: -*- python -*-
|
from uncompyle6.bin.uncompile import main_bin
|
||||||
#
|
main_bin()
|
||||||
# Copyright (c) 2000-2002 by hartmut Goebel <h.goebel@crazy-compilers.com>
|
|
||||||
# Copyright (c) 2015 by Rocky Bernstein
|
|
||||||
|
|
||||||
"""
|
|
||||||
Usage: uncompyle6 [OPTIONS]... [ FILE | DIR]...
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
uncompyle6 foo.pyc bar.pyc # decompile foo.pyc, bar.pyc to stdout
|
|
||||||
uncompyle6 -o . foo.pyc bar.pyc # decompile to ./foo.pyc_dis and ./bar.pyc_dis
|
|
||||||
uncompyle6 -o /tmp /usr/lib/python1.5 # decompile whole library
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-o <path> output decompiled files to this path:
|
|
||||||
if multiple input files are decompiled, the common prefix
|
|
||||||
is stripped from these names and the remainder appended to
|
|
||||||
<path>
|
|
||||||
uncompyle6 -o /tmp bla/fasel.pyc bla/foo.pyc
|
|
||||||
-> /tmp/fasel.pyc_dis, /tmp/foo.pyc_dis
|
|
||||||
uncompyle6 -o /tmp bla/fasel.pyc bar/foo.pyc
|
|
||||||
-> /tmp/bla/fasel.pyc_dis, /tmp/bar/foo.pyc_dis
|
|
||||||
uncompyle6 -o /tmp /usr/lib/python1.5
|
|
||||||
-> /tmp/smtplib.pyc_dis ... /tmp/lib-tk/FixTk.pyc_dis
|
|
||||||
-c <file> attempts a disassembly after compiling <file>
|
|
||||||
-d print timestamps
|
|
||||||
-p <integer> use <integer> number of processes
|
|
||||||
-r recurse directories looking for .pyc and .pyo files
|
|
||||||
--verify compare generated source with input byte-code
|
|
||||||
(requires -o)
|
|
||||||
--help show this message
|
|
||||||
|
|
||||||
Debugging Options:
|
|
||||||
--asm -a include byte-code (disables --verify)
|
|
||||||
--grammar -g show matching grammar
|
|
||||||
--treee -t include syntax tree (disables --verify)
|
|
||||||
|
|
||||||
Extensions of generated files:
|
|
||||||
'.pyc_dis' '.pyo_dis' successfully decompiled (and verified if --verify)
|
|
||||||
+ '_unverified' successfully decompile but --verify failed
|
|
||||||
+ '_failed' decompile failed (contact author for enhancement)
|
|
||||||
"""
|
|
||||||
|
|
||||||
from __future__ import print_function
|
|
||||||
import sys, os, getopt, time
|
|
||||||
|
|
||||||
program = os.path.basename(__file__)
|
|
||||||
|
|
||||||
from uncompyle6 import verify, check_python_version
|
|
||||||
from uncompyle6.main import main, status_msg
|
|
||||||
|
|
||||||
def usage():
|
|
||||||
print("""usage:
|
|
||||||
%s [--help] [--verify] [--asm] [--tree] [--grammar] [-o <path>] FILE|DIR...
|
|
||||||
""" % program)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
check_python_version(program)
|
|
||||||
|
|
||||||
showasm = showast = do_verify = recurse_dirs = False
|
|
||||||
numproc = 0
|
|
||||||
outfile = '-'
|
|
||||||
out_base = None
|
|
||||||
codes = []
|
|
||||||
timestamp = False
|
|
||||||
timestampfmt = "# %Y.%m.%d %H:%M:%S %Z"
|
|
||||||
|
|
||||||
try:
|
|
||||||
opts, files = getopt.getopt(sys.argv[1:], 'hagtdro:c:p:',
|
|
||||||
'help asm grammar recurse timestamp tree verify '
|
|
||||||
'showgrammar'.split(' '))
|
|
||||||
except getopt.GetoptError as e:
|
|
||||||
print('%s: %s' % (os.path.basename(sys.argv[0]), e), file=sys.stderr)
|
|
||||||
sys.exit(-1)
|
|
||||||
|
|
||||||
options = {}
|
|
||||||
for opt, val in opts:
|
|
||||||
if opt in ('-h', '--help'):
|
|
||||||
print(__doc__)
|
|
||||||
sys.exit(0)
|
|
||||||
elif opt == '--verify':
|
|
||||||
options['do_verify'] = True
|
|
||||||
elif opt in ('--asm', '-a'):
|
|
||||||
options['showasm'] = True
|
|
||||||
options['do_verify'] = False
|
|
||||||
elif opt in ('--tree', '-t'):
|
|
||||||
options['showast'] = True
|
|
||||||
options['do_verify'] = False
|
|
||||||
elif opt in ('--grammar', '-g'):
|
|
||||||
options['showgrammar'] = True
|
|
||||||
elif opt == '-o':
|
|
||||||
outfile = val
|
|
||||||
elif opt == ('--timestamp', '-d'):
|
|
||||||
timestamp = True
|
|
||||||
elif opt == '-c':
|
|
||||||
codes.append(val)
|
|
||||||
elif opt == '-p':
|
|
||||||
numproc = int(val)
|
|
||||||
elif opt == ('--recurse', '-r'):
|
|
||||||
recurse_dirs = True
|
|
||||||
else:
|
|
||||||
print(opt, file=sys.stderr)
|
|
||||||
usage()
|
|
||||||
|
|
||||||
# expand directory if specified
|
|
||||||
if recurse_dirs:
|
|
||||||
expanded_files = []
|
|
||||||
for f in files:
|
|
||||||
if os.path.isdir(f):
|
|
||||||
for root, _, dir_files in os.walk(f):
|
|
||||||
for df in dir_files:
|
|
||||||
if df.endswith('.pyc') or df.endswith('.pyo'):
|
|
||||||
expanded_files.append(os.path.join(root, df))
|
|
||||||
files = expanded_files
|
|
||||||
|
|
||||||
# argl, commonprefix works on strings, not on path parts,
|
|
||||||
# thus we must handle the case with files in 'some/classes'
|
|
||||||
# and 'some/cmds'
|
|
||||||
src_base = os.path.commonprefix(files)
|
|
||||||
if src_base[-1:] != os.sep:
|
|
||||||
src_base = os.path.dirname(src_base)
|
|
||||||
if src_base:
|
|
||||||
sb_len = len( os.path.join(src_base, '') )
|
|
||||||
files = [f[sb_len:] for f in files]
|
|
||||||
del sb_len
|
|
||||||
|
|
||||||
if not files:
|
|
||||||
print("No files given", file=sys.stderr)
|
|
||||||
usage()
|
|
||||||
|
|
||||||
|
|
||||||
if outfile == '-':
|
|
||||||
outfile = None # use stdout
|
|
||||||
elif outfile and os.path.isdir(outfile):
|
|
||||||
out_base = outfile; outfile = None
|
|
||||||
elif outfile and len(files) > 1:
|
|
||||||
out_base = outfile; outfile = None
|
|
||||||
|
|
||||||
if timestamp:
|
|
||||||
print(time.strftime(timestampfmt))
|
|
||||||
|
|
||||||
if numproc <= 1:
|
|
||||||
try:
|
|
||||||
result = main(src_base, out_base, files, codes, outfile,
|
|
||||||
**options)
|
|
||||||
if len(files) > 1:
|
|
||||||
mess = status_msg(do_verify, *result)
|
|
||||||
print('# ' + mess)
|
|
||||||
pass
|
|
||||||
except (KeyboardInterrupt):
|
|
||||||
pass
|
|
||||||
except verify.VerifyCmpError:
|
|
||||||
raise
|
|
||||||
else:
|
|
||||||
from multiprocessing import Process, Queue
|
|
||||||
|
|
||||||
try:
|
|
||||||
from Queue import Empty
|
|
||||||
except ImportError:
|
|
||||||
from Queue import Empty
|
|
||||||
|
|
||||||
fqueue = Queue(len(files)+numproc)
|
|
||||||
for f in files:
|
|
||||||
fqueue.put(f)
|
|
||||||
for i in range(numproc):
|
|
||||||
fqueue.put(None)
|
|
||||||
|
|
||||||
rqueue = Queue(numproc)
|
|
||||||
|
|
||||||
def process_func():
|
|
||||||
try:
|
|
||||||
(tot_files, okay_files, failed_files, verify_failed_files) = (0, 0, 0, 0)
|
|
||||||
while 1:
|
|
||||||
f = fqueue.get()
|
|
||||||
if f is None:
|
|
||||||
break
|
|
||||||
(t, o, f, v) = \
|
|
||||||
main(src_base, out_base, [f], codes, outfile, **options)
|
|
||||||
tot_files += t
|
|
||||||
okay_files += o
|
|
||||||
failed_files += f
|
|
||||||
verify_failed_files += v
|
|
||||||
except (Empty, KeyboardInterrupt):
|
|
||||||
pass
|
|
||||||
rqueue.put((tot_files, okay_files, failed_files, verify_failed_files))
|
|
||||||
rqueue.close()
|
|
||||||
|
|
||||||
try:
|
|
||||||
procs = [Process(target=process_func) for i in range(numproc)]
|
|
||||||
for p in procs:
|
|
||||||
p.start()
|
|
||||||
for p in procs:
|
|
||||||
p.join()
|
|
||||||
try:
|
|
||||||
(tot_files, okay_files, failed_files, verify_failed_files) = (0, 0, 0, 0)
|
|
||||||
while True:
|
|
||||||
(t, o, f, v) = rqueue.get(False)
|
|
||||||
tot_files += t
|
|
||||||
okay_files += o
|
|
||||||
failed_files += f
|
|
||||||
verify_failed_files += v
|
|
||||||
except Empty:
|
|
||||||
pass
|
|
||||||
print('# decompiled %i files: %i okay, %i failed, %i verify failed' %
|
|
||||||
(tot_files, okay_files, failed_files, verify_failed_files))
|
|
||||||
except (KeyboardInterrupt, OSError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
if timestamp:
|
|
||||||
print(time.strftime(timestampfmt))
|
|
||||||
|
@@ -6,7 +6,8 @@ machine:
|
|||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
override:
|
override:
|
||||||
- pip install -r test-requirements.txt
|
- pip install -r requirements.txt
|
||||||
|
- pip install -r requirements-dev.txt
|
||||||
test:
|
test:
|
||||||
override:
|
override:
|
||||||
- python ./setup.py develop && make check-2.7
|
- python ./setup.py develop && make check-2.7
|
||||||
|
21
pytest/test_single_compile.py
Normal file
21
pytest/test_single_compile.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
import pytest
|
||||||
|
from uncompyle6 import PYTHON_VERSION, PYTHON3, deparse_code
|
||||||
|
|
||||||
|
def test_single_mode():
|
||||||
|
single_expressions = (
|
||||||
|
'i = 1',
|
||||||
|
'i and (j or k)',
|
||||||
|
'i += 1',
|
||||||
|
'i = j % 4',
|
||||||
|
'i = {}',
|
||||||
|
'i = []',
|
||||||
|
'while i < 1 or stop:\n i\n',
|
||||||
|
'while i < 1 or stop:\n print%s\n' % ('(i)' if PYTHON3 else ' i'),
|
||||||
|
'for i in range(10):\n i\n',
|
||||||
|
'for i in range(10):\n for j in range(10):\n i + j\n',
|
||||||
|
'try:\n i\nexcept Exception:\n j\nelse:\n k\n'
|
||||||
|
)
|
||||||
|
|
||||||
|
for expr in single_expressions:
|
||||||
|
code = compile(expr + '\n', '<string>', 'single')
|
||||||
|
assert deparse_code(PYTHON_VERSION, code, compile_mode='single').text == expr + '\n'
|
1
requirements.txt
Normal file
1
requirements.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
spark-parser >= 1.1.1
|
@@ -6,3 +6,6 @@ doc_files = README
|
|||||||
# USAGE.txt
|
# USAGE.txt
|
||||||
# doc/
|
# doc/
|
||||||
# examples/
|
# examples/
|
||||||
|
|
||||||
|
[bdist_wheel]
|
||||||
|
universal=1
|
||||||
|
38
setup.py
38
setup.py
@@ -1,39 +1,31 @@
|
|||||||
#! python
|
#!/usr/bin/env python
|
||||||
|
|
||||||
"""Setup script for the 'uncompyle6' distribution."""
|
"""Setup script for the 'uncompyle6' distribution."""
|
||||||
|
|
||||||
from distutils.core import setup, Extension
|
|
||||||
|
|
||||||
# Get the package information used in setup().
|
|
||||||
# from __pkginfo__ import \
|
|
||||||
# author, author_email, classifiers, \
|
|
||||||
# install_requires, license, long_description, \
|
|
||||||
# modname, packages, py_modules, \
|
|
||||||
# short_desc, version, web, zip_safe
|
|
||||||
|
|
||||||
from __pkginfo__ import \
|
from __pkginfo__ import \
|
||||||
author, author_email, \
|
author, author_email, install_requires, \
|
||||||
long_description, \
|
license, long_description, classifiers, \
|
||||||
modname, packages, py_modules, scripts, \
|
entry_points, modname, py_modules, \
|
||||||
short_desc, version, web, zip_safe
|
short_desc, web, zip_safe
|
||||||
|
|
||||||
__import__('pkg_resources')
|
from setuptools import setup, find_packages
|
||||||
from setuptools import setup
|
|
||||||
|
exec(open('uncompyle6/version.py').read())
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
author = author,
|
author = author,
|
||||||
author_email = author_email,
|
author_email = author_email,
|
||||||
# classifiers = classifiers,
|
classifiers = classifiers,
|
||||||
description = short_desc,
|
description = short_desc,
|
||||||
# install_requires = install_requires,
|
entry_points = entry_points,
|
||||||
# license = license,
|
install_requires = install_requires,
|
||||||
|
license = license,
|
||||||
long_description = long_description,
|
long_description = long_description,
|
||||||
py_modules = py_modules,
|
|
||||||
name = modname,
|
name = modname,
|
||||||
packages = packages,
|
packages = find_packages(),
|
||||||
|
py_modules = py_modules,
|
||||||
test_suite = 'nose.collector',
|
test_suite = 'nose.collector',
|
||||||
url = web,
|
url = web,
|
||||||
setup_requires = ['nose>=1.0'],
|
setup_requires = ['nose>=1.0'],
|
||||||
scripts = scripts,
|
version = VERSION,
|
||||||
version = version,
|
|
||||||
zip_safe = zip_safe)
|
zip_safe = zip_safe)
|
||||||
|
@@ -1 +0,0 @@
|
|||||||
pytest
|
|
@@ -20,7 +20,11 @@ check:
|
|||||||
$(MAKE) check-$$PYTHON_VERSION
|
$(MAKE) check-$$PYTHON_VERSION
|
||||||
|
|
||||||
#: Run working tests from Python 2.6 or 2.7
|
#: Run working tests from Python 2.6 or 2.7
|
||||||
check-2.6 check-2.7: check-bytecode check-2.7-ok
|
check-2.6 check-2.7: check-bytecode-sans-3.5 check-2.7-ok
|
||||||
|
|
||||||
|
#: Run working tests from Python 3.2
|
||||||
|
check-3.2: check-bytecode
|
||||||
|
$(PYTHON) test_pythonlib.py --bytecode-3.2 --verify $(COMPILE)
|
||||||
|
|
||||||
#: Run working tests from Python 3.3
|
#: Run working tests from Python 3.3
|
||||||
check-3.3: check-bytecode
|
check-3.3: check-bytecode
|
||||||
@@ -43,6 +47,11 @@ check-bytecode-2:
|
|||||||
|
|
||||||
#: Check deparsing bytecode only
|
#: Check deparsing bytecode only
|
||||||
check-bytecode:
|
check-bytecode:
|
||||||
|
$(PYTHON) test_pythonlib.py --bytecode-2.5 --bytecode-2.6 --bytecode-2.7 \
|
||||||
|
--bytecode-3.2 --bytecode-3.3 --bytecode-3.4 --bytecode-3.5
|
||||||
|
|
||||||
|
#: Check deparsing bytecode only
|
||||||
|
check-bytecode-sans-3.5:
|
||||||
$(PYTHON) test_pythonlib.py --bytecode-2.5 --bytecode-2.6 --bytecode-2.7 \
|
$(PYTHON) test_pythonlib.py --bytecode-2.5 --bytecode-2.6 --bytecode-2.7 \
|
||||||
--bytecode-3.2 --bytecode-3.3 --bytecode-3.4
|
--bytecode-3.2 --bytecode-3.3 --bytecode-3.4
|
||||||
|
|
||||||
@@ -70,6 +79,10 @@ check-bytecode-3.3:
|
|||||||
check-bytecode-3.4:
|
check-bytecode-3.4:
|
||||||
$(PYTHON) test_pythonlib.py --bytecode-3.4
|
$(PYTHON) test_pythonlib.py --bytecode-3.4
|
||||||
|
|
||||||
|
#: Check deparsing Python 3.5
|
||||||
|
check-bytecode-3.5:
|
||||||
|
$(PYTHON) test_pythonlib.py --bytecode-3.5
|
||||||
|
|
||||||
#: short tests for bytecodes only for this version of Python
|
#: short tests for bytecodes only for this version of Python
|
||||||
check-native-short:
|
check-native-short:
|
||||||
$(PYTHON) test_pythonlib.py --bytecode-$(PYTHON_VERSION) --verify $(COMPILE)
|
$(PYTHON) test_pythonlib.py --bytecode-$(PYTHON_VERSION) --verify $(COMPILE)
|
||||||
@@ -78,7 +91,11 @@ check-native-short:
|
|||||||
check-2.7-ok:
|
check-2.7-ok:
|
||||||
$(PYTHON) test_pythonlib.py --ok-2.7 --verify $(COMPILE)
|
$(PYTHON) test_pythonlib.py --ok-2.7 --verify $(COMPILE)
|
||||||
|
|
||||||
#: Run longer Python 2.7's lib files known to be okay
|
#: Run longer Python 3.2's lib files known to be okay
|
||||||
|
check-3.2-ok:
|
||||||
|
$(PYTHON) test_pythonlib.py --ok-3.2 --verify $(COMPILE)
|
||||||
|
|
||||||
|
#: Run longer Python 3.4's lib files known to be okay
|
||||||
check-3.4-ok:
|
check-3.4-ok:
|
||||||
$(PYTHON) test_pythonlib.py --ok-3.4 --verify $(COMPILE)
|
$(PYTHON) test_pythonlib.py --ok-3.4 --verify $(COMPILE)
|
||||||
|
|
||||||
|
BIN
test/bytecode_2.5/10_if_else_ternary.pyc
Normal file
BIN
test/bytecode_2.5/10_if_else_ternary.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.6/10_if_else_ternary.pyc
Normal file
BIN
test/bytecode_2.6/10_if_else_ternary.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.7/05_long_list.pyc
Normal file
BIN
test/bytecode_2.7/05_long_list.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.7/05_try_finally_pass.pyc
Normal file
BIN
test/bytecode_2.7/05_try_finally_pass.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.7/10_classdec.pyc
Normal file
BIN
test/bytecode_2.7/10_classdec.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.7/10_if_break_finally.pyc
Normal file
BIN
test/bytecode_2.7/10_if_break_finally.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.7/10_if_else_ternary.pyc
Normal file
BIN
test/bytecode_2.7/10_if_else_ternary.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.2/05_dup_top_two.pyc
Normal file
BIN
test/bytecode_3.2/05_dup_top_two.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
test/bytecode_3.2/06_classbug.pyc
Normal file
BIN
test/bytecode_3.2/06_classbug.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.2/09_if_whiletrue_bug.pyc
Normal file
BIN
test/bytecode_3.2/09_if_whiletrue_bug.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.2/10_for_if_loopback.pyc
Normal file
BIN
test/bytecode_3.2/10_for_if_loopback.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.2/11-list-if.pyc
Normal file
BIN
test/bytecode_3.2/11-list-if.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.2/11_classbug.pyc
Normal file
BIN
test/bytecode_3.2/11_classbug.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.2/11_for_if_loopback2.pyc
Normal file
BIN
test/bytecode_3.2/11_for_if_loopback2.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.2/11_if_while_bug.pyc-notyet
Normal file
BIN
test/bytecode_3.2/11_if_while_bug.pyc-notyet
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
test/bytecode_3.4/03_py3_def.pyc
Normal file
BIN
test/bytecode_3.4/03_py3_def.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.4/05_const_map.pyc
Normal file
BIN
test/bytecode_3.4/05_const_map.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.4/05_with.pyc
Normal file
BIN
test/bytecode_3.4/05_with.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.4/05_yield_from.pyc
Normal file
BIN
test/bytecode_3.4/05_yield_from.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.4/15_static_method.pyc
Normal file
BIN
test/bytecode_3.4/15_static_method.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/00_assign.pyc
Normal file
BIN
test/bytecode_3.5/00_assign.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/00_import.pyc
Normal file
BIN
test/bytecode_3.5/00_import.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/00_pass.pyc
Normal file
BIN
test/bytecode_3.5/00_pass.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/01_boolean.pyc
Normal file
BIN
test/bytecode_3.5/01_boolean.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/01_class.pyc
Normal file
BIN
test/bytecode_3.5/01_class.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/01_fns.pyc
Normal file
BIN
test/bytecode_3.5/01_fns.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/01_list_comprehension.pyc
Normal file
BIN
test/bytecode_3.5/01_list_comprehension.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/01_positional.pyc
Normal file
BIN
test/bytecode_3.5/01_positional.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/01_try_except.pyc
Normal file
BIN
test/bytecode_3.5/01_try_except.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/02_closure.pyc
Normal file
BIN
test/bytecode_3.5/02_closure.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/02_def.pyc
Normal file
BIN
test/bytecode_3.5/02_def.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/02_slice.pyc
Normal file
BIN
test/bytecode_3.5/02_slice.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/03_py3_def.pyc
Normal file
BIN
test/bytecode_3.5/03_py3_def.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/05_abc_class.pyc
Normal file
BIN
test/bytecode_3.5/05_abc_class.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/05_class.pyc
Normal file
BIN
test/bytecode_3.5/05_class.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/05_closure_bug.pyc
Normal file
BIN
test/bytecode_3.5/05_closure_bug.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/05_const_map.pyc
Normal file
BIN
test/bytecode_3.5/05_const_map.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/05_if.pyc
Normal file
BIN
test/bytecode_3.5/05_if.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/05_if_assign.pyc
Normal file
BIN
test/bytecode_3.5/05_if_assign.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/05_ifelse.pyc
Normal file
BIN
test/bytecode_3.5/05_ifelse.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/05_list_comprehension.pyc
Normal file
BIN
test/bytecode_3.5/05_list_comprehension.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/05_long_list.pyc
Normal file
BIN
test/bytecode_3.5/05_long_list.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/05_static_method.pyc
Normal file
BIN
test/bytecode_3.5/05_static_method.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/05_try_except.pyc
Normal file
BIN
test/bytecode_3.5/05_try_except.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/05_try_finally_pass.pyc
Normal file
BIN
test/bytecode_3.5/05_try_finally_pass.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/05_with.pyc
Normal file
BIN
test/bytecode_3.5/05_with.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/06_classbug.pyc
Normal file
BIN
test/bytecode_3.5/06_classbug.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/07_classparam.pyc
Normal file
BIN
test/bytecode_3.5/07_classparam.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/09_whiletrue_bug.pyc
Normal file
BIN
test/bytecode_3.5/09_whiletrue_bug.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/10-genexpr.pyc
Normal file
BIN
test/bytecode_3.5/10-genexpr.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/10-list-ifnot.pyc
Normal file
BIN
test/bytecode_3.5/10-list-ifnot.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/10_class.pyc
Normal file
BIN
test/bytecode_3.5/10_class.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/10_del.pyc
Normal file
BIN
test/bytecode_3.5/10_del.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/10_for.pyc
Normal file
BIN
test/bytecode_3.5/10_for.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/10_if_break_finally.pyc
Normal file
BIN
test/bytecode_3.5/10_if_break_finally.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/10_if_pass.pyc
Normal file
BIN
test/bytecode_3.5/10_if_pass.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/10_keyword.pyc
Normal file
BIN
test/bytecode_3.5/10_keyword.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/10_mixed_boolean.pyc
Normal file
BIN
test/bytecode_3.5/10_mixed_boolean.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/10_while.pyc
Normal file
BIN
test/bytecode_3.5/10_while.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/11-list-if.pyc
Normal file
BIN
test/bytecode_3.5/11-list-if.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/15_assert.pyc
Normal file
BIN
test/bytecode_3.5/15_assert.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/15_for_if.pyc
Normal file
BIN
test/bytecode_3.5/15_for_if.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/20_try_except.pyc
Normal file
BIN
test/bytecode_3.5/20_try_except.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/25_try_except.pyc
Normal file
BIN
test/bytecode_3.5/25_try_except.pyc
Normal file
Binary file not shown.
@@ -70,7 +70,8 @@ for root, dirs, basenames in os.walk('simple_source'):
|
|||||||
simple_source.append(os.path.join(root, basename)[0:-3])
|
simple_source.append(os.path.join(root, basename)[0:-3])
|
||||||
pass
|
pass
|
||||||
|
|
||||||
tests['2.6'] = tests['2.7'] = tests['3.2'] = tests['3.3'] = tests['3.4'] = simple_source
|
tests['2.6'] = tests['2.7'] = tests['3.2'] = \
|
||||||
|
tests['3.3'] = tests['3.4'] = tests['3.5'] = simple_source
|
||||||
|
|
||||||
total_tests = len(tests['2.7'])
|
total_tests = len(tests['2.7'])
|
||||||
#tests['2.2'].sort(); print tests['2.2']
|
#tests['2.2'].sort(); print tests['2.2']
|
||||||
|
BIN
test/ok_lib2.7/_abcoll.pyc
Normal file
BIN
test/ok_lib2.7/_abcoll.pyc
Normal file
Binary file not shown.
BIN
test/ok_lib2.7/_abcoll.pyo
Normal file
BIN
test/ok_lib2.7/_abcoll.pyo
Normal file
Binary file not shown.
Binary file not shown.
BIN
test/ok_lib2.7/antigravity.pyo
Normal file
BIN
test/ok_lib2.7/antigravity.pyo
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
test/ok_lib3.2/antigravity.cpython-32.pyc
Normal file
BIN
test/ok_lib3.2/antigravity.cpython-32.pyc
Normal file
Binary file not shown.
BIN
test/ok_lib3.2/antigravity.cpython-32.pyo
Normal file
BIN
test/ok_lib3.2/antigravity.cpython-32.pyo
Normal file
Binary file not shown.
11
test/simple_source/branching/10_if_else_ternary.py
Normal file
11
test/simple_source/branching/10_if_else_ternary.py
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Tests:
|
||||||
|
|
||||||
|
# ret_expr_or_cond ::= ret_expr
|
||||||
|
# ret_cond ::= expr POP_JUMP_IF_FALSE expr RETURN_END_IF ret_expr_or_cond
|
||||||
|
# ret_expr_or_cond ::= ret_cond
|
||||||
|
# ret_or ::= expr JUMP_IF_TRUE_OR_POP ret_expr_or_cond COME_FROM
|
||||||
|
|
||||||
|
# See https://github.com/rocky/python-uncompyle6/issues/5
|
||||||
|
|
||||||
|
def minimize(x, y):
|
||||||
|
return x or (x if x < y else y)
|
23
test/simple_source/branching/10_if_pass.py
Normal file
23
test/simple_source/branching/10_if_pass.py
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Bug in Python 3.5 in disentangling jump "over" a "pass" statement
|
||||||
|
# or a jump to the next instruction.
|
||||||
|
|
||||||
|
# On Python 3.5 you should get
|
||||||
|
# compare ::= expr expr COMPARE_OP
|
||||||
|
# ...
|
||||||
|
# jmp_false ::= POP_JUMP_IF_FALSE
|
||||||
|
# ...
|
||||||
|
|
||||||
|
from weakref import ref
|
||||||
|
|
||||||
|
class _localimpl:
|
||||||
|
|
||||||
|
def create_dict(self, thread):
|
||||||
|
"""Create a new dict for the current thread, and return it."""
|
||||||
|
localdict = {}
|
||||||
|
idt = id(thread)
|
||||||
|
def thread_deleted(_, idt=idt):
|
||||||
|
local = wrlocal()
|
||||||
|
if local is not None: # bug is here
|
||||||
|
pass # jumping over here
|
||||||
|
wrlocal = ref(self, local_deleted)
|
||||||
|
return localdict
|
9
test/simple_source/bug26/05-ret-or.py
Normal file
9
test/simple_source/bug26/05-ret-or.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# Python 2.6
|
||||||
|
# In contrast to Python 2.7 there might be no "COME_FROM" so we add rule:
|
||||||
|
# ret_or ::= expr JUMP_IF_TRUE expr
|
||||||
|
# where Python 2.7 has
|
||||||
|
# ret_or ::= expr JUMP_IF_TRUE expr COME_FROM
|
||||||
|
|
||||||
|
class BufferedIncrementalEncoder(object):
|
||||||
|
def getstate(self):
|
||||||
|
return self.buffer or 0
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user