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
405 Commits
release-2.
...
release-2.
Author | SHA1 | Date | |
---|---|---|---|
|
da50394841 | ||
|
13d5cd1a58 | ||
|
08dcc7d820 | ||
|
7755563b65 | ||
|
b43cbc050d | ||
|
db7a26d47d | ||
|
92166452c1 | ||
|
96fa3ef381 | ||
|
755415c7d8 | ||
|
b168e1de55 | ||
|
38eed14b41 | ||
|
2c993f8c32 | ||
|
65858a4c74 | ||
|
263c63e009 | ||
|
813bce4697 | ||
|
a5d2237435 | ||
|
d22931cb49 | ||
|
9cc2700160 | ||
|
a5a0f45dde | ||
|
3c02fa7e36 | ||
|
0d0f836f76 | ||
|
69c93cc665 | ||
|
97576e473d | ||
|
1e324e0e8d | ||
|
7ab4e1fbdb | ||
|
abecb21671 | ||
|
8be6369bdf | ||
|
8941417a54 | ||
|
cbcfd53dae | ||
|
df2ca51f4a | ||
|
4f4069c6b5 | ||
|
6aa1531972 | ||
|
4fcb385dc0 | ||
|
260ddedbfd | ||
|
f8917aaf88 | ||
|
c8550d5c9e | ||
|
1aeb09cb8b | ||
|
f575234fc8 | ||
|
abcd10628a | ||
|
eb2b63ce9c | ||
|
805e17988e | ||
|
80df5dcc95 | ||
|
2bc316d6f0 | ||
|
195bbc746b | ||
|
0f56b4f476 | ||
|
94719918d4 | ||
|
f2a3721d7d | ||
|
79863ae122 | ||
|
d7f898b4fb | ||
|
fe36c9e9f6 | ||
|
76ae1592d0 | ||
|
31d387749b | ||
|
9e3026bd78 | ||
|
bfe7e7777d | ||
|
81b4941fda | ||
|
0f719d41fd | ||
|
766451cbb9 | ||
|
1e4dc52197 | ||
|
6073c77921 | ||
|
b6e53205dd | ||
|
ee6dddd25a | ||
|
968a54512b | ||
|
a81ffe8963 | ||
|
3b9e48a3b6 | ||
|
80a4ad4f1b | ||
|
50c2e1bda9 | ||
|
f4999f6300 | ||
|
0f536b18fa | ||
|
6fb879d0d8 | ||
|
411eaaeafb | ||
|
36874c72e2 | ||
|
7343575e55 | ||
|
fef0567746 | ||
|
41f360e3dc | ||
|
5d10f7a0b0 | ||
|
2a5eda631a | ||
|
a685c60606 | ||
|
d2ac293cf6 | ||
|
cd3cf5ec29 | ||
|
2eaea447eb | ||
|
287e98b4b1 | ||
|
63e4c9343f | ||
|
eab653afdd | ||
|
7700446bb1 | ||
|
bfd2f77fbc | ||
|
1574bf4e1e | ||
|
2328ca7a55 | ||
|
ccdd37611c | ||
|
2e355b6245 | ||
|
9849f06ff6 | ||
|
0e7da031b2 | ||
|
25dd67a135 | ||
|
1a38d3d9aa | ||
|
de65a2c250 | ||
|
7daec3352c | ||
|
8feb472d51 | ||
|
7a10917857 | ||
|
334f6935b6 | ||
|
aff920d87b | ||
|
6319d33fa0 | ||
|
abb61a4d7d | ||
|
b54a19c6ff | ||
|
a4c943fe0d | ||
|
0480455ae1 | ||
|
9b7d978944 | ||
|
a6befdee09 | ||
|
d6f7ef4e17 | ||
|
cec80e696c | ||
|
0826129112 | ||
|
7beaa9f36c | ||
|
78ef16e4d7 | ||
|
59b597ea5d | ||
|
cb8ffa51d7 | ||
|
a7ef513849 | ||
|
8e62a48c96 | ||
|
6d3b934bf2 | ||
|
27fb5758bd | ||
|
5703ccd8b8 | ||
|
20ba165e4a | ||
|
7eb9210b0c | ||
|
fe072d8b57 | ||
|
f430b0dbe4 | ||
|
9ef670c872 | ||
|
c04fe00e50 | ||
|
52691c4e8a | ||
|
f067148b6c | ||
|
bb8d0a6389 | ||
|
97ce330b00 | ||
|
8b240a80e7 | ||
|
e888a87d15 | ||
|
f41426e94b | ||
|
22dee55ff7 | ||
|
8916447adb | ||
|
478602bfa5 | ||
|
056f600da1 | ||
|
2e1bd2dc13 | ||
|
346d8678d2 | ||
|
4411ecceba | ||
|
a4dd6e9805 | ||
|
b52f341d46 | ||
|
2ada29618f | ||
|
649e4518fe | ||
|
0df2c8b4bb | ||
|
d2b477ae7d | ||
|
a8f9f2170f | ||
|
fe46015b78 | ||
|
051efb80f5 | ||
|
1fc8ac4700 | ||
|
c87710dd4b | ||
|
ccd129b377 | ||
|
c03a8186b5 | ||
|
8bc76f19b9 | ||
|
6908898b90 | ||
|
fa1a6347e9 | ||
|
760532b218 | ||
|
88f2ad1f5a | ||
|
d271e886d9 | ||
|
c0b4a5e703 | ||
|
b6dee24289 | ||
|
0e9ebca1a5 | ||
|
f3b9a5936e | ||
|
bae3d2e361 | ||
|
4f83a87a00 | ||
|
d8b7c3d813 | ||
|
c119965d96 | ||
|
b02754c954 | ||
|
23770fca64 | ||
|
71591152ef | ||
|
251de4338a | ||
|
03e8995d18 | ||
|
dd661bc94a | ||
|
c4e6af6e4f | ||
|
57d1f3b9f9 | ||
|
2d11ffb669 | ||
|
b7f1f1b028 | ||
|
0fce4c6dc3 | ||
|
c44d4898cb | ||
|
fecae9f902 | ||
|
60b25f7596 | ||
|
318311818e | ||
|
c7788e4545 | ||
|
979bca4fe0 | ||
|
47a56d3387 | ||
|
647248dfc8 | ||
|
f4ac13ef0f | ||
|
8f95ec9882 | ||
|
75c718bc5c | ||
|
b6fd9088b8 | ||
|
4d046eb0bd | ||
|
52a35e6c62 | ||
|
f1bb40f485 | ||
|
136f935e26 | ||
|
f5eeed6759 | ||
|
1d567d5d9a | ||
|
c9f364df9f | ||
|
6189ce3c04 | ||
|
6f2cdc164d | ||
|
e4cc126b38 | ||
|
da458bdce7 | ||
|
f47aecae9f | ||
|
ddc5460030 | ||
|
835c4151c3 | ||
|
1087613a27 | ||
|
a67891c563 | ||
|
31413be7a1 | ||
|
98a6f47ad6 | ||
|
2e3e6658ee | ||
|
85c562cb36 | ||
|
5ab3e52c9c | ||
|
004ce5c491 | ||
|
599ceddd08 | ||
|
6547d0230f | ||
|
a65443ee02 | ||
|
2bd850f297 | ||
|
90477edf04 | ||
|
c912d16b50 | ||
|
8dd405a5ee | ||
|
116a22a425 | ||
|
7d771b9a8c | ||
|
a1972bbc08 | ||
|
8a91081535 | ||
|
0958dc889d | ||
|
33a0c75b69 | ||
|
7ccbd419c6 | ||
|
a45ee15cf2 | ||
|
fb5ad76c4e | ||
|
d8598f61e4 | ||
|
5f52cce24d | ||
|
70463e036a | ||
|
7fba24198f | ||
|
e06a90ed27 | ||
|
d030a04c1a | ||
|
37d5a05241 | ||
|
5d27832d6f | ||
|
6b98432082 | ||
|
109e813058 | ||
|
4b8cb11d77 | ||
|
c77e9cdaf8 | ||
|
4c2f0df3dc | ||
|
b49d30266f | ||
|
65a16327ce | ||
|
fff09db66e | ||
|
3ef0325cb8 | ||
|
3a6f9d8f24 | ||
|
d14865c1be | ||
|
152935ab26 | ||
|
5c9c0228ee | ||
|
ac121076e6 | ||
|
04ae94ee9e | ||
|
e8ed17967c | ||
|
3f7c4209d9 | ||
|
f33f425692 | ||
|
5ffd9b2be7 | ||
|
87dc5ad80c | ||
|
177a422b87 | ||
|
3a78332d59 | ||
|
5e801b5d74 | ||
|
2523b340cd | ||
|
c3f6fa32db | ||
|
6dc9d3ab2f | ||
|
74f440bd0b | ||
|
affc504418 | ||
|
ecbbc7dfea | ||
|
6c5bd6289f | ||
|
9f0b0809b1 | ||
|
f0a8505887 | ||
|
04cc80b0d6 | ||
|
281f429223 | ||
|
8cfecff9c4 | ||
|
116b6eb468 | ||
|
2509d212e5 | ||
|
96b83c3d85 | ||
|
a3e10db8dc | ||
|
7e1aa6a34d | ||
|
476eb50868 | ||
|
285444e19a | ||
|
aed4d23c34 | ||
|
1c50e34c30 | ||
|
1be53ca729 | ||
|
808e468e5e | ||
|
936b213cec | ||
|
21683719e1 | ||
|
9754d27597 | ||
|
7e8173b076 | ||
|
ca9888ace4 | ||
|
070b7dab7b | ||
|
44d95e40e6 | ||
|
f6f3ad362b | ||
|
21377f3b43 | ||
|
a5f45f232d | ||
|
7c4316d4fb | ||
|
d1ef0bf21b | ||
|
063e517a7c | ||
|
4a3a62d01b | ||
|
ea733c31d7 | ||
|
63ec3f934a | ||
|
7c261d8495 | ||
|
942b15e3c6 | ||
|
69e65463b7 | ||
|
cd8cbf9200 | ||
|
accc959b71 | ||
|
0ee52aeeef | ||
|
c9d1f72424 | ||
|
29990c8da0 | ||
|
4e6e38358d | ||
|
fb870ccd8d | ||
|
7b7a9fa4cf | ||
|
1e25ffa879 | ||
|
7cc55f0c5f | ||
|
723ba1365f | ||
|
6a125d49d8 | ||
|
fd0d8d2567 | ||
|
772c67fcd7 | ||
|
bc86b73cf0 | ||
|
b99f196d18 | ||
|
78f24f9c66 | ||
|
55b269f744 | ||
|
8e0413273b | ||
|
c10b9babbe | ||
|
9fdf70f68d | ||
|
f571f6dfce | ||
|
59ba8a65cd | ||
|
9c2f48ca4a | ||
|
44dba42a40 | ||
|
af62286357 | ||
|
3cd3f7ccdf | ||
|
52b71bb01a | ||
|
c098b834fa | ||
|
15bb9e3823 | ||
|
21da5e787e | ||
|
b44c566a9f | ||
|
65b9ecee31 | ||
|
047c95a1e5 | ||
|
5f9f8f4d79 | ||
|
ac45e5757c | ||
|
e40d5d3897 | ||
|
ae78e9f930 | ||
|
0075c8a5f7 | ||
|
d6b35d57e4 | ||
|
11eddb7940 | ||
|
ec66dc0639 | ||
|
e31f829a56 | ||
|
61535a010d | ||
|
62e60817f6 | ||
|
7fdb4d3e68 | ||
|
e020f8f9a9 | ||
|
b640d42113 | ||
|
1a2aa41f7d | ||
|
170244181f | ||
|
6f5dce342f | ||
|
f3696cc3f1 | ||
|
13ae869267 | ||
|
663e724788 | ||
|
06023c247d | ||
|
21314c1dad | ||
|
0b6108801d | ||
|
42f26c3ffd | ||
|
8b305f78f4 | ||
|
72c781258f | ||
|
f865ecaa58 | ||
|
14b4f8e2da | ||
|
aa65b098a4 | ||
|
a1dab0fa3a | ||
|
0adf70b4d9 | ||
|
694e1edd00 | ||
|
a34f1fcd7a | ||
|
04698f45cc | ||
|
974b11ff55 | ||
|
4d9d659cfa | ||
|
bec1524c5a | ||
|
12d22c055f | ||
|
4dff02b19c | ||
|
71822bf9b3 | ||
|
fa6ae76a64 | ||
|
44c03ff7c7 | ||
|
261c60efd9 | ||
|
d87b5fe34c | ||
|
bd5b2be8fa | ||
|
73a043830c | ||
|
da9aeecc60 | ||
|
7772243ac7 | ||
|
f573013501 | ||
|
4b0b7f76dc | ||
|
d7f7748000 | ||
|
5b2198a4a6 | ||
|
1ce1cf87a4 | ||
|
32ca0c4482 | ||
|
0af3dd28bc | ||
|
36432c7488 | ||
|
74c6b38fd8 | ||
|
ae980e4f64 | ||
|
21216b4eb1 | ||
|
40d4348757 | ||
|
622f83970b | ||
|
460ad129cc | ||
|
fa84f4277a | ||
|
fa7d8f955a | ||
|
fe8000e02a | ||
|
4fa68b8894 | ||
|
36b7521597 | ||
|
f474ea648b | ||
|
7a4e3a05ff | ||
|
982a6010a1 | ||
|
c9fd86e38e | ||
|
9a251b239e |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,7 +1,7 @@
|
|||||||
|
*.pyo
|
||||||
*.pyc
|
*.pyc
|
||||||
*_dis
|
*_dis
|
||||||
*~
|
*~
|
||||||
*.pyc
|
|
||||||
/.cache
|
/.cache
|
||||||
/.eggs
|
/.eggs
|
||||||
/.python-version
|
/.python-version
|
||||||
@@ -13,5 +13,6 @@
|
|||||||
/nose-*.egg
|
/nose-*.egg
|
||||||
/tmp
|
/tmp
|
||||||
/uncompyle6.egg-info
|
/uncompyle6.egg-info
|
||||||
|
/unpyc
|
||||||
__pycache__
|
__pycache__
|
||||||
build
|
build
|
||||||
|
@@ -4,9 +4,11 @@ sudo: false
|
|||||||
|
|
||||||
python:
|
python:
|
||||||
- '3.5'
|
- '3.5'
|
||||||
- '2.7.11'
|
- '2.7.12'
|
||||||
- '2.6'
|
- '2.6'
|
||||||
|
- '3.3'
|
||||||
- '3.4'
|
- '3.4'
|
||||||
|
- '3.2'
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- pip install -r requirements.txt
|
- pip install -r requirements.txt
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
This is the changelog from *decompyle*'s release 2.4 passed on by Dan Pascu
|
This is the changelog from *decompyle*'s release 2.4 and before
|
||||||
|
passed on by Dan Pascu
|
||||||
|
|
||||||
|
|
||||||
release 2.4 (Dan Pascu)
|
release 2.4 (Dan Pascu)
|
||||||
@@ -74,3 +75,57 @@ release 2.2beta1 (hartmut Goebel)
|
|||||||
- use a single Walker and a single Parser, thus saving time and memory
|
- use a single Walker and a single Parser, thus saving time and memory
|
||||||
- use augmented assign and 'print >>' internally
|
- use augmented assign and 'print >>' internally
|
||||||
- optimized 'Walker.engine', the main part of code generation
|
- optimized 'Walker.engine', the main part of code generation
|
||||||
|
release 0.6.0: (hartmut Goebel)
|
||||||
|
- extended print (Python 2.0)
|
||||||
|
- extended import (Python 2.0) (may not cover all cases)
|
||||||
|
- augmented assign (Python 2.0) (may not cover all cases)
|
||||||
|
- list comprehensions (Python 2.0)
|
||||||
|
- equivalent for 'apply' (Python 1.6)
|
||||||
|
- if .. elif .. else are now nested as expected
|
||||||
|
- assert test, data
|
||||||
|
- unpack list corrected (was the same as unpack tuple)
|
||||||
|
- fixed unpack tuple (trailing semicolon was missing)
|
||||||
|
- major speed up :-)
|
||||||
|
- reduced memory usage (pre-alpha-0.5 has increased it a lot)
|
||||||
|
- still missing: EXTENDED_ARG
|
||||||
|
|
||||||
|
pre-alpha-0.5: (hartmut Goebel)
|
||||||
|
- *args, **kwargs
|
||||||
|
- global
|
||||||
|
- formal tuple parameters (eg. def a(self, (x,y,z)) )
|
||||||
|
- actual lambda parameters (eg. X(lambda z: z**2) )
|
||||||
|
- remove last 'return None' in procedures
|
||||||
|
- remove last 'return locals()' in class definitions
|
||||||
|
- docstrings
|
||||||
|
|
||||||
|
pre-alpha-0.4: (hartmut Goebel)
|
||||||
|
- assert
|
||||||
|
- try/except/finally
|
||||||
|
- parentheses in expressions
|
||||||
|
- nested expressions
|
||||||
|
- extracted dissassemble() from module dis and
|
||||||
|
removed ugly redirect of stdout, thus saved a lot of
|
||||||
|
ugly code and a lot of memory
|
||||||
|
|
||||||
|
pre-alpha-0.3: (hartmut Goebel)
|
||||||
|
- keyword arguments
|
||||||
|
- some boolean expressions
|
||||||
|
- and/or
|
||||||
|
- complex conditions in if/while
|
||||||
|
- read byte-code from .pyc without importing
|
||||||
|
- access to the body of classes and modules
|
||||||
|
- class and function definitions
|
||||||
|
- a = b = c = xxx
|
||||||
|
|
||||||
|
pre-alpha-0.1 -> pre-alpha-0.2:
|
||||||
|
- SET_LINENO filtered out in lexer now
|
||||||
|
- added support for subscripts (just for Christian Tismer :-)
|
||||||
|
- fixed bug with handling of BUILD_{LIST,TUPLE} & CALL_FUNCTION
|
||||||
|
- dict-building support
|
||||||
|
- comparison support
|
||||||
|
- exec support
|
||||||
|
- del support
|
||||||
|
- pass support
|
||||||
|
- slice support
|
||||||
|
- no more extraneous (albeit legal) commas
|
||||||
|
- finally, it excepts try [sic] but not all 42 variations of it
|
||||||
|
29
HISTORY.md
29
HISTORY.md
@@ -29,7 +29,9 @@ augmented with pseudo instruction COME_FROM. This code introduced
|
|||||||
another clever idea: using table-driven semantics routines, using
|
another clever idea: using table-driven semantics routines, using
|
||||||
format specifiers.
|
format specifiers.
|
||||||
|
|
||||||
The last mention of a release of SPARK from John is around 2002.
|
The last mention of a release of SPARK from John is around 2002. As
|
||||||
|
released, although the Early Algorithm parser was in good shape, this
|
||||||
|
code was woefully lacking as serious Python deparser.
|
||||||
|
|
||||||
In the fall of 2000, Hartmut Goebel
|
In the fall of 2000, Hartmut Goebel
|
||||||
[took over maintaining the code](https://groups.google.com/forum/#!searchin/comp.lang.python/hartmut$20goebel/comp.lang.python/35s3mp4-nuY/UZALti6ujnQJ). The
|
[took over maintaining the code](https://groups.google.com/forum/#!searchin/comp.lang.python/hartmut$20goebel/comp.lang.python/35s3mp4-nuY/UZALti6ujnQJ). The
|
||||||
@@ -93,8 +95,18 @@ so. Then hamled made a few commits earler on, while Eike Siewertsen
|
|||||||
made a few commits later on. But mostly wibiti, and Guenther
|
made a few commits later on. But mostly wibiti, and Guenther
|
||||||
Starnberger got the code to where uncompyle2 was around 2012.
|
Starnberger got the code to where uncompyle2 was around 2012.
|
||||||
|
|
||||||
This project, uncompyle6, however owes its existence to the fork of
|
In uncompyle2 decompilation of python bytecode 2.5 & 2.6 is done by
|
||||||
uncompyle2 by Myst herie (Mysterie) whose first commit picks up at
|
transforming the byte code into a a pseudo 2.7 python bytecode and is
|
||||||
|
based on code from Eloi Vanderbeken.
|
||||||
|
|
||||||
|
This project, uncompyle6, abandons that approach for various
|
||||||
|
reasons. However the main reason is that we need offsets in fragment
|
||||||
|
deparsing to be exactly the same, and the transformation process can
|
||||||
|
remove instructions. Adding instructions with psuedo_offsets is
|
||||||
|
however okay.
|
||||||
|
|
||||||
|
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
|
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
|
actively, if briefly, worked on. Also starting around 2012 is Dark
|
||||||
Fenx's uncompyle3 which I used for inspiration for Python3 support.
|
Fenx's uncompyle3 which I used for inspiration for Python3 support.
|
||||||
@@ -102,13 +114,18 @@ Fenx's uncompyle3 which I used for inspiration for Python3 support.
|
|||||||
I started working on this late 2015, mostly to add fragment 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+
|
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
|
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
|
3.2+. In doing so, it has been expedient to separate this into three
|
||||||
only after code is better cleaned up and supports Python 3 better.)
|
projects: load loading and disassembly (xdis), parsing and tree
|
||||||
|
building (spark_parser), and grammar and semantic actions for
|
||||||
|
decompiling (uncompyle6).
|
||||||
|
|
||||||
|
|
||||||
Over the many years, code styles and Python features have
|
Over the many years, code styles and Python features have
|
||||||
changed. However brilliant the code was and still is, it hasn't really
|
changed. However brilliant the code was and still is, it hasn't really
|
||||||
had a single public active maintainer. And there have been many forks
|
had a single public active maintainer. And there have been many forks
|
||||||
of the code.
|
of the code. I have spent a great deal of time trying to organize and
|
||||||
|
modularize the code so that it can handle more Python versions more
|
||||||
|
gracefully (with still only moderate success).
|
||||||
|
|
||||||
That it has been in need of an overhaul has been recognized by the
|
That it has been in need of an overhaul has been recognized by the
|
||||||
Hartmut a decade an a half ago:
|
Hartmut a decade an a half ago:
|
||||||
|
@@ -2,10 +2,16 @@ include README.rst
|
|||||||
include ChangeLog
|
include ChangeLog
|
||||||
include HISTORY.md
|
include HISTORY.md
|
||||||
include LICENSE
|
include LICENSE
|
||||||
|
include Makefile
|
||||||
|
include requirements.txt
|
||||||
|
include requirements-dev.txt
|
||||||
include DECOMPYLE-2.4-CHANGELOG.txt
|
include DECOMPYLE-2.4-CHANGELOG.txt
|
||||||
include __pkginfo__.py
|
include __pkginfo__.py
|
||||||
recursive-include uncompyle6 *.py
|
recursive-include uncompyle6 *.py
|
||||||
include bin/uncompyle6
|
include bin/uncompyle6
|
||||||
include bin/pydisassemble
|
include bin/pydisassemble
|
||||||
|
include pytest/Makefile
|
||||||
|
include test/Makefile
|
||||||
recursive-include test *.py *.pyc
|
recursive-include test *.py *.pyc
|
||||||
recursive-include pytest *.py
|
recursive-include pytest *.py
|
||||||
|
recursive-include pytest/testdata *
|
||||||
|
10
Makefile
10
Makefile
@@ -33,13 +33,21 @@ check-2.7 check-3.3 check-3.4: pytest
|
|||||||
|
|
||||||
#: Tests for Python 3.2 and 3.5 - pytest doesn't work here
|
#: Tests for Python 3.2 and 3.5 - pytest doesn't work here
|
||||||
# Or rather 3.5 doesn't work not on Travis
|
# Or rather 3.5 doesn't work not on Travis
|
||||||
check-3.2 check-3.5:
|
check-3.0 check-3.1 check-3.2 check-3.5 check-3.6:
|
||||||
$(MAKE) -C test $@
|
$(MAKE) -C test $@
|
||||||
|
|
||||||
#:Tests for Python 2.6 (doesn't have pytest)
|
#:Tests for Python 2.6 (doesn't have pytest)
|
||||||
check-2.6:
|
check-2.6:
|
||||||
$(MAKE) -C test $@
|
$(MAKE) -C test $@
|
||||||
|
|
||||||
|
#:PyPy 2.6.1 or PyPy 5.0.1
|
||||||
|
# Skip for now
|
||||||
|
2.6 5.0 5.3:
|
||||||
|
|
||||||
|
#:PyPy pypy3-2.4.0 Python 3:
|
||||||
|
pypy-3.2 2.4:
|
||||||
|
$(MAKE) -C test $@
|
||||||
|
|
||||||
#: Run py.test tests
|
#: Run py.test tests
|
||||||
pytest:
|
pytest:
|
||||||
$(MAKE) -C pytest check
|
$(MAKE) -C pytest check
|
||||||
|
188
NEWS
188
NEWS
@@ -1,3 +1,191 @@
|
|||||||
|
uncompyle6 2.9.7 2016-12-16
|
||||||
|
|
||||||
|
- Start to handle 3.5/3.6 build_map_unpack_with_call
|
||||||
|
- Some Python 3.6 bytecode to wordcode conversion fixes
|
||||||
|
- option -g: show start-end range when possible
|
||||||
|
- track print_docstring move to help (used in python 3.1)
|
||||||
|
- verify: allow RETURN_VALUE to match RETURN_END_IF
|
||||||
|
- some 3.2 compatibility
|
||||||
|
- Better Python 3 control flow detection by adding Pseudo ELSE opcodes
|
||||||
|
|
||||||
|
uncompyle6 2.9.6 2016-12-04
|
||||||
|
|
||||||
|
- Shorten Python3 grammars with + and *
|
||||||
|
this requires spark parser 1.5.1
|
||||||
|
- Add some AST reduction checks to improve
|
||||||
|
decompile accuracy. This too requires
|
||||||
|
spark parser 1.5.1
|
||||||
|
|
||||||
|
uncompyle6 2.9.6 2016-11-20
|
||||||
|
|
||||||
|
- Correct MANIFEST.in
|
||||||
|
- More AST grammar checking
|
||||||
|
- --linemapping option or linenumbers.line_number_mapping()
|
||||||
|
Shows correspondence of lines between source
|
||||||
|
and decompiled source
|
||||||
|
- Some control flow adjustments in code for 2.x.
|
||||||
|
This is probably an improvement in 2.6 and before.
|
||||||
|
For 2.7 things are just shuffled around a little. Sigh.
|
||||||
|
Overall I think we are getting more precise in
|
||||||
|
or analysis even if it is not always reflected
|
||||||
|
in the results.
|
||||||
|
- better control flow debugging output
|
||||||
|
- Python 2 and 3 detect structure code is more similar
|
||||||
|
- Handle Docstrings with embedded tiple quotes (""")
|
||||||
|
|
||||||
|
uncompyle6 2.9.5 2016-11-13
|
||||||
|
|
||||||
|
- Fix Python 3 bugs:
|
||||||
|
* improprer while 1 else
|
||||||
|
* docstring indent
|
||||||
|
* 3.3 default values in lambda expressions
|
||||||
|
* start 3.0 decompilation (needs newer xdis)
|
||||||
|
- Start grammar misparse checking
|
||||||
|
|
||||||
|
|
||||||
|
uncompyle6 2.9.4 2016-11-02
|
||||||
|
|
||||||
|
- Handle Python 3.x function annotations
|
||||||
|
- track def keywoard-parameter line-splitting in source code better
|
||||||
|
- bump min xdis version to mask previous xdis bug
|
||||||
|
|
||||||
|
uncompyle6 2.9.3 2016-10-26
|
||||||
|
|
||||||
|
Release forced by incompatiblity change in xdis 3.2.0.
|
||||||
|
|
||||||
|
- Python 3.1 bugs:
|
||||||
|
* handle "with ... as"
|
||||||
|
* handle "with"
|
||||||
|
* Start handling def (...) -> yy (has bugs still)
|
||||||
|
|
||||||
|
- DRY Python 3.x via inheritance
|
||||||
|
- Python 3.6 work (from Daniel Bradburn)
|
||||||
|
* Handle 3.6 buildstring
|
||||||
|
* Handle 3.6 handle single and multiple fstring better
|
||||||
|
|
||||||
|
|
||||||
|
uncompyle6 2.9.2 2016-10-15
|
||||||
|
|
||||||
|
- use source-code line breaks to assist in where to break
|
||||||
|
in tuples and maps
|
||||||
|
- Fix Python 1.5 decompyle bugs
|
||||||
|
- Fix some Python 2.6 and below bugs
|
||||||
|
- DRY fragments.py code a little
|
||||||
|
|
||||||
|
uncompyle6 2.9.1 2016-10-09
|
||||||
|
|
||||||
|
- Improved Python 1.5 decompiling
|
||||||
|
- Handle old-style pre Python 2.2 classes
|
||||||
|
|
||||||
|
uncompyle6 2.9.0 2016-10-09
|
||||||
|
|
||||||
|
- Use xdis 3.0.0 protocol load_module.
|
||||||
|
this Forces change in requirements.txt and _pkg_info_.py
|
||||||
|
- Start Python 1.5 decompiling; another round of work is needed to
|
||||||
|
remove bugs
|
||||||
|
- Simpify python 2.1 grammar
|
||||||
|
- Fix bug with -t ... Wasn't showing source text when -t option was given
|
||||||
|
- Fix 2.1-2.6 bug in list comprehension
|
||||||
|
|
||||||
|
uncompyle6 2.8.4 2016-10-08
|
||||||
|
|
||||||
|
- Python 3 disassembly bug fixes
|
||||||
|
- Python 3.6 fstring bug fixes (from moagstar)
|
||||||
|
- Python 2.1 disassembly
|
||||||
|
- COME_FROM suffixes added in Python3
|
||||||
|
- use .py extension in verification disassembly
|
||||||
|
|
||||||
|
uncompyle6 2.8.3 2016-09-11 live from NYC!
|
||||||
|
|
||||||
|
NOTE: this is possibly the last release before a major reworking of
|
||||||
|
control-flow structure detection is done.
|
||||||
|
|
||||||
|
- Lots of bug fixes in decompilation:
|
||||||
|
* 3.0 .. 3.4 whileTrue bug
|
||||||
|
* 3.x function declaration deparsing:
|
||||||
|
. 3.0 .. 3.2 *args processing
|
||||||
|
. 3.0 .. 3.2 call name and kwargs bug
|
||||||
|
. 3.0 .. getting parameter of *
|
||||||
|
. 3.0 .. handling varible number of args
|
||||||
|
. 3.0 .. "if" structure bugs
|
||||||
|
* 3.5+ if/else bugs
|
||||||
|
* 2.2-2.6 bugs
|
||||||
|
. try/except control flow
|
||||||
|
. a == b == c -like detection
|
||||||
|
. generator detection
|
||||||
|
. "while .. and" statement bugs
|
||||||
|
. handle "except <cond>, <var>"
|
||||||
|
. use older raise format in 2.x
|
||||||
|
- scanner "disassemble" is now "ingest". True disassembly is done by xdis
|
||||||
|
- Start accepting Python 3.1 bytecode
|
||||||
|
- Add --weak-verify option on test_pyenvlib and test_pythonlib. This
|
||||||
|
catches more bugs more easily
|
||||||
|
- bump xdis requirement so we can deparse dropbox 2.5 code
|
||||||
|
- Added H. Goebel's changes before 2.4 in DECOMPYLE-2.4-CHANGELOG.txt
|
||||||
|
|
||||||
|
uncompyle6 2.8.2 2016-08-29
|
||||||
|
|
||||||
|
- Handle Python 3.6 format string conversions !r, !s, !a
|
||||||
|
- Start to handle 3.1 bytecode
|
||||||
|
- Fix some PyPy translation bugs
|
||||||
|
- We now only handle 3.6.0a3+ since that is incompatible with 3.6 before that
|
||||||
|
|
||||||
|
uncompyle6 2.8.1 2016-08-20
|
||||||
|
|
||||||
|
- Add Python 2.2 decompilation
|
||||||
|
|
||||||
|
- Fix bugs
|
||||||
|
* PyPy LOOKUP_METHOD bug
|
||||||
|
* Python 3.6 FORMAT_VALUE handles expressions now
|
||||||
|
|
||||||
|
uncompyle6 2.8.0 2016-08-03
|
||||||
|
|
||||||
|
- Start Python 3.6 support (moagstar)
|
||||||
|
more work on PEP 498 needed
|
||||||
|
- tidy bytecode/word output
|
||||||
|
- numerous decompiling bugs fixed
|
||||||
|
- grammar testing started
|
||||||
|
- show magic number in deparsed output
|
||||||
|
- better grammar and semantic action segregation based
|
||||||
|
on python bytecode version
|
||||||
|
|
||||||
|
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
|
||||||
|
- Fix bugs:
|
||||||
|
* 3.x and 2.7 set comprehensions,
|
||||||
|
* while1 loops
|
||||||
|
* continue statements
|
||||||
|
- DRY and segregate grammar more
|
||||||
|
|
||||||
|
uncompyle6 2.6.1 2016-07-08
|
||||||
|
|
||||||
|
- Go over Python 2.5 bytecode deparsing
|
||||||
|
all library programs now deparse
|
||||||
|
- Fix a couple bugs in 2.6 deparsing
|
||||||
|
|
||||||
|
uncompyle6 2.6.0 2016-07-07
|
||||||
|
|
||||||
|
- Improve Python 2.6 bytecode deparsing:
|
||||||
|
stdlib now will deparse something
|
||||||
|
- Better <2.6 vs. 2.7 grammar separation
|
||||||
|
- Fix some 2.7 deparsing bugs
|
||||||
|
- Fix bug in installing uncompyle6 script
|
||||||
|
- Doc improvments
|
||||||
|
|
||||||
uncompyle6 2.5.0 2016-06-22 Summer Solstace
|
uncompyle6 2.5.0 2016-06-22 Summer Solstace
|
||||||
|
|
||||||
- Much better Python 3.2-3.5 coverage.
|
- Much better Python 3.2-3.5 coverage.
|
||||||
|
103
README.rst
103
README.rst
@@ -1,4 +1,4 @@
|
|||||||
|buildstatus|
|
|buildstatus| |Supported Python Versions|
|
||||||
|
|
||||||
uncompyle6
|
uncompyle6
|
||||||
==========
|
==========
|
||||||
@@ -11,19 +11,20 @@ Introduction
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
*uncompyle6* translates Python bytecode back into equivalent Python
|
*uncompyle6* translates Python bytecode back into equivalent Python
|
||||||
source code. It accepts bytecodes from Python version 2.5 to 3.5 or
|
source code. It accepts bytecodes from Python version 2.1 to 3.6 or
|
||||||
so. The code requires Python 2.6 or later and has been tested on Python
|
so, including PyPy bytecode and Dropbox's Python 2.5 bytecode.
|
||||||
running versions 2.6, 2.7, 3.2, 3.3, 3.4 and 3.5.
|
|
||||||
|
|
||||||
Why this?
|
Why this?
|
||||||
---------
|
---------
|
||||||
|
|
||||||
There were a number of decompyle, uncompile, uncompyle2, uncompyle3
|
There were a number of decompyle, uncompile, uncompyle2, uncompyle3
|
||||||
forks around. All of them come basically from the same code base, and
|
forks around. All of them came basically from the same code base, and
|
||||||
almost all of them not maintained very well. This code pulls these together
|
almost all of them no were no longer actively maintained. Only one
|
||||||
and addresses a number of open issues in those.
|
handled Python 3, and even there, only 3.2 or 3.3 depending on which
|
||||||
|
code is used. 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
|
ability to deparse just fragments and give source-code information
|
||||||
around a given bytecode offset.
|
around a given bytecode offset.
|
||||||
|
|
||||||
@@ -39,6 +40,14 @@ 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
|
when source-code information does not exist and there is just bytecode
|
||||||
information.
|
information.
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
------------
|
||||||
|
|
||||||
|
This project requires Python 2.6 or later, PyPy 3-2.4, or PyPy-5.0.1.
|
||||||
|
Python versions 2.3-2.7 are supported in the python-2.4 branch.
|
||||||
|
The bytecode files it can read has been tested on Python bytecodes from
|
||||||
|
versions 2.1-2.7, and 3.2-3.6 and the above-mentioned PyPy versions.
|
||||||
|
|
||||||
Installation
|
Installation
|
||||||
------------
|
------------
|
||||||
|
|
||||||
@@ -76,27 +85,66 @@ Run
|
|||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
./bin/uncompyle6 -h
|
$ uncompyle6 *compiled-python-file-pyc-or-pyo*
|
||||||
|
|
||||||
for usage help.
|
For usage help:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
$ uncompyle6 -h
|
||||||
|
|
||||||
|
|
||||||
Known Bugs/Restrictions
|
Known Bugs/Restrictions
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
Python 2 deparsing decompiles each and all the Python 2.7.10 and
|
The biggest known and possibly fixable (but hard) problem has to do
|
||||||
2.7.11 installed packages I have on my system, more than 90% verify
|
with handling control flow. All of the Python decompilers I have looked
|
||||||
ok. Some of these failures may be bugs in the verification process. So
|
at have the same problem. In some cases we can detect an erroneous
|
||||||
as such, it is probably a little better than uncompyle2. Other Python
|
decompilation and report that.
|
||||||
2 versions do worse.
|
|
||||||
|
|
||||||
ALl of the Python 3.2-3.5.4 Python standard lib packages that I have
|
About 90% of the decompilation of Python standard library packages in
|
||||||
installed on my system deparse. Each Python version has about 200
|
Python 2.7.12 verifies correctly. Over 99% of Python 2.7 and 3.3-3.5
|
||||||
byteocde files). I'm not sure how well these verify though.
|
"weakly" verify. Python 2.6 drops down to 96% weakly verifying.
|
||||||
|
Other versions drop off in quality too.
|
||||||
|
|
||||||
|
*Verification* is the process of decompiling bytecode, compiling with
|
||||||
|
a Python for that bytecode version, and then comparing the bytecode
|
||||||
|
produced by the decompiled/compiled program. Some allowance is made
|
||||||
|
for inessential differences. But other semantically equivalent
|
||||||
|
differences are not caught. For example ``1 and 0`` is decompiled to
|
||||||
|
the equivalent ``0``; remnants of the first true evaluation (1) is
|
||||||
|
lost when Python compiles this. When Python next compiles ``0`` the
|
||||||
|
resulting code is simpler.
|
||||||
|
|
||||||
|
*Weak Verification*
|
||||||
|
on the other hand doesn't check bytecode for equivalence but does
|
||||||
|
check to see if the resulting decompiled source is a valid Python
|
||||||
|
program by running the Python interpreter. Because the Python language
|
||||||
|
has changed so much, for best results you should use the same Python
|
||||||
|
Version in checking as used in the bytecode.
|
||||||
|
|
||||||
|
Later distributions average about 200 files. There is some work to do
|
||||||
|
on the lower end Python versions which is more difficult for us to
|
||||||
|
handle since we don't have a Python interpreter for versions 1.5, 1.6,
|
||||||
|
and 2.0.
|
||||||
|
|
||||||
|
Python 3.0 support is weak; 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. That has been addressed, but then it also
|
||||||
|
changes function call opcodes and its semantics.
|
||||||
|
|
||||||
|
Currently not all Python magic numbers are supported. Specifically in
|
||||||
|
some versions of Python, notably Python 3.6, the magic number has
|
||||||
|
changes several times within a version. We support only the released
|
||||||
|
magic. There are also customized Python interpreters, notably Dropbox,
|
||||||
|
which use their own magic and encrypt bytcode. With the exception of
|
||||||
|
the Dropbox's old Python 2.5 interpreter this kind of thing is not
|
||||||
|
handled.
|
||||||
|
|
||||||
|
We also don't handle PJOrion_ obfuscated code. For that try: PJOrion
|
||||||
|
Deobfuscator_ to unscramble the bytecode to get valid bytecode before
|
||||||
|
trying this tool.
|
||||||
|
|
||||||
There are a few constructs that still need to be added to Python 3.5
|
|
||||||
Python 3.6 changes things drastically by using word codes rather than
|
|
||||||
byte codes. So that will be yet another challenge
|
|
||||||
|
|
||||||
There is lots to do, so please dig in and help.
|
There is lots to do, so please dig in and help.
|
||||||
|
|
||||||
@@ -104,17 +152,20 @@ See Also
|
|||||||
--------
|
--------
|
||||||
|
|
||||||
* https://github.com/zrax/pycdc : supports all versions of Python and is written in C++
|
* 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
|
* https://code.google.com/archive/p/unpyc3/ : supports Python 3.2 only. The above projects use a different decompiling technique what is used here.
|
||||||
|
* https://github.com/figment/unpyc3/ : fork of above, but supports Python 3.3 only. Include some fixes like supporting function annotations
|
||||||
The above projects use a different decompiling technique what is used here.
|
* The HISTORY_ file.
|
||||||
|
|
||||||
The HISTORY file.
|
|
||||||
|
|
||||||
.. |downloads| image:: https://img.shields.io/pypi/dd/uncompyle6.svg
|
.. |downloads| image:: https://img.shields.io/pypi/dd/uncompyle6.svg
|
||||||
.. _trepan: https://pypi.python.org/pypi/trepan
|
.. _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
|
.. _debuggers: https://pypi.python.org/pypi/trepan3k
|
||||||
.. _remake: https://bashdb.sf.net/remake
|
.. _remake: https://bashdb.sf.net/remake
|
||||||
.. _pycdc: https://github.com/zrax/pycdc
|
.. _pycdc: https://github.com/zrax/pycdc
|
||||||
.. _this: https://github.com/rocky/python-uncompyle6/wiki/Deparsing-technology-and-its-use-in-exact-location-reporting
|
.. _this: https://github.com/rocky/python-uncompyle6/wiki/Deparsing-technology-and-its-use-in-exact-location-reporting
|
||||||
.. |buildstatus| image:: https://travis-ci.org/rocky/python-uncompyle6.svg
|
.. |buildstatus| image:: https://travis-ci.org/rocky/python-uncompyle6.svg
|
||||||
:target: https://travis-ci.org/rocky/python-uncompyle6
|
:target: https://travis-ci.org/rocky/python-uncompyle6
|
||||||
|
.. |Supported Python Versions| image:: https://img.shields.io/pypi/pyversions/uncompyle6.svg
|
||||||
|
:target: https://pypi.python.org/pypi/uncompyle6/
|
||||||
|
.. _PJOrion: http://www.koreanrandom.com/forum/topic/15280-pjorion-%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F-%D0%B4%D0%B5%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F-%D0%BE%D0%B1%D1%84
|
||||||
|
.. _Deobfuscator: https://github.com/extremecoders-re/PjOrion-Deobfuscator
|
||||||
|
@@ -12,17 +12,20 @@ copyright = """
|
|||||||
Copyright (C) 2015, 2016 Rocky Bernstein <rb@dustyfeet.com>.
|
Copyright (C) 2015, 2016 Rocky Bernstein <rb@dustyfeet.com>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
classifiers = ['Development Status :: 4 - Beta',
|
classifiers = ['Development Status :: 5 - Production/Stable',
|
||||||
'Intended Audience :: Developers',
|
'Intended Audience :: Developers',
|
||||||
'Operating System :: OS Independent',
|
'Operating System :: OS Independent',
|
||||||
'Programming Language :: Python',
|
'Programming Language :: Python',
|
||||||
'Programming Language :: Python :: 2',
|
'Programming Language :: Python :: 2.4',
|
||||||
|
'Programming Language :: Python :: 2.5',
|
||||||
'Programming Language :: Python :: 2.6',
|
'Programming Language :: Python :: 2.6',
|
||||||
'Programming Language :: Python :: 2.7',
|
'Programming Language :: Python :: 2.7',
|
||||||
'Programming Language :: Python :: 3',
|
'Programming Language :: Python :: 3.1',
|
||||||
|
'Programming Language :: Python :: 3.2',
|
||||||
'Programming Language :: Python :: 3.3',
|
'Programming Language :: Python :: 3.3',
|
||||||
'Programming Language :: Python :: 3.4',
|
'Programming Language :: Python :: 3.4',
|
||||||
'Programming Language :: Python :: 3.5',
|
'Programming Language :: Python :: 3.5',
|
||||||
|
'Programming Language :: Python :: 3.6',
|
||||||
'Topic :: Software Development :: Debuggers',
|
'Topic :: Software Development :: Debuggers',
|
||||||
'Topic :: Software Development :: Libraries :: Python Modules',
|
'Topic :: Software Development :: Libraries :: Python Modules',
|
||||||
]
|
]
|
||||||
@@ -32,17 +35,17 @@ author = "Rocky Bernstein, Hartmut Goebel, John Aycock, and others"
|
|||||||
author_email = "rb@dustyfeet.com"
|
author_email = "rb@dustyfeet.com"
|
||||||
entry_points={
|
entry_points={
|
||||||
'console_scripts': [
|
'console_scripts': [
|
||||||
'uncompyle6=uncompyle6.bin:main_bin',
|
'uncompyle6=uncompyle6.bin.uncompile:main_bin',
|
||||||
'pydisassemble=uncompyle6.bin.pydisassemble:main',
|
'pydisassemble=uncompyle6.bin.pydisassemble:main',
|
||||||
]}
|
]}
|
||||||
ftp_url = None
|
ftp_url = None
|
||||||
install_requires = ['spark-parser >= 1.4.0',
|
install_requires = ['spark-parser >= 1.5.1, < 1.6.0',
|
||||||
'xdis >= 1.1.1']
|
'xdis >= 3.2.4, < 3.3.0']
|
||||||
license = 'MIT'
|
license = 'MIT'
|
||||||
mailing_list = 'python-debugger@googlegroups.com'
|
mailing_list = 'python-debugger@googlegroups.com'
|
||||||
modname = 'uncompyle6'
|
modname = 'uncompyle6'
|
||||||
py_modules = None
|
py_modules = None
|
||||||
short_desc = 'Python byte-code disassembler and source-code converter'
|
short_desc = 'Python cross-version byte-code deparser'
|
||||||
web = 'https://github.com/rocky/python-uncompyle6/'
|
web = 'https://github.com/rocky/python-uncompyle6/'
|
||||||
|
|
||||||
# tracebacks in zip files are funky and not debuggable
|
# tracebacks in zip files are funky and not debuggable
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
machine:
|
machine:
|
||||||
python:
|
python:
|
||||||
version: 2.7.8
|
version: 2.7.10
|
||||||
environment:
|
environment:
|
||||||
COMPILE: --compile
|
COMPILE: --compile
|
||||||
|
|
||||||
|
@@ -33,7 +33,7 @@ def get_parsed_for_fn(fn):
|
|||||||
return deparse(PYTHON_VERSION, code)
|
return deparse(PYTHON_VERSION, code)
|
||||||
|
|
||||||
def check_expect(expect, parsed):
|
def check_expect(expect, parsed):
|
||||||
debug = True
|
debug = False
|
||||||
i = 2
|
i = 2
|
||||||
max_expect = len(expect)
|
max_expect = len(expect)
|
||||||
for name, offset in sorted(parsed.offsets.keys()):
|
for name, offset in sorted(parsed.offsets.keys()):
|
||||||
@@ -168,7 +168,7 @@ return (x, y)
|
|||||||
-------------
|
-------------
|
||||||
""".split("\n")
|
""".split("\n")
|
||||||
check_expect(expect, parsed)
|
check_expect(expect, parsed)
|
||||||
# ########################################################
|
########################################################
|
||||||
# # try
|
# # try
|
||||||
|
|
||||||
# expect = """
|
# expect = """
|
||||||
@@ -299,6 +299,12 @@ return
|
|||||||
Contained in...
|
Contained in...
|
||||||
i + 1
|
i + 1
|
||||||
-----
|
-----
|
||||||
|
31
|
||||||
|
return
|
||||||
|
------
|
||||||
|
Contained in...
|
||||||
|
for i in range(2): ...
|
||||||
|
------------------ ...
|
||||||
34
|
34
|
||||||
return
|
return
|
||||||
------
|
------
|
||||||
|
78
pytest/test_docstring.py
Normal file
78
pytest/test_docstring.py
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
import sys
|
||||||
|
from uncompyle6 import PYTHON3
|
||||||
|
if PYTHON3:
|
||||||
|
from io import StringIO
|
||||||
|
minint = -sys.maxsize-1
|
||||||
|
maxint = sys.maxsize
|
||||||
|
else:
|
||||||
|
from StringIO import StringIO
|
||||||
|
minint = -sys.maxint-1
|
||||||
|
maxint = sys.maxint
|
||||||
|
from uncompyle6.semantics.helper import print_docstring
|
||||||
|
|
||||||
|
class PrintFake():
|
||||||
|
def __init__(self):
|
||||||
|
self.pending_newlines = 0
|
||||||
|
self.f = StringIO()
|
||||||
|
|
||||||
|
def write(self, *data):
|
||||||
|
if (len(data) == 0) or (len(data) == 1 and data[0] == ''):
|
||||||
|
return
|
||||||
|
out = ''.join((str(j) for j in data))
|
||||||
|
n = 0
|
||||||
|
for i in out:
|
||||||
|
if i == '\n':
|
||||||
|
n += 1
|
||||||
|
if n == len(out):
|
||||||
|
self.pending_newlines = max(self.pending_newlines, n)
|
||||||
|
return
|
||||||
|
elif n:
|
||||||
|
self.pending_newlines = max(self.pending_newlines, n)
|
||||||
|
out = out[n:]
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
|
||||||
|
if self.pending_newlines > 0:
|
||||||
|
self.f.write('\n'*self.pending_newlines)
|
||||||
|
self.pending_newlines = 0
|
||||||
|
|
||||||
|
for i in out[::-1]:
|
||||||
|
if i == '\n':
|
||||||
|
self.pending_newlines += 1
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
|
||||||
|
if self.pending_newlines:
|
||||||
|
out = out[:-self.pending_newlines]
|
||||||
|
self.f.write(out)
|
||||||
|
def println(self, *data):
|
||||||
|
if data and not(len(data) == 1 and data[0] ==''):
|
||||||
|
self.write(*data)
|
||||||
|
self.pending_newlines = max(self.pending_newlines, 1)
|
||||||
|
return
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_docstring():
|
||||||
|
|
||||||
|
for doc, expect in (
|
||||||
|
("Now is the time",
|
||||||
|
' """Now is the time"""'),
|
||||||
|
("""
|
||||||
|
Now is the time
|
||||||
|
""",
|
||||||
|
''' """
|
||||||
|
Now is the time
|
||||||
|
"""''')
|
||||||
|
|
||||||
|
# (r'''func placeholder - ' and with ("""\nstring\n """)''',
|
||||||
|
# """ r'''func placeholder - ' and with (\"\"\"\nstring\n\"\"\")'''"""),
|
||||||
|
# (r"""func placeholder - ' and with ('''\nstring\n''') and \"\"\"\nstring\n\"\"\" """,
|
||||||
|
# """ r\"\"\"func placeholder - ' and with ('''\nstring\n''') and \"\"\"\nstring\n\"\"\" \"\"\"""")
|
||||||
|
):
|
||||||
|
|
||||||
|
o = PrintFake()
|
||||||
|
# print(doc)
|
||||||
|
# print(expect)
|
||||||
|
print_docstring(o, ' ', doc)
|
||||||
|
assert expect == o.f.getvalue()
|
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
from uncompyle6 import PYTHON_VERSION
|
from uncompyle6 import PYTHON_VERSION, IS_PYPY
|
||||||
from uncompyle6.scanner import get_scanner
|
from uncompyle6.scanner import get_scanner
|
||||||
from array import array
|
from array import array
|
||||||
def bug(state, slotstate):
|
def bug(state, slotstate):
|
||||||
@@ -8,26 +8,55 @@ def bug(state, slotstate):
|
|||||||
for key, value in slotstate.items():
|
for key, value in slotstate.items():
|
||||||
setattr(state, key, 2)
|
setattr(state, key, 2)
|
||||||
|
|
||||||
|
# From 2.7 disassemble
|
||||||
|
# Problem is not getting while, because
|
||||||
|
# COME_FROM not added
|
||||||
|
def bug_loop(disassemble, tb=None):
|
||||||
|
if tb:
|
||||||
|
try:
|
||||||
|
tb = 5
|
||||||
|
except AttributeError:
|
||||||
|
raise RuntimeError
|
||||||
|
while tb: tb = tb.tb_next
|
||||||
|
disassemble(tb)
|
||||||
|
|
||||||
def test_if_in_for():
|
def test_if_in_for():
|
||||||
code = bug.__code__
|
code = bug.__code__
|
||||||
scan = get_scanner(PYTHON_VERSION)
|
scan = get_scanner(PYTHON_VERSION)
|
||||||
print(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)
|
n = scan.setup_code(code)
|
||||||
scan.build_lines_data(code, n)
|
scan.build_lines_data(code, n)
|
||||||
scan.build_prev_op(n)
|
scan.build_prev_op(n)
|
||||||
fjt = scan.find_jump_targets()
|
fjt = scan.find_jump_targets(False)
|
||||||
assert {15: [3], 69: [66], 63: [18]} == fjt
|
assert {15: [3], 69: [66], 63: [18]} == fjt
|
||||||
assert scan.structs == \
|
assert scan.structs == \
|
||||||
[{'start': 0, 'end': 72, 'type': 'root'},
|
[{'start': 0, 'end': 72, 'type': 'root'},
|
||||||
{'start': 18, 'end': 66, 'type': 'if-then'},
|
{'start': 15, 'end': 66, 'type': 'if-then'},
|
||||||
{'start': 31, 'end': 59, 'type': 'for-loop'},
|
{'start': 31, 'end': 59, 'type': 'for-loop'},
|
||||||
{'start': 62, 'end': 63, 'type': 'for-else'}]
|
{'start': 62, 'end': 63, 'type': 'for-else'}]
|
||||||
|
|
||||||
|
code = bug_loop.__code__
|
||||||
|
n = scan.setup_code(code)
|
||||||
|
scan.build_lines_data(code, n)
|
||||||
|
scan.build_prev_op(n)
|
||||||
|
fjt = scan.find_jump_targets(False)
|
||||||
|
assert{64: [42], 67: [42, 42], 42: [16, 41], 19: [6]} == fjt
|
||||||
|
assert scan.structs == [
|
||||||
|
{'start': 0, 'end': 80, 'type': 'root'},
|
||||||
|
{'start': 3, 'end': 64, 'type': 'if-then'},
|
||||||
|
{'start': 6, 'end': 15, 'type': 'try'},
|
||||||
|
{'start': 19, 'end': 38, 'type': 'except'},
|
||||||
|
{'start': 45, 'end': 67, 'type': 'while-loop'},
|
||||||
|
{'start': 70, 'end': 64, 'type': 'while-else'},
|
||||||
|
# previous bug was not mistaking while-loop for if-then
|
||||||
|
{'start': 48, 'end': 67, 'type': 'while-loop'}]
|
||||||
|
|
||||||
elif 3.2 < PYTHON_VERSION <= 3.4:
|
elif 3.2 < PYTHON_VERSION <= 3.4:
|
||||||
scan.code = array('B', code.co_code)
|
scan.code = array('B', code.co_code)
|
||||||
scan.build_lines_data(code)
|
scan.build_lines_data(code)
|
||||||
scan.build_prev_op()
|
scan.build_prev_op()
|
||||||
fjt = scan.find_jump_targets()
|
fjt = scan.find_jump_targets(False)
|
||||||
assert {69: [66], 63: [18]} == fjt
|
assert {69: [66], 63: [18]} == fjt
|
||||||
assert scan.structs == \
|
assert scan.structs == \
|
||||||
[{'end': 72, 'type': 'root', 'start': 0},
|
[{'end': 72, 'type': 'root', 'start': 0},
|
||||||
|
150
pytest/test_fstring.py
Normal file
150
pytest/test_fstring.py
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
# std
|
||||||
|
import os
|
||||||
|
# test
|
||||||
|
import pytest
|
||||||
|
import hypothesis
|
||||||
|
from hypothesis import strategies as st
|
||||||
|
# uncompyle6
|
||||||
|
from uncompyle6 import PYTHON_VERSION, deparse_code
|
||||||
|
|
||||||
|
|
||||||
|
@st.composite
|
||||||
|
def expressions(draw):
|
||||||
|
# todo : would be nice to generate expressions using hypothesis however
|
||||||
|
# this is pretty involved so for now just use a corpus of expressions
|
||||||
|
# from which to select.
|
||||||
|
return draw(st.sampled_from((
|
||||||
|
'abc',
|
||||||
|
'len(items)',
|
||||||
|
'x + 1',
|
||||||
|
'lineno',
|
||||||
|
'container',
|
||||||
|
'self.attribute',
|
||||||
|
'self.method()',
|
||||||
|
# These expressions are failing, I think these are control
|
||||||
|
# flow problems rather than problems with FORMAT_VALUE,
|
||||||
|
# however I need to confirm this...
|
||||||
|
#'sorted(items, key=lambda x: x.name)',
|
||||||
|
#'func(*args, **kwargs)',
|
||||||
|
#'text or default',
|
||||||
|
#'43 if life_the_universe and everything else None'
|
||||||
|
)))
|
||||||
|
|
||||||
|
|
||||||
|
@st.composite
|
||||||
|
def format_specifiers(draw):
|
||||||
|
"""
|
||||||
|
Generate a valid format specifier using the rules:
|
||||||
|
|
||||||
|
format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]
|
||||||
|
fill ::= <any character>
|
||||||
|
align ::= "<" | ">" | "=" | "^"
|
||||||
|
sign ::= "+" | "-" | " "
|
||||||
|
width ::= integer
|
||||||
|
precision ::= integer
|
||||||
|
type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
|
||||||
|
|
||||||
|
See https://docs.python.org/2/library/string.html
|
||||||
|
|
||||||
|
:param draw: Let hypothesis draw from other strategies.
|
||||||
|
|
||||||
|
:return: An example format_specifier.
|
||||||
|
"""
|
||||||
|
alphabet_strategy = st.characters(min_codepoint=ord('a'), max_codepoint=ord('z'))
|
||||||
|
fill = draw(st.one_of(alphabet_strategy, st.none()))
|
||||||
|
align = draw(st.sampled_from(list('<>=^')))
|
||||||
|
fill_align = (fill + align or '') if fill else ''
|
||||||
|
|
||||||
|
type_ = draw(st.sampled_from('bcdeEfFgGnosxX%'))
|
||||||
|
can_have_sign = type_ in 'deEfFgGnoxX%'
|
||||||
|
can_have_comma = type_ in 'deEfFgG%'
|
||||||
|
can_have_precision = type_ in 'fFgG'
|
||||||
|
can_have_pound = type_ in 'boxX%'
|
||||||
|
can_have_zero = type_ in 'oxX'
|
||||||
|
|
||||||
|
sign = draw(st.sampled_from(list('+- ') + [''])) if can_have_sign else ''
|
||||||
|
pound = draw(st.sampled_from(('#', '',))) if can_have_pound else ''
|
||||||
|
zero = draw(st.sampled_from(('0', '',))) if can_have_zero else ''
|
||||||
|
|
||||||
|
int_strategy = st.integers(min_value=1, max_value=1000)
|
||||||
|
|
||||||
|
width = draw(st.one_of(int_strategy, st.none()))
|
||||||
|
width = str(width) if width is not None else ''
|
||||||
|
|
||||||
|
comma = draw(st.sampled_from((',', '',))) if can_have_comma else ''
|
||||||
|
if can_have_precision:
|
||||||
|
precision = draw(st.one_of(int_strategy, st.none()))
|
||||||
|
precision = '.' + str(precision) if precision else ''
|
||||||
|
else:
|
||||||
|
precision = ''
|
||||||
|
|
||||||
|
return ''.join((fill_align, sign, pound, zero, width, comma, precision, type_,))
|
||||||
|
|
||||||
|
|
||||||
|
@st.composite
|
||||||
|
def fstrings(draw):
|
||||||
|
"""
|
||||||
|
Generate a valid f-string.
|
||||||
|
See https://www.python.org/dev/peps/pep-0498/#specification
|
||||||
|
|
||||||
|
:param draw: Let hypothsis draw from other strategies.
|
||||||
|
|
||||||
|
:return: A valid f-string.
|
||||||
|
"""
|
||||||
|
character_strategy = st.characters(
|
||||||
|
blacklist_characters='\r\n\'\\s{}',
|
||||||
|
min_codepoint=1,
|
||||||
|
max_codepoint=1000,
|
||||||
|
)
|
||||||
|
is_raw = draw(st.booleans())
|
||||||
|
integer_strategy = st.integers(min_value=0, max_value=3)
|
||||||
|
expression_count = draw(integer_strategy)
|
||||||
|
content = []
|
||||||
|
for _ in range(expression_count):
|
||||||
|
expression = draw(expressions())
|
||||||
|
conversion = draw(st.sampled_from(('', '!s', '!r', '!a',)))
|
||||||
|
has_specifier = draw(st.booleans())
|
||||||
|
specifier = ':' + draw(format_specifiers()) if has_specifier else ''
|
||||||
|
content.append('{{{}{}}}'.format(expression, conversion, specifier))
|
||||||
|
content.append(draw(st.text(character_strategy)))
|
||||||
|
content = ''.join(content)
|
||||||
|
return "f{}'{}'".format('r' if is_raw else '', content)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skipif(PYTHON_VERSION < 3.6, reason='need at least python 3.6')
|
||||||
|
@hypothesis.given(format_specifiers())
|
||||||
|
def test_format_specifiers(format_specifier):
|
||||||
|
"""Verify that format_specifiers generates valid specifiers"""
|
||||||
|
try:
|
||||||
|
exec('"{:' + format_specifier + '}".format(0)')
|
||||||
|
except ValueError as e:
|
||||||
|
if 'Unknown format code' not in str(e):
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
def run_test(text):
|
||||||
|
hypothesis.assume(len(text))
|
||||||
|
hypothesis.assume("f'{" in text)
|
||||||
|
expr = text + '\n'
|
||||||
|
code = compile(expr, '<string>', 'single')
|
||||||
|
deparsed = deparse_code(PYTHON_VERSION, code, compile_mode='single')
|
||||||
|
recompiled = compile(deparsed.text, '<string>', 'single')
|
||||||
|
if recompiled != code:
|
||||||
|
assert 'dis(' + deparsed.text.strip('\n') + ')' == 'dis(' + expr.strip('\n') + ')'
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skipif(PYTHON_VERSION < 3.6, reason='need at least python 3.6')
|
||||||
|
@hypothesis.given(fstrings())
|
||||||
|
def test_uncompyle_fstring(fstring):
|
||||||
|
"""Verify uncompyling fstring bytecode"""
|
||||||
|
run_test(fstring)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skipif(PYTHON_VERSION < 3.6, reason='need at least python 3.6')
|
||||||
|
@pytest.mark.parametrize('fstring', [
|
||||||
|
"f'{abc}{abc!s}'",
|
||||||
|
"f'{abc}0'",
|
||||||
|
])
|
||||||
|
def test_uncompyle_direct(fstring):
|
||||||
|
"""useful for debugging"""
|
||||||
|
run_test(fstring)
|
63
pytest/test_grammar.py
Normal file
63
pytest/test_grammar.py
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
import re
|
||||||
|
from uncompyle6 import PYTHON_VERSION, PYTHON3, IS_PYPY # , PYTHON_VERSION
|
||||||
|
from uncompyle6.parser import get_python_parser, python_parser
|
||||||
|
from uncompyle6.scanner import get_scanner
|
||||||
|
|
||||||
|
def test_grammar():
|
||||||
|
|
||||||
|
def check_tokens(tokens, opcode_set):
|
||||||
|
remain_tokens = set(tokens) - opcode_set
|
||||||
|
remain_tokens = set([re.sub('_\d+$','', t) for t in remain_tokens])
|
||||||
|
remain_tokens = set([re.sub('_CONT$','', t) for t in remain_tokens])
|
||||||
|
remain_tokens = set(remain_tokens) - opcode_set
|
||||||
|
assert remain_tokens == set([]), \
|
||||||
|
"Remaining tokens %s\n====\n%s" % (remain_tokens, p.dumpGrammar())
|
||||||
|
|
||||||
|
p = get_python_parser(PYTHON_VERSION, is_pypy=IS_PYPY)
|
||||||
|
lhs, rhs, tokens, right_recursive = p.checkSets()
|
||||||
|
expect_lhs = set(['expr1024', 'pos_arg'])
|
||||||
|
unused_rhs = set(['build_list', 'call_function', 'mkfunc',
|
||||||
|
'mklambda',
|
||||||
|
'unpack', 'unpack_list'])
|
||||||
|
expect_right_recursive = [['designList', ('designator', 'DUP_TOP', 'designList')]]
|
||||||
|
if PYTHON3:
|
||||||
|
expect_lhs.add('load_genexpr')
|
||||||
|
|
||||||
|
unused_rhs = unused_rhs.union(set("""
|
||||||
|
except_pop_except genexpr classdefdeco2 listcomp
|
||||||
|
""".split()))
|
||||||
|
if 3.0 <= PYTHON_VERSION:
|
||||||
|
expect_lhs.add("annotate_arg")
|
||||||
|
expect_lhs.add("annotate_tuple")
|
||||||
|
unused_rhs.add("mkfunc_annotate")
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
expect_lhs.add('kwarg')
|
||||||
|
assert expect_lhs == set(lhs)
|
||||||
|
assert unused_rhs == set(rhs)
|
||||||
|
assert expect_right_recursive == right_recursive
|
||||||
|
s = get_scanner(PYTHON_VERSION, IS_PYPY)
|
||||||
|
ignore_set = set(
|
||||||
|
"""
|
||||||
|
JUMP_BACK CONTINUE RETURN_END_IF
|
||||||
|
COME_FROM COME_FROM_EXCEPT COME_FROM_LOOP COME_FROM_WITH
|
||||||
|
COME_FROM_FINALLY ELSE
|
||||||
|
LOAD_GENEXPR LOAD_ASSERT LOAD_SETCOMP LOAD_DICTCOMP
|
||||||
|
LAMBDA_MARKER RETURN_LAST
|
||||||
|
""".split())
|
||||||
|
if 2.6 <= PYTHON_VERSION <= 2.7:
|
||||||
|
opcode_set = set(s.opc.opname).union(ignore_set)
|
||||||
|
check_tokens(tokens, opcode_set)
|
||||||
|
elif PYTHON_VERSION == 3.4:
|
||||||
|
ignore_set.add('LOAD_CLASSNAME')
|
||||||
|
ignore_set.add('STORE_LOCALS')
|
||||||
|
opcode_set = set(s.opc.opname).union(ignore_set)
|
||||||
|
check_tokens(tokens, opcode_set)
|
||||||
|
|
||||||
|
def test_dup_rule():
|
||||||
|
import inspect
|
||||||
|
python_parser(PYTHON_VERSION, inspect.currentframe().f_code,
|
||||||
|
is_pypy=IS_PYPY,
|
||||||
|
parser_debug={
|
||||||
|
'dups': True, 'transition': False, 'reduce': False,
|
||||||
|
'rules': False, 'errorstack': None, 'context': True})
|
@@ -9,8 +9,6 @@ def test_single_mode():
|
|||||||
'i = j % 4',
|
'i = j % 4',
|
||||||
'i = {}',
|
'i = {}',
|
||||||
'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 i\n',
|
||||||
'for i in range(10):\n for j in range(10):\n i + j\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'
|
'try:\n i\nexcept Exception:\n j\nelse:\n k\n'
|
||||||
|
6
pytest/testdata/if-2.7.right
vendored
6
pytest/testdata/if-2.7.right
vendored
@@ -2,11 +2,11 @@
|
|||||||
# Embedded file name: simple_source/branching/05_if.py
|
# Embedded file name: simple_source/branching/05_if.py
|
||||||
|
|
||||||
6 0 LOAD_NAME 0 'True'
|
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'
|
7 6 LOAD_NAME 1 'False'
|
||||||
9 STORE_NAME 2 'b'
|
9 STORE_NAME 2 'b'
|
||||||
12 JUMP_FORWARD 0 '15'
|
12 JUMP_FORWARD 0 'to 15'
|
||||||
15_0 COME_FROM '12'
|
15_0 COME_FROM '12'
|
||||||
15 LOAD_CONST 0 ''
|
15 LOAD_CONST 0 ''
|
||||||
18 RETURN_VALUE ''
|
18 RETURN_VALUE
|
||||||
|
6
pytest/testdata/ifelse-2.7.right
vendored
6
pytest/testdata/ifelse-2.7.right
vendored
@@ -2,14 +2,14 @@
|
|||||||
# Embedded file name: simple_source/branching/05_ifelse.py
|
# Embedded file name: simple_source/branching/05_ifelse.py
|
||||||
|
|
||||||
3 0 LOAD_NAME 0 'True'
|
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
|
4 6 LOAD_CONST 0 1
|
||||||
9 STORE_NAME 1 'b'
|
9 STORE_NAME 1 'b'
|
||||||
12 JUMP_FORWARD 6 '21'
|
12 JUMP_FORWARD 6 'to 21'
|
||||||
|
|
||||||
6 15 LOAD_CONST 1 2
|
6 15 LOAD_CONST 1 2
|
||||||
18 STORE_NAME 2 'd'
|
18 STORE_NAME 2 'd'
|
||||||
21_0 COME_FROM '12'
|
21_0 COME_FROM '12'
|
||||||
21 LOAD_CONST 2 ''
|
21 LOAD_CONST 2 ''
|
||||||
24 RETURN_VALUE ''
|
24 RETURN_VALUE
|
||||||
|
@@ -1,2 +1,3 @@
|
|||||||
pytest
|
pytest
|
||||||
flake8
|
flake8
|
||||||
|
hypothesis
|
@@ -1 +1,2 @@
|
|||||||
spark-parser >= 1.2.1
|
# Pick up stuff from setup.py
|
||||||
|
-e .
|
||||||
|
2
setup.py
2
setup.py
@@ -24,6 +24,6 @@ setup(
|
|||||||
py_modules = py_modules,
|
py_modules = py_modules,
|
||||||
test_suite = 'nose.collector',
|
test_suite = 'nose.collector',
|
||||||
url = web,
|
url = web,
|
||||||
setup_requires = ['nose>=1.0'],
|
tests_require = ['nose>=1.0'],
|
||||||
version = VERSION,
|
version = VERSION,
|
||||||
zip_safe = zip_safe)
|
zip_safe = zip_safe)
|
||||||
|
@@ -20,43 +20,80 @@ check:
|
|||||||
$(MAKE) check-$$PYTHON_VERSION
|
$(MAKE) check-$$PYTHON_VERSION
|
||||||
|
|
||||||
#: Run working tests from Python 2.6 or 2.7
|
#: Run working tests from Python 2.6 or 2.7
|
||||||
check-2.6 check-2.7: check-bytecode-2 check-bytecode-3 check-2.7-ok
|
check-2.6 check-2.7: check-bytecode-2 check-bytecode-3 check-bytecode-1 check-2.7-ok
|
||||||
|
|
||||||
|
#: Run working tests from Python 3.0
|
||||||
|
check-3.0: check-bytecode
|
||||||
|
$(PYTHON) test_pythonlib.py --bytecode-3.0 --weak-verify $(COMPILE)
|
||||||
|
|
||||||
|
#: Run working tests from Python 3.1
|
||||||
|
check-3.1: check-bytecode
|
||||||
|
$(PYTHON) test_pythonlib.py --bytecode-3.1 --weak-verify $(COMPILE)
|
||||||
|
|
||||||
#: Run working tests from Python 3.2
|
#: Run working tests from Python 3.2
|
||||||
check-3.2: check-bytecode
|
check-3.2: check-bytecode
|
||||||
$(PYTHON) test_pythonlib.py --bytecode-3.2 --verify $(COMPILE)
|
$(PYTHON) test_pythonlib.py --bytecode-3.2 --weak-verify $(COMPILE)
|
||||||
|
|
||||||
#: Run working tests from Python 3.3
|
#: Run working tests from Python 3.3
|
||||||
check-3.3: check-bytecode
|
check-3.3: check-bytecode
|
||||||
$(PYTHON) test_pythonlib.py --bytecode-3.3 --verify $(COMPILE)
|
$(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
|
#: Run working tests from Python 3.4
|
||||||
check-3.4: check-bytecode check-3.4-ok check-2.7-ok
|
check-3.4: check-bytecode check-3.4-ok check-2.7-ok
|
||||||
$(PYTHON) test_pythonlib.py --bytecode-3.4 --verify $(COMPILE)
|
$(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)
|
||||||
|
|
||||||
|
#: Run working tests from Python 3.6
|
||||||
|
check-3.6: check-bytecode
|
||||||
|
$(PYTHON) test_pythonlib.py --bytecode-3.6 --verify $(COMPILE)
|
||||||
|
|
||||||
#: Check deparsing only, but from a different Python version
|
#: Check deparsing only, but from a different Python version
|
||||||
check-disasm:
|
check-disasm:
|
||||||
$(PYTHON) dis-compare.py
|
$(PYTHON) dis-compare.py
|
||||||
|
|
||||||
|
#: Check deparsing bytecode 1.x only
|
||||||
|
check-bytecode-1:
|
||||||
|
$(PYTHON) test_pythonlib.py --bytecode-1.5
|
||||||
|
|
||||||
#: Check deparsing bytecode 2.x only
|
#: Check deparsing bytecode 2.x only
|
||||||
check-bytecode-2:
|
check-bytecode-2:
|
||||||
$(PYTHON) test_pythonlib.py --bytecode-2.3 --bytecode-2.5 --bytecode-2.6 --bytecode-2.7
|
$(PYTHON) test_pythonlib.py \
|
||||||
|
--bytecode-2.1 --bytecode-2.2 --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 deparsing bytecode 3.x only
|
||||||
check-bytecode-3:
|
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.0 \
|
||||||
|
--bytecode-3.1 --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 deparsing bytecode that works running Python 2 and Python 3
|
||||||
check-bytecode: check-bytecode-3
|
check-bytecode: check-bytecode-3
|
||||||
$(PYTHON) test_pythonlib.py --bytecode-2.5 --bytecode-2.6 --bytecode-2.7
|
$(PYTHON) test_pythonlib.py \
|
||||||
|
--bytecode-2.1 --bytecode-2.2 --bytecode-2.3 --bytecode-2.4 \
|
||||||
|
--bytecode-2.5 --bytecode-2.6 --bytecode-2.7 \
|
||||||
|
--bytecode-pypy2.7 --bytecode-1
|
||||||
|
|
||||||
|
|
||||||
|
#: Check deparsing Python 2.1
|
||||||
|
check-bytecode-2.1:
|
||||||
|
$(PYTHON) test_pythonlib.py --bytecode-2.1
|
||||||
|
|
||||||
|
#: Check deparsing Python 2.2
|
||||||
|
check-bytecode-2.2:
|
||||||
|
$(PYTHON) test_pythonlib.py --bytecode-2.2
|
||||||
|
|
||||||
#: Check deparsing Python 2.3
|
#: Check deparsing Python 2.3
|
||||||
check-bytecode-2.3:
|
check-bytecode-2.3:
|
||||||
$(PYTHON) test_pythonlib.py --bytecode-2.3
|
$(PYTHON) test_pythonlib.py --bytecode-2.3
|
||||||
|
|
||||||
|
#: Check deparsing Python 2.4
|
||||||
|
check-bytecode-2.4:
|
||||||
|
$(PYTHON) test_pythonlib.py --bytecode-2.4
|
||||||
|
|
||||||
#: Check deparsing Python 2.5
|
#: Check deparsing Python 2.5
|
||||||
check-bytecode-2.5:
|
check-bytecode-2.5:
|
||||||
$(PYTHON) test_pythonlib.py --bytecode-2.5
|
$(PYTHON) test_pythonlib.py --bytecode-2.5
|
||||||
@@ -67,7 +104,15 @@ check-bytecode-2.6:
|
|||||||
|
|
||||||
#: Check deparsing Python 2.7
|
#: Check deparsing Python 2.7
|
||||||
check-bytecode-2.7:
|
check-bytecode-2.7:
|
||||||
$(PYTHON) test_pythonlib.py --bytecode-2.7
|
$(PYTHON) test_pythonlib.py --bytecode-2.7 --verify
|
||||||
|
|
||||||
|
#: Check deparsing Python 3.0
|
||||||
|
check-bytecode-3.0:
|
||||||
|
$(PYTHON) test_pythonlib.py --bytecode-3.0
|
||||||
|
|
||||||
|
#: Check deparsing Python 3.1
|
||||||
|
check-bytecode-3.1:
|
||||||
|
$(PYTHON) test_pythonlib.py --bytecode-3.1
|
||||||
|
|
||||||
#: Check deparsing Python 3.2
|
#: Check deparsing Python 3.2
|
||||||
check-bytecode-3.2:
|
check-bytecode-3.2:
|
||||||
@@ -85,6 +130,10 @@ check-bytecode-3.4:
|
|||||||
check-bytecode-3.5:
|
check-bytecode-3.5:
|
||||||
$(PYTHON) test_pythonlib.py --bytecode-3.5
|
$(PYTHON) test_pythonlib.py --bytecode-3.5
|
||||||
|
|
||||||
|
#: Check deparsing Python 3.6
|
||||||
|
check-bytecode-3.6:
|
||||||
|
$(PYTHON) test_pythonlib.py --bytecode-3.6
|
||||||
|
|
||||||
#: short tests for bytecodes only for this version of Python
|
#: short tests for bytecodes only for this version of Python
|
||||||
check-native-short:
|
check-native-short:
|
||||||
$(PYTHON) test_pythonlib.py --bytecode-$(PYTHON_VERSION) --verify $(COMPILE)
|
$(PYTHON) test_pythonlib.py --bytecode-$(PYTHON_VERSION) --verify $(COMPILE)
|
||||||
@@ -105,6 +154,18 @@ check-3.2-ok:
|
|||||||
check-3.4-ok:
|
check-3.4-ok:
|
||||||
$(PYTHON) test_pythonlib.py --ok-3.4 --verify $(COMPILE)
|
$(PYTHON) test_pythonlib.py --ok-3.4 --verify $(COMPILE)
|
||||||
|
|
||||||
|
#: 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 5.3:
|
||||||
|
$(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: clean-py-dis clean-dis clean-unverified
|
||||||
|
|
||||||
clean-dis:
|
clean-dis:
|
||||||
|
@@ -2,11 +2,15 @@
|
|||||||
""" Trivial helper program to bytecompile and run an uncompile
|
""" Trivial helper program to bytecompile and run an uncompile
|
||||||
"""
|
"""
|
||||||
import os, sys, py_compile
|
import os, sys, py_compile
|
||||||
assert len(sys.argv) == 2
|
assert len(sys.argv) >= 2
|
||||||
path = sys.argv[1]
|
|
||||||
short = os.path.basename(path)
|
|
||||||
version = sys.version[0:3]
|
version = sys.version[0:3]
|
||||||
cfile = "bytecode_%s/%s" % (version, short) + 'c'
|
for path in sys.argv[1:]:
|
||||||
print("byte-compiling %s to %s" % (path, cfile))
|
short = os.path.basename(path)
|
||||||
py_compile.compile(path, cfile)
|
if hasattr(sys, 'pypy_version_info'):
|
||||||
os.system("../bin/uncompyle6 -a -t %s" % cfile)
|
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):
|
||||||
|
os.system("../bin/uncompyle6 -a -t %s" % cfile)
|
||||||
|
BIN
test/bytecode_1.5/docstring.pyc
Normal file
BIN
test/bytecode_1.5/docstring.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/exceptions.pyc
Normal file
BIN
test/bytecode_1.5/exceptions.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/exec.pyc
Normal file
BIN
test/bytecode_1.5/exec.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/expressions.pyc
Normal file
BIN
test/bytecode_1.5/expressions.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/globals.pyc
Normal file
BIN
test/bytecode_1.5/globals.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/import.pyc
Normal file
BIN
test/bytecode_1.5/import.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/lambda.pyc
Normal file
BIN
test/bytecode_1.5/lambda.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/misc.pyc
Normal file
BIN
test/bytecode_1.5/misc.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/nested_elif.pyc
Normal file
BIN
test/bytecode_1.5/nested_elif.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/print.pyc
Normal file
BIN
test/bytecode_1.5/print.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/slices.pyc
Normal file
BIN
test/bytecode_1.5/slices.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_class.pyc
Normal file
BIN
test/bytecode_1.5/test_class.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_class.pyo
Normal file
BIN
test/bytecode_1.5/test_class.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_del.pyc
Normal file
BIN
test/bytecode_1.5/test_del.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_del.pyo
Normal file
BIN
test/bytecode_1.5/test_del.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_docstring.pyc
Normal file
BIN
test/bytecode_1.5/test_docstring.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_docstring.pyo
Normal file
BIN
test/bytecode_1.5/test_docstring.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_empty.pyc
Normal file
BIN
test/bytecode_1.5/test_empty.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_empty.pyo
Normal file
BIN
test/bytecode_1.5/test_empty.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_exceptions.pyc
Normal file
BIN
test/bytecode_1.5/test_exceptions.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_exceptions.pyo
Normal file
BIN
test/bytecode_1.5/test_exceptions.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_exec.pyc
Normal file
BIN
test/bytecode_1.5/test_exec.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_exec.pyo
Normal file
BIN
test/bytecode_1.5/test_exec.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_expressions.pyc
Normal file
BIN
test/bytecode_1.5/test_expressions.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_expressions.pyo
Normal file
BIN
test/bytecode_1.5/test_expressions.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_functions.pyc
Normal file
BIN
test/bytecode_1.5/test_functions.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_functions.pyo
Normal file
BIN
test/bytecode_1.5/test_functions.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_global.pyc
Normal file
BIN
test/bytecode_1.5/test_global.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_global.pyo
Normal file
BIN
test/bytecode_1.5/test_global.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_globals.pyc
Normal file
BIN
test/bytecode_1.5/test_globals.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_globals.pyo
Normal file
BIN
test/bytecode_1.5/test_globals.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_import.pyc
Normal file
BIN
test/bytecode_1.5/test_import.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_import.pyo
Normal file
BIN
test/bytecode_1.5/test_import.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_integers.pyc
Normal file
BIN
test/bytecode_1.5/test_integers.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_integers.pyo
Normal file
BIN
test/bytecode_1.5/test_integers.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_lambda.pyc
Normal file
BIN
test/bytecode_1.5/test_lambda.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_lambda.pyo
Normal file
BIN
test/bytecode_1.5/test_lambda.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_loops.pyc
Normal file
BIN
test/bytecode_1.5/test_loops.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_loops.pyo
Normal file
BIN
test/bytecode_1.5/test_loops.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_misc.pyc
Normal file
BIN
test/bytecode_1.5/test_misc.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_misc.pyo
Normal file
BIN
test/bytecode_1.5/test_misc.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_nested_elif.pyc
Normal file
BIN
test/bytecode_1.5/test_nested_elif.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_nested_elif.pyo
Normal file
BIN
test/bytecode_1.5/test_nested_elif.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_prettyprint.pyc
Normal file
BIN
test/bytecode_1.5/test_prettyprint.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_prettyprint.pyo
Normal file
BIN
test/bytecode_1.5/test_prettyprint.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_print.pyc
Normal file
BIN
test/bytecode_1.5/test_print.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_print.pyo
Normal file
BIN
test/bytecode_1.5/test_print.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_single_stmt.pyc
Normal file
BIN
test/bytecode_1.5/test_single_stmt.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_single_stmt.pyo
Normal file
BIN
test/bytecode_1.5/test_single_stmt.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_slices.pyc
Normal file
BIN
test/bytecode_1.5/test_slices.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_slices.pyo
Normal file
BIN
test/bytecode_1.5/test_slices.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_tuple_params.pyc
Normal file
BIN
test/bytecode_1.5/test_tuple_params.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_tuple_params.pyo
Normal file
BIN
test/bytecode_1.5/test_tuple_params.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_tuples.pyc
Normal file
BIN
test/bytecode_1.5/test_tuples.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/test_tuples.pyo
Normal file
BIN
test/bytecode_1.5/test_tuples.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_1.5/tuple_params.pyc
Normal file
BIN
test/bytecode_1.5/tuple_params.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.1/applyEquiv.pyc
Normal file
BIN
test/bytecode_2.1/applyEquiv.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.1/augmentedAssign.pyc
Normal file
BIN
test/bytecode_2.1/augmentedAssign.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.1/docstring.pyc
Normal file
BIN
test/bytecode_2.1/docstring.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.1/exceptions.pyc
Normal file
BIN
test/bytecode_2.1/exceptions.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.1/exec.pyc
Normal file
BIN
test/bytecode_2.1/exec.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.1/expressions.pyc
Normal file
BIN
test/bytecode_2.1/expressions.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.1/extendedImport.pyc
Normal file
BIN
test/bytecode_2.1/extendedImport.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.1/extendedPrint.pyc
Normal file
BIN
test/bytecode_2.1/extendedPrint.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.1/globals.pyc
Normal file
BIN
test/bytecode_2.1/globals.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.1/import.pyc
Normal file
BIN
test/bytecode_2.1/import.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.1/lambda.pyc
Normal file
BIN
test/bytecode_2.1/lambda.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.1/listComprehensions.pyc
Normal file
BIN
test/bytecode_2.1/listComprehensions.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.1/misc.pyc
Normal file
BIN
test/bytecode_2.1/misc.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.1/nested_elif.pyc
Normal file
BIN
test/bytecode_2.1/nested_elif.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.1/print.pyc
Normal file
BIN
test/bytecode_2.1/print.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.1/slices.pyc
Normal file
BIN
test/bytecode_2.1/slices.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.1/test_applyEquiv.pyc
Normal file
BIN
test/bytecode_2.1/test_applyEquiv.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.1/test_applyEquiv.pyo
Normal file
BIN
test/bytecode_2.1/test_applyEquiv.pyo
Normal file
Binary file not shown.
BIN
test/bytecode_2.1/test_augmentedAssign.pyc
Normal file
BIN
test/bytecode_2.1/test_augmentedAssign.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.1/test_augmentedAssign.pyo
Normal file
BIN
test/bytecode_2.1/test_augmentedAssign.pyo
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user