You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-03 00:45:53 +08:00
Compare commits
173 Commits
release-2.
...
release-2.
Author | SHA1 | Date | |
---|---|---|---|
|
df2cda5b66 | ||
|
42c49945ad | ||
|
3c68ca6cde | ||
|
5f6f78531f | ||
|
bfac9a6260 | ||
|
dd329f9c03 | ||
|
deb5b8bc6c | ||
|
a5e3d01dd3 | ||
|
ad755b27a3 | ||
|
f98e29a3a3 | ||
|
79d729e9f9 | ||
|
c9eeb681b9 | ||
|
43cea023c4 | ||
|
566ef37ecc | ||
|
b7003914c9 | ||
|
3d7b160e30 | ||
|
af38064a1b | ||
|
c9f3838d04 | ||
|
f34c558d38 | ||
|
37b8e21c76 | ||
|
f908e8dd8e | ||
|
0c386d2c39 | ||
|
be5efe3e56 | ||
|
85d65e25ba | ||
|
340ac7407f | ||
|
84632bdc78 | ||
|
494bbbdadb | ||
|
0e54c37fab | ||
|
a94b844988 | ||
|
7548364e8e | ||
|
184f480bc8 | ||
|
cddb55eb33 | ||
|
e2a6c0435d | ||
|
1823513841 | ||
|
d8a3c2708e | ||
|
d0644e08d7 | ||
|
b8f74c23f4 | ||
|
b00c59bdd7 | ||
|
c0f0485754 | ||
|
288516d8c2 | ||
|
2de8718de3 | ||
|
a8e235de17 | ||
|
f7ff4c2d41 | ||
|
0c0a534a48 | ||
|
e116d7280c | ||
|
b7f8bee11f | ||
|
58ee49159e | ||
|
934df7b5c4 | ||
|
37108bc41c | ||
|
d18a353381 | ||
|
f1004e6445 | ||
|
2f218fe9bf | ||
|
2a13851f55 | ||
|
e26de53332 | ||
|
53beae8ee6 | ||
|
953cf312db | ||
|
183a406bf1 | ||
|
902941102f | ||
|
c28f2f2e56 | ||
|
f274ac0e3b | ||
|
05e1be7b61 | ||
|
ee6db130ec | ||
|
5bcfa254c6 | ||
|
95c2336a76 | ||
|
039b084e4b | ||
|
b60c05ea86 | ||
|
968e8465bc | ||
|
3a0f0557f7 | ||
|
63a43d0c93 | ||
|
9a141a3144 | ||
|
669a220762 | ||
|
1436ba7abb | ||
|
69847dbeec | ||
|
35e4e03468 | ||
|
d1917046f4 | ||
|
55f12e36b7 | ||
|
81669ad7e7 | ||
|
5b9f9319a8 | ||
|
4b0892bcb5 | ||
|
74731a9d42 | ||
|
b9dfba7400 | ||
|
9ec43de039 | ||
|
5d42fe39bb | ||
|
e9b60ddbf0 | ||
|
0e04b12ad4 | ||
|
cb2b6d9bf4 | ||
|
a28f5604ce | ||
|
55ced53ca9 | ||
|
41f5835fcf | ||
|
70b77025ac | ||
|
918d4f5808 | ||
|
024f295feb | ||
|
0bb793239b | ||
|
f82165aaa7 | ||
|
4c77170ddf | ||
|
3e4889bcd7 | ||
|
7beac3f646 | ||
|
6b6755d599 | ||
|
4a904951f4 | ||
|
124267849c | ||
|
6bffae91fa | ||
|
da6e32b08e | ||
|
9379922c89 | ||
|
6dbdaedf7a | ||
|
dea17cd7f1 | ||
|
4f0a668b7c | ||
|
6746e5167d | ||
|
b32823bb7d | ||
|
54332ddffb | ||
|
b83d6c64ed | ||
|
95268cb14e | ||
|
5df09540b5 | ||
|
5e7632c33e | ||
|
1761ba2581 | ||
|
03d1c48088 | ||
|
9dd881fae1 | ||
|
2fc3886693 | ||
|
0dfbb27af5 | ||
|
e42e3cc230 | ||
|
0560c32093 | ||
|
3f309cebab | ||
|
d3a42ff992 | ||
|
b1e650a7bd | ||
|
491572ed2d | ||
|
717b22bd13 | ||
|
5e1d91cb94 | ||
|
e0def48020 | ||
|
9a2534556c | ||
|
85269dc4d8 | ||
|
01a39bf8ed | ||
|
97999c5e67 | ||
|
4563a547bc | ||
|
9cfd7d669e | ||
|
413f5aa5a5 | ||
|
b4426931ef | ||
|
92f5981661 | ||
|
54fe07e989 | ||
|
adc9b99106 | ||
|
1392b18bd7 | ||
|
9ae84092cb | ||
|
85d68a7926 | ||
|
b3359439f9 | ||
|
9be9abc682 | ||
|
c17ac696d6 | ||
|
9e2119f1a9 | ||
|
86305097d2 | ||
|
c8d15e7654 | ||
|
1d7a3c6444 | ||
|
e7778f83f2 | ||
|
b51039ac1e | ||
|
f73f0ba41c | ||
|
114f979555 | ||
|
7b38d2f1f8 | ||
|
dfbd60231b | ||
|
8b67f2ccd0 | ||
|
aadea7224d | ||
|
da7421da1c | ||
|
96ca68a6fe | ||
|
147b6e1cfe | ||
|
d7b12f4da1 | ||
|
c7b9e54e59 | ||
|
3003070acb | ||
|
19d6dedcf5 | ||
|
51ad3fb36e | ||
|
f017acce21 | ||
|
5bef5683e4 | ||
|
4e1467adc8 | ||
|
7cdf0abb43 | ||
|
9b336251a7 | ||
|
7844456e1e | ||
|
356ea6c770 | ||
|
4d58438515 | ||
|
f7bfe3f7b2 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -17,4 +17,5 @@
|
||||
__pycache__
|
||||
build
|
||||
/.venv*
|
||||
/.idea
|
||||
/.idea
|
||||
/.hypothesis
|
||||
|
845
ChangeLog
845
ChangeLog
@@ -1,6 +1,849 @@
|
||||
2017-11-26 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/version.py: Get ready for release 2.14.0
|
||||
|
||||
2017-11-26 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse2.py: Back of build_set/build_list
|
||||
separation
|
||||
|
||||
2017-11-26 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse3.py,
|
||||
uncompyle6/semantics/pysource.py: Isolate build_set from build_list
|
||||
in Python 2... More work is needed. Not done in Python 3 yet
|
||||
|
||||
2017-11-26 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/stdlib/runtests.sh: stdlib/runtess.sh python version
|
||||
detection
|
||||
|
||||
2017-11-26 rocky <rb@dustyfeet.com>
|
||||
|
||||
* pytest/test_grammar.py, test/simple_source/bug22/01_kv.py,
|
||||
test/simple_source/bug32/05_while_true_break.py: Work around grammar
|
||||
remove rule bug... And reinstate source to a current 3.3 bug (which we don't detect).
|
||||
But at least it is noted for future work.
|
||||
|
||||
2017-11-26 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parser.py, uncompyle6/parsers/parse22.py,
|
||||
uncompyle6/parsers/parse24.py, uncompyle6/parsers/parse25.py,
|
||||
uncompyle6/parsers/parse26.py, uncompyle6/parsers/parse27.py,
|
||||
uncompyle6/parsers/parse32.py: Isolaate kv, kv2 and kv3 better
|
||||
|
||||
2017-11-26 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parser.py, uncompyle6/parsers/parse22.py: Localize kv
|
||||
|
||||
2017-11-26 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parser.py, uncompyle6/parsers/parse26.py,
|
||||
uncompyle6/parsers/parse32.py: remove comp_ifnot
|
||||
|
||||
2017-11-25 rocky <rb@dustyfeet.com>
|
||||
|
||||
* : Another test
|
||||
|
||||
2017-11-25 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/Makefile, test/simple_source/bug27+/05_for_try_except.py,
|
||||
uncompyle6/parsers/parse27.py: 2.7 control-flow bug: except/pass in
|
||||
loop
|
||||
|
||||
2017-11-25 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse3.py,
|
||||
uncompyle6/semantics/pysource.py: back off of build_slice{2,3}
|
||||
->slice{2,3} There is another slice rule that interferes with this.
|
||||
|
||||
2017-11-25 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/simple_source/slice/02_slice.py, uncompyle6/parser.py,
|
||||
uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse3.py,
|
||||
uncompyle6/scanners/scanner2.py, uncompyle6/scanners/scanner26.py,
|
||||
uncompyle6/semantics/pysource.py: localize 2 and 3 argument
|
||||
BUILD_SLICE... Nontermninal name matches AST anme now. Add test.
|
||||
|
||||
2017-11-25 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/Makefile: Improve grammar-cover targets
|
||||
|
||||
2017-11-25 rocky <rb@dustyfeet.com>
|
||||
|
||||
* pytest/test_grammar.py, test/Makefile, uncompyle6/parser.py,
|
||||
uncompyle6/parsers/parse2.py, uncompyle6/semantics/fragments.py,
|
||||
uncompyle6/semantics/make_function.py,
|
||||
uncompyle6/semantics/pysource.py: remove unpack_list rule and ... tidy things a bit more
|
||||
|
||||
2017-11-24 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/semantics/pysource.py: Fix bug in 2.x with decorator of
|
||||
old-style class
|
||||
|
||||
2017-11-24 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/simple_source/expression/01_float.py,
|
||||
uncompyle6/semantics/pysource.py: Handle inf, +inf, -nan, and nan
|
||||
constants
|
||||
|
||||
2017-11-24 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/simple_source/expression/03_tuple_assign.py,
|
||||
test/simple_source/stmts/04_withas.py,
|
||||
uncompyle6/semantics/consts.py, uncompyle6/semantics/pysource.py: A
|
||||
couple more bugs found running 2.7 stdlib tests
|
||||
|
||||
2017-11-24 rocky <rb@dustyfeet.com>
|
||||
|
||||
* : One more (lambda) test
|
||||
|
||||
2017-11-24 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/simple_source/expression/10_lambda.py,
|
||||
uncompyle6/semantics/make_function.py: Fix bug where lambda has a
|
||||
yield in it
|
||||
|
||||
2017-11-24 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parser.py, uncompyle6/semantics/consts.py: cmp ->
|
||||
compare ... to better match the Python AST name Compare. This forces us to
|
||||
change compare -> compare_single Relates to Issue #29
|
||||
|
||||
2017-11-24 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/simple_source/bug33/01_triple_compare.py,
|
||||
uncompyle6/parser.py, uncompyle6/parsers/parse2.py,
|
||||
uncompyle6/parsers/parse26.py, uncompyle6/parsers/parse27.py,
|
||||
uncompyle6/parsers/parse3.py, uncompyle6/parsers/parse32.py,
|
||||
uncompyle6/semantics/consts.py: cmp_list -> compare_chained ... to better match the Python AST name Compare. Relates to Issue #29
|
||||
|
||||
2017-11-23 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/stdlib/README.md, test/stdlib/compile-file.py,
|
||||
test/stdlib/runtests.sh, uncompyle6/parsers/parse2.py: Start another
|
||||
kind of testing... And fix a bug found in that with 3-way equal
|
||||
|
||||
2017-11-23 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse36.py: Forgot to update a call in last
|
||||
change
|
||||
|
||||
2017-11-23 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse3.py: Reduce 3.5 call_aysnc grammar rules
|
||||
|
||||
2017-11-23 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/simple_source/bug32/03_if_try_raise.py,
|
||||
uncompyle6/parsers/parse32.py: Trystmt grammar from 3.3 needed in
|
||||
3.2 Add test to cover this
|
||||
|
||||
2017-11-23 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse32.py, uncompyle6/parsers/parse33.py,
|
||||
uncompyle6/parsers/parse35.py: Add triple compare from 3.3 into 3.2
|
||||
|
||||
2017-11-23 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse32.py, uncompyle6/parsers/parse33.py:
|
||||
Improve try else in 3.2... Grammar from 3.3 is relevant here
|
||||
|
||||
2017-11-23 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parser.py, uncompyle6/parsers/parse27.py,
|
||||
uncompyle6/parsers/parse3.py, uncompyle6/parsers/parse34.py: Remove
|
||||
whileelselastsmt ... Right now I don't know what it does and we don't have something that
|
||||
needs it
|
||||
|
||||
2017-11-23 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse27.py: provisional 2.7 whileelselast rule
|
||||
|
||||
2017-11-23 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parser.py, uncompyle6/parsers/parse26.py,
|
||||
uncompyle6/parsers/parse27.py, uncompyle6/parsers/parse34.py:
|
||||
grammar reduction of while loops
|
||||
|
||||
2017-11-23 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/simple_source/bug30/01_ops.py, uncompyle6/parser.py,
|
||||
uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse3.py,
|
||||
uncompyle6/parsers/parse32.py: 3.x Grammar reduction of custom
|
||||
rules... by looking for token patterns GET_ITER CALL_FUNCTION_1
|
||||
|
||||
2017-11-23 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/Makefile, test/simple_source/bug33/01_triple_compare.py,
|
||||
uncompyle6/parser.py, uncompyle6/parsers/parse26.py,
|
||||
uncompyle6/parsers/parse3.py, uncompyle6/parsers/parse32.py,
|
||||
uncompyle6/parsers/parse33.py: Grammar coverage and pruning
|
||||
|
||||
2017-11-22 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parser.py, uncompyle6/parsers/parse3.py: Isotate
|
||||
conditionalnot
|
||||
|
||||
2017-11-22 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/simple_source/expression/02_true_divide.py,
|
||||
uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse25.py,
|
||||
uncompyle6/parsers/parse26.py, uncompyle6/parsers/parse27.py: 2.x
|
||||
Grammar reduction/isolation
|
||||
|
||||
2017-11-22 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parser.py, uncompyle6/parsers/parse2.py,
|
||||
uncompyle6/parsers/parse24.py: Grammar reduction for load_attrs
|
||||
|
||||
2017-11-22 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse3.py: Reduce
|
||||
unecessary grammar rules in 2.x
|
||||
|
||||
2017-11-22 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/simple_source/stmts/01_augmented_assign.py,
|
||||
uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse27.py:
|
||||
Increase grammar coverage
|
||||
|
||||
2017-11-22 rocky <rb@dustyfeet.com>
|
||||
|
||||
* admin-tools/setup-master.sh, admin-tools/setup-python-2.4.sh:
|
||||
Administrivia: add "git pull"s
|
||||
|
||||
2017-11-18 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse3.py, uncompyle6/parsers/parse33.py,
|
||||
uncompyle6/parsers/parse34.py: 3.3. grammar cleanup ... need build_list in for BUILD_TUPLE_0
|
||||
|
||||
2017-11-18 rocky <rb@dustyfeet.com>
|
||||
|
||||
* pytest/test_grammar.py, uncompyle6/parser.py,
|
||||
uncompyle6/parsers/parse24.py, uncompyle6/semantics/pysource.py:
|
||||
Grammar cleanup: import_as_cont -> import_as
|
||||
|
||||
2017-11-18 rocky <rb@dustyfeet.com>
|
||||
|
||||
* __pkginfo__.py, pytest/test_grammar.py: Track spark_parser changes
|
||||
|
||||
2017-11-17 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/Makefile, uncompyle6/parsers/parse3.py: custom rule hacking
|
||||
... Reduce extraneous 3.x "load_list" and "load_closure" rules
|
||||
|
||||
2017-11-17 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse3.py, uncompyle6/parsers/parse33.py:
|
||||
Python 3 grammar clean up and reorganization
|
||||
|
||||
2017-11-17 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/Makefile, uncompyle6/parser.py,
|
||||
uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse3.py,
|
||||
uncompyle6/parsers/parse36.py: More grammar isolation. narrow custom
|
||||
rules... Specifically: _mklambda with load_closure is Python2 only Add
|
||||
classdefdeco2 rule only when we have seen a LOAD_BUILD_CLASS
|
||||
|
||||
2017-11-16 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse34.py: Python 3.4 while grammar cleanup
|
||||
|
||||
2017-11-16 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parser.py, uncompyle6/parsers/parse3.py: More grammar
|
||||
cleanups
|
||||
|
||||
2017-11-16 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/semantics/consts.py: Tag %c nonterminals in more
|
||||
template rules
|
||||
|
||||
2017-11-16 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse2.py: Bump copyright
|
||||
|
||||
2017-11-16 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parser.py, uncompyle6/parsers/parse2.py,
|
||||
uncompyle6/parsers/parse3.py: More grammar isolation: assert2 in
|
||||
Python3
|
||||
|
||||
2017-11-16 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse25.py, uncompyle6/parsers/parse3.py:
|
||||
Isolate "assert2" rule
|
||||
|
||||
2017-11-16 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parser.py, uncompyle6/parsers/parse23.py: Isolate
|
||||
"and2" rule to 2.3
|
||||
|
||||
2017-11-16 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/simple_source/stmts/05_with.py,
|
||||
uncompyle6/parsers/parse25.py, uncompyle6/parsers/parse26.py: Python
|
||||
2.5 "with"; Isolate 2.5-2.6 grammar better
|
||||
|
||||
2017-11-16 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/simple_source/expression/02_true_divide.py: Add
|
||||
BINARY_TRUE_DIVIDE tests for 2.{6,7}
|
||||
|
||||
2017-11-16 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse26.py, uncompyle6/parsers/parse27.py: More
|
||||
grammar cleanup
|
||||
|
||||
2017-11-16 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/scanners/scanner2.py: 2.7 continue-detection bug
|
||||
|
||||
2017-11-15 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse27.py: More
|
||||
2.7/2.7- grammer separation & cleanup
|
||||
|
||||
2017-11-15 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse27.py:
|
||||
Grammar cleanup: separate some 2.7 from 2.7- rules
|
||||
|
||||
2017-11-15 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parser.py: I said, remove dict/setcomp from <= 2.6!
|
||||
|
||||
2017-11-15 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse27.py,
|
||||
uncompyle6/parsers/parse3.py: grammar cleanup: dict/set
|
||||
comprehensions 2.7+
|
||||
|
||||
2017-11-15 rocky <rb@dustyfeet.com>
|
||||
|
||||
* HOW-TO-REPORT-A-BUG.md: Grammar typo
|
||||
|
||||
2017-11-15 rocky <rb@dustyfeet.com>
|
||||
|
||||
* HOW-TO-REPORT-A-BUG.md: Grammar typo
|
||||
|
||||
2017-11-15 rocky <rb@dustyfeet.com>
|
||||
|
||||
* : One more pypy test
|
||||
|
||||
2017-11-15 rocky <rb@dustyfeet.com>
|
||||
|
||||
* : Keep bytecode_2.7 pypy free... We need to add _another_ pypy directory
|
||||
|
||||
2017-11-15 rocky <rb@dustyfeet.com>
|
||||
|
||||
* : del stmt testing on 2.7
|
||||
|
||||
2017-11-15 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/Makefile, uncompyle6/parsers/parse3.py: Stronger 3.4 testing
|
||||
... parse3.py: remove unused grammar rule
|
||||
|
||||
2017-11-15 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/Makefile, test/simple_source/stmts/10_del.py,
|
||||
test/test_pyenvlib.py, uncompyle6/parsers/parse26.py,
|
||||
uncompyle6/semantics/check_ast.py, uncompyle6/semantics/pysource.py:
|
||||
Profiling workarounds, more coverage ... test/Makefile: more grammar checking. Update python versions
|
||||
10_del.pyc add test of DEL_GLOBAL check_ast.py, pysource.py: Profileing workarounds
|
||||
|
||||
2017-11-14 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse2.py: Guard around null ast This can happen in profiling
|
||||
|
||||
2017-11-13 rocky <rb@dustyfeet.com>
|
||||
|
||||
* HOW-TO-REPORT-A-BUG.md: bug report doc tweak
|
||||
|
||||
2017-11-13 rocky <rb@dustyfeet.com>
|
||||
|
||||
* HOW-TO-REPORT-A-BUG.md: add note on illegal use
|
||||
|
||||
2017-11-13 rocky <rb@dustyfeet.com>
|
||||
|
||||
* ChangeLog, uncompyle6/parser.py, uncompyle6/semantics/pysource.py:
|
||||
detected old-style Python 2.4 class better
|
||||
|
||||
2017-11-13 rocky <rb@dustyfeet.com>
|
||||
|
||||
* admin-tools/check-older-versions.sh: Administrivia
|
||||
|
||||
2017-11-13 rocky <rb@dustyfeet.com>
|
||||
|
||||
* ChangeLog, NEWS, uncompyle6/version.py: Get ready for release
|
||||
2.13.3
|
||||
|
||||
2017-11-12 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/Makefile: Back off --verify for --weak-verify
|
||||
|
||||
2017-11-12 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/Makefile: Back off --verify for --weak-verify
|
||||
|
||||
2017-11-12 rocky <rb@dustyfeet.com>
|
||||
|
||||
* : Reinstate previously failed tests 2.6, 3.5 and 3.6 decompilation has gotten better
|
||||
|
||||
2017-11-10 rocky <rb@dustyfeet.com>
|
||||
|
||||
* __pkginfo__.py: Use newer xdis
|
||||
|
||||
2017-11-09 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse36.py, uncompyle6/semantics/pysource.py:
|
||||
Fix bug in return-optimized try stmt
|
||||
|
||||
2017-11-09 rocky <rb@dustyfeet.com>
|
||||
|
||||
* HOW-TO-REPORT-A-BUG.md: More detail is needed in bug reporting... sigh.
|
||||
|
||||
2017-11-09 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/simple_source/bug35/04_importlist.py, uncompyle6/parser.py,
|
||||
uncompyle6/semantics/consts.py: bug in 3.x importlists consts.py: add rule for importlists. imports weren't separated by ',
|
||||
'. parser.py: Make importlist a list type of node. test/* add test for importlist
|
||||
|
||||
2017-11-08 rocky <rb@dustyfeet.com>
|
||||
|
||||
* : commit e9b60ddbf020ee7f14d8d77c6f4a8588d2968377 Author: rocky
|
||||
<rb@dustyfeet.com> Date: Wed Nov 8 23:05:01 2017 -0500
|
||||
|
||||
2017-11-08 rocky <rb@dustyfeet.com>
|
||||
|
||||
* HOW-TO-REPORT-A-BUG.md: more wordsmithing
|
||||
|
||||
2017-11-08 rocky <rb@dustyfeet.com>
|
||||
|
||||
* HOW-TO-REPORT-A-BUG.md: more wordsmithing
|
||||
|
||||
2017-11-08 rocky <rb@dustyfeet.com>
|
||||
|
||||
* HOW-TO-REPORT-A-BUG.md: more wordsmithing
|
||||
|
||||
2017-11-08 rocky <rb@dustyfeet.com>
|
||||
|
||||
* HOW-TO-REPORT-A-BUG.md: Typo
|
||||
|
||||
2017-11-08 rocky <rb@dustyfeet.com>
|
||||
|
||||
* HOW-TO-REPORT-A-BUG.md: Typo
|
||||
|
||||
2017-11-08 rocky <rb@dustyfeet.com>
|
||||
|
||||
* HOW-TO-REPORT-A-BUG.md: Typo
|
||||
|
||||
2017-11-08 rocky <rb@dustyfeet.com>
|
||||
|
||||
* HOW-TO-REPORT-A-BUG.md: Typo
|
||||
|
||||
2017-11-08 rocky <rb@dustyfeet.com>
|
||||
|
||||
* HOW-TO-REPORT-A-BUG.md: Tweak how to report a bug.
|
||||
|
||||
2017-11-08 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parser.py, uncompyle6/parsers/parse36.py,
|
||||
uncompyle6/scanners/scanner3.py: Add 3.6+ grammar for except's
|
||||
ending in RETURN... Not totally out of the maze in 3.6 control flow... There are still
|
||||
problems with erroneous RETURN_VALUEs becoming RETURN_END_IF,
|
||||
|
||||
2017-11-07 R. Bernstein <rocky@users.noreply.github.com>
|
||||
|
||||
* : Merge pull request #135 from rocky/3.6-instruction-refactor 3.6 instruction refactor
|
||||
|
||||
2017-11-06 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/scanners/scanner3.py: Small tweaks to sync up better
|
||||
with scanner2.py
|
||||
|
||||
2017-11-06 rocky <rb@dustyfeet.com>
|
||||
|
||||
* pytest/test_fjt.py: Remove parts of erroneous 2.7 test for now
|
||||
|
||||
2017-11-06 rocky <rb@dustyfeet.com>
|
||||
|
||||
* pytest/test_fjt.py, uncompyle6/scanners/scanner3.py,
|
||||
uncompyle6/scanners/scanner36.py: Fix 3.{3,4} pytest. Remove dup
|
||||
find_jump_targets
|
||||
|
||||
2017-11-06 rocky <rb@dustyfeet.com>
|
||||
|
||||
* Makefile, uncompyle6/scanners/scanner3.py,
|
||||
uncompyle6/scanners/scanner36.py: Move refactored find-jump-targets
|
||||
from 3.6 to 3.x
|
||||
|
||||
2017-11-06 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/Makefile, uncompyle6/scanners/scanner3.py,
|
||||
uncompyle6/scanners/scanner36.py: Move refactored ingest from 3.6 to
|
||||
3.x... We are getting away from working with bytecode in favor of working
|
||||
with full-fledged structured instructions Up next: find_jump_targets()
|
||||
|
||||
2017-11-06 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse36.py: awith custom COME_FROMs ... Now that jump branching has been properly fixed up for EXTENDED_ARG
|
||||
instructions which are more prevalent with wordcode encoding.
|
||||
|
||||
2017-11-06 rocky <rb@dustyfeet.com>
|
||||
|
||||
* : commit 9379922c89573972aa387e4f0b9abcba7358d1a3 Author: rocky
|
||||
<rb@dustyfeet.com> Date: Mon Nov 6 00:38:22 2017 -0500
|
||||
|
||||
2017-11-06 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/scanners/scanner36.py: Revert change that should have
|
||||
been in a branch
|
||||
|
||||
2017-11-06 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/scanners/scanner2.py,
|
||||
uncompyle6/scanners/scanner26.py, uncompyle6/scanners/scanner3.py,
|
||||
uncompyle6/scanners/scanner36.py: xdis _disassemble->disassemble
|
||||
|
||||
2017-11-04 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/semantics/fragments.py,
|
||||
uncompyle6/semantics/make_function.py,
|
||||
uncompyle6/semantics/pysource.py: Add flag to tolerate deparse
|
||||
errors... and keep going. The fragment parser should ignore errors in nested
|
||||
function definitions
|
||||
|
||||
2017-11-04 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/scanner.py, uncompyle6/semantics/fragments.py: Add
|
||||
Python 3.6.3 scanner lookup
|
||||
|
||||
2017-11-03 R. Bernstein <rocky@users.noreply.github.com>
|
||||
|
||||
* : Merge pull request #134 from mikemrm/master Corrected python3 import from queue
|
||||
|
||||
2017-10-29 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/simple_source/bug36/10_extended_arg_loop.py,
|
||||
uncompyle6/parsers/parse36.py, uncompyle6/scanners/scanner3.py:
|
||||
Python 3.6 control flow bug... Much more is needed, but it's a start
|
||||
|
||||
2017-10-29 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/verify.py: In verify, JUMP_BACK is the same as
|
||||
CONTINUE... at least for now. See FIXME in verify
|
||||
|
||||
2017-10-29 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/scanner.py, uncompyle6/scanners/scanner2.py,
|
||||
uncompyle6/scanners/scanner3.py, uncompyle6/scanners/scanner30.py:
|
||||
Python 3.6-inspired instruction size cleanup Revise and generalize for Python 3.6+ instructions vs < 3.6
|
||||
instuctions. Used more of the generalized methods in xdis and
|
||||
remove some (but not all) of the magic numbers. This is a lot of changes, but not all of the refactoring needed.
|
||||
Much crap still remains. Also, there are still bugs in handling 3.6
|
||||
bytecodes.
|
||||
|
||||
2017-10-24 rocky <rb@dustyfeet.com>
|
||||
|
||||
* Makefile, __pkginfo__.py: Bump uncompyle. Pypy 5.8.0-beta
|
||||
tolerance
|
||||
|
||||
2017-10-13 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/Makefile, uncompyle6/semantics/consts.py: Tag more semantic
|
||||
actions with nonterminals
|
||||
|
||||
2017-10-13 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parser.py, uncompyle6/semantics/consts.py: More node
|
||||
checking in tables
|
||||
|
||||
2017-10-13 rocky <rb@dustyfeet.com>
|
||||
|
||||
* pytest/test_pysource.py, uncompyle6/parser.py,
|
||||
uncompyle6/parsers/parse24.py, uncompyle6/semantics/consts.py,
|
||||
uncompyle6/semantics/fragments.py, uncompyle6/semantics/pysource.py:
|
||||
Start allowing node names in template engine These are now used to assert we have the right node type. Simplify import_from
|
||||
|
||||
2017-10-13 rocky <rb@dustyfeet.com>
|
||||
|
||||
* HISTORY.md, uncompyle6/semantics/pysource.py: Small changes
|
||||
|
||||
2017-10-12 rocky <rb@dustyfeet.com>
|
||||
|
||||
* admin-tools/make-dist-newer.sh, admin-tools/make-dist-older.sh:
|
||||
Administrivia - generalize shell code
|
||||
|
||||
2017-10-12 rocky <rb@dustyfeet.com>
|
||||
|
||||
* admin-tools/how-to-make-a-release.md: Update install doc
|
||||
|
||||
2017-10-12 rocky <rb@dustyfeet.com>
|
||||
|
||||
* admin-tools/how-to-make-a-release.md: Update instructions
|
||||
|
||||
2017-10-12 rocky <rb@dustyfeet.com>
|
||||
|
||||
* admin-tools/make-dist-newer.sh, admin-tools/make-dist-older.sh:
|
||||
Administrivia
|
||||
|
||||
2017-10-12 rocky <rb@dustyfeet.com>
|
||||
|
||||
* admin-tools/how-to-make-a-release.md: Minor
|
||||
|
||||
2017-10-12 rocky <rb@dustyfeet.com>
|
||||
|
||||
* : commit 491572ed2dd01bf655288638a121bf48c530b303 Author: rocky
|
||||
<rb@dustyfeet.com> Date: Thu Oct 12 06:48:49 2017 -0400
|
||||
|
||||
2017-10-12 rocky <rb@dustyfeet.com>
|
||||
|
||||
* ChangeLog, Makefile, NEWS, admin-tools/how-to-make-a-release.txt,
|
||||
uncompyle6/version.py: Get ready for release 2.13.2
|
||||
|
||||
2017-10-11 rocky <rb@dustyfeet.com>
|
||||
|
||||
* admin-tools/check-older-versions.sh,
|
||||
admin-tools/make-dist-newer.sh, admin-tools/make-dist-older.sh,
|
||||
admin-tools/pyenv-newer-versions, admin-tools/pyenv-older-versions,
|
||||
admin-tools/setup-master.sh: Administrivia
|
||||
|
||||
2017-10-11 rocky <rb@dustyfeet.com>
|
||||
|
||||
* admin-tools/check-newer-versions.sh,
|
||||
admin-tools/check-older-versions.sh,
|
||||
admin-tools/how-to-make-a-release.txt,
|
||||
admin-tools/make-dist-newer.sh, admin-tools/make-dist-older.sh:
|
||||
Adminstrivia
|
||||
|
||||
2017-10-11 rocky <rb@dustyfeet.com>
|
||||
|
||||
* admin-tools/README.md, admin-tools/check-newer-versions.sh,
|
||||
admin-tools/check-older-versions.sh,
|
||||
admin-tools/how-to-make-a-release.txt,
|
||||
admin-tools/make-dist-newer.sh, admin-tools/make-dist-older.sh,
|
||||
admin-tools/pyenv-newer-versions, admin-tools/pyenv-older-versions,
|
||||
admin-tools/setup-master.sh, admin-tools/setup-python-2.4.sh: Some
|
||||
admin tools I use.
|
||||
|
||||
2017-10-11 rocky <rb@dustyfeet.com>
|
||||
|
||||
* setup.py: remove python_requires
|
||||
|
||||
2017-10-11 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/bin/uncompile.py: Program name was incorrect. uncompile -> uncompyle6
|
||||
|
||||
2017-10-11 rocky <rb@dustyfeet.com>
|
||||
|
||||
* Makefile, NEWS, setup.py, uncompyle6/version.py: Administrivia
|
||||
woes
|
||||
|
||||
2017-10-10 rocky <rb@dustyfeet.com>
|
||||
|
||||
* : commit 9cfd7d669edc7f065bfc314924cfecbb6c7219ec Author: rocky
|
||||
<rb@dustyfeet.com> Date: Tue Oct 10 21:50:06 2017 -0400
|
||||
|
||||
2017-10-10 rocky <rb@dustyfeet.com>
|
||||
|
||||
* HOW-TO-REPORT-A-BUG.md, test/Makefile, uncompyle6/parser.py,
|
||||
uncompyle6/parsers/parse3.py, uncompyle6/scanners/scanner3.py,
|
||||
uncompyle6/semantics/consts.py, uncompyle6/semantics/pysource.py:
|
||||
Improve parse trace. lambda fixes yet again
|
||||
|
||||
2017-10-10 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/simple_source/branching/02_ifelse_lambda.py,
|
||||
uncompyle6/semantics/consts.py: Address dead code in lambda ifelse
|
||||
|
||||
2017-10-10 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse24.py, uncompyle6/scanners/scanner3.py:
|
||||
Misc bugs
|
||||
|
||||
2017-10-10 R. Bernstein <rocky@users.noreply.github.com>
|
||||
|
||||
* : Merge pull request #131 from rocky/type2kind-rework Adjust for spark-parser 2.7.0 incompatibilities
|
||||
|
||||
2017-10-10 rocky <rb@dustyfeet.com>
|
||||
|
||||
* __pkginfo__.py, pytest/test_grammar.py, pytest/test_pysource.py,
|
||||
uncompyle6/parser.py, uncompyle6/parsers/astnode.py,
|
||||
uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse24.py,
|
||||
uncompyle6/parsers/parse26.py, uncompyle6/parsers/parse27.py,
|
||||
uncompyle6/parsers/parse3.py, uncompyle6/parsers/parse32.py,
|
||||
uncompyle6/parsers/parse34.py, uncompyle6/parsers/parse35.py,
|
||||
uncompyle6/parsers/parse36.py, uncompyle6/parsers/parse37.py,
|
||||
uncompyle6/scanners/scanner22.py, uncompyle6/scanners/scanner26.py,
|
||||
uncompyle6/scanners/scanner27.py, uncompyle6/scanners/scanner3.py,
|
||||
uncompyle6/scanners/tok.py, uncompyle6/semantics/check_ast.py,
|
||||
uncompyle6/semantics/fragments.py,
|
||||
uncompyle6/semantics/make_function.py,
|
||||
uncompyle6/semantics/pysource.py, uncompyle6/verify.py,
|
||||
uncompyle6/version.py: Adjust for spark-parser 2.7.0
|
||||
incompatabilities
|
||||
|
||||
2017-10-05 rocky <rb@dustyfeet.com>
|
||||
|
||||
* : One more test
|
||||
|
||||
2017-10-05 rocky <rb@dustyfeet.com>
|
||||
|
||||
* : commit b3359439f94c136619b198beaecbfce1b827d2db Author: rocky
|
||||
<rb@dustyfeet.com> Date: Thu Oct 5 11:00:55 2017 -0400
|
||||
|
||||
2017-10-03 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse24.py,
|
||||
uncompyle6/parsers/parse26.py: handle newer parser reduction
|
||||
behavior
|
||||
|
||||
2017-10-03 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/semantics/pysource.py: Remove schumutz
|
||||
|
||||
2017-10-03 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/semantics/pysource.py: More table doc tweaks
|
||||
|
||||
2017-10-03 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/semantics/fragments.py,
|
||||
uncompyle6/semantics/pysource.py: Go over table-semantics
|
||||
description yet again
|
||||
|
||||
2017-10-02 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse2.py, uncompyle6/parsers/parse3.py:
|
||||
spark-parser induced changes... reduce rules can be called without token streams.
|
||||
|
||||
2017-09-30 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parser.py, uncompyle6/scanners/scanner2.py,
|
||||
uncompyle6/scanners/scanner3.py: Document hacky customize arg count
|
||||
better.
|
||||
|
||||
2017-09-26 rocky <rb@dustyfeet.com>
|
||||
|
||||
* README.rst: Word hacking
|
||||
|
||||
2017-09-26 rocky <rb@dustyfeet.com>
|
||||
|
||||
* ChangeLog, NEWS: Get ready for release 2.12.0
|
||||
|
||||
2017-09-26 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse3.py: No unicode in Python3. but we need it in Python2. The bug was probably introduced as a
|
||||
result of recent Python code type unteroperability canonicalization
|
||||
|
||||
2017-09-26 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/parsers/parse3.py: Pyton 3.1 Annotation args can be
|
||||
unicode?
|
||||
|
||||
2017-09-25 rocky <rb@dustyfeet.com>
|
||||
|
||||
* : Adjust for xdis opcode JUMP_OPS. release 2.12.0
|
||||
|
||||
2017-09-21 rocky <rb@dustyfeet.com>
|
||||
|
||||
* pytest/test_pysource.py: Python 3 compatibility
|
||||
|
||||
2017-09-21 rocky <rb@dustyfeet.com>
|
||||
|
||||
* pytest/test_pysource.py, uncompyle6/semantics/consts.py,
|
||||
uncompyle6/semantics/fragments.py, uncompyle6/semantics/pysource.py:
|
||||
Unit test for format-specifiers And in the process we catch some small bugs
|
||||
|
||||
2017-09-20 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/semantics/fragments.py,
|
||||
uncompyle6/semantics/pysource.py: Tidy pysource and fragments a
|
||||
little more
|
||||
|
||||
2017-09-20 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/semantics/consts.py: Tidy/regularize table entry
|
||||
formatting
|
||||
|
||||
2017-09-20 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/test_pythonlib.py, uncompyle6/semantics/pysource.py: Small
|
||||
fixes test_pyenvlib.py: it is sys.exit(), not exit() pysource.py:
|
||||
reinstate nod type of async_func_call
|
||||
|
||||
2017-09-20 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/semantics/consts.py, uncompyle6/semantics/pysource.py:
|
||||
More small doc changes
|
||||
|
||||
2017-09-20 rocky <rb@dustyfeet.com>
|
||||
|
||||
* pytest/test_pysource.py, uncompyle6/semantics/pysource.py: Update
|
||||
Table-driven info... Start a pysource unit test.
|
||||
|
||||
2017-09-17 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/semantics/fragments.py,
|
||||
uncompyle6/semantics/pysource.py: engine -> template_engine
|
||||
|
||||
2017-09-13 rocky <rb@dustyfeet.com>
|
||||
|
||||
* test/Makefile: Need weak-verification on 3.4 for now
|
||||
|
||||
2017-09-10 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/semantics/fragments.py: Revert one of the changes
|
||||
pending a better fix
|
||||
|
||||
2017-09-10 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/semantics/fragments.py,
|
||||
uncompyle6/semantics/pysource.py: More semantic action cleanup
|
||||
|
||||
2017-09-10 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/scanners/scanner3.py, uncompyle6/scanners/tok.py: Match
|
||||
Python 3.4's terms a little names better
|
||||
|
||||
2017-09-09 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/scanners/tok.py: Revert last revert
|
||||
|
||||
2017-09-09 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/scanners/tok.py: Revert last change
|
||||
|
||||
2017-09-09 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/scanners/tok.py: New-style Python classes only, please.
|
||||
|
||||
2017-08-31 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/scanner.py, uncompyle6/scanners/scanner37.py: Skeletal
|
||||
support for Python 3.7 Largely failing though.
|
||||
|
||||
2017-08-31 rocky <rb@dustyfeet.com>
|
||||
|
||||
* README.rst: Remove python versions tag I think it's messing up Pypi's very fussy formatting
|
||||
|
||||
2017-08-31 rocky <rb@dustyfeet.com>
|
||||
|
||||
* ChangeLog, NEWS, README.rst, __pkginfo__.py,
|
||||
uncompyle6/parsers/parse37.py,
|
||||
uncompyle6/semantics/make_function.py, uncompyle6/version.py: Get
|
||||
ready for release 2.11.5
|
||||
|
||||
2017-08-15 rocky <rb@dustyfeet.com>
|
||||
|
||||
* uncompyle6/version.py: Get ready for release 2.11.4
|
||||
* Makefile: 3.7 support
|
||||
|
||||
2017-08-15 rocky <rb@dustyfeet.com>
|
||||
|
||||
* ChangeLog, NEWS, uncompyle6/version.py: Get ready for release
|
||||
2.11.4
|
||||
|
||||
2017-08-15 rocky <rb@dustyfeet.com>
|
||||
|
||||
|
17
HISTORY.md
17
HISTORY.md
@@ -98,9 +98,20 @@ so. Then hamled made a few commits earler on, while Eike Siewertsen
|
||||
made a few commits later on. But mostly wibiti, and Guenther
|
||||
Starnberger got the code to where uncompyle2 was around 2012.
|
||||
|
||||
In `uncompyle`, decompilation of python bytecode 2.5 & 2.6 is done by
|
||||
transforming the byte code into a pseudo-2.7 Python bytecode and is
|
||||
based on code from Eloi Vanderbeken.
|
||||
While John Aycock and Hartmut Goebel were well versed in compiler
|
||||
technology, those that have come afterwards don't seem to have been as
|
||||
facile in it. Furthermore, documentation or guidance on how the
|
||||
decompiler code worked, comparison to a conventional compiler
|
||||
pipeline, how to add new constructs, or debug grammars was weak. Some
|
||||
of the grammar tracing and error reporting was a bit weak as well.
|
||||
|
||||
Given this, perhaps it is not surprising that subsequent changes
|
||||
tended to shy away from using the built-in compiler technology
|
||||
mechanisms and addressed problems and extensions by some other means.
|
||||
|
||||
Specifically, in `uncompyle`, decompilation of python bytecode 2.5 & 2.6
|
||||
is done by transforming the byte code into 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
|
||||
|
@@ -2,17 +2,98 @@
|
||||
|
||||
## The difficulty of the problem
|
||||
|
||||
There is no Python decompiler yet, that I know about that will
|
||||
decompyle everything. This one probably does the
|
||||
best job of *any* Python decompiler. But it is a constant work in progress: Python keeps changing, and so does its code generation.
|
||||
This decompiler is a constant work in progress: Python keeps
|
||||
changing, and so does its code generation.
|
||||
|
||||
I have found bugs in *every* Python decompiler I have tried. Even
|
||||
those where authors/maintainers claim that they have used it on
|
||||
the entire Python standard library. And I don't mean that
|
||||
the program doesn't come out with the same Python source instructions,
|
||||
but that the program is *semantically* not equivalent.
|
||||
There is no Python decompiler yet that I know about that will
|
||||
decompile everything. Overall, I think this one probably does the best
|
||||
job of *any* Python decompiler that handles such a wide range of
|
||||
versions.
|
||||
|
||||
So it is likely you'll find a mistranslation in decompiling.
|
||||
But at any given time, there are maybe dozens of valid Python bytecode
|
||||
files that I know of that will cause problems. And when I get through
|
||||
those and all the issues of decompiler bugs that are currently logged,
|
||||
I could probably easily find dozens more bugs just by doing a
|
||||
decompile of all the Python bytecode on any one of my
|
||||
computers. Unless you want to help out by _fixing_ bugs, or are
|
||||
willing to do work by isolating and narrowing bugs, don't feel you are
|
||||
doing me a favor by doing scans on your favorite sets of bytecode
|
||||
files.
|
||||
|
||||
In sum, it is not uncommon that you will find a mistranslation in
|
||||
decompiling. Furthermore, you may be expected to do some work in order
|
||||
to have your bug worthy of being considered above other bugs.
|
||||
|
||||
No one is getting paid to work to work on this project, let alone bugs
|
||||
you may have an interest in. If you require decompiling bytecode
|
||||
immediately, consider using a decompilation service.
|
||||
|
||||
## Is it really a bug?
|
||||
|
||||
|
||||
### Do you have valid bytecode?
|
||||
|
||||
As mentioned in README.rst, this project doesn't handle obfuscated
|
||||
code. See README.rst for suggestions for how to remove some kinds of
|
||||
obfuscation.
|
||||
|
||||
Checking if bytecode is valid is pretty simple: disassemble the code.
|
||||
Python comes with a disassembly module called `dis`. A prerequisite
|
||||
module for this package, `xdis` has a cross-python version
|
||||
disassembler.
|
||||
|
||||
### Semantic equivalence vs. exact source code
|
||||
|
||||
Almost all versions of Python can perform some sort of code
|
||||
improvement that can't be undone. In earlier versions of Python it is
|
||||
rare; in later Python versions, it is more common.
|
||||
|
||||
If the code emitted is semantically equivalent, then this isn't a bug.
|
||||
|
||||
|
||||
For example the code might be
|
||||
|
||||
```
|
||||
if a:
|
||||
if b:
|
||||
x = 1
|
||||
```
|
||||
|
||||
and we might produce:
|
||||
|
||||
```
|
||||
if a and b:
|
||||
x = 1
|
||||
```
|
||||
|
||||
These are equivalent. Sometimes
|
||||
|
||||
```
|
||||
else:
|
||||
if ...
|
||||
|
||||
```
|
||||
|
||||
may come out as `elif`.
|
||||
|
||||
|
||||
As mentioned in the README, It is possible that Python changes what
|
||||
you write to be more efficient. For example, for:
|
||||
|
||||
|
||||
```
|
||||
if True:
|
||||
x = 5
|
||||
```
|
||||
|
||||
Python will generate code like:
|
||||
|
||||
```
|
||||
x = 5
|
||||
```
|
||||
|
||||
So just because the text isn't the same, does not
|
||||
necessarily mean there's a bug.
|
||||
|
||||
## What to send (minimum requirements)
|
||||
|
||||
@@ -21,13 +102,20 @@ The basic requirement is pretty simple:
|
||||
* Python bytecode
|
||||
* Python source text
|
||||
|
||||
Please don't put files on download services that one has to register
|
||||
for or can't get to by issuing a simple `curl` or `wget`. If you can't
|
||||
attach it to the issue, or create a github gist, then the code you are
|
||||
sending is too large.
|
||||
|
||||
Also try to narrow the bug. See below.
|
||||
|
||||
## What to send (additional helpful information)
|
||||
|
||||
Some kind folks also give the invocation they used and the output
|
||||
which usually includes an error message produced. This is helpful. I
|
||||
can figure out what OS you are running this on and what version of
|
||||
*uncomplye6* was used. Therefore, if you don't provide the input
|
||||
command and the output from that, please give:
|
||||
which usually includes an error message produced. This is
|
||||
helpful. From this, I can figure out what OS you are running this on
|
||||
and what version of *uncomplye6* was used. Therefore, if you don't
|
||||
provide the input command and the output from that, please give:
|
||||
|
||||
* _uncompyle6_ version used
|
||||
* OS that you used this on
|
||||
@@ -48,11 +136,18 @@ Well, you could learn. No one is born into this world knowing how to
|
||||
disassemble Python bytecode. And as Richard Feynman once said, "What
|
||||
one fool can learn, so can another."
|
||||
|
||||
If this is too difficult, or too time consuming, or not of interest to
|
||||
you, then perhaps what require is a decompilation service. [Crazy
|
||||
Compilers](http://www.crazy-compilers.com/decompyle/) offers a
|
||||
byte-code decompiler service for versions of Python up to 2.6. (If
|
||||
there are others around let me know and I'll list them here.)
|
||||
|
||||
## Narrowing the problem
|
||||
|
||||
I don't need or want the entire source code base for which one file or module
|
||||
can't be decompiled. I just need that one file or module only. If
|
||||
there are several files, file a bug report for each file.
|
||||
I don't need or want the entire source code base for the file(s) or
|
||||
module(s) can't be decompiled. I just need those file(s) or module(s).
|
||||
If there are problems in several files, file a bug report for each
|
||||
file.
|
||||
|
||||
Python modules can get quite large, and usually decompilation problems
|
||||
occur in a single function or maybe the main-line code but not any of
|
||||
@@ -66,3 +161,27 @@ properly on a neighboring version of Python. That is helpful too.
|
||||
|
||||
In sum, the more you can isolate or narrow the problem, the more
|
||||
likley the problem will be fixed and fixed sooner.
|
||||
|
||||
## Confidentiality of Bug Reports
|
||||
|
||||
When you report a bug, you are giving up confidentiality to the source
|
||||
code and the byte code. However, I would imagine that if you have
|
||||
narrowed the problem sufficiently, confidentiality of the little that
|
||||
remains would not be an issue.
|
||||
|
||||
However feel free to remove any commments, and modify variable names
|
||||
or constants in the source code.
|
||||
|
||||
## Ethics
|
||||
|
||||
I do not condone using this program for unethical or illegal purposes.
|
||||
More detestful, at least to me, is asking for help to assist you in
|
||||
something that might not legitimate.
|
||||
|
||||
Don't use the issue tracker for such solicitations. To try to stave
|
||||
off illegitimate behavior, you should note that the issue tracker, the
|
||||
code, and bugs mentioned in that are in the open: there is no
|
||||
confidentiality. You may be asked about the authorship or claimed
|
||||
ownership of the bytecode. If I think something is not quite right, I
|
||||
may label the issue questionable which may make the it easier those
|
||||
who are looking for illegal activity.
|
||||
|
16
Makefile
16
Makefile
@@ -11,7 +11,7 @@ RM ?= rm
|
||||
LINT = flake8
|
||||
|
||||
#EXTRA_DIST=ipython/ipy_trepan.py trepan
|
||||
PHONY=all check clean pytest check-long dist distclean lint flake8 test rmChangeLog clean_pyc
|
||||
PHONY=all check clean distcheck pytest check-long dist distclean lint flake8 test rmChangeLog clean_pyc
|
||||
|
||||
TEST_TYPES=check-long check-short check-2.7 check-3.4
|
||||
|
||||
@@ -36,13 +36,15 @@ check-2.7 check-3.3 check-3.4: pytest
|
||||
check-3.0 check-3.1 check-3.2 check-3.5 check-3.6:
|
||||
$(MAKE) -C test $@
|
||||
|
||||
check-3.7: pytest
|
||||
|
||||
#:Tests for Python 2.6 (doesn't have pytest)
|
||||
check-2.6:
|
||||
$(MAKE) -C test $@
|
||||
|
||||
#:PyPy 2.6.1 or PyPy 5.0.1
|
||||
#:PyPy 2.6.1 PyPy 5.0.1, or PyPy 5.8.0-beta0
|
||||
# Skip for now
|
||||
2.6 5.0 5.3:
|
||||
2.6 5.0 5.3 5.6 5.8:
|
||||
|
||||
#:PyPy pypy3-2.4.0 Python 3:
|
||||
pypy-3.2 2.4:
|
||||
@@ -58,9 +60,13 @@ clean: clean_pyc
|
||||
(cd test && $(MAKE) clean)
|
||||
|
||||
#: Create source (tarball) and wheel distribution
|
||||
dist:
|
||||
dist: distcheck
|
||||
$(PYTHON) ./setup.py sdist bdist_wheel
|
||||
|
||||
# perform some checks on the package via setup.py
|
||||
distcheck:
|
||||
$(PYTHON) ./setup.py check
|
||||
|
||||
#: Remove .pyc files
|
||||
clean_pyc:
|
||||
( cd uncompyle6 && $(RM) -f *.pyc */*.pyc )
|
||||
@@ -87,7 +93,7 @@ bdist_egg:
|
||||
|
||||
|
||||
#: Create binary wheel distribution
|
||||
bdist_wheel:
|
||||
wheel:
|
||||
$(PYTHON) ./setup.py bdist_wheel
|
||||
|
||||
|
||||
|
63
NEWS
63
NEWS
@@ -1,3 +1,64 @@
|
||||
uncompyle6 2.14.0 2017-11-26 johnnybamazing
|
||||
|
||||
- Start to isolate grammar rules between versions
|
||||
and remove used grammar rules
|
||||
- Fix a number of bytecode decompile problems
|
||||
(many more remain)
|
||||
- Add stdlib/runtests.sh for even more rigourous testing
|
||||
|
||||
uncompyle6 2.13.3 2017-11-13
|
||||
|
||||
Overall: better 3.6 decompiling and some much needed code refactoring and cleanup
|
||||
|
||||
|
||||
- Start noting names in for template-action names; these are
|
||||
used to check/assert we have the right node type
|
||||
- Simplify <import_from> rule
|
||||
- Pypy 5.80-beta testing tolerance
|
||||
- Start to clean up instruction mangling phase by using 3.6-style instructions
|
||||
rather trying to parse the bytecode array. This largely been done in for versions 3.x;
|
||||
3.0 custom mangling code has been reduced;
|
||||
some 2.x conversion has been done, but more is desired. This make it possible to...
|
||||
- Handle EXTENDED_ARGS better. While relevant to all Python versions it is most noticeable in
|
||||
version 3.6+ where in switching to wordcodes the size of operands has been reduced from 2**16
|
||||
to 2**8. JUMP instruction then often need EXTENDED_ARGS.
|
||||
- Refactor find_jump_targets() with via working of of instructions rather the bytecode array.
|
||||
- use --weak-verify more and additional fuzzing on verify()
|
||||
- fragment parser now ignores errors in nested function definitions; an parameter was
|
||||
added to assist here. Ignoring errors may be okay because the fragment parser often just needs,
|
||||
well, *fragments*.
|
||||
- Distinguish RETURN_VALUE from RETURN_END_IF in exception bodies better in 3.6
|
||||
- bug in 3.x language changes: import queue va import Queue
|
||||
- reinstate some bytecode tests since decompiling has gotten better
|
||||
- Revise how to report a bug
|
||||
|
||||
uncompyle6 2.13.2 2017-10-12
|
||||
|
||||
- Re-release using a more automated approach
|
||||
|
||||
uncompyle6 2.13.1 2017-10-11
|
||||
|
||||
- Re-release because Python 2.4 source uploaded rather than 2.6-3.6
|
||||
|
||||
uncompyle6 2.13.0 2017-10-10
|
||||
|
||||
- Fixes in deparsing lambda expressions
|
||||
- Improve table-semantics descriptions
|
||||
- Document hacky customize arg count better (until we can remove it)
|
||||
- Update to use xdis 3.7.0 or greater
|
||||
|
||||
uncompyle6 2.12.0 2017-09-26
|
||||
|
||||
- Use xdis 3.6.0 or greater now
|
||||
- Small semantic table cleanups
|
||||
- Python 3.4's terms a little names better
|
||||
- Slightly more Python 3.7, but still failing a lot
|
||||
- Cross Python 2/3 compatibility with annotation arguments
|
||||
|
||||
uncompyle6 2.11.5 2017-08-31
|
||||
|
||||
- Skeletal support for Python 3.7
|
||||
|
||||
uncompyle6 2.11.4 2017-08-15
|
||||
|
||||
* scanner and parser now allow 3-part version string lookups,
|
||||
@@ -5,7 +66,7 @@ uncompyle6 2.11.4 2017-08-15
|
||||
* unpin 3.5.1. xdis 3.5.4 has been releasd and fixes the problems we had. Use that.
|
||||
* some routnes here moved to xdis. Use the xdis version
|
||||
* README.rst: Link typo Name is trepan2 now not trepan
|
||||
* xdis-forched change adjust for COMPARE_OP "is-not" in
|
||||
* xdis-forced change adjust for COMPARE_OP "is-not" in
|
||||
semanatic routines. We need "is not".
|
||||
* Some PyPy tolerance in validate testing.
|
||||
* Some pyston tolerance
|
||||
|
59
README.rst
59
README.rst
@@ -1,10 +1,10 @@
|
||||
|buildstatus| |Supported Python Versions|
|
||||
|buildstatus|
|
||||
|
||||
uncompyle6
|
||||
==========
|
||||
|
||||
A native Python cross-version Decompiler and Fragment Decompiler.
|
||||
Follows in the tradition of decompyle, uncompyle, and uncompyle2.
|
||||
The successor to decompyle, uncompyle, and uncompyle2.
|
||||
|
||||
|
||||
Introduction
|
||||
@@ -12,22 +12,28 @@ Introduction
|
||||
|
||||
*uncompyle6* translates Python bytecode back into equivalent Python
|
||||
source code. It accepts bytecodes from Python version 1.5, and 2.1 to
|
||||
3.6 or so, including PyPy bytecode and Dropbox's Python 2.5 bytecode.
|
||||
3.7 or so, including PyPy bytecode and Dropbox's Python 2.5 bytecode.
|
||||
|
||||
Why this?
|
||||
---------
|
||||
|
||||
There were a number of decompyle, uncompile, uncompyle2, uncompyle3
|
||||
There were a number of decompyle, uncompyle, uncompyle2, uncompyle3
|
||||
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 or 3.3 depending on which
|
||||
code is used. This code pulls these together and moves forward. This
|
||||
project has the most complete support for Python 3.3 and above. It
|
||||
also addresses a number of open issues in the previous forks.
|
||||
code is used. This code pulls these together and moves forward.
|
||||
|
||||
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.
|
||||
This project has the most complete support for Python 3.3 and above
|
||||
and the best all-around Python support.
|
||||
|
||||
We are serious about testing, and use automated processes to find
|
||||
bugs. In the issue trackers for other decompilers, you will find a
|
||||
number of bugs we've found along the way. Very few to none of them are
|
||||
not fixed in the other decompilers.
|
||||
|
||||
Another thing that makes this different from other CPython bytecode
|
||||
decompilers is the ability to deparse just fragments and give
|
||||
source-code information around a given bytecode offset.
|
||||
|
||||
I use this to deparse fragments of code inside my trepan_
|
||||
debuggers_. For that, I need to record text fragments for all
|
||||
@@ -109,14 +115,14 @@ Known Bugs/Restrictions
|
||||
-----------------------
|
||||
|
||||
The biggest known and possibly fixable (but hard) problem has to do
|
||||
with handling control flow. All of the Python decompilers I have looked
|
||||
at have the same problem. In some cases we can detect an erroneous
|
||||
decompilation and report that.
|
||||
with handling control flow. (Python has probably the most diverse and
|
||||
screwy set of compound statements I've ever seen; a number of the
|
||||
usual ones like else clauses on loops and try blocks I suspect most
|
||||
programmers don't know aobut.)
|
||||
|
||||
Over 98% of the decompilation of Python standard library packages in
|
||||
Python 2.7.12 verifies correctly. Over 99% of Python 2.7 and 3.3-3.5
|
||||
"weakly" verify. Python 2.6 drops down to 96% weakly verifying.
|
||||
Other versions drop off in quality too.
|
||||
All of the Python decompilers I have looked at have the same
|
||||
problem. In some cases we can detect an erroneous decompilation and
|
||||
report that.
|
||||
|
||||
*Verification* is the process of decompiling bytecode, compiling with
|
||||
a Python for that bytecode version, and then comparing the bytecode
|
||||
@@ -134,6 +140,17 @@ 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.
|
||||
|
||||
Finally, we have automated running the standard Python tests after
|
||||
first compiling and decompiling the test program. Results here are a
|
||||
bit weak (if not better than most other Python decompilers). But over
|
||||
time this will probably get better.
|
||||
|
||||
Python support is strongest in Python 2 for 2.7 and drops off as you
|
||||
get further away from that. Support is also probably pretty good for
|
||||
python 2.3-2.4 since a lot of the goodness of early the version of the
|
||||
decompiler from that era has been preserved (and Python compilation in
|
||||
that era was minimal)
|
||||
|
||||
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,
|
||||
@@ -144,7 +161,9 @@ In the Python 3 series, Python support is is strongest around 3.4 or
|
||||
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 and has more problems with control flow than
|
||||
3.5 has.
|
||||
3.5 has. Between Python 3.5, 3.6 and 3.7 there have been major changes
|
||||
to the `MAKE_FUNCTION` and `CALL_FUNCTION` instructions. Those are
|
||||
not handled yet.
|
||||
|
||||
Currently not all Python magic numbers are supported. Specifically in
|
||||
some versions of Python, notably Python 3.6, the magic number has
|
||||
@@ -169,7 +188,7 @@ See Also
|
||||
|
||||
* https://github.com/zrax/pycdc : supports all versions of Python and is written in C++. Support for later Python 3 versions is a bit lacking though.
|
||||
* https://code.google.com/archive/p/unpyc3/ : supports Python 3.2 only. The above projects use a different decompiling technique than 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
|
||||
* https://github.com/figment/unpyc3/ : fork of above, but supports Python 3.3 only. Includes some fixes like supporting function annotations
|
||||
* The HISTORY_ file.
|
||||
* `How to report a bug <https://github.com/rocky/python-uncompyle6/blob/master/HOW-TO-REPORT-A-BUG.md>`_
|
||||
* https://github.com/rocky/python-xdis : Cross Python version disassembler
|
||||
@@ -184,7 +203,5 @@ See Also
|
||||
.. _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
|
||||
: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
|
||||
|
@@ -39,8 +39,8 @@ entry_points = {
|
||||
'pydisassemble=uncompyle6.bin.pydisassemble:main',
|
||||
]}
|
||||
ftp_url = None
|
||||
install_requires = ['spark-parser >= 1.6.1, < 1.7.0',
|
||||
'xdis >= 3.5.4, < 3.6.0', 'six']
|
||||
install_requires = ['spark-parser >= 1.8.0, < 1.9.0',
|
||||
'xdis >= 3.6.1, < 3.7.0', 'six']
|
||||
license = 'MIT'
|
||||
mailing_list = 'python-debugger@googlegroups.com'
|
||||
modname = 'uncompyle6'
|
||||
|
11
admin-tools/README.md
Normal file
11
admin-tools/README.md
Normal file
@@ -0,0 +1,11 @@
|
||||
Making a release is a somewhat tedious process so I've automated it a little
|
||||
|
||||
|
||||
Here are tools that I, rocky, use to check and build a distribution.
|
||||
|
||||
They are customized to my environment:
|
||||
- I use pyenv to various Python versions installed
|
||||
- I have git repos for xdis, and spark parser at the same level as uncompyle6
|
||||
|
||||
There may be other rocky-specific things that need customization.
|
||||
how-to-make-a-release.txt has overall how I make a release
|
26
admin-tools/check-newer-versions.sh
Executable file
26
admin-tools/check-newer-versions.sh
Executable file
@@ -0,0 +1,26 @@
|
||||
#!/bin/bash
|
||||
function finish {
|
||||
cd $owd
|
||||
}
|
||||
|
||||
# FIXME put some of the below in a common routine
|
||||
owd=$(pwd)
|
||||
trap finish EXIT
|
||||
|
||||
cd $(dirname ${BASH_SOURCE[0]})
|
||||
if ! source ./pyenv-newer-versions ; then
|
||||
exit $?
|
||||
fi
|
||||
if ! source ./setup-master.sh ; then
|
||||
exit $?
|
||||
fi
|
||||
cd ..
|
||||
for version in $PYVERSIONS; do
|
||||
if ! pyenv local $version ; then
|
||||
exit $?
|
||||
fi
|
||||
make clean && pip install -e .
|
||||
if ! make check; then
|
||||
exit $?
|
||||
fi
|
||||
done
|
27
admin-tools/check-older-versions.sh
Executable file
27
admin-tools/check-older-versions.sh
Executable file
@@ -0,0 +1,27 @@
|
||||
#!/bin/bash
|
||||
function finish {
|
||||
cd $owd
|
||||
}
|
||||
owd=$(pwd)
|
||||
trap finish EXIT
|
||||
|
||||
cd $(dirname ${BASH_SOURCE[0]})
|
||||
if ! source ./pyenv-older-versions ; then
|
||||
exit $?
|
||||
fi
|
||||
if ! source ./setup-python-2.4.sh ; then
|
||||
exit $?
|
||||
fi
|
||||
|
||||
PYVERSIONS='2.7.14 2.6.9 3.3.6 3.4.2 3.5.4 3.6.3'
|
||||
|
||||
cd ..
|
||||
for version in $PYVERSIONS; do
|
||||
if ! pyenv local $version ; then
|
||||
exit $?
|
||||
fi
|
||||
make clean && python setup.py develop
|
||||
if ! make check ; then
|
||||
exit $?
|
||||
fi
|
||||
done
|
88
admin-tools/how-to-make-a-release.md
Normal file
88
admin-tools/how-to-make-a-release.md
Normal file
@@ -0,0 +1,88 @@
|
||||
<!-- markdown-toc start - Don't edit this section. Run M-x markdown-toc-refresh-toc -->
|
||||
**Table of Contents**
|
||||
|
||||
- [Get latest sources:](#get-latest-sources)
|
||||
- [Change version in uncompyle6/version.py. Then:](#change-version-in-uncompyle6versionpy-then)
|
||||
- [Update ChangeLog:](#update-changelog)
|
||||
- [Update NEWS from ChangeLog. Then:](#update-news-from-changelog-then)
|
||||
- [Make sure pyenv is running and check newer versions](#make-sure-pyenv-is-running-and-check-newer-versions)
|
||||
- [Switch to python-2.4, sync that up and build that first since it creates a tarball which we don't want.](#switch-to-python-24-sync-that-up-and-build-that-first-since-it-creates-a-tarball-which-we-dont-want)
|
||||
- [Update NEWS from master branch](#update-news-from-master-branch)
|
||||
- [Check against all versions](#check-against-all-versions)
|
||||
- [Make packages and tag](#make-packages-and-tag)
|
||||
- [Upload single package and look at Rst Formating](#upload-single-package-and-look-at-rst-formating)
|
||||
- [Upload rest of versions](#upload-rest-of-versions)
|
||||
- [Push tags:](#push-tags)
|
||||
|
||||
<!-- markdown-toc end -->
|
||||
# Get latest sources:
|
||||
|
||||
$ . ./admin-tool/update-sources.sh
|
||||
|
||||
# Change version in uncompyle6/version.py. Then:
|
||||
|
||||
$ emacs uncompyle6/version.py
|
||||
$ source uncompyle6/version.py
|
||||
$ echo $VERSION
|
||||
$ git commit -m"Get ready for release $VERSION" .
|
||||
|
||||
# Update ChangeLog:
|
||||
|
||||
$ make ChangeLog
|
||||
|
||||
# Update NEWS from ChangeLog. Then:
|
||||
|
||||
$ emacs NEWS
|
||||
$ make check
|
||||
$ git commit --amend .
|
||||
$ git push # get CI testing going early
|
||||
|
||||
# Make sure pyenv is running and check newer versions
|
||||
|
||||
$ pyenv local && source admin-tools/check-newer-versions.sh
|
||||
|
||||
# Switch to python-2.4, sync that up and build that first since it creates a tarball which we don't want.
|
||||
|
||||
$ source admin-tools/setup-python-2.4.sh
|
||||
$ rm ChangeLog
|
||||
|
||||
# $ git merge master ?
|
||||
|
||||
# Update NEWS from master branch
|
||||
|
||||
$ git commit -m"Get ready for release $VERSION" .
|
||||
|
||||
# Check against all versions
|
||||
|
||||
$ source admin-tools/check-older-versions.sh
|
||||
$ source admin-tools/check-newer-versions.sh
|
||||
|
||||
# Make packages and tag
|
||||
|
||||
$ admin-tools/make-dist-older.sh
|
||||
$ git tag release-python-2.4-$VERSION
|
||||
|
||||
$ admin-tools/make-dist-newer.sh
|
||||
$ git tag release-$VERSION
|
||||
|
||||
# Upload single package and look at Rst Formating
|
||||
|
||||
$ twine upload dist/uncompyle6-${VERSION}-py3.3.egg
|
||||
|
||||
# Upload rest of versions
|
||||
|
||||
$ twine upload dist/uncompyle6-${VERSION}*
|
||||
|
||||
# Push tags:
|
||||
|
||||
$ git push --tags
|
||||
|
||||
# Check on a VM
|
||||
|
||||
$ cd /virtual/vagrant/virtual/vagrant/ubuntu-zesty
|
||||
$ vagrant up
|
||||
$ vagrant ssh
|
||||
$ pyenv local 3.5.2
|
||||
$ pip install --upgrade uncompyle6
|
||||
$ exit
|
||||
$ vagrant halt
|
38
admin-tools/make-dist-newer.sh
Executable file
38
admin-tools/make-dist-newer.sh
Executable file
@@ -0,0 +1,38 @@
|
||||
#!/bin/bash
|
||||
PACKAGE=uncompyle6
|
||||
|
||||
# FIXME put some of the below in a common routine
|
||||
function finish {
|
||||
cd $owd
|
||||
}
|
||||
|
||||
cd $(dirname ${BASH_SOURCE[0]})
|
||||
owd=$(pwd)
|
||||
trap finish EXIT
|
||||
|
||||
if ! source ./pyenv-newer-versions ; then
|
||||
exit $?
|
||||
fi
|
||||
if ! source ./setup-master.sh ; then
|
||||
exit $?
|
||||
fi
|
||||
|
||||
cd ..
|
||||
source $PACKAGE/version.py
|
||||
echo $VERSION
|
||||
|
||||
for pyversion in $PYVERSIONS; do
|
||||
if ! pyenv local $pyversion ; then
|
||||
exit $?
|
||||
fi
|
||||
# pip bdist_egg create too-general wheels. So
|
||||
# we narrow that by moving the generated wheel.
|
||||
|
||||
# Pick out first two number of version, e.g. 3.5.1 -> 35
|
||||
first_two=$(echo $pyversion | cut -d'.' -f 1-2 | sed -e 's/\.//')
|
||||
rm -fr build
|
||||
python setup.py bdist_egg bdist_wheel
|
||||
mv -v dist/${PACKAGE}-$VERSION-{py2.py3,py$first_two}-none-any.whl
|
||||
done
|
||||
|
||||
python ./setup.py sdist
|
39
admin-tools/make-dist-older.sh
Executable file
39
admin-tools/make-dist-older.sh
Executable file
@@ -0,0 +1,39 @@
|
||||
#!/bin/bash
|
||||
PACKAGE=uncompyle6
|
||||
|
||||
# FIXME put some of the below in a common routine
|
||||
function finish {
|
||||
cd $owd
|
||||
}
|
||||
owd=$(pwd)
|
||||
trap finish EXIT
|
||||
|
||||
cd $(dirname ${BASH_SOURCE[0]})
|
||||
if ! source ./pyenv-older-versions ; then
|
||||
exit $?
|
||||
fi
|
||||
if ! source ./setup-python-2.4.sh ; then
|
||||
exit $?
|
||||
fi
|
||||
|
||||
cd ..
|
||||
source $PACKAGE/version.py
|
||||
echo $VERSION
|
||||
|
||||
for pyversion in $PYVERSIONS; do
|
||||
if ! pyenv local $pyversion ; then
|
||||
exit $?
|
||||
fi
|
||||
|
||||
rm -fr build
|
||||
python setup.py bdist_egg
|
||||
done
|
||||
|
||||
# Pypi can only have one source tarball.
|
||||
# Tarballs can get created from the above setup, so make sure to remove them since we want
|
||||
# the tarball from master.
|
||||
|
||||
tarball=dist/${PACKAGE}-$VERSION-tar.gz
|
||||
if [[ -f $tarball ]]; then
|
||||
rm -v dist/${PACKAGE}-$VERSION-tar.gz
|
||||
fi
|
6
admin-tools/pyenv-newer-versions
Normal file
6
admin-tools/pyenv-newer-versions
Normal file
@@ -0,0 +1,6 @@
|
||||
# -*- shell-script -*-
|
||||
if [[ $0 == ${BASH_SOURCE[0]} ]] ; then
|
||||
echo "This script should be *sourced* rather than run directly through bash"
|
||||
exit 1
|
||||
fi
|
||||
export PYVERSIONS='3.5.2 3.6.2 2.6.9 3.3.6 2.7.14 3.4.2'
|
6
admin-tools/pyenv-older-versions
Normal file
6
admin-tools/pyenv-older-versions
Normal file
@@ -0,0 +1,6 @@
|
||||
# -*- shell-script -*-
|
||||
if [[ $0 == ${BASH_SOURCE[0]} ]] ; then
|
||||
echo "This script should be *sourced* rather than run directly through bash"
|
||||
exit 1
|
||||
fi
|
||||
export PYVERSIONS='2.4.6 2.5.6'
|
22
admin-tools/setup-master.sh
Executable file
22
admin-tools/setup-master.sh
Executable file
@@ -0,0 +1,22 @@
|
||||
#!/bin/bash
|
||||
PYTHON_VERSION=3.6.3
|
||||
|
||||
# FIXME put some of the below in a common routine
|
||||
function finish {
|
||||
cd $owd
|
||||
}
|
||||
|
||||
export PATH=$HOME/.pyenv/bin/pyenv:$PATH
|
||||
owd=$(pwd)
|
||||
bs=${BASH_SOURCE[0]}
|
||||
if [[ $0 == $bs ]] ; then
|
||||
echo "This script should be *sourced* rather than run directly through bash"
|
||||
exit 1
|
||||
fi
|
||||
mydir=$(dirname $bs)
|
||||
fulldir=$(readlink -f $mydir)
|
||||
cd $fulldir/..
|
||||
(cd ../python-spark && git checkout master && pyenv local $PYTHON_VERSION) && git pull && \
|
||||
(cd ../python-xdis && git checkout master && pyenv local $PYTHON_VERSION) && git pull && \
|
||||
git checkout master && pyenv local $PYTHON_VERSION && git pull
|
||||
cd $owd
|
16
admin-tools/setup-python-2.4.sh
Executable file
16
admin-tools/setup-python-2.4.sh
Executable file
@@ -0,0 +1,16 @@
|
||||
#!/bin/bash
|
||||
PYTHON_VERSION=2.4.6
|
||||
|
||||
owd=$(pwd)
|
||||
bs=${BASH_SOURCE[0]}
|
||||
if [[ $0 == $bs ]] ; then
|
||||
echo "This script should be *sourced* rather than run directly through bash"
|
||||
exit 1
|
||||
fi
|
||||
mydir=$(dirname $bs)
|
||||
fulldir=$(readlink -f $mydir)
|
||||
cd $fulldir/..
|
||||
(cd ../python-spark && git checkout python-2.4 && pyenv local $PYTHON_VERSION) && git pull && \
|
||||
(cd ../python-xdis && git checkout python-2.4 && pyenv local $PYTHON_VERSION) && git pull && \
|
||||
git checkout python-2.4 && pyenv local $PYTHON_VERSION && git pull
|
||||
cd $owd
|
@@ -1,6 +1,7 @@
|
||||
#!/usr/bin/env python
|
||||
from uncompyle6 import PYTHON_VERSION, IS_PYPY
|
||||
from uncompyle6.scanner import get_scanner
|
||||
from xdis.bytecode import Bytecode
|
||||
from array import array
|
||||
def bug(state, slotstate):
|
||||
if state:
|
||||
@@ -29,12 +30,17 @@ def test_if_in_for():
|
||||
scan.build_lines_data(code, n)
|
||||
scan.build_prev_op(n)
|
||||
fjt = scan.find_jump_targets(False)
|
||||
assert {15: [3], 69: [66], 63: [18]} == fjt
|
||||
assert scan.structs == \
|
||||
[{'start': 0, 'end': 72, 'type': 'root'},
|
||||
{'start': 15, 'end': 66, 'type': 'if-then'},
|
||||
{'start': 31, 'end': 59, 'type': 'for-loop'},
|
||||
{'start': 62, 'end': 63, 'type': 'for-else'}]
|
||||
|
||||
## FIXME: the data below is wrong.
|
||||
## we get different results currenty as well.
|
||||
## We need to probably fix both the code
|
||||
## and the test below
|
||||
# assert {15: [3], 69: [66], 63: [18]} == fjt
|
||||
# assert scan.structs == \
|
||||
# [{'start': 0, 'end': 72, 'type': 'root'},
|
||||
# {'start': 15, 'end': 66, 'type': 'if-then'},
|
||||
# {'start': 31, 'end': 59, 'type': 'for-loop'},
|
||||
# {'start': 62, 'end': 63, 'type': 'for-else'}]
|
||||
|
||||
code = bug_loop.__code__
|
||||
n = scan.setup_code(code)
|
||||
@@ -53,9 +59,11 @@ def test_if_in_for():
|
||||
{'start': 48, 'end': 67, 'type': 'while-loop'}]
|
||||
|
||||
elif 3.2 < PYTHON_VERSION <= 3.4:
|
||||
bytecode = Bytecode(code, scan.opc)
|
||||
scan.code = array('B', code.co_code)
|
||||
scan.build_lines_data(code)
|
||||
scan.build_prev_op()
|
||||
scan.insts = list(bytecode)
|
||||
fjt = scan.find_jump_targets(False)
|
||||
assert {69: [66], 63: [18]} == fjt
|
||||
assert scan.structs == \
|
||||
|
@@ -11,15 +11,18 @@ def test_grammar():
|
||||
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())
|
||||
"Remaining tokens %s\n====\n%s" % (remain_tokens, p.dump_grammar())
|
||||
|
||||
p = get_python_parser(PYTHON_VERSION, is_pypy=IS_PYPY)
|
||||
lhs, rhs, tokens, right_recursive = p.checkSets()
|
||||
(lhs, rhs, tokens,
|
||||
right_recursive, dup_rhs) = p.check_sets()
|
||||
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')]]
|
||||
'unpack',])
|
||||
|
||||
expect_right_recursive = frozenset([('designList',
|
||||
('designator', 'DUP_TOP', 'designList'))])
|
||||
if PYTHON3:
|
||||
expect_lhs.add('load_genexpr')
|
||||
|
||||
@@ -33,19 +36,36 @@ def test_grammar():
|
||||
pass
|
||||
else:
|
||||
expect_lhs.add('kwarg')
|
||||
|
||||
# FIXME: grammar remove_rule on
|
||||
# kv3 ::= expr expr STORE_MAP
|
||||
# doesn't currently work in grammar, so we have this extraneous kv3 around.
|
||||
if 3.3 <= PYTHON_VERSION <= 3.4:
|
||||
expect_lhs.add('kv3')
|
||||
|
||||
assert expect_lhs == set(lhs)
|
||||
assert unused_rhs == set(rhs)
|
||||
assert expect_right_recursive == right_recursive
|
||||
|
||||
expect_dup_rhs = frozenset([('COME_FROM',), ('CONTINUE',), ('JUMP_ABSOLUTE',),
|
||||
('LOAD_CONST',),
|
||||
('JUMP_BACK',), ('JUMP_FORWARD',)])
|
||||
reduced_dup_rhs = {k: dup_rhs[k] for k in dup_rhs if k not in expect_dup_rhs}
|
||||
for k in reduced_dup_rhs:
|
||||
print(k, reduced_dup_rhs[k])
|
||||
# assert not reduced_dup_rhs, reduced_dup_rhs
|
||||
|
||||
s = get_scanner(PYTHON_VERSION, IS_PYPY)
|
||||
ignore_set = set(
|
||||
"""
|
||||
JUMP_BACK CONTINUE RETURN_END_IF
|
||||
JUMP_BACK CONTINUE
|
||||
COME_FROM COME_FROM_EXCEPT
|
||||
COME_FROM_EXCEPT_CLAUSE
|
||||
COME_FROM_LOOP COME_FROM_WITH
|
||||
COME_FROM_FINALLY ELSE
|
||||
LOAD_GENEXPR LOAD_ASSERT LOAD_SETCOMP LOAD_DICTCOMP
|
||||
LAMBDA_MARKER RETURN_LAST
|
||||
LAMBDA_MARKER
|
||||
RETURN_END_IF RETURN_END_IF_LAMBDA RETURN_VALUE_LAMBDA RETURN_LAST
|
||||
""".split())
|
||||
if 2.6 <= PYTHON_VERSION <= 2.7:
|
||||
opcode_set = set(s.opc.opname).union(ignore_set)
|
||||
|
176
pytest/test_pysource.py
Normal file
176
pytest/test_pysource.py
Normal file
@@ -0,0 +1,176 @@
|
||||
from uncompyle6 import PYTHON3
|
||||
from uncompyle6.semantics.consts import (
|
||||
escape, NONE,
|
||||
# RETURN_NONE, PASS, RETURN_LOCALS
|
||||
)
|
||||
|
||||
if PYTHON3:
|
||||
from io import StringIO
|
||||
def iteritems(d):
|
||||
return d.items()
|
||||
else:
|
||||
from StringIO import StringIO
|
||||
def iteritems(d):
|
||||
return d.iteritems()
|
||||
|
||||
from uncompyle6.semantics.pysource import SourceWalker as SourceWalker
|
||||
|
||||
def test_template_engine():
|
||||
s = StringIO()
|
||||
sw = SourceWalker(2.7, s, None)
|
||||
sw.ast = NONE
|
||||
sw.template_engine(('--%c--', 0), NONE)
|
||||
print(sw.f.getvalue())
|
||||
assert sw.f.getvalue() == '--None--'
|
||||
# FIXME: and so on...
|
||||
|
||||
from uncompyle6.semantics.consts import (
|
||||
TABLE_DIRECT, TABLE_R,
|
||||
)
|
||||
|
||||
from uncompyle6.semantics.fragments import (
|
||||
TABLE_DIRECT_FRAGMENT,
|
||||
)
|
||||
|
||||
skip_for_now = "DELETE_DEREF".split()
|
||||
|
||||
def test_tables():
|
||||
for t, name, fragment in (
|
||||
(TABLE_DIRECT, 'TABLE_DIRECT', False),
|
||||
(TABLE_R, 'TABLE_R', False),
|
||||
(TABLE_DIRECT_FRAGMENT, 'TABLE_DIRECT_FRAGMENT', True)):
|
||||
for k, entry in iteritems(t):
|
||||
if k in skip_for_now:
|
||||
continue
|
||||
fmt = entry[0]
|
||||
arg = 1
|
||||
i = 0
|
||||
m = escape.search(fmt)
|
||||
print("%s[%s]" % (name, k))
|
||||
while m:
|
||||
i = m.end()
|
||||
typ = m.group('type') or '{'
|
||||
if typ in frozenset(['%', '+', '-', '|', ',', '{']):
|
||||
# No args
|
||||
pass
|
||||
elif typ in frozenset(['c', 'p', 'P', 'C', 'D']):
|
||||
# One arg - should be int or tuple of int
|
||||
if typ == 'c':
|
||||
item = entry[arg]
|
||||
if isinstance(item, tuple):
|
||||
assert isinstance(item[1], str), (
|
||||
"%s[%s][%d] kind %s is '%s' should be str but is %s. "
|
||||
"Full entry: %s" %
|
||||
(name, k, arg, typ, item[1], type(item[1]), entry)
|
||||
)
|
||||
item = item[0]
|
||||
assert isinstance(item, int), (
|
||||
"%s[%s][%d] kind %s is '%s' should be an int but is %s. "
|
||||
"Full entry: %s" %
|
||||
(name, k, arg, typ, item, type(item), entry)
|
||||
)
|
||||
elif typ in frozenset(['C', 'D']):
|
||||
tup = entry[arg]
|
||||
assert isinstance(tup, tuple), (
|
||||
"%s[%s][%d] type %s is %s should be an tuple but is %s. "
|
||||
"Full entry: %s" %
|
||||
(name, k, arg, typ, entry[arg], type(entry[arg]), entry)
|
||||
)
|
||||
assert len(tup) == 3
|
||||
for j, x in enumerate(tup[:-1]):
|
||||
assert isinstance(x, int), (
|
||||
"%s[%s][%d][%d] type %s is %s should be an tuple but is %s. "
|
||||
"Full entry: %s" %
|
||||
(name, k, arg, j, typ, x, type(x), entry)
|
||||
)
|
||||
assert isinstance(tup[-1], str) or tup[-1] is None, (
|
||||
"%s[%s][%d][%d] sep type %s is %s should be an string but is %s. "
|
||||
"Full entry: %s" %
|
||||
(name, k, arg, j, typ, tup[-1], type(x), entry)
|
||||
)
|
||||
|
||||
elif typ == 'P':
|
||||
tup = entry[arg]
|
||||
assert isinstance(tup, tuple), (
|
||||
"%s[%s][%d] type %s is %s should be an tuple but is %s. "
|
||||
"Full entry: %s" %
|
||||
(name, k, arg, typ, entry[arg], type(entry[arg]), entry)
|
||||
)
|
||||
assert len(tup) == 4
|
||||
for j, x in enumerate(tup[:-2]):
|
||||
assert isinstance(x, int), (
|
||||
"%s[%s][%d][%d] type %s is '%s' should be an tuple but is %s. "
|
||||
"Full entry: %s" %
|
||||
(name, k, arg, j, typ, x, type(x), entry)
|
||||
)
|
||||
assert isinstance(tup[-2], str), (
|
||||
"%s[%s][%d][%d] sep type %s is '%s' should be an string but is %s. "
|
||||
"Full entry: %s" %
|
||||
(name, k, arg, j, typ, x, type(x), entry)
|
||||
)
|
||||
assert isinstance(tup[1], int), (
|
||||
"%s[%s][%d][%d] prec type %s is '%s' should be an int but is %s. "
|
||||
"Full entry: %s" %
|
||||
(name, k, arg, j, typ, x, type(x), entry)
|
||||
)
|
||||
|
||||
else:
|
||||
# Should be a tuple which contains only ints
|
||||
tup = entry[arg]
|
||||
assert isinstance(tup, tuple), (
|
||||
"%s[%s][%d] type %s is '%s' should be an tuple but is %s. "
|
||||
"Full entry: %s" %
|
||||
(name, k, arg, typ, entry[arg], type(entry[arg]), entry)
|
||||
)
|
||||
assert len(tup) == 2
|
||||
for j, x in enumerate(tup):
|
||||
assert isinstance(x, int), (
|
||||
"%s[%s][%d][%d] type '%s' is '%s should be an int but is %s. Full entry: %s" %
|
||||
(name, k, arg, j, typ, x, type(x), entry)
|
||||
)
|
||||
pass
|
||||
arg += 1
|
||||
elif typ in frozenset(['r']) and fragment:
|
||||
pass
|
||||
elif typ == 'b' and fragment:
|
||||
assert isinstance(entry[arg], int), (
|
||||
"%s[%s][%d] type %s is '%s' should be an int but is %s. "
|
||||
"Full entry: %s" %
|
||||
(name, k, arg, typ, entry[arg], type(entry[arg]), entry)
|
||||
)
|
||||
arg += 1
|
||||
elif typ == 'x' and fragment:
|
||||
tup = entry[arg]
|
||||
assert isinstance(tup, tuple), (
|
||||
"%s[%s][%d] type %s is '%s' should be an tuple but is %s. "
|
||||
"Full entry: %s" %
|
||||
(name, k, arg, typ, entry[arg], type(entry[arg]), entry)
|
||||
)
|
||||
assert len(tup) == 2
|
||||
assert isinstance(tup[0], int), (
|
||||
"%s[%s][%d] source type %s is '%s' should be an int but is %s. "
|
||||
"Full entry: %s" %
|
||||
(name, k, arg, typ, entry[arg], type(entry[arg]), entry)
|
||||
)
|
||||
assert isinstance(tup[1], tuple), (
|
||||
"%s[%s][%d] dest type %s is '%s' should be an tuple but is %s. "
|
||||
"Full entry: %s" %
|
||||
(name, k, arg, typ, entry[arg], type(entry[arg]), entry)
|
||||
)
|
||||
for j, x in enumerate(tup[1]):
|
||||
assert isinstance(x, int), (
|
||||
"%s[%s][%d][%d] type %s is %s should be an int but is %s. Full entry: %s" %
|
||||
(name, k, arg, j, typ, x, type(x), entry)
|
||||
)
|
||||
arg += 1
|
||||
pass
|
||||
else:
|
||||
assert False, (
|
||||
"%s[%s][%d] type %s is not known. Full entry: %s" %
|
||||
(name, k, arg, typ, entry)
|
||||
)
|
||||
m = escape.search(fmt, i)
|
||||
pass
|
||||
assert arg == len(entry), (
|
||||
"%s[%s] arg %d should be length of entry %d. Full entry: %s" %
|
||||
(name, k, arg, len(entry), entry))
|
2
setup.py
2
setup.py
@@ -24,6 +24,6 @@ setup(
|
||||
py_modules = py_modules,
|
||||
test_suite = 'nose.collector',
|
||||
url = web,
|
||||
tests_require = ['nose>=1.0'],
|
||||
tests_require = ['nose>=1.0'],
|
||||
version = VERSION,
|
||||
zip_safe = zip_safe)
|
||||
|
@@ -8,6 +8,7 @@ NATIVE_CHECK = check-$(PYTHON_VERSION)
|
||||
|
||||
# Set COMPILE='--compile' to force compilation before check
|
||||
COMPILE ?=
|
||||
COVER_DIR=../tmp/grammar-cover
|
||||
|
||||
# Run short tests
|
||||
check-short:
|
||||
@@ -39,7 +40,7 @@ check-3.3: 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)
|
||||
$(PYTHON) test_pythonlib.py --bytecode-3.4 --weak-verify $(COMPILE)
|
||||
|
||||
#: Run working tests from Python 3.5
|
||||
check-3.5: check-bytecode
|
||||
@@ -47,7 +48,11 @@ check-3.5: check-bytecode
|
||||
|
||||
#: Run working tests from Python 3.6
|
||||
check-3.6: check-bytecode
|
||||
$(PYTHON) test_pythonlib.py --bytecode-3.6 --verify $(COMPILE)
|
||||
$(PYTHON) test_pythonlib.py --bytecode-3.6 --weak-verify $(COMPILE)
|
||||
|
||||
# FIXME
|
||||
#: this is called when running under pypy3.5-5.8.0 or pypy2-5.6.0
|
||||
5.8 5.6:
|
||||
|
||||
#: Check deparsing only, but from a different Python version
|
||||
check-disasm:
|
||||
@@ -67,7 +72,7 @@ check-bytecode-2:
|
||||
check-bytecode-3:
|
||||
$(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
|
||||
--bytecode-3.4 --bytecode-3.5 --bytecode-3.6 --bytecode-pypy3.2
|
||||
|
||||
#: Check deparsing bytecode that works running Python 2 and Python 3
|
||||
check-bytecode: check-bytecode-3
|
||||
@@ -99,26 +104,53 @@ check-bytecode-2.5:
|
||||
|
||||
#: Get grammar coverage for Python 2.5
|
||||
grammar-coverage-2.5:
|
||||
SPARK_PARSER_COVERAGE=/tmp/spark-grammar-25.cover $(PYTHON) test_pythonlib.py --bytecode-2.5
|
||||
SPARK_PARSER_COVERAGE=/tmp/spark-grammar-25.cover $(PYTHON) test_pyenvlib.py --2.5.6
|
||||
-rm $(COVER_DIR)/spark-grammar-25.cover
|
||||
SPARK_PARSER_COVERAGE=$(COVER_DIR)/spark-grammar-25.cover $(PYTHON) test_pythonlib.py --bytecode-2.5
|
||||
SPARK_PARSER_COVERAGE=$(COVER_DIR)/spark-grammar-25.cover $(PYTHON) test_pyenvlib.py --2.5.6
|
||||
|
||||
#: Get grammar coverage for Python 2.6
|
||||
grammar-coverage-2.6:
|
||||
SPARK_PARSER_COVERAGE=/tmp/spark-grammar-26.cover $(PYTHON) test_pythonlib.py --bytecode-2.6
|
||||
SPARK_PARSER_COVERAGE=/tmp/spark-grammar-26.cover $(PYTHON) test_pyenvlib.py --2.6.9
|
||||
-rm $(COVER_DIR)/spark-grammar-26.cover
|
||||
SPARK_PARSER_COVERAGE=$(COVER_DIR)/spark-grammar-26.cover $(PYTHON) test_pythonlib.py --bytecode-2.6
|
||||
SPARK_PARSER_COVERAGE=$(COVER_DIR)/spark-grammar-26.cover $(PYTHON) test_pyenvlib.py --2.6.9
|
||||
|
||||
#: Get grammar coverage for Python 2.7
|
||||
grammar-coverage-2.7:
|
||||
SPARK_PARSER_COVERAGE=/tmp/spark-grammar-27.cover $(PYTHON) test_pythonlib.py --bytecode-2.7
|
||||
SPARK_PARSER_COVERAGE=/tmp/spark-grammar-27.cover $(PYTHON) test_pyenvlib.py --2.7.13
|
||||
-rm $(COVER_DIR)/spark-grammar-27.cover
|
||||
SPARK_PARSER_COVERAGE=$(COVER_DIR)/spark-grammar-27.cover $(PYTHON) test_pythonlib.py --bytecode-2.7
|
||||
SPARK_PARSER_COVERAGE=$(COVER_DIR)/spark-grammar-27.cover $(PYTHON) test_pyenvlib.py --2.7.13
|
||||
|
||||
#: Get grammar coverage for Python 3.2
|
||||
grammar-coverage-3.2:
|
||||
-rm $(COVER_DIR)/spark-grammar-32.cover
|
||||
SPARK_PARSER_COVERAGE=$(COVER_DIR)/spark-grammar-32.cover $(PYTHON) test_pythonlib.py --bytecode-3.2
|
||||
SPARK_PARSER_COVERAGE=$(COVER_DIR)/spark-grammar-32.cover $(PYTHON) test_pyenvlib.py --3.2.6
|
||||
|
||||
#: Get grammar coverage for Python 3.3
|
||||
grammar-coverage-3.3:
|
||||
-rm $(COVER_DIR)/spark-grammar-33.cover
|
||||
SPARK_PARSER_COVERAGE=$(COVER_DIR)/spark-grammar-33.cover $(PYTHON) test_pythonlib.py --bytecode-3.3
|
||||
SPARK_PARSER_COVERAGE=$(COVER_DIR)/spark-grammar-33.cover $(PYTHON) test_pyenvlib.py --3.3.6
|
||||
|
||||
##: Get grammar coverage for Python 3.4
|
||||
grammar-coverage-3.4:
|
||||
-rm $(COVER_DIR)/spark-grammar-34.cover
|
||||
SPARK_PARSER_COVERAGE=$(COVER_DIR)/spark-grammar-34.cover $(PYTHON) test_pythonlib.py --bytecode-3.4
|
||||
SPARK_PARSER_COVERAGE=$(COVER_DIR)/spark-grammar-34.cover $(PYTHON) test_pyenvlib.py --3.4.2
|
||||
|
||||
##: Get grammar coverage for Python 3.5
|
||||
grammar-coverage-3.5:
|
||||
rm $(COVER_DIR)/spark-grammar-35.cover || /bin/true
|
||||
SPARK_PARSER_COVERAGE=$(COVER_DIR)/spark-grammar-35.cover $(PYTHON) test_pythonlib.py --bytecode-3.5
|
||||
SPARK_PARSER_COVERAGE=$(COVER_DIR)/spark-grammar-35.cover $(PYTHON) test_pyenvlib.py --3.5.2
|
||||
|
||||
#: Check deparsing Python 2.6
|
||||
check-bytecode-2.6:
|
||||
pcheck-bytecode-2.6:
|
||||
$(PYTHON) test_pythonlib.py --bytecode-2.6 --weak-verify
|
||||
|
||||
#: Check deparsing Python 2.7
|
||||
check-bytecode-2.7:
|
||||
$(PYTHON) test_pythonlib.py --bytecode-2.7 --verify
|
||||
$(PYTHON) test_pythonlib.py --bytecode-2.7 --weak-verify
|
||||
|
||||
#: Check deparsing Python 3.0
|
||||
check-bytecode-3.0:
|
||||
@@ -138,7 +170,7 @@ check-bytecode-3.3:
|
||||
|
||||
#: Check deparsing Python 3.4
|
||||
check-bytecode-3.4:
|
||||
$(PYTHON) test_pythonlib.py --bytecode-3.4
|
||||
$(PYTHON) test_pythonlib.py --bytecode-3.4 --weak-verify
|
||||
|
||||
#: Check deparsing Python 3.5
|
||||
check-bytecode-3.5:
|
||||
@@ -150,11 +182,11 @@ check-bytecode-3.6:
|
||||
|
||||
#: short tests for bytecodes only for this version of Python
|
||||
check-native-short:
|
||||
$(PYTHON) test_pythonlib.py --bytecode-$(PYTHON_VERSION) --verify $(COMPILE)
|
||||
$(PYTHON) test_pythonlib.py --bytecode-$(PYTHON_VERSION) --weak-verify $(COMPILE)
|
||||
|
||||
#: Run longer Python 2.6's lib files known to be okay
|
||||
check-2.6-ok:
|
||||
$(PYTHON) test_pythonlib.py --ok-2.6 --verify $(COMPILE)
|
||||
$(PYTHON) test_pythonlib.py --ok-2.6 --weak-verify $(COMPILE)
|
||||
|
||||
#: Run longer Python 2.7's lib files known to be okay
|
||||
check-2.7-ok:
|
||||
|
BIN
test/bytecode_2.2/01_augmented_assign.pyc
Normal file
BIN
test/bytecode_2.2/01_augmented_assign.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.2/01_kv.pyc
Normal file
BIN
test/bytecode_2.2/01_kv.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.5/01_augmented_assign.pyc
Normal file
BIN
test/bytecode_2.5/01_augmented_assign.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.5/01_float.pyc
Normal file
BIN
test/bytecode_2.5/01_float.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.6/01_augmented_assign.pyc
Normal file
BIN
test/bytecode_2.6/01_augmented_assign.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
test/bytecode_2.6/02_true_divide.pyc
Normal file
BIN
test/bytecode_2.6/02_true_divide.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.6/02_while1else.pyc
Normal file
BIN
test/bytecode_2.6/02_while1else.pyc
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
test/bytecode_2.7/01_augmented_assign.pyc
Normal file
BIN
test/bytecode_2.7/01_augmented_assign.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.7/01_float.pyc
Normal file
BIN
test/bytecode_2.7/01_float.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.7/01_triple_compare.pyc
Normal file
BIN
test/bytecode_2.7/01_triple_compare.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.7/02_ifelse_lambda.pyc
Normal file
BIN
test/bytecode_2.7/02_ifelse_lambda.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.7/02_true_divide.pyc
Normal file
BIN
test/bytecode_2.7/02_true_divide.pyc
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
test/bytecode_2.7/10_del.pyc
Normal file
BIN
test/bytecode_2.7/10_del.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_2.7/10_lambda.pyc
Normal file
BIN
test/bytecode_2.7/10_lambda.pyc
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
test/bytecode_3.1/10_classdec.pyc
Normal file
BIN
test/bytecode_3.1/10_classdec.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.2/01_triple_compare.pyc
Normal file
BIN
test/bytecode_3.2/01_triple_compare.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
test/bytecode_3.2/03_if_try_raise.pyc
Normal file
BIN
test/bytecode_3.2/03_if_try_raise.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.2/03_map.pyc
Normal file
BIN
test/bytecode_3.2/03_map.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.2/05_while_true_break.pyc
Normal file
BIN
test/bytecode_3.2/05_while_true_break.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
test/bytecode_3.3/01_delete_deref.pyc
Normal file
BIN
test/bytecode_3.3/01_delete_deref.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.3/01_ops.pyc
Normal file
BIN
test/bytecode_3.3/01_ops.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.3/01_triple_compare.pyc
Normal file
BIN
test/bytecode_3.3/01_triple_compare.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.3/03_map.pyc
Normal file
BIN
test/bytecode_3.3/03_map.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
test/bytecode_3.3/10_classdec.pyc
Normal file
BIN
test/bytecode_3.3/10_classdec.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.4/01_delete_deref.pyc
Normal file
BIN
test/bytecode_3.4/01_delete_deref.pyc
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
test/bytecode_3.5/03_map.pyc
Normal file
BIN
test/bytecode_3.5/03_map.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.5/04_importlist.pyc
Normal file
BIN
test/bytecode_3.5/04_importlist.pyc
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
test/bytecode_3.6/01_augmented_assign.pyc
Normal file
BIN
test/bytecode_3.6/01_augmented_assign.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.6/02_ifelse_lambda.pyc
Normal file
BIN
test/bytecode_3.6/02_ifelse_lambda.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.6/04_importlist.pyc
Normal file
BIN
test/bytecode_3.6/04_importlist.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.6/10_extended_arg_loop.pyc
Normal file
BIN
test/bytecode_3.6/10_extended_arg_loop.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_pypy2.7/05_const_map.pyc
Normal file
BIN
test/bytecode_pypy2.7/05_const_map.pyc
Normal file
Binary file not shown.
16
test/simple_source/branching/02_ifelse_lambda.py
Normal file
16
test/simple_source/branching/02_ifelse_lambda.py
Normal file
@@ -0,0 +1,16 @@
|
||||
# We have to do contortions here because
|
||||
# lambda's have to be more or less on a line
|
||||
|
||||
f = lambda x: 1 if x<2 else 3
|
||||
f(5)
|
||||
|
||||
# If that wasn't enough ...
|
||||
# Python will create dead code
|
||||
# in the below. So we must make sure
|
||||
# not to include the else expression
|
||||
|
||||
g = lambda: 1 if True else 3
|
||||
g()
|
||||
|
||||
h = lambda: 1 if False else 3
|
||||
h()
|
3
test/simple_source/bug22/01_kv.py
Normal file
3
test/simple_source/bug22/01_kv.py
Normal file
@@ -0,0 +1,3 @@
|
||||
# Test of building map via kv rules
|
||||
aa = 'aa'
|
||||
dict0 = {'a': 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa','b': 1234,'d': aa,aa: aa}
|
@@ -16,3 +16,17 @@ for a in [__name__]:
|
||||
try:len(a)
|
||||
except:continue
|
||||
y = 2
|
||||
|
||||
# From 2.7.14 decimal.py
|
||||
# Bug is in handling a CONTINUE op as a result of it being inside
|
||||
# an except in a loop
|
||||
def foo(self, error, ordered_errors, vals, funct, Signals):
|
||||
for error in ordered_errors:
|
||||
try:
|
||||
funct(*vals)
|
||||
except error:
|
||||
pass
|
||||
except Signals as e:
|
||||
error = e
|
||||
else:
|
||||
error = 5
|
||||
|
16
test/simple_source/bug30/01_ops.py
Normal file
16
test/simple_source/bug30/01_ops.py
Normal file
@@ -0,0 +1,16 @@
|
||||
# Statements to beef up grammar coverage rules
|
||||
# Force "inplace" ops
|
||||
y = +10 # UNARY_POSITIVE
|
||||
y /= 1 # INPLACE_DIVIDE
|
||||
y %= 4 # INPLACE_MODULO
|
||||
y **= 1 # INPLACE POWER
|
||||
y >>= 2 # INPLACE_RSHIFT
|
||||
y <<= 2 # INPLACE_LSHIFT
|
||||
y //= 1 # INPLACE_TRUE_DIVIDE
|
||||
y &= 1 # INPLACE_AND
|
||||
y ^= 1 # INPLACE_XOR
|
||||
|
||||
# Beef up augassign and STORE_SLICE+3
|
||||
x = [1,2,3,4,5]
|
||||
x[0:1] = 1
|
||||
x[0:3] += 1, 2, 3
|
21
test/simple_source/bug32/03_if_try_raise.py
Normal file
21
test/simple_source/bug32/03_if_try_raise.py
Normal file
@@ -0,0 +1,21 @@
|
||||
# From 3.2 distutils/core
|
||||
# Ensure we handle funky trystmt
|
||||
def setup (ok, dist, **attrs):
|
||||
if ok:
|
||||
try:
|
||||
dist.run_commands()
|
||||
except KeyboardInterrupt:
|
||||
raise SystemExit("interrupted")
|
||||
except IOError as exc:
|
||||
error = exc
|
||||
if dist:
|
||||
raise
|
||||
else:
|
||||
raise SystemExit(error)
|
||||
except (RuntimeError) as msg:
|
||||
if dist:
|
||||
raise
|
||||
else:
|
||||
raise SystemExit("error: " + str(msg))
|
||||
|
||||
return dist
|
18
test/simple_source/bug32/05_while_true_break.py
Normal file
18
test/simple_source/bug32/05_while_true_break.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# From 3.4 mailbox.py
|
||||
# Bug is not not getting control structure right
|
||||
# specifically the 2nd elif not line
|
||||
def _generate_toc(line):
|
||||
while 1:
|
||||
if line.startswith('2'):
|
||||
line = 5
|
||||
while 1:
|
||||
if line:
|
||||
line = 6
|
||||
break
|
||||
elif not line:
|
||||
line = 7
|
||||
break
|
||||
elif not line:
|
||||
break
|
||||
|
||||
return 1
|
5
test/simple_source/bug33/01_triple_compare.py
Normal file
5
test/simple_source/bug33/01_triple_compare.py
Normal file
@@ -0,0 +1,5 @@
|
||||
# In Python 3.3+ this uses grammar rule
|
||||
# compare_chained2 ::= expr COMPARE_OP RETURN_VALUE
|
||||
|
||||
def _is_valid_netmask(self, netmask):
|
||||
return 0 <= netmask <= self._max_prefixlen
|
7
test/simple_source/bug35/04_importlist.py
Normal file
7
test/simple_source/bug35/04_importlist.py
Normal file
@@ -0,0 +1,7 @@
|
||||
# Had bug in 3.x in not having semantic importlist rule
|
||||
def main(osp, Mfile, mainpyfile, dbg=None):
|
||||
try:
|
||||
from xdis import load_module, PYTHON_VERSION, IS_PYPY
|
||||
return PYTHON_VERSION, IS_PYPY, load_module
|
||||
except:
|
||||
pass
|
49
test/simple_source/bug36/10_extended_arg_loop.py
Normal file
49
test/simple_source/bug36/10_extended_arg_loop.py
Normal file
@@ -0,0 +1,49 @@
|
||||
# Bug in 3.6 has to do with parsing jumps where
|
||||
# the offset is more than 256 bytes so an EXTENDED_ARG
|
||||
# instruction is inserted. find_jump_targets() and
|
||||
# detect_control_flow need to be able to work in the presence
|
||||
# of EXTENDED_ARG.
|
||||
|
||||
# This is a problem theoretically in Python before 3.6
|
||||
# but since offsets are very large it isn't noticed.
|
||||
|
||||
# Code is simplified from trepan2/trepan/cli.py
|
||||
import sys
|
||||
def main(dbg=None, sys_argv=list(sys.argv)):
|
||||
|
||||
if sys_argv:
|
||||
mainpyfile = None
|
||||
else:
|
||||
mainpyfile = "10"
|
||||
sys.path[0] = "20"
|
||||
|
||||
while True:
|
||||
try:
|
||||
if dbg.program_sys_argv and mainpyfile:
|
||||
normal_termination = dbg.run_script(mainpyfile)
|
||||
if not normal_termination: break
|
||||
else:
|
||||
dbg.core.execution_status = 'No program'
|
||||
dbg.core.processor.process_commands()
|
||||
pass
|
||||
|
||||
dbg.core.execution_status = 'Terminated'
|
||||
dbg.intf[-1].msg("The program finished - quit or restart")
|
||||
dbg.core.processor.process_commands()
|
||||
except IOError:
|
||||
break
|
||||
except RuntimeError:
|
||||
dbg.core.execution_status = 'Restart requested'
|
||||
if dbg.program_sys_argv:
|
||||
sys.argv = list(dbg.program_sys_argv)
|
||||
part1 = ('Restarting %s with arguments:' %
|
||||
dbg.core.filename(mainpyfile))
|
||||
args = ' '.join(dbg.program_sys_argv[1:])
|
||||
dbg.intf[-1].msg(args + part1)
|
||||
else: break
|
||||
except SystemExit:
|
||||
break
|
||||
pass
|
||||
|
||||
sys.argv = 5
|
||||
return
|
4
test/simple_source/expression/01_float.py
Normal file
4
test/simple_source/expression/01_float.py
Normal file
@@ -0,0 +1,4 @@
|
||||
a = 1e300 * 1e300 * 0
|
||||
b = -1e300 * 1e300 * 0
|
||||
c = 1e300 * 1e300
|
||||
d = -1e300 * 1e300
|
4
test/simple_source/expression/02_true_divide.py
Normal file
4
test/simple_source/expression/02_true_divide.py
Normal file
@@ -0,0 +1,4 @@
|
||||
# Tests BINARY_TRUE_DIVIDE and INPLACE_TRUE_DIVIDE
|
||||
from __future__ import division # needed on 2.6 and 2.7
|
||||
x = len(__file__) / 1
|
||||
x /= 1
|
@@ -6,7 +6,12 @@ def some_other_function():
|
||||
some_variable, = some_function()
|
||||
print(some_variable)
|
||||
|
||||
# From 2.7 test_compile.py
|
||||
# Bug is adding erroneous parens in d[(1:2, 1:2)] += 1
|
||||
def bug(d):
|
||||
d[1:2, 1:2] += 1
|
||||
|
||||
empty_tup = ()
|
||||
one_item_tup = ("item1", )
|
||||
one_item_tup_without_parentheses = "item",
|
||||
one_item_tup_without_parentheses = "item",
|
||||
many_items_tup = ("item1", "item2", "item3")
|
||||
|
@@ -26,3 +26,11 @@ class ExtendedInterpolation():
|
||||
value_getter = lambda option: self._interpolation.before_get(self,
|
||||
section, option, d[option], d)
|
||||
return value_getter
|
||||
|
||||
# Bug from Python 2.7's test_collections.py
|
||||
# is that the lambda function has two
|
||||
# statements in it, one for returning *after* the yield
|
||||
# The return None statement should be removed and the
|
||||
# yield should be turned into a statement
|
||||
def test_Iterable(self):
|
||||
return (lambda: (yield))()
|
||||
|
@@ -1,3 +1,8 @@
|
||||
ary = [1,2,3]
|
||||
# Tests of Python slice operators
|
||||
|
||||
ary = [1,2,3,4,5]
|
||||
# Forces BUILD_SLICE 2 on 3.x
|
||||
ary[:2]
|
||||
ary[2:]
|
||||
# Forces BUILD_SLICE 3
|
||||
ary[1:4:2]
|
||||
|
71
test/simple_source/stmts/01_augmented_assign.py
Normal file
71
test/simple_source/stmts/01_augmented_assign.py
Normal file
@@ -0,0 +1,71 @@
|
||||
"""
|
||||
01_augmented_assign.py modified from
|
||||
|
||||
augmentedAssign.py -- source test pattern for augmented assigns
|
||||
|
||||
This source is part of the decompyle test suite.
|
||||
|
||||
decompyle is a Python byte-code decompiler
|
||||
See http://www.crazy-compilers.com/decompyle/ for
|
||||
for further information
|
||||
"""
|
||||
|
||||
raise RuntimeError("This program can't be run")
|
||||
|
||||
a = 1
|
||||
b = 2
|
||||
a += b; # print a # a = a+b = 3
|
||||
a -= b; # print a # a = a-b = 1
|
||||
a *= b; # print a # a = a*b = 2
|
||||
a -= a; # print a # a = a-a = 0
|
||||
a += 7*3; # print a # == 21
|
||||
|
||||
l= [1,2,3]
|
||||
l[1] *= 3; # print l[1]; # 6
|
||||
l[1][2][3] = 7
|
||||
l[1][2][3] *= 3;
|
||||
|
||||
# Python 2.x
|
||||
# augassign1 ::= expr expr inplace_op ROT_TWO STORE_SLICE+0
|
||||
l[:] += [9]; # print l
|
||||
|
||||
# Python 2.x
|
||||
# augassign1 ::= expr expr inplace_op ROT_THREE STORE_SLICE+2
|
||||
l[:2] += [9]; # print l
|
||||
|
||||
|
||||
# Python 2.x
|
||||
# augassign1 ::= expr expr inplace_op ROT_THREE STORE_SLICE+1
|
||||
l[1:] += [9]; # print l
|
||||
|
||||
# Python 2.x
|
||||
# augassign1 ::= expr expr inplace_op ROT_FOUR STORE_SLICE+3
|
||||
l[1:4] += [9]; # print l
|
||||
|
||||
l += [42,43]; # print l
|
||||
|
||||
a.value = 1
|
||||
a.value += 1;
|
||||
a.b.val = 1
|
||||
a.b.val += 1;
|
||||
|
||||
l = []
|
||||
for i in range(3):
|
||||
lj = []
|
||||
for j in range(3):
|
||||
lk = []
|
||||
for k in range(3):
|
||||
lk.append(0)
|
||||
lj.append(lk)
|
||||
l.append(lj)
|
||||
|
||||
i = j = k = 1
|
||||
def f():
|
||||
global i
|
||||
i += 1
|
||||
return i
|
||||
|
||||
l[i][j][k] = 1
|
||||
i = 1
|
||||
l[f()][j][k] += 1
|
||||
# print i, l
|
@@ -10,3 +10,9 @@
|
||||
def formatweekday(self):
|
||||
with self as encoding:
|
||||
return encoding
|
||||
|
||||
# Bug in 2.7.14 test_contextlib.py. Bug was not enclosing (x,y) in parenthesis
|
||||
def withas_bug(self, nested, a, b):
|
||||
with self.assertRaises(ZeroDivisionError):
|
||||
with nested(a(), b()) as (x, y):
|
||||
1 // 0
|
||||
|
@@ -1,3 +1,5 @@
|
||||
from __future__ import with_statement
|
||||
with (sys) as f:
|
||||
with open(__file__, 'r') as f:
|
||||
print(f)
|
||||
with f:
|
||||
pass
|
||||
|
@@ -11,3 +11,8 @@ del c[2:3]
|
||||
|
||||
d = [0,1,2,3,4,5,6]
|
||||
del d[1:3:2]
|
||||
|
||||
e = ('a', 'b')
|
||||
def foo():
|
||||
global e
|
||||
del e
|
||||
|
3
test/stdlib/README.md
Normal file
3
test/stdlib/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
The programs in here are to test Python stdlib tests in lib/pythonX.Y/test
|
||||
|
||||
We'll compile a test, then decompile it and then run the test
|
23
test/stdlib/compile-file.py
Executable file
23
test/stdlib/compile-file.py
Executable file
@@ -0,0 +1,23 @@
|
||||
#!/usr/bin/env python
|
||||
import sys
|
||||
if len(sys.argv) != 2:
|
||||
print("Usage: compile-file.py *python-file*")
|
||||
sys.exit(1)
|
||||
source = sys.argv[1]
|
||||
|
||||
assert source.endswith('.py')
|
||||
basename = source[:-3]
|
||||
|
||||
# We do this crazy way to support Python 2.6 which
|
||||
# doesn't support version_major, and has a bug in
|
||||
# floating point so we can't divide 26 by 10 and get
|
||||
# 2.6
|
||||
PY_VERSION = sys.version_info[0] + (sys.version_info[1] / 10.0)
|
||||
|
||||
bytecode = "%s-%s.pyc" % (basename, PY_VERSION)
|
||||
|
||||
import py_compile
|
||||
print("compiling %s to %s" % (source, bytecode))
|
||||
py_compile.compile(source, bytecode, 'exec')
|
||||
# import os
|
||||
# os.system("../bin/uncompyle6 %s" % bytecode)
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user