You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-04 01:09:52 +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
|
||||
/.eggs
|
||||
/.python-version
|
||||
/.tox
|
||||
/README
|
||||
/__pkginfo__.pyc
|
||||
/dist
|
||||
/how-to-make-a-release.txt
|
||||
/tmp
|
||||
/uncompyle6.egg-info
|
||||
__pycache__
|
||||
build
|
||||
|
@@ -3,12 +3,14 @@ language: python
|
||||
sudo: false
|
||||
|
||||
python:
|
||||
- '2.6'
|
||||
- '2.7'
|
||||
- '3.4'
|
||||
- '3.5'
|
||||
- '2.7'
|
||||
- '2.6'
|
||||
- '3.4'
|
||||
- '3.2'
|
||||
|
||||
install:
|
||||
- pip install -r requirements.txt
|
||||
- pip install -r requirements-dev.txt
|
||||
|
||||
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>
|
||||
|
||||
* __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>
|
||||
|
||||
|
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
|
||||
[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).
|
||||
|
||||
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),
|
||||
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
|
||||
pretty-printing of docstrings, lists and hashes. He also wrote
|
||||
extensive tests and routines to the testing and verification of
|
||||
decompiled bytecode.
|
||||
pretty-printing of docstrings, lists, and hashes. He also wrote test and verification routines of
|
||||
deparsed bytecode, and used this in an extensive set of tests that he also wrote. He could verify against the entire Python library.
|
||||
|
||||
decompyle2.2 was packaged for Debian (sarge) by
|
||||
[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
|
||||
success that his good work deserves.
|
||||
|
||||
Next we get to
|
||||
["uncompyle" and PyPI](https://pypi.python.org/pypi/uncompyle/1.1) and
|
||||
the era of git repositories. In contrast to decompyle, this now runs
|
||||
only on Python 2.7 although it accepts bytecode back to Python
|
||||
2.5. Thomas Grainger is the package owner of this, although Hartmut is
|
||||
listed as the author.
|
||||
Dan Pascu did a bit of work around 2005 on the Python get this code to
|
||||
handle Python 2.3 and 2.4 bytecodes. Because of jump optimization
|
||||
introduced in the CPython bytecode compiler at that time, various JUMP
|
||||
instructions were classifed as going forward or backwards, and COME
|
||||
FROM instructions were introduced. See RELEASE-2.4-CHANGELOG.txt for
|
||||
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
|
||||
[github](https://github.com/gstarnberger/uncompyle) but also on
|
||||
[bitbucket](https://bitbucket.org/gstarnberger/uncompyle) where the
|
||||
git history goes back to 2009. Somewhere in there the name was changed
|
||||
from "decompyle" to "uncompyle".
|
||||
[bitbucket](https://bitbucket.org/gstarnberger/uncompyle) and later
|
||||
the defunct [google
|
||||
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
|
||||
several years of active development. Guenther Starnberger, Keknehv,
|
||||
hamled, and Eike Siewertsen are principle committers here.
|
||||
several years of active development. First Keknehv worked on this up
|
||||
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
|
||||
Myst herie (Mysterie) whose first commit seems to goes back to 2012;
|
||||
it is also based on Hartmut's code. I chose this as it seems had been
|
||||
the most actively worked on most recently.
|
||||
This project, uncompyle6, however owes its existence to the fork of
|
||||
uncompyle2 by Myst herie (Mysterie) whose first commit picks up at
|
||||
2012. I chose this since it seemed to have been at that time the most
|
||||
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
|
||||
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.
|
||||
Probably a complete rewrite would be sensefull. hG/2000-12-27
|
||||
|
||||
One of the attempts to modernize it and make it available for Python3
|
||||
is [the one by Anton Vorobyov (DarkFenX)](https://github.com/DarkFenX/uncompyle3). I've
|
||||
followed some of the ideas there in this project.
|
||||
|
||||
Lastly, I should mention [unpyc](https://code.google.com/p/unpyc3/)
|
||||
and most especially [pycdc](https://github.com/zrax/pycdc), largely by
|
||||
Michael Hansen and Darryl Pogue. If they supported getting source-code
|
||||
fragments and I could call it from Python, I'd probably ditch this and
|
||||
use that. From what I've seen, the code runs blindingly fast and spans
|
||||
all versions of Python.
|
||||
This project deparses using a LR parse. However another approach is to
|
||||
do something like simulate execution symbolically and build expression
|
||||
trees off of stack results. The two important projects that work this
|
||||
way are [unpyc3](https://code.google.com/p/unpyc3/) and most
|
||||
especially [pycdc](https://github.com/zrax/pycdc) The latter project
|
||||
is largely by Michael Hansen and Darryl Pogue. If they supported
|
||||
getting source-code fragments and I could call it from Python, I'd
|
||||
probably ditch this and use that. From what I've seen, the code runs
|
||||
blindingly fast and spans all versions of Python.
|
||||
|
||||
Tests for the project have been, or are being, culled from all of the
|
||||
projects mentioned.
|
||||
|
@@ -1,9 +1,11 @@
|
||||
include README.rst
|
||||
include HISTORY.md
|
||||
include ChangeLog
|
||||
include HISTORY.md
|
||||
include LICENSE
|
||||
include DECOMPYLE-2.4-CHANGELOG.txt
|
||||
include __pkginfo__.py
|
||||
recursive-include uncompyle6 *.py
|
||||
include bin/uncompyle6
|
||||
include bin/pydisassemble
|
||||
recursive-include test *.py
|
||||
recursive-include test *.py *.pyc
|
||||
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 $@
|
||||
|
||||
#: Tests for Python 3.5 - pytest doesn't work here
|
||||
check-3.5:
|
||||
check-3.2 check-3.5:
|
||||
$(MAKE) -C test $@
|
||||
|
||||
#:Tests for Python 2.6 (doesn't have pytest)
|
||||
@@ -44,9 +44,9 @@ clean: clean_pyc
|
||||
$(PYTHON) ./setup.py $@
|
||||
(cd test && $(MAKE) clean)
|
||||
|
||||
#: Create source (tarball) and binary (egg) distribution
|
||||
#: Create source (tarball) and wheel distribution
|
||||
dist:
|
||||
$(PYTHON) ./setup.py sdist bdist_egg
|
||||
$(PYTHON) ./setup.py sdist bdist_wheel
|
||||
|
||||
#: Remove .pyc files
|
||||
clean_pyc:
|
||||
@@ -73,6 +73,11 @@ 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
|
||||
# to do the following. I'm sure distutils will someday get there.
|
||||
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
|
||||
|
||||
- Limited support for decompiling Python 3.5
|
||||
|
38
README.rst
38
README.rst
@@ -1,10 +1,10 @@
|
||||
|downloads| |buildstatus|
|
||||
|buildstatus|
|
||||
|
||||
uncompyle6
|
||||
==========
|
||||
|
||||
A native Python bytecode Disassembler, Decompiler, Fragment Decompiler
|
||||
and bytecode library
|
||||
and bytecode library. Follows in the tradition of decompyle, uncompyle, and uncompyle2.
|
||||
|
||||
|
||||
Introduction
|
||||
@@ -12,17 +12,22 @@ Introduction
|
||||
|
||||
*uncompyle6* translates Python bytecode back into equivalent Python
|
||||
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,
|
||||
3.4 and 3.5.
|
||||
so. The code requires Python 2.6 or later and has been tested on Python
|
||||
running versions 2.6, 2.7, 3.2, 3.3, 3.4 and 3.5.
|
||||
|
||||
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
|
||||
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
|
||||
bytecode offsets (of interest). This purpose although largely
|
||||
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
|
||||
# or if you have pyenv:
|
||||
python setup.py develop
|
||||
@@ -77,24 +84,27 @@ Run
|
||||
::
|
||||
|
||||
./bin/uncompyle6 -h
|
||||
./bin/pydisassemble -y
|
||||
./bin/pydisassemble -h
|
||||
|
||||
for usage help
|
||||
for usage help.
|
||||
|
||||
|
||||
Known Bugs/Restrictions
|
||||
-----------------------
|
||||
|
||||
Python 2 deparsing is probably as solid as the various versions of
|
||||
uncompyle2. Python 3 deparsing is okay but not as solid.
|
||||
Python 2 deparsing decompiles all of the Python 2.7.10 library and as
|
||||
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
|
||||
--------
|
||||
|
||||
* https://github.com/zrax/pycdc
|
||||
* https://github.com/Mysterie/uncompyle2
|
||||
* https://github.com/DarkFenX/uncompyle3
|
||||
* https://code.google.com/p/unpyc3/
|
||||
* https://github.com/zrax/pycdc : supports all versions of Python and is written in C++
|
||||
* https://code.google.com/archive/p/unpyc3/ : supports Python 3.2 only
|
||||
|
||||
The above projects use a different decompiling technique what is used here.
|
||||
|
||||
The HISTORY file.
|
||||
|
||||
|
@@ -9,13 +9,20 @@
|
||||
|
||||
# Things that change more often go here.
|
||||
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',
|
||||
'Operating System :: OS Independent',
|
||||
'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 :: Libraries :: Python Modules',
|
||||
]
|
||||
@@ -23,30 +30,25 @@ classifiers = ['Development Status :: 3 - Alpha',
|
||||
# The rest in alphabetic order
|
||||
author = "Rocky Bernstein, Hartmut Goebel, John Aycock, and others"
|
||||
author_email = "rb@dustyfeet.com"
|
||||
entry_points={
|
||||
'console_scripts': [
|
||||
'uncompyle6=bin.uncompile6:main',
|
||||
'pydisassemble=bin.pydisassemble:main',
|
||||
]}
|
||||
ftp_url = None
|
||||
# license = 'BSDish'
|
||||
install_requires = ['spark-parser >= 1.1.1']
|
||||
license = 'MIT'
|
||||
mailing_list = 'python-debugger@googlegroups.com'
|
||||
modname = 'uncompyle6'
|
||||
packages = ['uncompyle6', 'uncompyle6.opcodes', 'uncompyle6.semantics', 'uncompyle6.scanners', 'uncompyle6.parsers']
|
||||
py_modules = None
|
||||
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/'
|
||||
|
||||
# tracebacks in zip files are funky and not debuggable
|
||||
zip_safe = True
|
||||
|
||||
|
||||
import os.path
|
||||
def read(*rnames):
|
||||
return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
|
||||
|
||||
|
@@ -1,77 +1,3 @@
|
||||
#!/usr/bin/env python
|
||||
# Mode: -*- python -*-
|
||||
#
|
||||
# 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)
|
||||
from uncompyle6.bin.pydisassemble import main
|
||||
main()
|
||||
|
214
bin/uncompyle6
214
bin/uncompyle6
@@ -1,213 +1,3 @@
|
||||
#!/usr/bin/env python
|
||||
# Mode: -*- python -*-
|
||||
#
|
||||
# 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))
|
||||
from uncompyle6.bin.uncompile import main_bin
|
||||
main_bin()
|
||||
|
@@ -6,7 +6,8 @@ machine:
|
||||
|
||||
dependencies:
|
||||
override:
|
||||
- pip install -r test-requirements.txt
|
||||
- pip install -r requirements.txt
|
||||
- pip install -r requirements-dev.txt
|
||||
test:
|
||||
override:
|
||||
- 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
|
||||
# doc/
|
||||
# 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."""
|
||||
|
||||
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 \
|
||||
author, author_email, \
|
||||
long_description, \
|
||||
modname, packages, py_modules, scripts, \
|
||||
short_desc, version, web, zip_safe
|
||||
author, author_email, install_requires, \
|
||||
license, long_description, classifiers, \
|
||||
entry_points, modname, py_modules, \
|
||||
short_desc, web, zip_safe
|
||||
|
||||
__import__('pkg_resources')
|
||||
from setuptools import setup
|
||||
from setuptools import setup, find_packages
|
||||
|
||||
exec(open('uncompyle6/version.py').read())
|
||||
|
||||
setup(
|
||||
author = author,
|
||||
author_email = author_email,
|
||||
# classifiers = classifiers,
|
||||
classifiers = classifiers,
|
||||
description = short_desc,
|
||||
# install_requires = install_requires,
|
||||
# license = license,
|
||||
entry_points = entry_points,
|
||||
install_requires = install_requires,
|
||||
license = license,
|
||||
long_description = long_description,
|
||||
py_modules = py_modules,
|
||||
name = modname,
|
||||
packages = packages,
|
||||
packages = find_packages(),
|
||||
py_modules = py_modules,
|
||||
test_suite = 'nose.collector',
|
||||
url = web,
|
||||
setup_requires = ['nose>=1.0'],
|
||||
scripts = scripts,
|
||||
version = version,
|
||||
version = VERSION,
|
||||
zip_safe = zip_safe)
|
||||
|
@@ -1 +0,0 @@
|
||||
pytest
|
@@ -20,7 +20,11 @@ check:
|
||||
$(MAKE) check-$$PYTHON_VERSION
|
||||
|
||||
#: 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
|
||||
check-3.3: check-bytecode
|
||||
@@ -43,6 +47,11 @@ check-bytecode-2:
|
||||
|
||||
#: Check deparsing bytecode only
|
||||
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 \
|
||||
--bytecode-3.2 --bytecode-3.3 --bytecode-3.4
|
||||
|
||||
@@ -70,6 +79,10 @@ check-bytecode-3.3:
|
||||
check-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
|
||||
check-native-short:
|
||||
$(PYTHON) test_pythonlib.py --bytecode-$(PYTHON_VERSION) --verify $(COMPILE)
|
||||
@@ -78,7 +91,11 @@ check-native-short:
|
||||
check-2.7-ok:
|
||||
$(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:
|
||||
$(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])
|
||||
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'])
|
||||
#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