Compare commits

..

54 Commits

Author SHA1 Message Date
rocky
affc504418 Get ready for release 2.7.1 2016-07-26 17:13:10 -04:00
rocky
ecbbc7dfea Custom PyPy rules for tryfinallysmt, assign{2,3} 2016-07-26 16:49:14 -04:00
rocky
6c5bd6289f More PyPy grammar rules
* assert one and two-arg form
* trystmt

Simplify adding multiple grammar rules
2016-07-26 10:21:12 -04:00
rocky
9f0b0809b1 Instruction formatting - yet again 2016-07-25 23:09:34 -04:00
rocky
f0a8505887 Add grammar for PyPy 2-arg assert 2016-07-25 22:36:02 -04:00
rocky
04cc80b0d6 PyPy BUILD_MAP_n. Reinstate bytecode tests 2016-07-25 21:53:56 -04:00
rocky
281f429223 Handle PyPy BUILD_MAP_0 where actual kw_args > 0 2016-07-25 17:50:19 -04:00
rocky
8cfecff9c4 Clean up PyPy load_attr grammar rules 2016-07-25 16:05:08 -04:00
rocky
116b6eb468 Enable more PyPy testing 2016-07-25 14:41:27 -04:00
rocky
2509d212e5 Start checking PyPy bytecodes 2016-07-25 13:35:02 -04:00
rocky
96b83c3d85 Add pypy scanners 2016-07-25 13:29:03 -04:00
rocky
a3e10db8dc Handle PyPy CALL_METHOD op more correctly
Start testing pypy2.7 and 3.2 bytecodes
2016-07-25 13:05:54 -04:00
rocky
7e1aa6a34d add_custom_rules() in 2.x and 3.x are more alike 2016-07-25 09:33:11 -04:00
rocky
476eb50868 Handle PyPy JUMP_IF_NOT_DEBUG
Update README.rst to note PyPY and reorganize a little
2016-07-25 09:18:03 -04:00
rocky
285444e19a Better assembly formatting of jump instructions 2016-07-25 00:36:39 -04:00
rocky
aed4d23c34 More PyPy LOOKUP_METHOD rules 2016-07-24 20:59:44 -04:00
rocky
1c50e34c30 PyPy support
* Use proper PYPY 32 opcodes
* handle opcodes LOOKUP_METHOD and CALL_METHOD
* Administrative stuff for PyPy
2016-07-24 18:54:51 -04:00
rocky
808e468e5e add-test: Make sure PyPy bytecode is separated 2016-07-24 10:32:35 -04:00
rocky
936b213cec Merge branch 'pypy'
Conflicts:
	test/bytecode_2.7/05_for_try_except.pyc
	uncompyle6/scanners/scanner2.py
2016-07-24 04:27:17 -04:00
rocky
21683719e1 Start supporting PyPy 3.2
Add some PyPy 2.7 and PyPy 3.2 bytecode files
2016-07-24 04:17:54 -04:00
rocky
9754d27597 Merge branch 'pypy' of github.com:rocky/python-uncompyle6 into pypy 2016-07-24 03:45:18 -04:00
rocky
7e8173b076 Note we need xdis 2.0.0 or greater 2016-07-24 03:44:26 -04:00
rocky
ca9888ace4 Another 2.7 'continue' detection bug 2016-07-23 17:44:42 -04:00
rocky
070b7dab7b Another 2.7 'continue' detection bug 2016-07-23 17:42:42 -04:00
rocky
44d95e40e6 Another 2.7 'continue' detection bug 2016-07-23 17:33:50 -04:00
rocky
f6f3ad362b 2.7: Detect "continue" inside except
Fixes issue #38.

This is a bit hacky. We need a more general "continue" detection.
2016-07-23 11:02:01 -04:00
rocky
21377f3b43 Merge branch 'master' into pypy
Conflicts:
	uncompyle6/scanners/scanner2.py
2016-07-23 10:57:58 -04:00
rocky
a5f45f232d 2.7: Detect "continue" inside except
Fixes issue #38.

This is a bit hacky. We need a more general "continue" detection.
2016-07-23 10:37:41 -04:00
rocky
7c4316d4fb Start handling pypy 2.7
Need to understand whether we care compiling pypy.
Pypy 2.7 list comprehensions are different and use
its own opcode.
2016-07-21 02:58:50 -04:00
rocky
d1ef0bf21b Update HISTORY and add link to it in README.md 2016-07-20 12:02:58 -04:00
rocky
063e517a7c Better parse error formatting
Start to move away for compiler-oriented terminology:
   Favor "instructions" over "tokens".
Syntax error -> Parse error.
2016-07-17 16:27:17 -04:00
rocky
4a3a62d01b Align disassembly output with xdis
align number of offset fields with xdis.
Show None type when we mean None, not ''
2016-07-17 14:00:00 -04:00
rocky
ea733c31d7 Respect after/both option in scanner3 2016-07-17 12:38:48 -04:00
rocky
63ec3f934a Adjust test data for changed disasm output 2016-07-17 12:13:19 -04:00
rocky
7c261d8495 Merge branch 'master' of github.com:rocky/python-uncompyle6 2016-07-16 14:13:34 -04:00
rocky
942b15e3c6 Suppress arg in dissassembly if there is none 2016-07-16 14:12:31 -04:00
rocky
69e65463b7 More explicit usage info 2016-07-16 10:49:36 -04:00
rocky
cd8cbf9200 Add 3.5 matrix mult ops
We now run 3.5 verifycation so we need to remove some
of the tests that fail to verify pending fixing.
2016-07-15 12:12:19 -04:00
rocky
accc959b71 Get ready for release 2.7.0 2016-07-15 02:54:00 -04:00
rocky
0ee52aeeef Isolate pseudo op IMPORT_NAME_CONT
I think this is a holdover from pre 2.3 days. Possibly it can be dropped altogether.
2016-07-14 21:05:09 -04:00
rocky
c9d1f72424 Attempt to get 3.5 RETURN_END_IF working
This feels hacky and I'm not sure is quite right.
Untili we understand better what to do though, we'll
go with it.
2016-07-14 14:49:57 -04:00
rocky
29990c8da0 3.x __qualname__ = supression
Class names have become more complicated so the pattern test
needs to be more complex as well. Sigh
2016-07-14 12:57:48 -04:00
rocky
4e6e38358d 3.x list comprehenions list_if_not, comp_ifnot bug
Saw only list_if_not bug, but might also be applicable
to comp_ifnot
2016-07-14 11:30:42 -04:00
rocky
fb870ccd8d 3.x ""raise AssertionError" vs "assert"
Not sure this is totally correct yet.
2016-07-14 10:31:12 -04:00
rocky
7b7a9fa4cf Python 3.4 assertion handling. Improve verify
3.4 has jump optimization like 3.5.
verify.py: show mismatch on verification mismatch
2016-07-14 05:20:30 -04:00
rocky
1e25ffa879 Reinstate some code for verification 2016-07-13 22:02:08 -04:00
rocky
7cc55f0c5f Back off showing verification errors
Pending why this failing in make.
2016-07-13 13:47:30 -04:00
rocky
723ba1365f "return None" -> "pass"
Python 3.4 classes have what looks like a return None, but this
is invalid syntax. So for now we'll remove all "return None"s.

There may be a "pass" in there instead.
2016-07-13 13:37:07 -04:00
rocky
6a125d49d8 Merge branch 'master' of github.com:rocky/python-uncompyle6 2016-07-13 13:01:36 -04:00
rocky
fd0d8d2567 Travis workaround
Not sure what's up with 01-class on 3.4. remove for now.
More info in 2.7.11 on what failed.
2016-07-13 13:00:03 -04:00
rocky
772c67fcd7 Debugging smutz caused verify failures 2016-07-13 09:53:51 -04:00
rocky
bc86b73cf0 Document/correct hide_internal and store_locals 2016-07-12 12:07:48 -04:00
rocky
b99f196d18 Better 3.2/33 store_locals handling 2016-07-12 09:46:46 -04:00
rocky
78f24f9c66 Python 3.2 & 3.3 handle STORE_NAME better 2016-07-11 23:24:52 -04:00
128 changed files with 1201 additions and 262 deletions

298
ChangeLog
View File

@@ -1,3 +1,301 @@
2016-07-26 rocky <rb@dustyfeet.com>
* README.rst, __pkginfo__.py, requirements.txt,
test/test_pyenvlib.py, uncompyle6/version.py: Get ready for release
2.7.1
2016-07-26 rocky <rb@dustyfeet.com>
* test/simple_source/bug_pypy27/00_assign_pypy.py,
test/simple_source/bug_pypy27/03_try_return.py, uncompyle6/main.py,
uncompyle6/parsers/parse2.py, uncompyle6/scanners/scanner2.py,
uncompyle6/semantics/pysource.py: Custom PyPy rules for
tryfinallysmt, assign{2,3}
2016-07-26 rocky <rb@dustyfeet.com>
* test/simple_source/bug_pypy27/01_assert2.py,
test/simple_source/bug_pypy27/03_try_return.py,
uncompyle6/parser.py, uncompyle6/parsers/parse2.py,
uncompyle6/parsers/parse27.py, uncompyle6/scanners/scanner2.py,
uncompyle6/scanners/scanner3.py, uncompyle6/semantics/pysource.py:
More PyPy grammar rules * assert one and two-arg form * trystmt Simplify adding multiple grammar rules
2016-07-25 rocky <rb@dustyfeet.com>
* pytest/testdata/if-2.7.right, pytest/testdata/ifelse-2.7.right,
uncompyle6/scanners/tok.py: Instruction formatting - yet again
2016-07-25 rocky <rb@dustyfeet.com>
* uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse3.py,
uncompyle6/semantics/pysource.py: Add grammar for PyPy 2-arg assert
2016-07-25 rocky <rb@dustyfeet.com>
* uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse3.py,
uncompyle6/scanners/scanner2.py, uncompyle6/scanners/scanner3.py,
uncompyle6/scanners/tok.py, uncompyle6/semantics/pysource.py: PyPy
BUILD_MAP_n. Reinstate bytecode tests
2016-07-25 rocky <rb@dustyfeet.com>
* uncompyle6/parser.py, uncompyle6/parsers/parse2.py: Handle PyPy
BUILD_MAP_0 where actual kw_args > 0
2016-07-25 rocky <rb@dustyfeet.com>
* uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse3.py: Clean
up PyPy load_attr grammar rules
2016-07-25 rocky <rb@dustyfeet.com>
* Makefile: Enable more PyPy testing
2016-07-25 rocky <rb@dustyfeet.com>
* test/Makefile: Start checking PyPy bytecodes
2016-07-25 rocky <rb@dustyfeet.com>
* test/Makefile, uncompyle6/scanners/pypy27.py,
uncompyle6/scanners/pypy32.py: Add pypy scanners
2016-07-25 rocky <rb@dustyfeet.com>
* __pkginfo__.py, requirements.txt, test/Makefile,
test/simple_source/bug27+/05_setattr.py,
uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse3.py,
uncompyle6/scanners/scanner2.py, uncompyle6/scanners/scanner27.py,
uncompyle6/scanners/scanner3.py: Handle PyPy CALL_METHOD op more
correctly Start testing pypy2.7 and 3.2 bytecodes
2016-07-25 rocky <rb@dustyfeet.com>
* uncompyle6/parsers/parse2.py: add_custom_rules() in 2.x and 3.x
are more alike
2016-07-25 rocky <rb@dustyfeet.com>
* README.rst, test/simple_source/stmts/03_if_elif.py,
uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse27.py,
uncompyle6/parsers/parse3.py, uncompyle6/scanners/scanner2.py,
uncompyle6/scanners/scanner3.py, uncompyle6/semantics/pysource.py:
Handle PyPy JUMP_IF_NOT_DEBUG Update README.rst to note PyPY and reorganize a little
2016-07-25 rocky <rb@dustyfeet.com>
* pytest/testdata/if-2.7.right, pytest/testdata/ifelse-2.7.right,
uncompyle6/scanners/scanner2.py, uncompyle6/scanners/scanner26.py,
uncompyle6/scanners/scanner3.py, uncompyle6/scanners/tok.py: Better
assembly formatting of jump instructions
2016-07-24 rocky <rb@dustyfeet.com>
* Makefile, test/Makefile, uncompyle6/parsers/parse2.py,
uncompyle6/parsers/parse3.py, uncompyle6/scanners/scanner3.py: More
PyPy LOOKUP_METHOD rules
2016-07-24 rocky <rb@dustyfeet.com>
* Makefile, __pkginfo__.py, pytest/test_fjt.py, requirements.txt,
test/Makefile, test/test_pythonlib.py,
uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse3.py,
uncompyle6/scanner.py, uncompyle6/scanners/scanner2.py,
uncompyle6/scanners/scanner3.py, uncompyle6/semantics/pysource.py:
PyPy support * Use proper PYPY 32 opcodes * handle opcodes LOOKUP_METHOD and CALL_METHOD * Administrative stuff for PyPy
2016-07-24 rocky <rb@dustyfeet.com>
* test/add-test.py: add-test: Make sure PyPy bytecode is separated
2016-07-24 rocky <rb@dustyfeet.com>
* : commit 21683719e1a07d51095d32200ec294d659746474 Author: rocky
<rb@dustyfeet.com> Date: Sun Jul 24 04:16:54 2016 -0400
2016-07-24 rocky <rb@dustyfeet.com>
* : commit 7e8173b07620c344a73660b354f05a61c4723d18 Author: rocky
<rb@dustyfeet.com> Date: Sun Jul 24 03:44:26 2016 -0400
2016-07-23 rocky <rb@dustyfeet.com>
* test/simple_source/bug27+/05_for_try_except.py,
uncompyle6/scanners/scanner2.py, uncompyle6/scanners/scanner27.py:
Another 2.7 'continue' detection bug
2016-07-23 rocky <rb@dustyfeet.com>
* test/simple_source/bug27+/05_for_try_except.py,
uncompyle6/scanners/scanner2.py, uncompyle6/scanners/scanner27.py:
Another 2.7 'continue' detection bug
2016-07-23 rocky <rb@dustyfeet.com>
* test/simple_source/bug27+/05_for_try_except.py,
uncompyle6/scanners/scanner2.py, uncompyle6/scanners/scanner27.py:
Another 2.7 'continue' detection bug
2016-07-23 rocky <rb@dustyfeet.com>
* test/simple_source/bug27+/05_for_try_except.py,
uncompyle6/scanners/scanner2.py: 2.7: Detect "continue" inside
except Fixes issue #38. This is a bit hacky. We need a more general "continue" detection.
2016-07-23 rocky <rb@dustyfeet.com>
* : commit a5f45f232decad2e74bfdf476255604273fd95fd Author: rocky
<rb@dustyfeet.com> Date: Sat Jul 23 10:37:41 2016 -0400
2016-07-21 rocky <rb@dustyfeet.com>
* __pkginfo__.py, test/test_pyenvlib.py, uncompyle6/disas.py,
uncompyle6/main.py, uncompyle6/parser.py,
uncompyle6/parsers/parse27.py, uncompyle6/scanner.py,
uncompyle6/scanners/scanner2.py, uncompyle6/scanners/scanner27.py,
uncompyle6/semantics/fragments.py,
uncompyle6/semantics/pysource.py, uncompyle6/verify.py: Start
handling pypy 2.7 Need to understand whether we care compiling pypy. Pypy 2.7 list
comprehensions are different and use its own opcode.
2016-07-20 rocky <rb@dustyfeet.com>
* HISTORY.md, README.rst: Update HISTORY and add link to it in
README.md
2016-07-17 rocky <rb@dustyfeet.com>
* uncompyle6/parser.py, uncompyle6/semantics/pysource.py: Better
parse error formatting Start to move away for compiler-oriented terminology: Favor "instructions" over "tokens". Syntax error -> Parse error.
2016-07-17 rocky <rb@dustyfeet.com>
* pytest/testdata/if-2.7.right, pytest/testdata/ifelse-2.7.right,
uncompyle6/scanners/scanner2.py, uncompyle6/scanners/tok.py: Align
disassembly output with xdis align number of offset fields with xdis. Show None type when we
mean None, not ''
2016-07-17 rocky <rb@dustyfeet.com>
* uncompyle6/scanners/scanner3.py: Respect after/both option in
scanner3
2016-07-17 rocky <rb@dustyfeet.com>
* pytest/testdata/if-2.7.right, pytest/testdata/ifelse-2.7.right:
Adjust test data for changed disasm output
2016-07-16 rocky <rb@dustyfeet.com>
* : commit 942b15e3c62963b32aaba877fd451ffe304c07a9 Author: rocky
<rb@dustyfeet.com> Date: Sat Jul 16 14:12:31 2016 -0400
2016-07-16 rocky <rb@dustyfeet.com>
* README.rst: More explicit usage info
2016-07-15 rocky <rb@dustyfeet.com>
* README.rst, test/Makefile,
test/simple_source/bug35/01_matrix_multiply.py,
uncompyle6/parsers/parse3.py, uncompyle6/semantics/pysource.py: Add
3.5 matrix mult ops We now run 3.5 verifycation so we need to remove some of the tests
that fail to verify pending fixing.
2016-07-15 rocky <rb@dustyfeet.com>
* ChangeLog, NEWS, README.rst, uncompyle6/version.py: Get ready for
release 2.7.0
2016-07-14 rocky <rb@dustyfeet.com>
* uncompyle6/parser.py, uncompyle6/parsers/parse2.py,
uncompyle6/scanners/scanner2.py, uncompyle6/scanners/scanner26.py,
uncompyle6/semantics/pysource.py: Isolate pseudo op IMPORT_NAME_CONT I think this is a holdover from pre 2.3 days. Possibly it can be
dropped altogether.
2016-07-14 rocky <rb@dustyfeet.com>
* uncompyle6/parsers/parse3.py, uncompyle6/semantics/pysource.py:
Attempt to get 3.5 RETURN_END_IF working This feels hacky and I'm not sure is quite right. Untili we
understand better what to do though, we'll go with it.
2016-07-14 rocky <rb@dustyfeet.com>
* test/Makefile, uncompyle6/semantics/pysource.py: 3.x __qualname__
= supression Class names have become more complicated so the pattern test needs
to be more complex as well. Sigh
2016-07-14 rocky <rb@dustyfeet.com>
* README.rst, uncompyle6/semantics/fragments.py,
uncompyle6/semantics/pysource.py: 3.x list comprehenions
list_if_not, comp_ifnot bug Saw only list_if_not bug, but might also be applicable to comp_ifnot
2016-07-14 rocky <rb@dustyfeet.com>
* test/simple_source/stmts/15_assert.py,
uncompyle6/scanners/scanner3.py: 3.x ""raise AssertionError" vs
"assert" Not sure this is totally correct yet.
2016-07-14 rocky <rb@dustyfeet.com>
* uncompyle6/main.py, uncompyle6/parsers/parse3.py,
uncompyle6/parsers/parse34.py, uncompyle6/scanners/scanner2.py,
uncompyle6/scanners/scanner26.py, uncompyle6/scanners/scanner3.py,
uncompyle6/verify.py: Python 3.4 assertion handling. Improve verify 3.4 has jump optimization like 3.5. verify.py: show mismatch on
verification mismatch
2016-07-13 rocky <rb@dustyfeet.com>
* : Reinstate some code for verification
2016-07-13 rocky <rb@dustyfeet.com>
* uncompyle6/main.py: Back off showing verification errors Pending why this failing in make.
2016-07-13 rocky <rb@dustyfeet.com>
* uncompyle6/semantics/pysource.py: "return None" -> "pass" Python 3.4 classes have what looks like a return None, but this is
invalid syntax. So for now we'll remove all "return None"s. There may be a "pass" in there instead.
2016-07-13 rocky <rb@dustyfeet.com>
* : commit fd0d8d25672b9450bafc1d5c6781bedd7ec8bd1d Author: rocky
<rb@dustyfeet.com> Date: Wed Jul 13 13:00:03 2016 -0400
2016-07-13 rocky <rb@dustyfeet.com>
* test/simple_source/stmts/11_return_val.py,
uncompyle6/semantics/pysource.py: Debugging smutz caused verify
failures
2016-07-12 rocky <rb@dustyfeet.com>
* uncompyle6/parsers/parse3.py, uncompyle6/semantics/fragments.py,
uncompyle6/semantics/pysource.py: Document/correct hide_internal and
store_locals
2016-07-12 rocky <rb@dustyfeet.com>
* test/simple_source/bug33/05_store_locals.py,
test/simple_source/bug33/05_store_name.py,
uncompyle6/semantics/pysource.py: Better 3.2/33 store_locals
handling
2016-07-11 rocky <rb@dustyfeet.com>
* test/simple_source/bug33/05_store_name.py,
test/simple_source/comprehension/05_3x_set_comphension.py,
uncompyle6/parsers/parse3.py, uncompyle6/semantics/pysource.py:
Python 3.2 & 3.3 handle STORE_NAME better
2016-07-11 rocky <rb@dustyfeet.com>
* ChangeLog, NEWS, README.rst, uncompyle6/version.py: Get ready for
release 2.6.2
2016-07-11 rocky <rb@dustyfeet.com>
* test/add-test.py,

View File

@@ -112,8 +112,7 @@ Fenx's uncompyle3 which I used for inspiration for Python3 support.
I started working on this late 2015, mostly to add fragment support.
In that, I 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.)
3.2+.
Over the many years, code styles and Python features have
changed. However brilliant the code was and still is, it hasn't really

View File

@@ -40,6 +40,14 @@ check-3.2 check-3.5:
check-2.6:
$(MAKE) -C test $@
#:PyPy 2.6.1 or PyPy 5.0.1
# Skip for now
2.6 5.0:
#:PyPy pypy3-2.4.0 Python 3:
pypy-3.2 2.4:
$(MAKE) -C test $@
#: Run py.test tests
pytest:
$(MAKE) -C pytest check

13
NEWS
View File

@@ -1,3 +1,16 @@
uncompyle6 2.7.1 2016-07-26
- PyPy bytecodes for 2.7 and 3.2 added
- Instruction formatting improved slightly
- 2.7 bytecode "continue" bug fixed
uncompyle6 2.7.0 2016-07-15
- Many Syntax and verifification bugs removed
tested on standard libraries from 2.3.7 to 3.5.1
and they all decompile and verify fine.
I'm sure there are more bugs though.
uncompyle6 2.6.2 2016-07-11 Manhattenhenge
- Extend bytecodes back to 2.3

View File

@@ -12,18 +12,19 @@ Introduction
*uncompyle6* translates Python bytecode back into equivalent Python
source code. It accepts bytecodes from Python version 2.3 to 3.5 or
so. The code requires Python 2.6 or later and has been tested on Python
running versions 2.3-2.7, and 3.2-3.5.
so, including PyPy bytecode.
Why this?
---------
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.
forks around. All of them came basically from the same code base, and
almost all of them no were no longer actively maintained. Only one
handled Python 3, and even there, only 3.2. This code pulls these
together and moves forward. It also addresses a number of open issues
in the previous forks.
What makes this different from other CPython bytecode decompilers? Its
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.
@@ -39,6 +40,13 @@ location in more detail than just a line number. It can be also used
when source-code information does not exist and there is just bytecode
information.
Requirements
------------
This project requires Python 2.6 or later, PyPy 3-2.4, or PyPy-5.0.1.
The bytecode files it can read has been tested on Python bytecodes from
versions 2.3-2.7, and 3.2-3.5 and the above-mentioned PyPy versions.
Installation
------------
@@ -76,29 +84,33 @@ Run
::
./bin/uncompyle6 -h
$ uncompyle6 *compiled-python-file-pyc-or-pyo*
for usage help.
For usage help:
::
$ uncompyle6 -h
Known Bugs/Restrictions
-----------------------
Python 2 deparsing decompiles each and all the Python 2.3 to 2.7.10
installed packages I have on my system. Later distributions average
about 200 files.
Python 2 deparsing decompiles and about 90% verifies from Python 2.3.7 to Python
3.4.2 on the standard library packages I have on my system.
More than 90% of the 2.7 files verify ok Some of these failures may be
bugs in the verification process. At this point, 2.7 decompilation is
better than uncompyle2. A number of bugs have been fixed over what was
in uncompyle2.
(Verification is the process of decompiling bytecode, compiling with a
Python for that byecode version, and then comparing the byetcode
produced by the decompiled/compiled program. Some allowance is made
for inessential differences.)
That said, I'd like the decompilation process still feels a little bit
hacky in certain places and we still get parse errors too often.
Later distributions average about 200 files. At this point, 2.7
decompilation is better than uncompyle2. A number of bugs have been
fixed.
There are a few constructs that still need to be added to Python 3.5.
Python 3.5 largely works, but still has some bugs in it.
Python 3.6 changes things drastically by using word codes rather than
byte codes. So that will be yet another challenge.
byte codes, and that needs to be addressed.
There is lots to do, so please dig in and help.
@@ -106,14 +118,12 @@ See Also
--------
* 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.
* 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.
.. |downloads| image:: https://img.shields.io/pypi/dd/uncompyle6.svg
.. _trepan: https://pypi.python.org/pypi/trepan
.. _HISTORY: https://github.com/rocky/python-uncompyle6/blob/master/HISTORY.md
.. _debuggers: https://pypi.python.org/pypi/trepan3k
.. _remake: https://bashdb.sf.net/remake
.. _pycdc: https://github.com/zrax/pycdc

View File

@@ -37,7 +37,7 @@ entry_points={
]}
ftp_url = None
install_requires = ['spark-parser >= 1.4.0',
'xdis >= 1.1.7']
'xdis >= 2.0.3']
license = 'MIT'
mailing_list = 'python-debugger@googlegroups.com'
modname = 'uncompyle6'

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env python
from uncompyle6 import PYTHON_VERSION
from uncompyle6 import PYTHON_VERSION, IS_PYPY
from uncompyle6.scanner import get_scanner
from array import array
def bug(state, slotstate):
@@ -12,7 +12,7 @@ def test_if_in_for():
code = bug.__code__
scan = get_scanner(PYTHON_VERSION)
print(PYTHON_VERSION)
if 2.7 <= PYTHON_VERSION <= 3.0:
if 2.7 <= PYTHON_VERSION <= 3.0 and not IS_PYPY:
n = scan.setup_code(code)
scan.build_lines_data(code, n)
scan.build_prev_op(n)

View File

@@ -2,11 +2,11 @@
# Embedded file name: simple_source/branching/05_if.py
6 0 LOAD_NAME 0 'True'
3 POP_JUMP_IF_FALSE 15 '15'
3 POP_JUMP_IF_FALSE 15 'to 15'
7 6 LOAD_NAME 1 'False'
9 STORE_NAME 2 'b'
12 JUMP_FORWARD 0 '15'
12 JUMP_FORWARD 0 'to 15'
15_0 COME_FROM '12'
15 LOAD_CONST 0 ''
18 RETURN_VALUE ''
18 RETURN_VALUE

View File

@@ -2,14 +2,14 @@
# Embedded file name: simple_source/branching/05_ifelse.py
3 0 LOAD_NAME 0 'True'
3 POP_JUMP_IF_FALSE 15 '15'
3 POP_JUMP_IF_FALSE 15 'to 15'
4 6 LOAD_CONST 0 1
9 STORE_NAME 1 'b'
12 JUMP_FORWARD 6 '21'
12 JUMP_FORWARD 6 'to 21'
6 15 LOAD_CONST 1 2
18 STORE_NAME 2 'd'
21_0 COME_FROM '12'
21 LOAD_CONST 2 ''
24 RETURN_VALUE ''
24 RETURN_VALUE

View File

@@ -1 +1,2 @@
spark-parser >= 1.2.1
xdis >= 2.0.3

View File

@@ -30,28 +30,32 @@ check-3.2: check-bytecode
check-3.3: check-bytecode
$(PYTHON) test_pythonlib.py --bytecode-3.3 --verify $(COMPILE)
#: Run working tests from Python 3.5
check-3.5: check-bytecode
#: Run working tests from Python 3.4
check-3.4: check-bytecode check-3.4-ok check-2.7-ok
$(PYTHON) test_pythonlib.py --bytecode-3.4 --verify $(COMPILE)
#: Run working tests from Python 3.5
check-3.5: check-bytecode
$(PYTHON) test_pythonlib.py --bytecode-3.5 --verify $(COMPILE)
#: Check deparsing only, but from a different Python version
check-disasm:
$(PYTHON) dis-compare.py
#: Check deparsing bytecode 2.x only
check-bytecode-2:
$(PYTHON) test_pythonlib.py --bytecode-2.3 --bytecode-2.4 --bytecode-2.5 --bytecode-2.6 --bytecode-2.7
$(PYTHON) test_pythonlib.py --bytecode-2.3 --bytecode-2.4 \
--bytecode-2.5 --bytecode-2.6 --bytecode-2.7 --bytecode-pypy2.7
#: Check deparsing bytecode 3.x only
check-bytecode-3:
$(PYTHON) test_pythonlib.py --bytecode-3.2 --bytecode-3.3 --bytecode-3.4 --bytecode-3.5
$(PYTHON) test_pythonlib.py --bytecode-3.2 --bytecode-3.3 \
--bytecode-3.4 --bytecode-3.5 --bytecode-pypy3.2
#: Check deparsing bytecode that works running Python 2 and Python 3
check-bytecode: check-bytecode-3
$(PYTHON) test_pythonlib.py --bytecode-2.3 --bytecode-2.4 --bytecode-2.5 --bytecode-2.6 --bytecode-2.7
$(PYTHON) test_pythonlib.py --bytecode-2.3 --bytecode-2.4 \
--bytecode-2.5 --bytecode-2.6 --bytecode-2.7 --bytecode-pypy2.7
#: Check deparsing Python 2.3
check-bytecode-2.3:
@@ -109,6 +113,18 @@ check-3.2-ok:
check-3.4-ok:
$(PYTHON) test_pythonlib.py --ok-3.4 --verify $(COMPILE)
#: PyPy of some sort. E.g. [PyPy 5.0.1 with GCC 4.8.4]
# Skip for now
2.6:
#: PyPy 5.0.x with Python 2.7 ...
pypy-2.7 5.0:
$(PYTHON) test_pythonlib.py --bytecode-pypy2.7 --verify
#: PyPy 2.4.x with Python 3.2 ...
pypy-3.2 2.4:
$(PYTHON) test_pythonlib.py --bytecode-pypy3.2 --verify
clean: clean-py-dis clean-dis clean-unverified
clean-dis:

View File

@@ -6,7 +6,10 @@ assert len(sys.argv) >= 2
version = sys.version[0:3]
for path in sys.argv[1:]:
short = os.path.basename(path)
cfile = "bytecode_%s/%s" % (version, short) + 'c'
if hasattr(sys, 'pypy_version_info'):
cfile = "bytecode_pypy%s/%s" % (version, short) + 'c'
else:
cfile = "bytecode_%s/%s" % (version, short) + 'c'
print("byte-compiling %s to %s" % (path, cfile))
py_compile.compile(path, cfile)
if isinstance(version, str) or version >= (2, 6, 0):

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,18 @@
# Issue #38 in Python 2.7
# Problem is distinguishing 'continue' from 'jump_back'
# in assembly instructions.
# Here, we hack looking for two jump backs
# followed by the end of the except. This
# is a big hack.
for a in [__name__]:
try:len(a)
except:continue
# The above has JUMP_ABSOLUTE in it.
# This has JUMP_FORWARD instead.
for a in [__name__]:
try:len(a)
except:continue
y = 2

View File

@@ -0,0 +1,9 @@
# Ensure PyPy handling of:
# key, value in slotstate.items().
# PyPy uses LOOKUP_METHOD and CALL_METHOD instead
# of LOAD_ATTR and CALL_FUNCTION
def bug(state, slotstate):
if state:
if slotstate is not None:
for key, value in slotstate.items():
setattr(state, key, 2)

View File

@@ -0,0 +1,9 @@
# From 3.3.5 turtledemo/bytedesign.py
# Python 3.2 and 3.3 adds this funny
# LOAD_FAST STORE_LOCALS
# which we translate to
# # inspect.currentframe().f_locals = __locals__
from turtle import Turtle
class Designer(Turtle):
def design(self, homePos, scale):
pass

View File

@@ -0,0 +1,7 @@
# Tests Python 3.5+'s ops
# BINARY_MATRIX_MULTIPLY and INPLACE_MATRIX_MULTIPLY
# code taken from pycdc tests/35_matrix_mult_oper.pyc.src
m = [1, 2] @ [3, 4]
m @= [5, 6]

View File

@@ -0,0 +1,4 @@
# From PyPy 2.6.1 datetime
# PyPy has simpler handling of assign3 and assign2
i, n = 0, 1
a, b, c = 1, 2, 3

Some files were not shown because too many files have changed in this diff Show More