Compare commits

...

1058 Commits

Author SHA1 Message Date
rocky
df2cda5b66 Another RsT typo 2017-11-26 10:32:01 -05:00
rocky
42c49945ad RsT typo 2017-11-26 10:27:53 -05:00
rocky
3c68ca6cde Update test version 2.7.13->2.7.14 2017-11-26 10:08:15 -05:00
rocky
5f6f78531f Get ready for release 2.14.0 2017-11-26 10:00:08 -05:00
rocky
bfac9a6260 Back of build_set/build_list separation 2017-11-26 09:25:37 -05:00
rocky
dd329f9c03 Isolate build_set from build_list in Python 2...
More work is needed. Not done in Python 3 yet
2017-11-26 09:15:35 -05:00
rocky
deb5b8bc6c stdlib/runtess.sh python version detection 2017-11-26 08:13:46 -05:00
rocky
a5e3d01dd3 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 08:07:00 -05:00
rocky
ad755b27a3 Isolaate kv, kv2 and kv3 better 2017-11-26 07:13:04 -05:00
rocky
f98e29a3a3 Localize kv 2017-11-26 01:40:34 -05:00
rocky
79d729e9f9 remove comp_ifnot 2017-11-26 00:58:20 -05:00
rocky
c9eeb681b9 Another test 2017-11-25 23:16:52 -05:00
rocky
43cea023c4 2.7 control-flow bug: except/pass in loop 2017-11-25 22:18:57 -05:00
rocky
566ef37ecc back off of build_slice{2,3} ->slice{2,3}
There is another slice rule that interferes with this.
2017-11-25 21:49:03 -05:00
rocky
b7003914c9 localize 2 and 3 argument BUILD_SLICE...
Nontermninal name matches AST anme now. Add test.
2017-11-25 21:10:11 -05:00
rocky
3d7b160e30 Improve grammar-cover targets 2017-11-25 20:06:01 -05:00
rocky
af38064a1b remove unpack_list rule and ...
tidy things a bit more
2017-11-25 00:32:13 -05:00
rocky
c9f3838d04 Fix bug in 2.x with decorator of old-style class 2017-11-24 21:16:59 -05:00
rocky
f34c558d38 Handle inf, +inf, -nan, and nan constants 2017-11-24 15:30:05 -05:00
rocky
37b8e21c76 A couple more bugs found running 2.7 stdlib tests 2017-11-24 10:22:58 -05:00
rocky
f908e8dd8e One more (lambda) test 2017-11-24 08:57:18 -05:00
rocky
0c386d2c39 Fix bug where lambda has a yield in it 2017-11-24 08:55:26 -05:00
rocky
be5efe3e56 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 07:15:37 -05:00
rocky
85d65e25ba cmp_list -> compare_chained ...
to better match the Python AST name Compare. Relates to Issue #29
2017-11-24 06:58:07 -05:00
rocky
340ac7407f Start another kind of testing...
And fix a bug found in that with 3-way equal
2017-11-24 00:10:12 -05:00
rocky
84632bdc78 Forgot to update a call in last change 2017-11-23 16:44:07 -05:00
rocky
494bbbdadb Reduce 3.5 call_aysnc grammar rules 2017-11-23 16:23:49 -05:00
rocky
0e54c37fab Trystmt grammar from 3.3 needed in 3.2
Add test to cover this
2017-11-23 14:29:31 -05:00
rocky
a94b844988 Add triple compare from 3.3 into 3.2 2017-11-23 13:43:19 -05:00
rocky
7548364e8e Improve try else in 3.2...
Grammar from 3.3 is relevant here
2017-11-23 13:06:08 -05:00
rocky
184f480bc8 Remove whileelselastsmt ...
Right now I don't know what it does and we don't have something that
needs it
2017-11-23 12:33:41 -05:00
rocky
cddb55eb33 provisional 2.7 whileelselast rule 2017-11-23 11:45:24 -05:00
rocky
e2a6c0435d grammar reduction of while loops 2017-11-23 10:51:22 -05:00
rocky
1823513841 3.x Grammar reduction of custom rules...
by looking for token patterns GET_ITER CALL_FUNCTION_1
2017-11-23 07:47:38 -05:00
rocky
d8a3c2708e Grammar coverage and pruning 2017-11-23 05:40:30 -05:00
rocky
d0644e08d7 Isotate conditionalnot 2017-11-22 19:38:02 -05:00
rocky
b8f74c23f4 2.x Grammar reduction/isolation 2017-11-22 19:13:21 -05:00
rocky
b00c59bdd7 Grammar reduction for load_attrs 2017-11-22 14:41:23 -05:00
rocky
c0f0485754 Reduce unecessary grammar rules in 2.x 2017-11-22 13:06:05 -05:00
rocky
288516d8c2 Increase grammar coverage 2017-11-22 11:28:05 -05:00
rocky
2de8718de3 Administrivia: add "git pull"s 2017-11-22 06:29:35 -05:00
rocky
a8e235de17 3.3. grammar cleanup ...
need build_list in for BUILD_TUPLE_0
2017-11-18 11:02:54 -05:00
rocky
f7ff4c2d41 Grammar cleanup: import_as_cont -> import_as 2017-11-18 10:26:57 -05:00
rocky
0c0a534a48 Track spark_parser changes 2017-11-18 09:49:14 -05:00
rocky
e116d7280c custom rule hacking ...
Reduce extraneous 3.x "load_list" and "load_closure" rules
2017-11-17 12:06:14 -05:00
rocky
b7f8bee11f Python 3 grammar clean up and reorganization 2017-11-17 07:16:24 -05:00
rocky
58ee49159e 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-17 00:51:03 -05:00
rocky
934df7b5c4 Python 3.4 while grammar cleanup 2017-11-16 12:36:49 -05:00
rocky
37108bc41c More grammar cleanups 2017-11-16 12:01:18 -05:00
rocky
d18a353381 Tag %c nonterminals in more template rules 2017-11-16 11:31:18 -05:00
rocky
f1004e6445 Bump copyright 2017-11-16 11:23:04 -05:00
rocky
2f218fe9bf More grammar isolation: assert2 in Python3 2017-11-16 11:20:35 -05:00
rocky
2a13851f55 Isolate "assert2" rule 2017-11-16 10:55:40 -05:00
rocky
e26de53332 Isolate "and2" rule to 2.3 2017-11-16 10:47:35 -05:00
rocky
53beae8ee6 Python 2.5 "with"; Isolate 2.5-2.6 grammar better 2017-11-16 09:26:23 -05:00
rocky
953cf312db Add BINARY_TRUE_DIVIDE tests for 2.{6,7} 2017-11-16 01:30:41 -05:00
rocky
183a406bf1 More grammar cleanup 2017-11-16 00:32:34 -05:00
rocky
902941102f 2.7 continue-detection bug 2017-11-16 00:22:24 -05:00
rocky
c28f2f2e56 More 2.7/2.7- grammer separation & cleanup 2017-11-15 23:01:33 -05:00
rocky
f274ac0e3b Grammar cleanup: separate some 2.7 from 2.7- rules 2017-11-15 21:04:06 -05:00
rocky
05e1be7b61 I said, remove dict/setcomp from <= 2.6! 2017-11-15 09:58:34 -05:00
rocky
ee6db130ec grammar cleanup: dict/set comprehensions 2.7+ 2017-11-15 09:38:48 -05:00
rocky
5bcfa254c6 Grammar typo 2017-11-15 04:23:21 -05:00
rocky
95c2336a76 Grammar typo 2017-11-15 04:22:44 -05:00
rocky
039b084e4b One more pypy test 2017-11-15 04:09:52 -05:00
rocky
b60c05ea86 Keep bytecode_2.7 pypy free...
We need to add _another_ pypy directory
2017-11-15 04:00:54 -05:00
rocky
968e8465bc del stmt testing on 2.7 2017-11-15 03:35:55 -05:00
rocky
3a0f0557f7 Stronger 3.4 testing ...
parse3.py: remove unused grammar rule
2017-11-15 03:33:40 -05:00
rocky
63a43d0c93 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-15 03:16:54 -05:00
rocky
9a141a3144 Guard around null ast
This can happen in profiling
2017-11-14 10:58:41 -05:00
rocky
669a220762 bug report doc tweak 2017-11-13 11:39:17 -05:00
rocky
1436ba7abb add note on illegal use 2017-11-13 11:28:35 -05:00
rocky
69847dbeec detected old-style Python 2.4 class better 2017-11-13 10:57:50 -05:00
rocky
35e4e03468 Administrivia 2017-11-13 09:53:10 -05:00
rocky
d1917046f4 Get ready for release 2.13.3 2017-11-13 09:43:12 -05:00
rocky
55f12e36b7 Back off --verify for --weak-verify 2017-11-12 21:26:57 -05:00
rocky
81669ad7e7 Back off --verify for --weak-verify 2017-11-12 20:43:27 -05:00
rocky
5b9f9319a8 Reinstate previously failed tests
2.6, 3.5 and 3.6 decompilation has gotten better
2017-11-12 16:05:19 -05:00
rocky
4b0892bcb5 Use newer xdis 2017-11-10 22:30:03 -05:00
rocky
74731a9d42 Fix bug in return-optimized try stmt 2017-11-09 11:01:29 -05:00
rocky
b9dfba7400 More detail is needed in bug reporting...
sigh.
2017-11-09 09:57:11 -05:00
rocky
9ec43de039 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-09 04:42:47 -05:00
rocky
5d42fe39bb Merge branch 'master' of github.com:rocky/python-uncompyle6 2017-11-08 23:06:23 -05:00
rocky
e9b60ddbf0 Better Python 3 ENDIF detection
If we have

COMPARE_OP exception-match
POP_JUMP_IF...
....
RETURN_VALUE

Then RETURN_VALUE can't be RETURN_END_IF
2017-11-08 23:05:01 -05:00
rocky
0e04b12ad4 more wordsmithing 2017-11-08 16:00:02 -05:00
rocky
cb2b6d9bf4 more wordsmithing 2017-11-08 15:58:27 -05:00
rocky
a28f5604ce more wordsmithing 2017-11-08 15:56:54 -05:00
rocky
55ced53ca9 Typo 2017-11-08 15:54:25 -05:00
rocky
41f5835fcf Typo 2017-11-08 15:54:08 -05:00
rocky
70b77025ac Typo 2017-11-08 15:53:48 -05:00
rocky
918d4f5808 Typo 2017-11-08 15:53:09 -05:00
rocky
024f295feb Tweak how to report a bug. 2017-11-08 15:42:51 -05:00
rocky
0bb793239b 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-08 10:31:38 -05:00
R. Bernstein
f82165aaa7 Merge pull request #135 from rocky/3.6-instruction-refactor
3.6 instruction refactor
2017-11-07 12:58:07 -05:00
rocky
4c77170ddf Small fixes and tweaks:
parser.py: handle errors when no tokens have been produced.
scanner3{,0}.py: DRY custom scanner 3.0 rem_or code.
scanner3.py misc other small tweaks
2017-11-07 12:48:03 -05:00
rocky
3e4889bcd7 Small tweaks to sync up better with scanner2.py 2017-11-06 13:30:49 -05:00
rocky
7beac3f646 Remove parts of erroneous 2.7 test for now 2017-11-06 12:56:50 -05:00
rocky
6b6755d599 Fix 3.{3,4} pytest. Remove dup find_jump_targets 2017-11-06 12:27:43 -05:00
rocky
4a904951f4 Move refactored find-jump-targets from 3.6 to 3.x 2017-11-06 11:54:01 -05:00
rocky
124267849c 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 09:43:49 -05:00
rocky
6bffae91fa 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 09:10:42 -05:00
rocky
da6e32b08e Merge branch 'master' into 3.6-instruction-refactor 2017-11-06 00:47:17 -05:00
rocky
9379922c89 Iterate over instruction, not bytecode 2017-11-06 00:46:49 -05:00
rocky
6dbdaedf7a Revert change that should have been in a branch 2017-11-06 00:45:04 -05:00
rocky
dea17cd7f1 xdis _disassemble->disassemble 2017-11-06 00:38:22 -05:00
rocky
4f0a668b7c Add flag to tolerate deparse errors...
and keep going. The fragment parser should ignore errors
in nested function definitions
2017-11-04 12:29:27 -04:00
rocky
6746e5167d Add Python 3.6.3 scanner lookup 2017-11-04 11:13:55 -04:00
R. Bernstein
b32823bb7d Merge pull request #134 from mikemrm/master
Corrected python3 import from queue
2017-11-03 10:23:24 -04:00
Mike Mason
54332ddffb Corrected python3 import from queue 2017-11-03 09:05:52 -05:00
rocky
b83d6c64ed Python 3.6 control flow bug...
Much more is needed, but it's a start
2017-10-29 23:52:58 -04:00
rocky
95268cb14e In verify, JUMP_BACK is the same as CONTINUE...
at least for now. See FIXME in verify
2017-10-29 21:34:34 -04:00
rocky
5df09540b5 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-29 11:46:28 -04:00
rocky
5e7632c33e Bump uncompyle. Pypy 5.8.0-beta tolerance 2017-10-24 22:56:23 -04:00
rocky
1761ba2581 Tag more semantic actions with nonterminals 2017-10-13 15:43:41 -04:00
rocky
03d1c48088 More node checking in tables 2017-10-13 11:35:17 -04:00
rocky
9dd881fae1 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 11:16:58 -04:00
rocky
2fc3886693 Small changes 2017-10-13 07:52:56 -04:00
rocky
0dfbb27af5 Administrivia - generalize shell code 2017-10-12 20:36:24 -04:00
rocky
e42e3cc230 Update install doc 2017-10-12 07:29:52 -04:00
rocky
0560c32093 Update instructions 2017-10-12 07:26:52 -04:00
rocky
3f309cebab Administrivia 2017-10-12 07:19:46 -04:00
rocky
d3a42ff992 Minor 2017-10-12 07:14:53 -04:00
rocky
b1e650a7bd Merge branch 'master' of github.com:rocky/python-uncompyle6 2017-10-12 06:52:24 -04:00
rocky
491572ed2d Get ready for release 2.13.2 2017-10-12 06:52:02 -04:00
rocky
717b22bd13 Get ready for release 2.13.2 2017-10-12 06:51:08 -04:00
rocky
5e1d91cb94 Administrivia 2017-10-11 22:09:03 -04:00
rocky
e0def48020 Adminstrivia 2017-10-11 21:51:01 -04:00
rocky
9a2534556c Some admin tools I use. 2017-10-11 21:15:06 -04:00
rocky
85269dc4d8 remove python_requires 2017-10-11 17:18:47 -04:00
rocky
01a39bf8ed Program name was incorrect.
uncompile -> uncompyle6
2017-10-11 14:52:42 -04:00
rocky
97999c5e67 Administrivia woes 2017-10-11 07:56:52 -04:00
rocky
4563a547bc Merge branch 'master' of github.com:rocky/python-uncompyle6 2017-10-10 22:08:30 -04:00
rocky
9cfd7d669e Get ready for release 2.13.0 2017-10-10 22:08:10 -04:00
rocky
413f5aa5a5 Improve parse trace. lambda fixes yet again 2017-10-10 21:50:06 -04:00
rocky
b4426931ef Address dead code in lambda ifelse 2017-10-10 19:05:16 -04:00
rocky
92f5981661 Misc bugs 2017-10-10 16:08:24 -04:00
R. Bernstein
54fe07e989 Merge pull request #131 from rocky/type2kind-rework
Adjust for spark-parser 2.7.0 incompatibilities
2017-10-10 15:19:03 -04:00
rocky
adc9b99106 More spark-parser 2.7.0 compatabilithy changes 2017-10-10 15:11:08 -04:00
rocky
1392b18bd7 Adjust for spark-parser 2.7.0 incompatabilities 2017-10-10 14:14:26 -04:00
rocky
9ae84092cb One more test 2017-10-05 11:13:35 -04:00
rocky
85d68a7926 Merge branch 'master' of github.com:rocky/python-uncompyle6 2017-10-05 11:03:59 -04:00
rocky
b3359439f9 if bug in lambda with ifelse
A synergy of Python's irregular lambda, its custom ifelse syntax and its
marvelous indentation regime. Fixes #130
2017-10-05 11:00:55 -04:00
rocky
9be9abc682 handle newer parser reduction behavior 2017-10-03 11:53:05 -04:00
rocky
c17ac696d6 Remove schumutz 2017-10-03 11:39:26 -04:00
rocky
9e2119f1a9 More table doc tweaks 2017-10-03 11:36:25 -04:00
rocky
86305097d2 Go over table-semantics description yet again 2017-10-03 05:42:14 -04:00
rocky
c8d15e7654 spark-parser induced changes...
reduce rules can be called without token streams.
2017-10-02 03:09:28 -04:00
rocky
1d7a3c6444 Document hacky customize arg count better. 2017-09-30 18:02:35 -04:00
rocky
e7778f83f2 Word hacking 2017-09-26 10:35:00 -04:00
rocky
b51039ac1e Get ready for release 2.12.0 2017-09-26 09:59:55 -04:00
rocky
f73f0ba41c 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 09:43:01 -04:00
rocky
114f979555 Pyton 3.1 Annotation args can be unicode? 2017-09-26 09:31:04 -04:00
rocky
7b38d2f1f8 Adjust for xdis opcode JUMP_OPS. release 2.12.0 2017-09-25 20:01:31 -04:00
rocky
dfbd60231b Get ready for release 2.12.0 2017-09-25 19:11:25 -04:00
rocky
8b67f2ccd0 Python 3 compatibility 2017-09-21 11:47:42 -04:00
rocky
aadea7224d Unit test for format-specifiers
And in the process we catch some small bugs
2017-09-21 11:25:51 -04:00
rocky
da7421da1c Tidy pysource and fragments a little more 2017-09-20 19:02:56 -04:00
rocky
96ca68a6fe Tidy/regularize table entry formatting 2017-09-20 17:47:56 -04:00
rocky
147b6e1cfe Small fixes
test_pyenvlib.py: it is sys.exit(), not exit()
pysource.py: reinstate nod type of async_func_call
2017-09-20 11:32:42 -04:00
rocky
d7b12f4da1 More small doc changes 2017-09-20 02:49:14 -04:00
rocky
c7b9e54e59 Update Table-driven info...
Start a pysource unit test.
2017-09-20 00:06:50 -04:00
rocky
3003070acb engine -> template_engine 2017-09-17 11:56:51 -04:00
rocky
19d6dedcf5 Need weak-verification on 3.4 for now 2017-09-13 01:09:04 -04:00
rocky
51ad3fb36e Revert one of the changes pending a better fix 2017-09-10 03:01:19 -04:00
rocky
f017acce21 More semantic action cleanup 2017-09-10 02:56:47 -04:00
rocky
5bef5683e4 Match Python 3.4's terms a little names better 2017-09-10 00:48:54 -04:00
rocky
4e1467adc8 Revert last revert 2017-09-09 08:08:40 -04:00
rocky
7cdf0abb43 Revert last change 2017-09-09 08:03:04 -04:00
rocky
9b336251a7 New-style Python classes only, please. 2017-09-09 07:47:21 -04:00
rocky
7844456e1e Skeletal support for Python 3.7
Largely failing though.
2017-08-31 10:12:09 -04:00
rocky
356ea6c770 Remove python versions tag
I think it's messing up Pypi's very fussy formatting
2017-08-31 09:50:48 -04:00
rocky
4d58438515 Get ready for release 2.11.5 2017-08-31 09:42:14 -04:00
rocky
f7bfe3f7b2 3.7 support 2017-08-15 21:52:43 -04:00
rocky
c54a47b15f Get ready for release 2.11.4 2017-08-15 10:57:14 -04:00
rocky
d1e02afb4b Misc cleanups...
remove code now in xdis
require at least xdis 3.5.4
PyPy tolerance in validate testing
2017-08-15 09:41:39 -04:00
rocky
f4ceb6304d Allow 3-part version string lookups, e.g 2.7.1
We allow a float here, but if passed a string like
'2.7'. or  '2.7.13', accept that in looking up
either a scanner or a parser.
2017-08-13 09:17:07 -04:00
rocky
503039ab51 Link typo
Name is trepan2 now not trepan
2017-08-10 09:41:48 -04:00
rocky
8393064136 Get ready for release 2.11.3
need xdis 3.5.1 for now. Adjust for xdis "is-not" which we need as "is not"
2017-08-09 22:09:31 -04:00
rocky
bb9b3ac9cf Revert commit to wrong branch 2017-08-02 08:25:39 -04:00
rocky
05ac60ea74 Remove six from Python-2.4/2.5 package 2017-08-02 08:18:54 -04:00
rocky
d138a01bf1 xdis's "exception match" is now "exception-match" 2017-07-17 22:42:57 -04:00
rocky
9e8e4f54c7 xdis 3.5.1 is botched? 2017-07-15 00:24:40 -04:00
rocky
a06a5e1cd8 Use newer xdis 2017-07-14 23:45:56 -04:00
R. Bernstein
1048f6a964 Fixes issue #124 2017-07-14 23:43:40 -04:00
rocky
7fed237077 History updates 2017-07-14 08:03:06 -04:00
rocky
8b816ead0d RsT doc formatting 2017-07-09 02:06:39 -04:00
rocky
300d387349 Get ready for release 2.11.2 2017-07-09 01:44:55 -04:00
rocky
27ab6fe2f5 Use xdis 3.5.0's opcode sets 2017-07-08 20:41:46 -04:00
rocky
2e164763eb Start supporting Pypy 3.5 (5.7.1-beta) 2017-07-08 17:47:32 -04:00
rocky
d332bde104 Loops in Python 2.4-2.6 loop come_from
Looks like Python 2.4-2.6 may have a COME_FROM(_LOOP)
before the jump_back.

Fixes Issue #123
2017-07-05 06:12:14 -04:00
rocky
0893652943 Work around not having real flow-control analysis 2017-06-29 20:49:01 -04:00
rocky
6efd7afda3 continue non-detection in Python 2.7
fixes issue 122
2017-06-29 20:27:07 -04:00
rocky
ee3202779a A guard against badly formated bytecode 2017-06-28 18:39:05 -04:00
rocky
9c072a6a42 3.x funciton and annotation bug fixes 2017-06-25 18:46:03 -04:00
rocky
277ad36566 Get ready for release 2.11.1 2017-06-25 13:50:46 -04:00
rocky
af3d46b35c Use xdis' instruction offset calculation fns..
next_offset, op_size, has_argument
2017-06-24 06:43:04 -04:00
rocky
e1bc0c5cd6 Python 2 sometimes need str->uncode in writing? 2017-06-19 08:02:59 -04:00
rocky
5a519ed36a Allow deparsed out to be str as well as unicode 2017-06-19 07:55:09 -04:00
rocky
af10f99776 Get ready for release 2.11.0 2017-06-18 15:31:44 -04:00
rocky
0cbafa6e3a Adjust nodeInfo if it is a Token 2017-06-13 04:41:32 -04:00
rocky
4afaee2a36 Add nonterminal node in extractInfo 2017-06-13 04:17:23 -04:00
rocky
daea3c348c Fragment tag more expressions
Revise make_function3 comment wrt args and kwargs
2017-06-10 16:31:56 -04:00
rocky
bf45260588 Fragment tag array subscripts 2017-06-10 08:05:18 -04:00
R. Bernstein
34a356d237 Create README.rst 2017-06-10 06:21:36 -04:00
R. Bernstein
d9c1374a59 Create README.rst 2017-06-10 06:14:06 -04:00
rocky
2e05137f2b Set YIELD_VALUE offset in a <yield> expr 2017-06-10 02:09:58 -04:00
rocky
267ecda070 Python 3.2 MAKE_FUNCTION again..
Was handling bug32/01_named_and_kwargs.py wrong again
2017-06-10 01:42:50 -04:00
R. Bernstein
7e89839777 Merge pull request #119 from rocky/scan-longconstant
Simplify access to L65536 ...
2017-06-09 18:57:28 -04:00
rocky
c7f8edd5ef Simplify access to L65536 ...
and fix use in scanner26.py. Thanks to AnythingTechPro
2017-06-09 18:22:02 -04:00
rocky
6a991833a3 Attempt to document the MAKE_FUNCTION/MAKE_LAMBDA mess...
in Python 3.0+
2017-06-09 06:52:14 -04:00
rocky
28ee3f1257 Correct make_function3 for Pytohn 3.2 2017-06-08 21:49:13 -04:00
rocky
e9588e56e2 Disable "continue" removal in pysource.py
"continue" could be the only statement and then removing it
might lead to a dangling "else".
2017-06-08 04:35:06 -04:00
rocky
7b2217fda4 Mark "pass" offsets.
Start routine to find previous node.
2017-06-07 22:14:38 -04:00
rocky
5ca219f3d3 Remove hacky fragments try fixup...
hacky call_function code is also not needed or will be reinstated
properly. Better grammar structure for Python 3.6 call_function.
2017-06-06 21:58:47 -04:00
rocky
b733a1b036 BUILD_{MAP,TUPLE}_UNPACK & CALL_FUNCTION_EX_KW...
Bang on these in 3.6. Not totally succesfull right now.
In fact a regression on one of the test cases
2017-06-05 23:51:51 -04:00
rocky
4615cda03f Important fragments bug fix...
start, finish that had been adjusted wasn't getting reflected in final
returned deparsed.offsets dictionary. Redo keeping API compatibility,
i.e we still use namedtuple NodeInfo.
2017-06-05 21:17:17 -04:00
rocky
eb92418224 Python 3.5 *args with kwargs handling.
3.5 is a snowflake here. Thank you, Python.

Fully fixes Issue 95.

3.6 is broken on this source, but for a *different* reason. Sigh.
2017-06-04 17:53:51 -04:00
rocky
844221cd43 Small changes.
fragment tag EXEC_STMT
2017-06-03 23:29:46 -04:00
rocky
7c299fbf37 Streamline .travis.yml a little bit 2017-06-03 05:38:05 -04:00
rocky
da695115b5 We need six 2017-06-03 05:36:50 -04:00
rocky
f1d9e194fe Go over administrivia 2017-06-03 05:31:46 -04:00
rocky
e727a437ea Get ready for release 2.10.1 2017-06-03 05:26:34 -04:00
rocky
9a3e11a957 Fragment bugs
fragment.py:
* deparse_code_aorund_offset: was sometimes returning the wrong type
* capture function name offset
* lint imports

pysource.py: use a clearer variable name
2017-06-03 05:18:40 -04:00
rocky
966a4bc7dc Track changes in ifelstmtr..
in fragments from pysource
2017-06-02 21:15:23 -04:00
rocky
ad98fae3d4 Get ready for release 2.10.0 2017-05-30 01:55:36 -04:00
rocky
cbbf64ccd0 Python 3.6 makefunction handling for fragments 2017-05-30 01:25:33 -04:00
rocky
394120bb1a Fix up 3.6 unmapexpr 2017-05-23 21:10:14 -04:00
rocky
7257ba41c5 Fix up retreiving "async" property on 3.6 2017-05-23 21:02:06 -04:00
rocky
9eee4eccd7 Fix bug in a 3.6 class name. 2017-05-23 19:00:06 -04:00
rocky
cf3c07e047 Add fuzzy offset deparse lookup 2017-05-23 06:10:31 -04:00
rocky
d93b7a9eae Correct EXTENDED_ARG handling on Python 3.6...
where it can appear several times and xdis may handle it as well.
It possibly in other versions bug since EXTENDED_ARG is used so rarely
there because it has such a high value 1<<16, it's hard to test and
determine that.
2017-05-21 04:44:11 -04:00
rocky
5ebb731c04 Worse results. Revert some of the last changes 2017-05-20 07:50:41 -04:00
rocky
d3794ec9af More explicit about 3.5 UNMAP_PACK
Have to reduce 3.5 bytecode testing for now, code is more solid.
2017-05-20 07:40:59 -04:00
rocky
2ab7aa2f48 Simplify EXTENDED_ARG on 3.x
We largely remove them and fold them itno the next op.
MAKE_FUNCTION though before 3.6 is an exception as that indicates an
annotated function
2017-05-19 22:06:18 -04:00
rocky
49fd430505 EXTENDED_ARG is implemented in 2.6 2017-05-19 19:29:56 -04:00
rocky
2a47f0309f Fix EXTENDED_ARG for long lists, sets, maps 2017-05-19 15:36:53 -04:00
rocky
3084ac20e9 Another attempt at getting get_target() correct 2017-05-19 07:52:31 -04:00
rocky
9c846c309e Bug in pypy JUMP_IF_NOT_DEBUG handling 2017-05-19 07:18:25 -04:00
rocky
b4efa62fad EXTENDED_ARG handling...
get_target() wasn't taking into account EXTENDED_ARG before opcode.

This is mostly relevant in Python 3.6 where the max size before needing
EXTENDED_ARG has been reduced to 256, but theoretically possible in earlier
versions.
2017-05-19 07:13:20 -04:00
rocky
94d1c6dfd3 Enforce using xdis >=3.3.1 ..
to pick up bug fixes to 3.6 in xdis
2017-05-18 04:20:16 -04:00
rocky
6991a637a2 Small changes....
* __pkginfo__.py: Need spark parser 1.6.1 for corrected remove_rules() fn
* parser36.py: remove replaced Python3 rules
* scanner3.py: corrected comment. Thanks to moagstar here.
*
2017-05-17 23:31:56 -04:00
rocky
52b1f4d2b6 Fix broken CI on 3.6...
Another grammar rule replacing SETUP_LOOP with setup_loop
2017-05-16 20:23:24 -04:00
rocky
0ce804ae16 More EXTENDED_ARGS on 3.6 2017-05-16 06:20:41 -04:00
rocky
d2502f205e extend use of EXTENDED_ARGS in 3.6
switching to a wordcode seems to have made opcode fields smaller so we
need EXTENDED_ARG more?
2017-05-16 06:03:57 -04:00
rocky
2ad40a5648 Allow LOAD_CONST EXTENDED_ARG 2017-05-16 00:22:48 -04:00
rocky
d1a695b2bd Reinstate 3.6 listcomp rule 2017-05-15 19:28:17 -04:00
rocky
47b6a35abc Bang on 3.6 MAKE_FUNCTION some more 2017-05-15 03:07:11 -04:00
rocky
b1e32c7cc5 towards fixing a 3.5.CALL_FUNCTONI_VAR bug 2017-05-14 12:23:47 -04:00
rocky
47977b3372 Python 3.5 kw arg can be an expr
Fixes Issue #95
2017-05-14 11:46:15 -04:00
R. Bernstein
2a7a166696 Merge pull request #117 from rocky/3.6-MAKE_FUNCTION
3.6 make function
2017-05-14 03:47:05 -04:00
rocky
ea732acf49 In conjunction with MAKE_FUNCTION_FLAGS change...
Switched from tuple to string, but forgot to change the code that uses this.
2017-05-13 17:29:20 -04:00
rocky
da884487d5 MAKE_FUNCTION_FLAGS can be a simpler tuple 2017-05-13 11:47:27 -04:00
rocky
ff73efcf8e Grammar rules for Python 3.6 MAKE_FUNCTION 2017-05-13 11:39:19 -04:00
rocky
a32c0e68ef Bang on 3.6 MAKE_FUNCTION a bit more
parse3.py, parse36.py: adding return_closure rule tags what's going on
with this rule

pysource.py: start changing semantic rules to support code changed by
new make_function semantics

README.rst: typo
2017-05-13 10:06:43 -04:00
rocky
73857c831b Typo 2017-05-13 06:12:31 -04:00
rocky
4c2ca44818 Bug in 2.7 decompiling ourself!
Troublesome file was uncompyle6.semantics.pysource.engine()
2017-05-12 22:52:05 -04:00
R. Bernstein
3e7add1138 Merge pull request #113 from grkov90/patch-1
Fixed out_base bug
2017-05-11 16:39:08 -04:00
Gregory Komagurov
69fd1b3371 Fix tests 2017-05-11 19:43:14 +03:00
rocky
d540146d5a WIP: start 3.6 MAKE_FUNCTION handling 2017-05-11 07:00:46 -04:00
Daniel Bradburn
e9a17010c7 Merge pull request #116 from moagstar/function_call_keyword_only
Added support for Python 3.6 CALL_FUNCTION_KW
2017-05-11 07:56:08 +02:00
Daniel Bradburn
038692dbf9 Double star arg only test is no longer expected to fail 2017-05-10 22:57:48 +02:00
Daniel Bradburn
93437152a2 Fixed bug in compiling double star arg only function calls where the closing parenthesis would be missed 2017-05-10 22:52:49 +02:00
Daniel Bradburn
b952f56c44 Adding requirement for pytest >= 3.0 to fix strange INTERNALERROR in combination with hypothesis when using pytest 2.6.4 2017-05-10 22:36:28 +02:00
Daniel Bradburn
ca1679e636 Added support for support for Python 3.6 CALL_FUNCTION_KW 2017-05-10 21:49:42 +02:00
rocky
8d084ed358 pysource guard and another appveyor test 2017-05-08 07:03:10 -04:00
rocky
a10914a645 appveyor take 2 2017-05-08 06:44:43 -04:00
rocky
9c0ef9fa63 Try appveyor 2017-05-08 06:28:36 -04:00
rocky
449d74af51 More guarded CONTINUE deletion 2017-05-07 13:30:26 -04:00
rocky
f8a40c1949 Reduce spurious "continue" statements 2017-05-07 13:15:26 -04:00
rocky
e10e184eda --weak-verify on 3.3 with inclusion of last commit
Note that the result is sematically equivalent, so it is is correct.
2017-05-07 09:13:50 -04:00
rocky
605721c995 Python 3.x control-flow bug...
"pass" statement inside "while True"
2017-05-07 09:10:05 -04:00
rocky
50d875f6a6 Small typo 2017-05-07 08:01:48 -04:00
rocky
26e8de8532 Fix improper COME_FROM_EXCEPT in Python 3.3+ 2017-05-07 03:19:53 -04:00
rocky
89d8a70778 python 3.3 while True parsing bug 2017-05-06 10:00:33 -04:00
rocky
1093ef5c5b Get ready for release 2.9.11 2017-05-06 07:34:30 -04:00
rocky
dcaca27821 fix PYTHON variable setting in test/Makefile 2017-05-06 07:25:01 -04:00
rocky
4a47822904 Fix more Python3.2 parser errors 2017-05-06 05:25:56 -04:00
rocky
4e9555a7f6 Improve Python 3.2 decompilation ...
by removing a lot of the control-flow labels of 3.3+
2017-05-05 21:34:21 -04:00
rocky
d1c0413b79 Try CI testing on Python 3.6 2017-05-05 17:55:01 -04:00
Gregory
93ec81673b Some fix 2017-05-03 18:25:55 +03:00
Gregory
0cf5f41fda Fixed out_base bug
Variable filename using in for

tags 
uncompyle6 -o haven't worked
argument -o haven't worked
2017-05-03 15:14:53 +03:00
rocky
246495febd Bang more on BUIlD_MAP_UNPACK
there are still bugs. Note:

{**{'x': 1}, **{'y': 2}} and
{{'x': 1}, **{'y': 2}}

generate the same Python 3.5+ bytecode.
2017-05-02 21:55:41 -04:00
rocky
91b86ac156 BUILD_MAP_UNPACK'ing of dictionaries in 3.5 2017-05-02 05:51:48 -04:00
rocky
26cd91046e Remove extra unpack *. Issue #98 2017-05-01 05:26:55 -04:00
R. Bernstein
b42c66e091 Update HISTORY.md 2017-04-29 22:32:16 -04:00
rocky
364827a2f2 Handle BUILD_MAP_UNPACK in a build_list 2017-04-29 21:44:52 -04:00
rocky
819458564c A hacky way to get CALL_FUNCTION_EX_KW to work. 2017-04-27 21:38:30 -04:00
rocky
486f313532 remove debug code 2017-04-26 02:14:28 -04:00
rocky
84fd71b73b Python 3.6 CALL_FUNCTION_EX first attempt 2017-04-25 07:31:01 -04:00
rocky
50687e6317 Reduse scope of LOAD_ASSERT as expr to 3.4+ 2017-04-22 22:10:55 -04:00
rocky
b35546157f LOAD_ASSERT can also be an expr
This may have the undesirable property that assert statements might get
tagged with equivalant low-level Python code that uses "raise
AssertionError", but so be it.

Fixes #103
2017-04-22 20:03:21 -04:00
R. Bernstein
7755dddd94 Update HISTORY.md 2017-04-22 11:18:08 -04:00
R. Bernstein
ce1e841255 Update HISTORY.md 2017-04-22 11:15:45 -04:00
rocky
68f0f79030 History keeps gettting amended 2017-04-22 11:12:52 -04:00
rocky
bf195a234f Document Python 3.x status 2017-04-22 10:57:54 -04:00
rocky
87db833f62 Add await expr
Fixes #111
2017-04-22 10:39:20 -04:00
rocky
8081decf7c Update test 2017-04-22 04:29:18 -04:00
rocky
e5008693a1 3.3+ bug in handling single kwarg after *
Towards fixing issue #110
2017-04-22 04:19:04 -04:00
rocky
810649799c Add async for with pass statement
Fixes #109
2017-04-20 12:39:15 -04:00
rocky
d4be647bce 3.5 ifelsestmtl grammar bug.
Fixes #108
2017-04-19 05:08:48 -04:00
rocky
4a898ff4c1 Expand await stmt handling
Fixes #107
2017-04-18 01:51:23 -04:00
rocky
cb6925beec Add DELETE_DEREF grammar rule
Fixes Issue #106
2017-04-18 01:35:08 -04:00
rocky
2665f292c5 Rename test case to something more appropriate 2017-04-17 05:43:50 -04:00
rocky
33be34c6fb Fix botched test case
Thanks to Zm908 for pointing this out
2017-04-17 05:35:43 -04:00
rocky
3bbc94847d Comment on what's up with last change 2017-04-16 16:07:08 -04:00
rocky
3a8d4e1a12 Python 3.x ifelse in comprehension
Fixes Issue #91
2017-04-16 14:47:11 -04:00
rocky
87e005a7ba Add 2.7 complex test 2017-04-16 10:31:15 -04:00
rocky
5477ca294d Correct bug in 3.5+ build_list with UNPACK 2017-04-15 22:34:56 -04:00
R. Bernstein
31c28d0220 Update HOW-TO-REPORT-A-BUG.md 2017-04-15 18:56:56 -04:00
R. Bernstein
659e28d686 Update HOW-TO-REPORT-A-BUG.md 2017-04-15 18:42:01 -04:00
rocky
8a33a583cd 3.6 generates Wonky EXTENDED_ARG in expression
Fixes Issue #102
2017-04-15 18:31:39 -04:00
rocky
8a776176e2 Add how to report a bug
Add test case for ... if 1 else ...
2017-04-15 10:41:13 -04:00
rocky
03498963d4 Python 3.5+ BUILD_UNMAP_PACK rules
Towards addressing Issue #98
2017-04-14 23:39:56 -04:00
rocky
47dbc57f3d Reduce adding RETURN_END_IF in 3.5+
The whole control flow determination has to be redone in a less
haphazard way using real flow-control analysis. Hopefully that's on the
way.

In the meantime we have this hack.
2017-04-14 06:57:25 -04:00
rocky
39b9810587 Better names for a test 2017-04-14 05:05:02 -04:00
rocky
8cdaac93ab Add if1else. Fixes #101 2017-04-13 21:27:22 -04:00
rocky
a9f7a3c6d0 In 3.x come_from should include COME_FROM_EXCEPT 2017-04-13 20:27:02 -04:00
rocky
495bdd7b64 Towards fixing issue #92 2017-04-13 01:48:17 -04:00
rocky
b4ded92822 Add Python 2.3 rule for "if 1: ..."
Fully fixes #97 for Python 2.3. Python 2.4 was fixed in a previous commit.
2017-04-13 01:14:49 -04:00
rocky
be9194c223 annotate args type need to be expr's not constants 2017-04-12 20:12:41 -04:00
rocky
45bd8e4058 Handle Python 2.4 "if 1...." 2017-04-12 04:50:22 -04:00
rocky
bb24df596d Bang on 3.x annotations 2017-04-11 17:09:10 -04:00
rocky
6acec471e3 Towards fixing annotated decorator functions...
and annotate functions
2017-04-11 05:56:20 -04:00
rocky
41343c27b7 Misc bugs
parse2.py: restore accidently-removed while1stmt rule
scanner27.py: grammar typo
check_ast: add while1else to list of looping constructs
pysource.py: CALL_FUNCTION_VAR_KW_ARGS with positional args rule is different?
2017-04-10 07:57:56 -04:00
rocky
9e34654b38 Add more while1else grammar rules
Towards addressing issue #93
2017-04-10 02:47:46 -04:00
rocky
b9703cf6b4 One more FUNCTION_VAR test for 3.3 2017-04-09 06:58:41 -04:00
rocky
792df2a7a7 Another Python 3.5 FUNCTION_VAR bug
Fixes #94
2017-04-09 06:54:32 -04:00
rocky
b4a6c3c319 Merge branch 'master' of github.com:rocky/python-uncompyle6 2017-04-09 05:32:46 -04:00
rocky
4199bc7f61 Fix Python 3.5 CALL_FUNCTION_VAR_KW
Fixes Issue #95
2017-04-09 05:30:45 -04:00
rocky
91e1d2538f Merge branch 'master' of github.com:rocky/python-uncompyle6 2017-04-03 06:53:32 -04:00
rocky
6773a66b99 Tidy use of load_attrs 2017-04-03 06:53:12 -04:00
rocky
ed6cb9af79 Merge branch 'master' of github.com:rocky/python-uncompyle6 2017-03-27 07:10:16 -04:00
rocky
a91cd71667 Note we've run this on Python 3.0-3.1 bytecodes
__pkginfo__.py: use ore recent xdis
2017-03-27 07:08:59 -04:00
rocky
6f82ae3642 Use more-recent xdis 2017-03-19 14:01:59 -04:00
rocky
4e05c741e3 grammar typo and add another test 2017-03-15 03:59:07 -04:00
rocky
fdcb90f661 Python 3.0 doesn't have POP_JUMP_IF... 2017-03-12 10:32:05 -04:00
rocky
f416473562 Note problem in handling pathologically long lists 2017-03-12 10:16:10 -04:00
rocky
5856802902 Small cleanup - remove POP_JUMP_TF 2017-03-07 22:07:29 -05:00
rocky
4f2ae2f603 More accurate ranges of try blocks in 3.x 2017-03-05 00:05:52 -05:00
rocky
ea1651d8ca More accurate ranges of try blocks in 3.x 2017-03-05 00:03:01 -05:00
R. Bernstein
be769da401 Merge pull request #84 from moagstar/property_based_test_function_call
Property based test function call
2017-03-04 14:43:34 -05:00
Daniel Bradburn
cb3c5e7119 validation now uses xdis for python2 support 2017-03-04 20:23:39 +01:00
rocky
39e3582e72 README updates for 3.5 and 1.5 2017-03-04 11:54:02 -05:00
rocky
a0c090932e Bug found by hypothesis in creating function calls 2017-03-04 11:49:09 -05:00
Daniel Bradburn
d1e118afa3 marked all function call tests as failing until they pass across all python versions 2017-03-04 13:04:31 +01:00
Daniel Bradburn
f7da8fd8ab added minimal examples for various function call opcodes 2017-03-04 12:44:11 +01:00
Daniel Bradburn
3b1dd9d1c4 added property based test for verifying uncompylation of function calls. A number of minimal examples for the various function call opcodes have been generated with the majority marked as expected failure until python 3.6 opcode support is complete. I'm hoping this will make it easier to figure out what needs to be done to support the new opcodes and changed semntics for function calls 2017-03-04 12:43:12 +01:00
Daniel Bradburn
91fd1ce732 reduced errors when generating function call instances 2017-03-03 21:38:53 +01:00
Daniel Bradburn
a46e7cbfa4 added test file for function calls 2017-03-03 21:06:31 +01:00
Daniel Bradburn
d46873c44d added .idea to gitignore 2017-03-03 21:03:50 +01:00
Daniel Bradburn
54e50771ab added .venv to gitignore 2017-03-03 21:03:06 +01:00
rocky
160ec0d9cc COME_FROM for 3.x POP_EXCEPT, DRY with op_name() ...
Start adding COME_FROMs for POP_EXCEPT in preparation for
getting tryelse blocks correct.

Simpler opname access functions:
  - self.op_name(op) is self.opc.opname[op]
  - self.op_name_from_offset(offset) is self.opc.opname[self.code[offset]]

verify.py: not all offsets are ints
2017-03-01 05:50:31 -05:00
rocky
e1111e3f50 Python 2.6 a == b or c == d == 3 grammar bug 2017-02-28 09:18:36 -05:00
rocky
65913778a5 2.6 a == b or x == y == z bug 2017-02-28 03:12:48 -05:00
rocky
cf21fff38b Predidence of cmp_list: x == y == z
The x, y, z should not have parenthesis around pairs of them
(x == y) or (y == z)
2017-02-28 01:25:33 -05:00
rocky
29122340e6 Python 2.7 check jump targets of "and" 2017-02-28 00:15:39 -05:00
rocky
1e3ea60055 Get ready for release 2.9.10 2017-02-25 20:35:00 -05:00
rocky
2fbbc728b1 Python 2.6 parsing bugs ..
and some parser list nonterminal cleanup
2017-02-25 04:45:10 -05:00
rocky
0a6c8ba909 Python 2.6 control flow bug with added COME_FROM 2017-02-24 21:29:28 -05:00
rocky
d3904527e6 Python 2.5 wasn't handling tryelse properly 2017-02-22 05:38:30 -05:00
rocky
b043f6bafc New test doesn't --verify correctly. Sigh. 2017-02-20 09:22:01 -05:00
rocky
aa207a3c77 Add test for last while1 bug fix 2017-02-20 09:15:39 -05:00
rocky
747212c62c Python 3.x needs more "while 1" grammar rules 2017-02-20 08:57:16 -05:00
rocky
493e4b14a1 Some Python 3.4 bugss fixed by using 3.5 rules 2017-02-20 08:17:17 -05:00
rocky
9491c67779 More COME_FROM's in Python 3...
Need this to find boundaries of simple if better
2017-02-20 04:17:46 -05:00
rocky
8ef5e5d12b Marginally better for Python 2.6 but...
control flow is still wrong.
2017-02-19 08:12:15 -05:00
rocky
222986640e Merge branch 'coverage'
Beef up coverage
2017-02-10 02:09:28 -05:00
rocky
f9d47abb2b Reduce withas and with semantic footprint
This appears in python 2.5+ only. 2.5 is via "from future"
2017-02-10 02:08:52 -05:00
rocky
31ed869a6f Beef up grammar coverage 2017-02-10 02:03:28 -05:00
rocky
19d2569515 Changes based on grammar coverage info 2017-01-29 23:01:12 -05:00
R. Bernstein
9348411056 Merge pull request #83 from rocky/coverage
Coverage
2017-01-29 21:54:45 -05:00
rocky
e71dd010d7 Simplfy getting coverage
consts.py: notes on versions use which ops
2017-01-29 21:39:29 -05:00
rocky
dadd1c5c45 Add --coverage to test_pyenvlib and ...
improve grammar coverage on 2.7
2017-01-29 18:06:07 -05:00
rocky
99af1c9ffe Merge branch 'master' into coverage 2017-01-29 07:35:02 -05:00
rocky
3dc766d0a9 Update date 2017-01-29 07:34:49 -05:00
rocky
357005c814 Add --coverage option. WOOT! 2017-01-29 07:33:41 -05:00
rocky
41d63a0261 Bump min spark_parser version 2017-01-27 16:41:31 -05:00
rocky
1cb2cd7a82 More 2.6, 2.7 control flow
Todo more COME_FROMs but now need to check targets better. In some cases
we're relying on grammar ambiguity to work out right and in 2.7 it doesn't
2017-01-24 01:21:28 -05:00
rocky
9ec312ba5e More 2.6, 2.7 control-flow bugs
Wasn't limiting exception clause to try finally. Probably still has bugs
in try-finally nesting

Add another 2.6/2.7 COME_FROM to try to limit if/end scope better
2017-01-24 00:53:30 -05:00
rocky
597d51951e Improve Python 2.6 & 2.7 verification 2017-01-23 02:32:09 -05:00
rocky
cc2321f49e Fix up Python 3.0 handling 2017-01-22 03:45:40 -05:00
rocky
476a1c8ab5 Merge branch 'master' of github.com:rocky/python-uncompyle6 2017-01-21 06:25:54 -05:00
rocky
545a46dffa Correct spelling of Earley 2017-01-21 06:24:31 -05:00
rocky
8333e4ae93 Handle BUILD_CONST_KEY_MAP as a varargs
custom rules with BUILD_CONST_KEY_MAP are pinned to the specific number
of args seen.
2017-01-20 20:41:10 -05:00
R. Bernstein
e9057f378a Merge pull request #81 from moagstar/BUILD_CONST_KEY_MAP
fixed bug with BUILD_CONST_KEY_MAP
2017-01-19 20:43:10 -05:00
Daniel Bradburn
36b75abd90 fixed bug with BUILD_CONST_KEY_MAP 2017-01-19 21:58:56 +01:00
R. Bernstein
1528537ca4 Merge pull request #80 from moagstar/BUILD_CONST_KEY_MAP
Build const key map
2017-01-19 01:24:18 -05:00
Daniel Bradburn
6b8ae29267 added dev requirement six 2017-01-18 22:43:33 +01:00
Daniel Bradburn
33ec66a82f added generation of dict display from BUILD_CONST_KEY_MAP 2017-01-18 22:38:09 +01:00
Daniel Bradburn
b0493d1984 fixed typo 2017-01-18 22:34:12 +01:00
Daniel Bradburn
7f37c60c42 added some more test cases for BUILD_CONST_KEY_MAP 2017-01-18 22:33:44 +01:00
Daniel Bradburn
e2fd308928 simplified test cases for test_build_const_key_map 2017-01-17 23:07:27 +01:00
Daniel Bradburn
6d7cec002a added validation code for checking decompilation of an expression 2017-01-17 22:40:31 +01:00
rocky
9c49b5d54b Handle 3.6 BUILD_CONST_KEYMAP 2017-01-15 11:10:13 -05:00
rocky
8dc23e2cdc Python 2.1 doesn't have FOR_ITER or GET_ITER...
adjust locgic for this fact
2017-01-15 09:50:38 -05:00
rocky
a01b8be054 sys.recursionlimit is optional, not essential 2017-01-12 04:48:39 -05:00
rocky
114fe11e66 Merge branch 'master' of github.com:rocky/python-uncompyle6 2017-01-11 21:44:12 -05:00
rocky
b131c20e99 Get ready for release 2.9.9 2017-01-11 21:42:25 -05:00
rocky
5db1178b3e Get ready for release 2.10.9 2017-01-11 21:38:30 -05:00
R. Bernstein
7ece296f76 Merge pull request #79 from rocky/revert-78-patch-1
Revert "fix bug : not generate all files when use "-ro""
2017-01-11 07:10:23 -05:00
R. Bernstein
5035d5433b Revert "fix bug : not generate all files when use "-ro"" 2017-01-11 07:09:18 -05:00
R. Bernstein
78a5b620a7 Merge pull request #78 from jlugjb/patch-1
fix bug : not generate all files when use "-ro"
2017-01-11 07:06:10 -05:00
jlugjb
e851c0d46a fix bug : not generate all files when use "-ro"
when use the args of "-ro  outdir inputdir", only the first file is generated, other files is covered.
2017-01-11 17:02:36 +08:00
rocky
a760188724 Improve BUILD_xxx_UNPACK slightly 2017-01-10 04:36:28 -05:00
rocky
ad345ef94a Add async_call_function for 3.5+ 2017-01-09 07:03:51 -05:00
rocky
d050dd3adb Reinstate test 2017-01-09 06:01:06 -05:00
rocky
9392103998 Works now 2017-01-08 22:28:33 -05:00
rocky
707770049f Python 3.0 decompile bugs 2017-01-08 22:19:15 -05:00
rocky
ec0669367f Towards better 3.0 decompilation
Sync scanner2 and scanner3 better
2017-01-08 17:40:57 -05:00
rocky
3f40c16587 Fix 3.5, 3.6 while true if/break bug 2017-01-08 15:54:49 -05:00
rocky
66518baed0 Misc cleanups
Favor "decompile" over "uncompyle" since "decompile" is in common use
Reduce size of pysource.py by splitting out constants
2017-01-08 09:26:19 -05:00
rocky
21023fea74 Add 3.5+ async with/for ..
scanner3.py: 3.6 bytecode vs wordcode fix
2017-01-08 08:54:03 -05:00
rocky
66741d16ba Start to add 3.5+ await and async 2017-01-07 21:36:37 -05:00
rocky
e02ebef45d More Python 3 annotation bugs 2017-01-07 10:27:42 -05:00
rocky
99fce6dfd7 Fix some errors in deparsing Python 3 annotations 2017-01-07 03:03:53 -05:00
rocky
7b8c5e091c Small Pyhton 3.x annotate bug 2017-01-07 00:21:59 -05:00
rocky
77caf515ea Note what's up with Python 3 decompile quality 2017-01-03 07:38:01 -05:00
rocky
e4c0d56947 3.5 continue check is needed on 3.6 2017-01-03 07:22:25 -05:00
rocky
4827b1e994 Towards better 3.6 support 2017-01-03 00:44:07 -05:00
rocky
2b46e71264 Python 3.5 continue detection bug 2017-01-02 10:06:52 -05:00
rocky
84c2932bc5 add come_from for setup_finally and setup_except 2017-01-01 21:11:35 -05:00
rocky
874b3c9d31 Towards fixing Python 3.5 return bugs 2017-01-01 04:56:15 -05:00
rocky
f6a997befc Note how to verify correctness ...
with --verify, --weak-verify and cross checking with pycdc
2017-01-01 02:13:13 -05:00
rocky
136f42a610 Get ready for release 2.9.9 2016-12-31 05:38:16 -05:00
rocky
c43e734f37 2.x list_if may have a THEN in it 2016-12-31 05:28:37 -05:00
rocky
2327f0fdfa Towards fixing a Python 3.3 return/continue bug 2016-12-31 03:56:41 -05:00
rocky
0afcd31bd5 On --verify if we can't unbuffer output, don't 2016-12-30 05:07:41 -05:00
rocky
6f097ff1ca dectect_structure() -> detect_control_flow() 2016-12-29 07:32:36 -05:00
rocky
8eb1a16f5b DRY code and emitted Python 3 source
* Python 3: break; continue -> break
* Use variable in detect_structure for pre[rtarget]
* Make Python 2 and Python 3 detect_structure more alie
2016-12-29 07:28:37 -05:00
rocky
ed9fb64e72 More if/then detection in Python 3.x 2016-12-29 03:56:39 -05:00
R. Bernstein
d002c667ae Merge pull request #73 from rocky/then-crap
Add THEN token to improve Python 2.2-2.6 control flow detection
2016-12-29 02:52:41 -05:00
R. Bernstein
e56743cc14 Merge pull request #72 from rocky/master
THEN psuedo-ops for Python 2.x
2016-12-29 01:49:59 -05:00
rocky
39814fab8b Misc bugs 2016-12-28 20:16:13 -05:00
rocky
970774ab95 Merge branch 'master' of github.com:rocky/python-uncompyle6 2016-12-28 20:15:36 -05:00
rocky
723fa5dfed Towards fixing a 3.2 while true: ... break bug 2016-12-28 19:13:11 -05:00
rocky
4d4e59c40b Towards fixing a 3.2 while true: ... break bug 2016-12-28 18:58:02 -05:00
rocky
a92e6c9688 Bugs in Python 2.6- "and" and "lambda" handling ..
and clean up verify output
2016-12-28 04:54:11 -05:00
rocky
6c546fe6e1 WIP : Add THEN to disambigute from "and" 2016-12-27 22:45:08 -05:00
rocky
9b1dd0f26c Make 2.6 and 2.7 ingest more alike 2016-12-27 10:29:29 -05:00
rocky
0ff0c97a95 Update 2.7 bytecode file for last fix 2016-12-26 09:37:20 -05:00
R. Bernstein
3e988be075 Merge pull request #71 from jiangpengcheng/tupple_bug
tupples which contain only 1 element need a comma
2016-12-26 09:31:15 -05:00
jiangpch
eb64a03dfa add testcases for tuple assignment 2016-12-26 19:22:57 +08:00
jiangpch
9aa4e2b9ae tupples which contain only 1 element need a comma 2016-12-26 15:23:50 +08:00
rocky
c147514e9e fix bug in using python2 AST rules in python 2.5 2016-12-26 02:03:43 -05:00
rocky
813229ac45 Merge branch 'master' of github.com:rocky/python-uncompyle6 2016-12-26 00:43:12 -05:00
rocky
f1a947f106 lint . 2016-12-26 00:43:02 -05:00
rocky
2f51067a9d Scanner call fixes. NAME_MODULE removal for <=2.4 2016-12-25 09:20:57 -05:00
rocky
e3f4beeb74 Lint 2016-12-24 07:45:02 -05:00
rocky
7d58dcf6dd Remove stray debug hook 2016-12-24 04:10:31 -05:00
rocky
bfff1b4e9f Bang on 3.6 build_map_unpack_with_call
Probably will fix better in the future.
2016-12-20 19:42:23 -05:00
rocky
e6761e13bb Python flake8 crap
Was testing realgud's C-x!8 (goto flake8 warning/error)
2016-12-18 20:18:19 -05:00
rocky
c7c0a98982 Python 2.5 mistaken try/else 2016-12-18 00:56:07 -05:00
rocky
eebec48308 show-asm on python2.5 is optional
make scanner2 look a little more like scanner3
2016-12-17 08:01:25 -05:00
rocky
da50394841 Release 2.9.8 news 2016-12-16 22:56:48 -05:00
rocky
13d5cd1a58 Get ready for release 2.9.8 2016-12-16 22:42:46 -05:00
rocky
08dcc7d820 Start to handle 3.5 build_map_unpack_with_call
3.6 also started but needs even more work
2016-12-16 20:39:24 -05:00
rocky
7755563b65 Some Python 3.6 bytecode->wordcode fixes 2016-12-15 02:54:25 -05:00
rocky
b43cbc050d Was passing wrong type 2016-12-13 20:05:08 -05:00
rocky
db7a26d47d option -g: show start-end range when possible 2016-12-11 09:02:28 -05:00
rocky
92166452c1 two misc changes
- track print_docstring move to help (used in python 3.1)
- verify: allow RETURN_VALUE to match RETURN_END_IF
2016-12-11 08:22:26 -05:00
rocky
96fa3ef381 3.2 needs --weak-verify 2016-12-10 07:35:31 -05:00
rocky
755415c7d8 Try testing on 3.2 2016-12-10 07:32:56 -05:00
rocky
b168e1de55 Can run in Python 3.1 and Python 3.2 2016-12-10 07:30:27 -05:00
rocky
38eed14b41 Another python 3 ELSE fixes and ...
Makefile:
  - test python 3.0 bytecode
  - turn full --verify back on Python 3.x
2016-12-10 06:36:22 -05:00
rocky
2c993f8c32 Another faulty Python3 ELSE tag remove 2016-12-10 00:43:55 -05:00
rocky
65858a4c74 Grammar check: ELSE on RHS is ok. 2016-12-09 22:22:01 -05:00
rocky
263c63e009 Back of some of the verification changes 2016-12-09 21:43:22 -05:00
rocky
813bce4697 Merge branch 'master' of github.com:rocky/python-uncompyle6 2016-12-09 21:13:31 -05:00
rocky
a5d2237435 Python 3.x else clause detection and..
- Strengthen verify check.
- weak verification on Python 3.5 for now
2016-12-09 21:10:10 -05:00
rocky
d22931cb49 Get ready for release 2.9.7
Some of the many lint things. Linting is kind of stupid though.
2016-12-04 09:36:30 -05:00
rocky
9cc2700160 Shorten Python3 grammars with + and * 2016-11-28 23:49:43 -05:00
rocky
a5a0f45dde Try new spark 2.5.1 grammar syntax shortcuts
This package I now declare stable
2016-11-28 07:55:00 -05:00
R. Bernstein
3c02fa7e36 Update README.rst 2016-11-28 07:47:18 -05:00
rocky
0d0f836f76 Limitations of decompiling control structures. 2016-11-27 14:20:35 -05:00
R. Bernstein
69c93cc665 Merge pull request #69 from rocky/ast-reduce-checks
AST reduce checks
2016-11-27 14:12:08 -05:00
rocky
97576e473d Python 3 while/else bug 2016-11-27 07:06:20 -05:00
rocky
1e324e0e8d Misc changes
scanner26.py: make scanner2.py and scanner26.py more alike
scanner2.py: check that return stmt is last in list. (May change)
main.py: show filename on verify error
test/*: add more
2016-11-26 21:41:45 -05:00
rocky
7ab4e1fbdb Start grammar reduction checks 2016-11-26 15:38:00 -05:00
rocky
abecb21671 2.7 grammar bug workaround. Fix docstring bug 2016-11-24 21:57:39 -05:00
rocky
8be6369bdf Better line number tracking
Indent Python 2 list comprehensions, albeit badly.
DRY code a little via indent_if_source_nl
2016-11-24 10:31:38 -05:00
rocky
8941417a54 <2.7 "if" detection and dup Python 3 grammar rule 2016-11-24 05:33:08 -05:00
rocky
cbcfd53dae Python 2.6 grammary bug and..
__pkginfo.py__: Bump spark_parser version for parse_flags 'dups'
2016-11-23 21:44:53 -05:00
rocky
df2ca51f4a Note that we now work on 2.4 and 2.5 2016-11-23 08:28:10 -05:00
rocky
4f4069c6b5 Merge branch 'come-from-type' 2016-11-23 08:26:35 -05:00
rocky
6aa1531972 Circle CI uses 2.7.10
and 2.7.12 is not available
2016-11-23 00:48:38 -05:00
rocky
4fcb385dc0 DRY Python3 grammar 2016-11-22 19:59:19 -05:00
rocky
260ddedbfd More detailed COME_FROMs
For now we only add COME_FROM_FINALLY and COME_FROM_WITH
and even here only on 2.7
2016-11-22 19:42:26 -05:00
rocky
f8917aaf88 Remove redundant 2.7 (and 2.x) grammar rules 2016-11-22 17:31:36 -05:00
rocky
c8550d5c9e Split out print_docstring
move from pysource.py to new helper.py
2016-11-22 05:29:50 -05:00
rocky
1aeb09cb8b Get ready for release 2.9.6 2016-11-20 21:38:43 -05:00
R. Bernstein
f575234fc8 Merge pull request #68 from rocky/line-mappings
Line mappings
2016-11-20 21:16:01 -05:00
rocky
abcd10628a Add --linemaps: shows line number correspondences 2016-11-20 21:11:38 -05:00
rocky
eb2b63ce9c Merge remote-tracking branch 'origin' into line-mappings 2016-11-20 18:41:19 -05:00
rocky
805e17988e Fix bug in docstring triple quotes
Problem was not escaping """ inside """.
Use ''' when possible; and when not, use: \"\"\".
2016-11-20 12:21:56 -05:00
rocky
80df5dcc95 Back off a test.
That means bugs in 2.7 still not fixed. Sigh.
2016-11-20 11:37:19 -05:00
rocky
2bc316d6f0 more 2.7 control flow bug fixing 2016-11-20 06:55:08 -05:00
rocky
195bbc746b Pass debug in scanner26 find_targets 2016-11-20 03:42:30 -05:00
rocky
0f56b4f476 Add debug option on Python 3 find_jump_targets() 2016-11-20 03:21:03 -05:00
rocky
94719918d4 A little closesr in PyPy 2.7 list comprehensions
pysource.py: note need to handle line breaks in list comprehensions
2016-11-20 03:17:49 -05:00
rocky
f2a3721d7d Start to improve detect_structure for 2.7 and 2.x
Add debug flag to find_jump_targets to show the structure we found.
When there are control-flow bugs, it's often reflected here.

scanner3.py: make code make more similar to 2.x code
2016-11-20 02:38:59 -05:00
rocky
79863ae122 Merge branch 'master' into line-mappings 2016-11-18 09:04:03 -05:00
rocky
d7f898b4fb New feature: show line number correspondences
Option --linemap on uncompile show how original source-code line numbers
map to uncompiled source lines
2016-11-18 09:02:00 -05:00
R. Bernstein
fe36c9e9f6 Merge pull request #67 from rocky/2.6-cf-ignore-if
2.6 cf ignore if
2016-11-17 03:53:10 -05:00
rocky
76ae1592d0 verify scanner2 vs scanner3 small changes...
verify.py: allow LOAD_CONST None to make LOAD_NAME 'None'
scanner{2,3}.py: make them look more alike
2016-11-17 03:43:39 -05:00
rocky
31d387749b More AST checking
Small fixes in output format
2016-11-16 07:28:19 -05:00
rocky
9e3026bd78 WIP Grammar changes - reinstatng COME_FROMs around ignore_if's 2016-11-15 23:44:22 -05:00
rocky
bfe7e7777d Revise MANIFEST.in with what we have 2016-11-15 23:44:22 -05:00
rocky
81b4941fda Merge branch '2.6-cf-ignore-if' of github.com:rocky/python-uncompyle6 into 2.6-cf-ignore-if 2016-11-15 13:26:22 -05:00
rocky
0f719d41fd Revise MANIFEST.in with what we have 2016-11-14 20:20:07 -05:00
rocky
766451cbb9 WIP remove COME_FROMs around ignore_if's 2016-11-14 09:27:56 -05:00
rocky
1e4dc52197 WIP remove COME_FROMs around ignore_if's 2016-11-14 07:27:13 -05:00
rocky
6073c77921 Show line numbers in 2.6 "after" asm ..
start to understand some of the Python 2.6 bytecode parse failures.
2016-11-14 00:30:23 -05:00
rocky
b6e53205dd Handle verify syntax errors...
Update README.rst stats
2016-11-13 18:55:23 -05:00
rocky
ee6dddd25a Administrivia: Fixes #66 2016-11-13 14:20:36 -05:00
rocky
968a54512b Get ready for release 2.9.5 2016-11-13 10:37:51 -05:00
rocky
a81ffe8963 Python 3 bugs ...
- Was using "while 1 .. else" improperly
- docstring indent bug: was indenting docstring improperly
2016-11-13 10:08:41 -05:00
rocky
3b9e48a3b6 Revise what works and what doesn't 2016-11-13 09:07:53 -05:00
rocky
80a4ad4f1b Python 3.0 while1 if bug...
Is a workaround. We really need more tagging in of SETUP_LOOP and COME_FROM.
2016-11-13 01:28:36 -05:00
rocky
50c2e1bda9 Revert augassign change but..
Make note of what's going on and add grammar test for bad
situations we have in Python 2.6 (and perhaps others)
2016-11-11 09:08:02 -05:00
rocky
f4999f6300 augassign semantic action bug 2016-11-11 08:41:55 -05:00
rocky
0f536b18fa Bug in detecting 3.3 default value in lambda 2016-11-10 23:59:51 -05:00
rocky
6fb879d0d8 Detect some erroneous decompilations
Until we can actually prevent these in grammar rules, we will warn of
improper decompilations.

Also, we now stop when we hit a decompile error. Previously we were not.
2016-11-10 22:29:39 -05:00
rocky
411eaaeafb Remove unused imports 2016-11-10 20:10:56 -05:00
rocky
36874c72e2 Possiby tidy grammar 2016-11-07 22:06:37 -05:00
rocky
7343575e55 Bump xdis to get correct 3.0 bytecodes 2016-11-06 18:01:03 -05:00
rocky
fef0567746 Some Python 3.4 grammar rules apply to Python 3.3 2016-11-06 10:00:10 -05:00
rocky
41f360e3dc Start bytecode 3.0 decompiling 2016-11-06 09:20:46 -05:00
rocky
5d10f7a0b0 Python 3.0 doesn't have POP_JUMP ops...
In some ways Python 3.0 code generation is more like Python 2.6 (and
before) than it is Python 2.7 or 3.0.
2016-11-06 08:55:03 -05:00
R. Bernstein
2a5eda631a Merge pull request #63 from rocky/python-3.0
Python 3.0
2016-11-05 21:17:12 -04:00
rocky
a685c60606 Make parse 3.0 be its own thing 2016-11-05 21:02:49 -04:00
rocky
d2ac293cf6 Merge branch 'master' into python-3.0 2016-11-05 21:01:50 -04:00
rocky
cd3cf5ec29 Use L. for line number prefix in asm and AST 2016-11-03 21:26:12 -04:00
rocky
2eaea447eb Get ready for release 2.9.4 2016-11-02 22:44:23 -04:00
rocky
287e98b4b1 Update unpyc3 info. 2016-11-02 20:42:31 -04:00
rocky
63e4c9343f Clean up annotation grammar a little 2016-11-01 15:50:19 -04:00
rocky
eab653afdd Full Python 3 annotations 2016-11-01 12:21:27 -04:00
rocky
7700446bb1 Note github unpyc3 and..
- Add source to bytecode_2.2/03_class_method.pyc
- more ignore
2016-10-30 21:16:33 -04:00
rocky
bfd2f77fbc More source-code line indention in make_function..
and remove Python 3 situations from make_function2()
2016-10-30 10:39:11 -04:00
rocky
1574bf4e1e More annotation processing in to make_function
Move return-value annotation determination from n_mkfunc_annotate to
make_function_annotate which is where other kinds of annotation handling
will also need to be done.
2016-10-29 16:03:02 -04:00
rocky
2328ca7a55 Break out make_function() into its own file.
It is already too complex and will get worse in Python 3.6.

Note: make_function in fragments.py is still inside and
probably needs fixup.
2016-10-29 07:22:58 -04:00
rocky
ccdd37611c More complete annotate handling
Still have a bit of work to do though.
2016-10-28 19:55:17 -04:00
rocky
2e355b6245 Expand annotate return to Python 3.4 2016-10-28 11:33:54 -04:00
rocky
9849f06ff6 Expand annotate handling to 3.3
(and possibly 3.2)

- DRY Python 3.1-3.3 grammar a little
2016-10-28 09:01:41 -04:00
rocky
0e7da031b2 Split out 3.1-3.3 parsers from parser3.py
This is anticipation of extending annotation to Python 3.2+
2016-10-28 07:07:18 -04:00
rocky
25dd67a135 Clean and fix Python 3 annotate arg return 2016-10-27 13:52:07 -04:00
rocky
1a38d3d9aa Dependencies stay within 2nd semantic level 2016-10-26 18:36:12 -04:00
rocky
de65a2c250 Get ready for release 2.9.3 2016-10-26 08:29:09 -04:00
rocky
7daec3352c Start to attack Python 3.1 def() -> xx construct
Start to localize make_function routines by Python version
2016-10-26 08:20:19 -04:00
rocky
8feb472d51 Split out Python 3.1 parser from rest.
__pkginfo__.py: use Python 3.1 bytecode fixes
2016-10-25 21:47:02 -04:00
rocky
7a10917857 Handle Python 3.1 "with ... as" statement 2016-10-25 02:05:10 -04:00
rocky
334f6935b6 Add python 3.1 bytecode testing 2016-10-24 20:49:05 -04:00
rocky
aff920d87b Python 3.1 "with" statement bug 2016-10-24 20:47:12 -04:00
rocky
6319d33fa0 Python 3.1 compile bug. DRY Python 3.x rules ...
via inheritance
2016-10-24 08:50:34 -04:00
rocky
abb61a4d7d Fix some Python 3.1 bugs 2016-10-24 02:16:23 -04:00
rocky
b54a19c6ff Start Python 3.0 decoding
Fix some Python 3.1 bugs
2016-10-24 02:11:26 -04:00
Daniel Bradburn
a4c943fe0d Merge pull request #60 from rocky/buildstring
Buildstring
2016-10-22 20:08:30 +02:00
rocky
0480455ae1 DRY Python 3.6 grammar rules 2016-10-22 12:29:36 -04:00
rocky
9b7d978944 Move fstring rules inside a 3.6+ check 2016-10-22 11:48:52 -04:00
rocky
a6befdee09 Merge branch 'buildstring' of github.com:moagstar/python-uncompyle6 into buildstring 2016-10-22 07:23:19 -04:00
rocky
d6f7ef4e17 DRY op_size
Move from scanner{2,3}.py to scanner.py
2016-10-21 07:40:35 -04:00
moagstar
cec80e696c further work on supporting single and multiple fstring decompilation 2016-10-20 20:44:27 +02:00
rocky
0826129112 DRY Python 2.x unmangle_classname
main.py: small typo: Disassembled -> Decompiled
2016-10-20 06:35:01 -04:00
moagstar
7beaa9f36c urther work on fstrings for python 3.6 - there is a new opcode build_string which is used to improve fstring performance, but broke the fstring support in uncompyle 2016-10-19 23:32:15 +02:00
rocky
78ef16e4d7 Change meta data info in uncompyle6:
* Show file size of source when possible,
  i.e. in Python 3.x
* Show full information about python interpreter
  used to decompile
2016-10-15 19:24:05 -04:00
rocky
59b597ea5d Get ready for release 2.9.2 2016-10-15 05:37:56 -04:00
rocky
cb8ffa51d7 Merge branch 'source-indent-respect' 2016-10-14 22:16:24 -04:00
rocky
a7ef513849 Python 2.6- _ifstmst_jump bug 2016-10-14 21:34:55 -04:00
rocky
8e62a48c96 Python 2.6- _ifstmst_jump bug 2016-10-14 21:32:35 -04:00
rocky
6d3b934bf2 Pretty-print constant tuples 2016-10-13 22:59:59 -04:00
rocky
27fb5758bd 2.6 and before: try_middle come_from per except 2016-10-13 20:49:51 -04:00
rocky
5703ccd8b8 2.6 try statement (and below)
They may neeed arbitrary come_froms for each except clause
2016-10-13 19:37:38 -04:00
rocky
20ba165e4a Bug in handling kv, kv2 2016-10-13 06:39:35 -04:00
rocky
7eb9210b0c Start to track line breaks on lists 2016-10-13 06:37:53 -04:00
rocky
fe072d8b57 DRY fragments.py preorder code
pysource.py: doc typo
2016-10-11 22:24:00 -04:00
rocky
f430b0dbe4 Need xdis 3.0.2 for Python 1.5 bug fixes 2016-10-11 02:41:44 -04:00
rocky
9ef670c872 Fix Python 1.5 bytecode deparse
Need xdis 3.0.2 though since the bug is really there.
2016-10-11 02:39:09 -04:00
rocky
c04fe00e50 Fix python 1.5 decompile bugs ...
add bytecode 1.5 tests from decompyle
2016-10-11 02:30:08 -04:00
rocky
52691c4e8a Map expression with source-directed linebreaks ...
for Python 3.4 and 3.5
2016-10-10 21:12:44 -04:00
rocky
f067148b6c Start using source linebreaks in formatting...
.. large literals like maps and dicts, and tuples
2016-10-10 18:28:02 -04:00
rocky
bb8d0a6389 Get ready for release 2.9.1 2016-10-10 12:29:57 -04:00
rocky
97ce330b00 Python 1.5 scanner and parser and ..
.. slightly improved Forgot to check in files before.

Handle Python pre 2.2. classes
2016-10-10 12:09:00 -04:00
rocky
8b240a80e7 Get ready for release 2.9.0 ...
- Use xdis 3.0.0 protocol load_module. Needs bump in requirements.txt
  and _pkg_info_.py
- Start Python 1.5 decompiling - another round of work is needed to remove
  bugs
- small cleanups
2016-10-10 09:33:49 -04:00
rocky
e888a87d15 Reinstate some tests 2016-10-09 06:44:08 -04:00
rocky
f41426e94b Simpify python 2.1 grammar Fix bug with -t ...
Wasn't showing source text when -t option was given
2016-10-08 21:52:10 -04:00
rocky
22dee55ff7 Python 2.1-2.6 bug in list comprehension 2016-10-08 19:51:57 -04:00
rocky
8916447adb Get ready for release 2.8.4 2016-10-08 06:30:44 -04:00
rocky
478602bfa5 Add decompyle's 2.1 tests
Update README.rst to note new pythons supported since last update
2016-10-08 05:54:35 -04:00
rocky
056f600da1 Start Python 2.1 bytecode decompile 2016-10-07 22:42:30 -04:00
rocky
2e1bd2dc13 Use .py extension in disassembled files more often 2016-10-06 04:05:38 -04:00
rocky
346d8678d2 Merge in COME_FROM disambiguation ...
from controlflowbranch. Should probably expand to Python2
parsers as well
2016-10-06 03:27:37 -04:00
rocky
4411ecceba Merge branch 'controlflow' 2016-10-06 03:26:44 -04:00
rocky
a4dd6e9805 Python 3: "or" doesn't have optional come_from 2016-10-05 22:56:48 -04:00
rocky
b52f341d46 Python 3: "or" doesn't have optional come_from 2016-10-05 22:54:50 -04:00
rocky
2ada29618f Python 3: "and" doesn't have optional come_from 2016-10-05 03:36:57 -04:00
rocky
649e4518fe Python 3: "and" doesn't have optional come_from 2016-10-05 03:34:29 -04:00
rocky
0df2c8b4bb Merge branch 'master' into controlflow 2016-10-05 00:01:04 -04:00
rocky
d2b477ae7d Add tuple comma when not in BUILD_LIST_n
Fixes issue #57

bin/uncompile.py: --verify now works on a single bytecode file. We will
set the output to be something created by tempfile.mktemps
2016-10-04 23:58:35 -04:00
rocky
a8f9f2170f Python 3 while1 grammar rules with COME_FROM_LOOP 2016-09-28 05:52:13 -04:00
rocky
fe46015b78 PY3 COME_FROM_LOOP bug
There are still more in sre...
2016-09-27 04:59:06 -04:00
rocky
051efb80f5 PY3: COME_FROM -> COME_FROM_FINALLY as appropriate
We now have all WITH_ op jumps associated in the grammar

Also, some COME_FROM_LOOP grammar fixes
2016-09-27 03:27:41 -04:00
rocky
1fc8ac4700 Interval order COME_FROMs in Python3
This bug had possibly caused lots of grammar pollution which may need
addressing.

We want to process COME_FROMs to the same offset to be in *descending*
order so we have the larger range or biggest instruction interval
last. (I think they are sorted in increasing order, but for safety
we sort them). That way, specific COME_FROM tags will match up
properly. For example, a "loop" with an "if" nested in it should have
the "loop" tag last so the grammar rule matches that properly

Adjust Python 3 grammar for more COME_FROM -> COME_FROM_LOOP. And
remove optional COME_FROM_LOOP where possible. Previously, the
optional-ness was a result of inner nestings gobbling up the
COME_FROM.

We'll probably want to go back and fix this up in Python2.
2016-09-26 09:26:51 -04:00
rocky
c87710dd4b Python 3 COME_FROM -> COME_FROM_WITH appropriately 2016-09-26 08:09:05 -04:00
rocky
ccd129b377 Try stronger verification
verify.py: add check in verification that magic is the same.
Otherwise we go for weak verification.
2016-09-25 17:48:33 -04:00
rocky
c03a8186b5 Address whileTrue if cond .. -> while cond .. bug
Reinstate Python standard library bisect test
2016-09-25 16:59:32 -04:00
rocky
8bc76f19b9 Tidy use of SETUP_ ops
Also possibly remove a bug in decompiling Python 3.0 .. 3.2 which doesn't
have SETUP_WITH
2016-09-23 19:22:09 -04:00
rocky
6908898b90 Tidy use of SETUP_ ops
Also possibly remove a bug in decompiling Python 3.0 .. 3.2 which doesn't
have SETUP_WITH
2016-09-23 19:18:54 -04:00
rocky
fa1a6347e9 Weaken testing for controlfow branch
We have more equivalent programs now
2016-09-23 04:58:29 -04:00
rocky
760532b218 Add COME_FROM_LOOP
Note: we have regressed in --verify and some tests,
but I believe that's because we are producing more equivalant
(if uglier) programs. That's a separate problem though.
2016-09-22 08:24:02 -04:00
rocky
88f2ad1f5a Merge branch 'master' into controlflow 2016-09-22 01:33:29 -04:00
rocky
d271e886d9 Fix pytest grammar test failure
dict and set comprehensions are only in 2.7+
2016-09-22 01:32:00 -04:00
rocky
c0b4a5e703 Fix some Test failures
Fix py.test pytest/test_grammar.py -

Comprehension sorts of things removed from parser that
don't exist in earlier pythons

scanners/tok.py Add back in "to" when needed
2016-09-22 01:27:58 -04:00
rocky
b6dee24289 First step towards managing control flow decoding 2016-09-21 21:30:57 -04:00
R. Bernstein
0e9ebca1a5 Merge pull request #56 from rocky/fstring
merge fstring changes from moagstar
2016-09-21 20:44:35 -04:00
moagstar
f3b9a5936e fixed generation of FSTRING_CONVERSION_MAP in < python 2.7 2016-09-21 22:13:25 +02:00
moagstar
bae3d2e361 merge fstring changes from moagstar 2016-09-21 22:04:46 +02:00
rocky
4f83a87a00 Python 2 & 3 scanner code ever so slightly closer 2016-09-21 07:06:30 -04:00
rocky
d8b7c3d813 Small NEWS doc typo 2016-09-21 03:26:44 -04:00
rocky
c119965d96 Small changes 2016-09-18 17:23:49 -04:00
rocky
b02754c954 Get ready for release 2.8.3 2016-09-11 19:22:07 -04:00
rocky
23770fca64 Tidy a bit 2016-09-11 03:39:19 -04:00
rocky
71591152ef 3.0 .. 3.4 bug in whileTrue 2016-09-09 22:27:13 -04:00
rocky
251de4338a 3.1 scanner small fixes 2016-09-09 18:23:43 -04:00
rocky
03e8995d18 ret_cond adjustment for < 2.7 and ...
"<= 2.6" -> "< 2.7" since python 2.6's version is 2.6000001
2016-09-09 15:55:15 -04:00
rocky
dd661bc94a Start accepting Python 3.1 bytecode 2016-09-09 15:32:46 -04:00
rocky
c4e6af6e4f Add 3.6 parser 2016-09-08 05:44:45 -04:00
rocky
57d1f3b9f9 More testing
- travis:
   * 2.7.12 - bump from 2.7.11
   * 3.3.6

test_pyenvlib: add --weak-verify to
Makefile: check-3.2.6 needs --weak-verify
2016-09-08 05:09:36 -04:00
rocky
2d11ffb669 Python 3.0-3.2 *args processing 2016-09-08 03:54:57 -04:00
rocky
b7f1f1b028 3.2 (and down to 3.0?) bug in fn name and kwargs 2016-09-08 02:35:06 -04:00
rocky
0fce4c6dc3 Another 3.5+ erroneous RETURN_END_IF misclassify 2016-09-07 04:03:21 -04:00
rocky
c44d4898cb But in Python 3.5+ erroneosly adding RETURN_END_IF 2016-09-07 03:37:48 -04:00
rocky
fecae9f902 Fix 3.3 named bug and ...
Parse 3.4 parameters correctly.
Allow test_pyenvlib to do 3.3.6
2016-09-06 02:15:47 -04:00
rocky
60b25f7596 Python 3.x bug in getting parameter of ** argument 2016-09-05 22:33:59 -04:00
rocky
318311818e Python 2.6- try/except control flow detection 2016-09-05 04:02:37 -04:00
rocky
c7788e4545 disassemble -> ingest where appropriate
As part of tokenization for (de)parsing, we need to do something like a
disassembly, but is is really a little different.

Disassembly, strictly speaking, is done by the xdis module now.
What "ingestion" does is massage the instruction tokens to a form that is
more amenable for parsing.

In sum, ingestion is different than disassembly, although disassembly is
generally the first part of ingestion.
2016-09-04 11:43:02 -04:00
rocky
979bca4fe0 Small cleanup/code optimization 2016-09-04 10:02:20 -04:00
rocky
47a56d3387 Python 2.3--2.6 bug in parsing try-middle
Note: it looks like COME_FROMs need to be classified better
with respect to whether they are from an except or not
we are getting if/else vs except nesting errors.
2016-09-04 09:28:47 -04:00
rocky
647248dfc8 A couple more 2.6 (and below) bugs fixed
* Detect "return None" inside if statement
* another case of triple ==, ==, ==
     scanner2.py: detect_structure: descriminate more on parent type
2016-09-04 04:10:08 -04:00
rocky
f4ac13ef0f Python 2.5-2.6 generator bug
Adjust for variable position of list iteration node in a genexpr node
2016-09-03 21:37:32 -04:00
rocky
8f95ec9882 Python 2.7 "return None" bug
Same as 2.3-2.6 "return None".
2016-09-03 10:27:21 -04:00
rocky
75c718bc5c Python 2.2..2.6 bug in a == b == c == d
Fix was to remove some come froms. Feels a little hacky though.
2016-09-03 10:05:55 -04:00
rocky
b6fd9088b8 Python 2.3..2.6 "return" bug
In Python 2.6 and possibly down to 2.3 we need to issue "return" not
"return None" inside a generator. So check for that "return None"
inside n_return and issue "return" for that.
2016-09-03 08:04:52 -04:00
rocky
4d046eb0bd Add hartmut Goebel's changes before 2.4 2016-09-03 00:50:18 -04:00
rocky
52a35e6c62 Fix Python 2.4-2.6 comp_for text generation...
Makefile: tolerate pypy 5.3.x
Rest: fix semantic action rule for comp_for and test this
2016-09-03 00:30:48 -04:00
rocky
f1bb40f485 Python 2.6- bug: RETURN_ENDIF, POP_TOP ..
POP_TOP should be excluded as a potentional statement beginning
2016-09-02 21:08:44 -04:00
rocky
136f935e26 Fix Python 3.x named param and kwargs bug 2016-09-02 06:30:39 -04:00
rocky
f5eeed6759 2.6- bug: while..and: stmt - on one line
If 2.6 or before POP_BLOCK after a JUMP_IF_FALSE does not
constitute a new statement. The POP_BLOCK is really part
of the JUMP_IF_FALSE. In Python 2.7+ it's a single op.
2016-09-01 20:44:17 -04:00
rocky
1d567d5d9a Handle Python 2.6 and below "except <cond>, <var>" 2016-09-01 02:20:07 -04:00
rocky
c9f364df9f Python 3.x bug in handling var number of args 2016-08-31 06:20:29 -04:00
rocky
6189ce3c04 Bug in 3.x detecting "if" structure and ...
scanner3.py: bug in 3.x detecting "if" structure
Make scanner2.py look more like scanner3.py
verify.py: add weak-verify which tests Pytyon syntax, but not code
2016-08-31 04:07:42 -04:00
rocky
6f2cdc164d Handle Python 2 vs 3 raise syntax change
raise_stmt ::=  "raise" expression "," expression
becomes:
   raise_stmt ::=  "raise" expression from expression

raise expr, expr -> raise
2016-08-30 00:42:24 -04:00
rocky
e4cc126b38 Get ready for release 2.8.2 2016-08-29 21:48:21 -04:00
rocky
da458bdce7 Correct PYPY bit logic in previous commit 2016-08-27 20:19:12 -04:00
rocky
f47aecae9f PYPY bugs and inspired changes ...
verify.py: Show co_flags when different.
pysource.py: PYPY also generates normal tryfinallystmt code
test_pyenvlib.py: allow pypy-5.3.1
2016-08-27 19:32:42 -04:00
rocky
ddc5460030 Start to handle Python 3.1 bytecode 2016-08-26 20:50:08 -04:00
rocky
835c4151c3 Bump min requirement versions
xdis we need increased so we don't catch old xdis bugs
2016-08-26 08:02:27 -04:00
rocky
1087613a27 Handle 3.6 Format String conversions !r, !s, !a 2016-08-25 07:26:01 -04:00
rocky
a67891c563 Get ready for release 2.8.1 2016-08-20 22:14:36 -04:00
rocky
31413be7a1 Python 2.2 doesn't have opcode LIST_APPEND 2016-08-16 12:45:43 -04:00
rocky
98a6f47ad6 Python 2.2 scanner bug: don't mung IMPORT_NAME op 2016-08-16 06:38:09 -04:00
rocky
2e3e6658ee Small pypy LOOKUP_METHOD cleanups 2016-08-16 06:09:10 -04:00
R. Bernstein
85c562cb36 Merge pull request #49 from moagstar/master
Fixed a bug with FORMAT_VALUE with sub expressions.
2016-08-16 05:33:09 -04:00
moagstar
5ab3e52c9c disable test_format_specifiers on python < 3.6 since this is only required for the fstring tests and was causing failures on 2.7 2016-08-16 08:38:38 +02:00
DanielBradburn
004ce5c491 Fixed bug with FORMAT_VALUE where a sub expression would not be correctly interpreted 2016-08-16 08:24:06 +02:00
rocky
599ceddd08 xdis 2.1.1 removes some bugs encountered here 2016-08-14 23:11:55 -04:00
rocky
6547d0230f Merge branch 'master' of github.com:rocky/python-uncompyle6 2016-08-14 23:00:16 -04:00
rocky
a65443ee02 Fix pypy semantic action bug in CALL_METHOD 2016-08-14 22:59:34 -04:00
DanielBradburn
2bd850f297 added examples for known failures 2016-08-14 20:44:23 +02:00
R. Bernstein
90477edf04 Merge pull request #45 from rocky/revert-43-patch-1
Revert "Cache pip installation in travis"
2016-08-14 07:54:46 -04:00
R. Bernstein
c912d16b50 Merge pull request #46 from rocky/revert-44-patch-2
Revert "Test with latest PyPy in Travis"
2016-08-14 07:53:59 -04:00
R. Bernstein
8dd405a5ee Revert "Test with latest PyPy in Travis" 2016-08-14 07:53:47 -04:00
R. Bernstein
116a22a425 Merge pull request #44 from thedrow/patch-2
Test with latest PyPy in Travis
2016-08-14 07:53:40 -04:00
R. Bernstein
7d771b9a8c Revert "Cache pip installation in travis" 2016-08-14 07:46:55 -04:00
R. Bernstein
a1972bbc08 Merge pull request #43 from thedrow/patch-1
Cache pip installation in travis
2016-08-14 07:41:46 -04:00
Omer Katz
8a91081535 Fix indentation. 2016-08-14 11:03:49 +03:00
rocky
0958dc889d Back off of 3.6 testing for now 2016-08-13 23:33:23 -04:00
rocky
33a0c75b69 Merge branch 'master' of github.com:rocky/python-uncompyle6 2016-08-13 20:26:52 -04:00
rocky
7ccbd419c6 Correct SET_LINENO handling in Python 2.2
Add more  2.2 tests
2016-08-13 20:25:19 -04:00
rocky
a45ee15cf2 I said - we test 2.2 now. 2016-08-13 09:14:33 -04:00
rocky
fb5ad76c4e Include Python 2.2 in testing 2016-08-13 09:07:15 -04:00
rocky
d8598f61e4 Start handling Python 2.2 bytecode and...
Fix some bugs in Python 2.3-2.5 bytecode handling
2016-08-13 07:16:50 -04:00
Omer Katz
5f52cce24d Test with latest PyPy. 2016-08-11 11:15:33 +03:00
Omer Katz
70463e036a Cache pip installation 2016-08-11 11:13:58 +03:00
DanielBradburn
7fba24198f small formatting change 2016-08-10 22:29:02 +02:00
DanielBradburn
e06a90ed27 added hypothesis to requirements-dev 2016-08-10 22:27:54 +02:00
DanielBradburn
d030a04c1a added hypothesis test (currently failing due to limited support) for testing fstring uncompyling 2016-08-10 22:20:43 +02:00
Daniel Bradburn
37d5a05241 Merge pull request #2 from rocky/master
Merging pypy and cpython 3.6 from rocky
2016-08-10 08:22:15 +02:00
DanielBradburn
5d27832d6f resolve merge conflicts from pull request 2016-08-10 08:20:51 +02:00
rocky
6b98432082 Merge branch 'master' of github.com:rocky/python-uncompyle6 2016-08-03 08:21:44 -04:00
rocky
109e813058 Get ready for release 2.8.0 2016-08-03 08:20:32 -04:00
rocky
4b8cb11d77 Need recent xdis fix for 3.6 wordcode 2016-08-01 11:02:29 -04:00
rocky
c77e9cdaf8 Add Python 3.6 formatted_str test 2016-08-01 09:47:45 -04:00
R. Bernstein
4c2f0df3dc Merge pull request #41 from rocky/3.6
Move forward on moagstar's Python 3.6 support
2016-08-01 09:16:45 -04:00
rocky
b49d30266f Tidy assembly output a little more 2016-08-01 08:42:52 -04:00
rocky
65a16327ce Moagstar's 3.6 wordcode + formattedValue rules 2016-08-01 03:16:26 -04:00
rocky
fff09db66e WIP try to keep line numbers the same 2016-07-30 14:25:43 -04:00
rocky
3ef0325cb8 Small changes 2016-07-29 19:54:16 -04:00
rocky
3a6f9d8f24 Fix 3.5 misclassifying RETURN_VALUE
We use location of SETUP_EXCEPT instructions to disambiguate.
2016-07-29 08:56:23 -04:00
Daniel Bradburn
d14865c1be Starting adding python 3.6 support to uncompyle 2016-07-28 09:07:12 +02:00
rocky
152935ab26 while1 bug applied to Python 2.3 and 2.4 2016-07-28 01:23:29 -04:00
rocky
5c9c0228ee PyPy 3.2 bug confusing RETURN_END_IF for except
Also fix a instruction formatting bug
2016-07-28 00:41:40 -04:00
rocky
ac121076e6 Split out 3.5 parser 2016-07-27 19:09:25 -04:00
rocky
04ae94ee9e Add python 3.4 grammar checking
DRY grammar testing
2016-07-27 18:32:15 -04:00
rocky
e8ed17967c Clean and check Python 2.6 grammar 2016-07-27 18:03:07 -04:00
rocky
3f7c4209d9 Start to segregate and clean up grammar 2016-07-27 17:35:21 -04:00
rocky
f33f425692 Add is_pypy parameter to places that need it 2016-07-27 16:08:40 -04:00
rocky
5ffd9b2be7 2.6 and 2.7 while1 grammar rule
Fixes issue #40
2016-07-27 13:19:42 -04:00
rocky
87dc5ad80c Start grammar checker 2016-07-27 11:02:01 -04:00
rocky
177a422b87 Show magic number in output
Fix bugs due to removal of token.format()
2016-07-27 09:44:05 -04:00
rocky
3a78332d59 tok.format -> tok.__str__; simplify pypy code 2016-07-27 09:26:39 -04:00
rocky
5e801b5d74 Python 2.7 set comprehension bug 2016-07-27 08:36:33 -04:00
rocky
2523b340cd separate semantic action version differences
Added customize_for_version which
uses is_pypy and version to adjust tables
2016-07-27 07:32:55 -04:00
rocky
c3f6fa32db Customize tables better for specific Python versions 2016-07-27 06:56:02 -04:00
rocky
6dc9d3ab2f Small code clean up 2016-07-27 06:01:49 -04:00
rocky
74f440bd0b Usuability fixes
* try using format for __str__
* Explicitly nuke self.attr and self.pattr when no arg
* Sync pysource and format wrt make_function
2016-07-26 20:49:41 -04:00
rocky
affc504418 Get ready for release 2.7.1 2016-07-26 17:13:10 -04:00
rocky
ecbbc7dfea Custom PyPy rules for tryfinallysmt, assign{2,3} 2016-07-26 16:49:14 -04:00
rocky
6c5bd6289f More PyPy grammar rules
* assert one and two-arg form
* trystmt

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

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

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

There may be a "pass" in there instead.
2016-07-13 13:37:07 -04:00
rocky
6a125d49d8 Merge branch 'master' of github.com:rocky/python-uncompyle6 2016-07-13 13:01:36 -04:00
rocky
fd0d8d2567 Travis workaround
Not sure what's up with 01-class on 3.4. remove for now.
More info in 2.7.11 on what failed.
2016-07-13 13:00:03 -04:00
rocky
772c67fcd7 Debugging smutz caused verify failures 2016-07-13 09:53:51 -04:00
rocky
bc86b73cf0 Document/correct hide_internal and store_locals 2016-07-12 12:07:48 -04:00
rocky
b99f196d18 Better 3.2/33 store_locals handling 2016-07-12 09:46:46 -04:00
rocky
78f24f9c66 Python 3.2 & 3.3 handle STORE_NAME better 2016-07-11 23:24:52 -04:00
rocky
55b269f744 Get ready for release 2.6.2 2016-07-11 19:33:51 -04:00
rocky
8e0413273b Fix some Python set comprehension bugs 2016-07-11 18:23:05 -04:00
rocky
c10b9babbe Add missing a test source file 2016-07-11 10:22:06 -04:00
rocky
9fdf70f68d Python 3.(4?) while1 bug
Clean up while1 grammar a tad
2016-07-11 10:18:18 -04:00
rocky
f571f6dfce Revert recent 2.x code which fail verification 2016-07-10 20:06:05 -04:00
rocky
59ba8a65cd Structure detection bugs +
Had borked 3.4 grammar rules in
previous refactor
2016-07-10 19:21:55 -04:00
rocky
9c2f48ca4a DRY and clean up code a little 2016-07-10 08:39:50 -04:00
rocky
44dba42a40 Remove JA. Use standard JUMP_ABSOLUTE instead 2016-07-10 08:21:17 -04:00
rocky
af62286357 Python 2/3 compatibility bug 2016-07-10 08:15:22 -04:00
rocky
3cd3f7ccdf Bugs caused by 3.x jump_forward misclasification 2016-07-10 08:05:18 -04:00
rocky
52b71bb01a Python 3 better CONTINUE op classification
Also document what's up with JUMP_ABSOLUTE
classification
2016-07-10 06:47:34 -04:00
rocky
c098b834fa 3.4 continue handling. More work is needed 2016-07-09 23:20:08 -04:00
rocky
15bb9e3823 Need xdis 2.4 bugfix 2016-07-09 21:42:34 -04:00
rocky
21da5e787e Start splitting off 3.4 grammar from rest 2016-07-09 21:11:14 -04:00
rocky
b44c566a9f Python 2.3 list comprehensions 2016-07-09 18:13:08 -04:00
rocky
65b9ecee31 Fix some 2.3 bugs; add more 2.3-6. tests 2016-07-09 17:33:54 -04:00
rocky
047c95a1e5 2.3 while1stmt bug 2016-07-09 13:13:10 -04:00
rocky
5f9f8f4d79 Merge branch 'python-2.3' 2016-07-09 09:17:17 -04:00
rocky
ac45e5757c Redo Python 2.3 to be more like the rest 2016-07-09 09:11:04 -04:00
rocky
e40d5d3897 Merge conflict 2016-07-09 08:31:02 -04:00
rocky
ae78e9f930 Python3 scanner code cleanup 2016-07-09 05:17:10 -04:00
rocky
0075c8a5f7 Python 3 code cleanup 2016-07-08 22:33:42 -04:00
rocky
d6b35d57e4 DRY scanner code. Allow 2.4 decompile from 3.x 2016-07-08 21:37:09 -04:00
rocky
11eddb7940 Add more 2.4 and 2.6 tests 2016-07-08 18:24:14 -04:00
rocky
ec66dc0639 2.4 "import *" grammar rule 2016-07-08 18:12:35 -04:00
rocky
e31f829a56 Python 2.4 generator expressions and gen_comp_body 2016-07-08 18:00:13 -04:00
rocky
61535a010d <2.5 grammar customizations for imports and loops 2016-07-08 17:26:14 -04:00
rocky
62e60817f6 Start handling Pyton 2.4 bytecodes 2016-07-08 15:00:23 -04:00
rocky
7fdb4d3e68 Get ready for release 2.6.1 2016-07-08 12:16:42 -04:00
rocky
e020f8f9a9 2.5/2.6 RETURN_VALUE bug 2016-07-08 12:02:28 -04:00
rocky
b640d42113 2.5/2.6 fn name clash
fixes list conprehension problem
2016-07-08 10:38:56 -04:00
rocky
1a2aa41f7d Python 2.5 with statement 2016-07-08 10:30:49 -04:00
rocky
170244181f Revise decompilation quality estimate 2016-07-08 07:10:46 -04:00
rocky
6f5dce342f Start going over Python 2.5 bytecode
Fix 2.6 with bug
2016-07-08 07:01:48 -04:00
rocky
f3696cc3f1 Get ready for release 2.6.0 2016-07-07 19:17:39 -04:00
rocky
13ae869267 <2.7 add a rare kind of list_for 2016-07-07 18:03:44 -04:00
rocky
663e724788 Remove 2.7 asynchat verifcation for now 2016-07-07 13:56:04 -04:00
rocky
06023c247d while1 bug in 2.6 and 2.7 2016-07-07 13:08:00 -04:00
rocky
21314c1dad <2.7 whileelse rule 2016-07-07 12:11:45 -04:00
rocky
0b6108801d <2.6 make sure jump back on loops is really "back" 2016-07-07 11:43:26 -04:00
rocky
42f26c3ffd <2.7 lack of POP_IF_ adjustment in detect_structure 2016-07-07 10:04:21 -04:00
rocky
8b305f78f4 2.6 POP_TOP and POP_JUMP_IF bugs 2016-07-07 07:03:20 -04:00
rocky
72c781258f 2.6 bug in handling jumps to jumps 2016-07-06 21:27:50 -04:00
rocky
f865ecaa58 2.6.9 bug: multiple COME_FROMs via "or"/"assert" 2016-07-06 21:07:40 -04:00
rocky
14b4f8e2da 2.6.9 elif with multiple COME_FROMs 2016-07-06 20:56:29 -04:00
rocky
aa65b098a4 < 2.7 bug in not distinguishing raise from assert 2016-07-06 19:52:02 -04:00
rocky
a1dab0fa3a Add 10_if_else_ternary.pyc for 2.5 2016-07-04 10:21:38 -04:00
rocky
0adf70b4d9 fragment test update for expanded offsets 2016-07-03 22:59:33 -04:00
rocky
694e1edd00 More offsets captrued Add %b specifer
%b - associate text before specifier
pysource.py: small doc correction
2016-07-03 21:57:46 -04:00
rocky
a34f1fcd7a Merge branch 'master' of github.com:rocky/python-uncompyle6
Conflicts:
	uncompyle6/parsers/parse26.py
2016-07-03 12:08:37 -04:00
rocky
04698f45cc Update history. Note 2.5-2.6 deficiencies
Note Eloi Vanderbeken's contribution
2016-07-03 11:32:20 -04:00
rocky
974b11ff55 Another 2.6 while stmt. Clean up grammar a little 2016-07-03 10:50:19 -04:00
rocky
4d9d659cfa 2.6 improper tagging of RETURN_END_IF 2016-07-03 04:33:43 -04:00
rocky
bec1524c5a 2.6.9 tryelsestmt 2016-07-02 22:53:58 -04:00
rocky
12d22c055f Python 2.6 with as stmt 2016-07-02 22:24:28 -04:00
rocky
4dff02b19c 2.6 ifelsestmt 2016-07-01 17:15:00 -04:00
rocky
71822bf9b3 Another 2.6 return_stmt bug 2016-07-01 07:51:15 -04:00
rocky
fa6ae76a64 2.6 return_stmt bug 2016-07-01 06:50:06 -04:00
rocky
44c03ff7c7 Fix import name in setup entry_points.
Fixes issue #34
2016-06-30 22:35:40 -04:00
rocky
261c60efd9 More 2.6.9 bugs fixed
* break loop parsing bug
* ifelsestmt semantic-action bug in handling else
2016-06-30 21:42:49 -04:00
rocky
d87b5fe34c 2.6 conditional in list comprehension bug 2016-06-30 19:51:13 -04:00
rocky
bd5b2be8fa Oh Python and your f*'d notions of spacing 2016-06-30 07:02:34 -04:00
rocky
73a043830c 2.6.9 list comprehension 2016-06-30 06:51:20 -04:00
rocky
da9aeecc60 <= 2.6 weird jump out of try block
Allow COME_FROMs to appare via JUMP_FORWARD in
tey/except blocks
2016-06-30 06:21:13 -04:00
rocky
7772243ac7 CONTINUE handling in 2.6.9 2016-06-30 05:32:57 -04:00
rocky
f573013501 2.6 except_suite bug 2016-06-30 05:09:14 -04:00
rocky
4b0b7f76dc 2.6 genexpr. Some not quite right. 2016-06-29 23:32:29 -04:00
rocky
d7f7748000 2.6.9 assert 2-arg bug 2016-06-29 22:28:52 -04:00
rocky
5b2198a4a6 A 2.6 comprehension bug 2016-06-29 21:24:19 -04:00
R. Bernstein
1ce1cf87a4 Merge pull request #33 from rocky/python-2.6
Python 2.6
2016-06-29 20:42:53 -04:00
rocky
32ca0c4482 2.6 ifelse/while modifications 2016-06-29 12:46:02 -04:00
rocky
0af3dd28bc Weird 2.6.9 list comprehension 2016-06-28 17:37:13 -04:00
rocky
36432c7488 Add more come_from_pops 2016-06-28 14:43:58 -04:00
rocky
74c6b38fd8 2.6. with fn() 2016-06-28 10:54:01 -04:00
rocky
ae980e4f64 Base 2.5 off of 2.6. Some other small bugs. 2016-06-28 03:31:32 -04:00
rocky
21216b4eb1 2.6 try except hadnling works now 2016-06-27 21:54:29 -04:00
rocky
40d4348757 2.6 list comprehensions 2016-06-27 17:53:06 -04:00
rocky
622f83970b JUMP_IF_{TRUE,FALSE}_OR_OP fixes 2016-06-27 17:15:21 -04:00
rocky
460ad129cc WIP 2.6 j{f,b}_pop fix 2016-06-27 16:16:35 -04:00
rocky
fa84f4277a WIP deal with JUMP_IF_{TRUE,FALSE} vs with POP version 2016-06-24 20:06:10 -04:00
rocky
fa7d8f955a WIP Python-2.6 but don't remove opcodes
The scheme for turning 2.6 bytecode into 2.7 psuedo bytecode
I think is a lose.

I won't work for fragment handling.

Instead, change the grammar and syntax rules

This also has the benefits:

* We see how code generation changed over releases
  by looking at grammar and semantic rules rather
  than arbitrary code
* We can better assocate with what's running
  (in a sense this is a restatement of broken fragment
   handling)
* With the right structure in place we are in a better position to
  handle 2.5, 2.4, etc. That is, after a while, the incremental changes
  to get say from python 2.3 bytecode to python 2.7 are great.

Conflicts:
	uncompyle6/parsers/astnode.py
2016-06-24 18:15:59 -04:00
rocky
fe8000e02a Small misfeature disassemble showasm parameter use 2016-06-24 15:05:14 -04:00
rocky
4fa68b8894 2.6 compatibility 2016-06-24 10:36:36 -04:00
rocky
36b7521597 Small formating changes ...
and premonition of 2.6 byteocde work
2016-06-24 09:47:45 -04:00
rocky
f474ea648b Merge branch 'master' of github.com:rocky/python-uncompyle6 2016-06-24 09:29:20 -04:00
rocky
7a4e3a05ff Should use xdis 1.1.2 + small lint change 2016-06-24 09:28:50 -04:00
rocky
982a6010a1 WIP 2.6 redo bytecode handling
Don't try to convert 2.6 bytecode to 2.7 psuedo bytecode.
Instead adjust grammar and semantic actions.

Down the line we should to segregate version changes in
semantic code better.
2016-06-24 09:23:30 -04:00
Daniel Bradburn
c9fd86e38e fixed bug in maybe_show_ast_param_default, if default was not a str a TypeError would occur 2016-06-24 08:49:37 +02:00
rocky
9a251b239e Doc fixes 2016-06-22 23:42:33 -04:00
rocky
1563e16f9f Get ready for release 2.5.0 2016-06-22 22:52:32 -04:00
rocky
e2917590fc Update README 2016-06-22 22:31:19 -04:00
rocky
493ffa62fe Python 3.5 and setcomp_func's
A comprehension walk in Python 3.5 needs to include
setcomp_func's.
2016-06-22 22:21:54 -04:00
rocky
9a2369830d Python 3.5 if handling...
Allow RETURN_END_IF in a return statement
May want to do this in other versions as well, but right now
we only need it here.
2016-06-22 22:09:06 -04:00
rocky
f999e6a33a Another kind of yield_from on 3.5 2016-06-22 16:48:03 -04:00
rocky
126af429fb differing ways to do "yield from" in 3.3-3.5 2016-06-22 16:29:58 -04:00
rocky
480e6a125f Add Python 3.5 yield from and ...
* fragments.py: Handle pass stmt sometimes
* scanners: regularize Python 2 scanners some
* test/test_pyenvlib.py: add python 3.5.1 option
2016-06-22 13:08:11 -04:00
rocky
faa630902d Python 3 comprehension fixes
Sync up fragments.py
2016-06-22 10:50:11 -04:00
rocky
f576853f19 More 3.2 LOAD_CONST removal
More python3 custom grammar DRYing
2016-06-22 09:52:20 -04:00
rocky
dc88bcf69f DRY parse grammar a little
More LOAD_CONST grammar removal in 3.2
2016-06-22 08:36:01 -04:00
rocky
c77e4a9dc9 Python 3.2 MAKE_FUNCTION adjustment 2016-06-22 02:11:59 -04:00
rocky
75592795b3 Python 2.6 tolerance 2016-06-22 00:05:19 -04:00
rocky
649da8fbc0 Btter Python 3 fragment set comprehensions ...
fragment handling for "break" and "continue"
2016-06-21 23:40:26 -04:00
rocky
cdb02fa591 Handle fragment key/value offsets better 2016-06-21 04:08:36 -04:00
rocky
051ed90185 Bang on Python 3.2 decompiling. 2016-06-20 23:05:12 -04:00
rocky
1a83c849dc Python 3 needs Python2's RETURN_END_IF
Make python2 and python3 scanner look more the same
2016-06-20 22:12:29 -04:00
rocky
a6fbe4c636 previous 2.7 class decorator bug fixed in 3.x 2016-06-20 20:19:17 -04:00
rocky
f215888374 DRY redundant custom rule checking code 2016-06-20 19:06:45 -04:00
rocky
24d4cfb150 Python 3 set comprehension bug 2016-06-20 18:47:03 -04:00
rocky
59780483a8 Python 3.x class bug using subclass fns 2016-06-20 17:20:47 -04:00
rocky
80cfe62f36 For Python 3: add LOAD_CLASSDEREF op 2016-06-20 13:04:21 -04:00
rocky
8c374904f5 3.x make closure kw args handling bug 2016-06-20 10:01:18 -04:00
rocky
078f15013e Python 3.x class decorator bug 2016-06-20 00:32:00 -04:00
rocky
efb4012087 Correct kw+pos args semantics on 3.3
Sync fragment make_function code
2016-06-19 21:41:40 -04:00
rocky
8b50dda9ef Start 3.3 positional and kw parameters
Semantic routines need more work.
2016-06-19 19:18:45 -04:00
rocky
bd809dc08b Another 3.x bug involving jumps 2016-06-19 17:47:43 -04:00
rocky
109d99bc62 Revert assert test on 3.4 until we figure out how to address 2016-06-19 13:59:24 -04:00
rocky
5c268ee2a6 2.7 and 3.x bug in dict comprehensions 2016-06-19 13:45:07 -04:00
rocky
520290898b 3.4 Load assert bug 2016-06-19 11:52:38 -04:00
rocky
f8ccb8065e 3.4 tryifelse bug 2016-06-19 11:15:36 -04:00
rocky
5d86a4e536 Python 3 except clause parsing bug 2016-06-19 10:30:39 -04:00
rocky
ff014a8393 Cover more offsets 2016-06-19 04:22:55 -04:00
rocky
2c22e86562 Python 3.3 is more like 3.4 than we had thought? 2016-06-19 03:23:25 -04:00
R. Bernstein
305002e910 Merge pull request #31 from rocky/ast-format
Ast format
2016-06-19 03:05:40 -04:00
rocky
8943167e96 Alight instructions
Merge recent changes with master
2016-06-19 03:01:10 -04:00
rocky
90e504e806 Merge branch 'master' into ast-format 2016-06-19 02:32:02 -04:00
rocky
10b95cd9a8 Fix * in multi-target assignment 2016-06-19 02:31:19 -04:00
rocky
a0834890fa Merge branch 'master' into ast-format 2016-06-19 00:49:57 -04:00
rocky
d7b79c2b59 3.4 dictionary comprehension bug
Sync up fragment code with recent changesa
2016-06-19 00:49:22 -04:00
rocky
73df5f3737 3.4 set comprehension if bug 2016-06-18 23:43:50 -04:00
rocky
724faf9a3a Go over grammars..
* Reduce duplication
* Remove unused grammar rules
* Add grammar checking when parsers run as standalone
2016-06-17 22:59:17 -04:00
rocky
c4912be570 Not-quite-right 3.5+ * handling 2016-06-14 11:32:17 -04:00
rocky
fe56ca96c2 Add fragment offsets for more instructions
Save and restore class name across switches
2016-06-07 23:21:01 -04:00
rocky
e9c8c11071 Set comprehension code is not in 2.6
So we need more care in test programs.
2016-06-06 18:06:44 -04:00
rocky
bdfe14069c Add class offset of Python3 2016-06-06 17:26:08 -04:00
rocky
70d4841a6a Fix python 3 set comprehension and ...
Add a few set/list comprehension offsets for Python 3
2016-06-06 17:04:59 -04:00
rocky
8b1250dcc8 small changes 2016-06-06 15:34:57 -04:00
rocky
4f8714ff4c include offset for starting listcomp 2016-06-06 10:10:19 -04:00
rocky
cf4fb3c252 Merge branch 'master' of github.com:rocky/python-uncompyle6 into ast-format 2016-06-03 13:45:16 -04:00
rocky
d4006abf15 Typos 2016-06-03 10:59:29 -04:00
rocky
bdd8a9f2a0 Can't handle python 2.3 on 3.x for now 2016-06-03 10:55:13 -04:00
rocky
ebcb1d08f4 Limited support for Python 2.3 2016-06-03 10:20:52 -04:00
rocky
eefbc40eef option to show asm and DRY.
Get ready for some 2.3 support
2016-06-03 09:25:20 -04:00
rocky
6bdddb6a58 For Python 3.3 verification
README.rst: reflow paragraph
2016-06-03 04:33:58 -04:00
rocky
3da4c9ce77 Start custom grammar for 2.6 and ...
fix a python 2.6.9 deparse with lc if+and+not
2016-06-02 19:16:27 -04:00
rocky
167f5af5e6 Misc refactorings 2016-06-02 16:58:42 -04:00
rocky
3bd41b68ec Remove things we don't do here anymore.
For those other things see xdis.
2016-06-01 13:51:08 -04:00
rocky
92f20f489f Remove stuff we don't do anymore
For these other functions see xdis.
2016-06-01 13:47:48 -04:00
rocky
e368ab282c print AST children counts for internal nodes 2016-06-01 08:55:41 -04:00
R. Bernstein
5f6314d757 Merge pull request #23 from rocky/diagnostics-to-stream
Diagnostics to stream
2016-06-01 08:24:00 -04:00
rocky
a9809e332b asm should format tokens 2016-06-01 08:19:33 -04:00
Daniel Bradburn
b3182e804d showasm and showast now accept file like objects which are used for writing the the asm or ast to. 2016-06-01 10:02:04 +02:00
Daniel Bradburn
52731bb5cd showasm and showast now accept file like objects which are used for writing the the asm or ast to. 2016-06-01 10:01:39 +02:00
R. Bernstein
e3ef9c1724 Merge pull request #22 from rocky/xdis-load
Xdis load
2016-05-31 20:09:12 -04:00
rocky
70c6ee946c Work around lack of JUMP_OPs in xdis 1.1.0 2016-05-31 20:03:28 -04:00
rocky
20768266b4 use totally xdis's opcodes
Needs xdis 1.1.0 or greater
2016-05-31 19:53:17 -04:00
rocky
3e5876dd03 Back of some of the last disasm changes
Was failing test_disasm and I don't want to deal with that now.

Add more 2.7 bytecode tests
2016-05-30 00:23:51 -04:00
rocky
07d49d0f5b Merge branch 'xdis-load' of github.com:rocky/python-uncompyle6 into xdis-load 2016-05-29 23:52:39 -04:00
rocky
08790ab0ab Make use of xdis routines in disassembly 2016-05-29 23:02:31 -04:00
rocky
69bb74c86e DRY scanner25 and scanner26 more 2016-05-29 22:18:36 -04:00
rocky
ead41d7a96 Bang again on Python 2.5 and 2.6 scanners 2016-05-29 19:13:57 -04:00
rocky
bb2e9c0d31 bang on scanner2{5,6} 2016-05-29 18:44:07 -04:00
rocky
58fd0f7fe5 Start to DRY 2.6 scanner
Note: can't use xdis 2.6 opcode until another xdis release.
2016-05-29 05:05:48 -04:00
rocky
cd7ccdc872 Remove use of 2.7 globals by using self.opc 2016-05-29 04:00:43 -04:00
rocky
b60f62d529 Merge branch 'xdis-load' of github.com:rocky/python-uncompyle6 into xdis-load 2016-05-28 21:47:52 -04:00
rocky
e70e7bfc16 Start to DRY Python 2 scanners...
Get 2.7 opcodes from xdis.
2016-05-28 19:34:12 -04:00
rocky
90741148ad DRY scanners more 2016-05-28 17:07:43 -04:00
rocky
a984ae4f6a Fix bug in 3x list comprehensions with ifnot 2016-05-28 12:13:46 -04:00
rocky
fca233419f Remove dis3. Fix in 3.x list if not comprehension 2016-05-28 12:05:38 -04:00
rocky
bebd85f5e1 One more Python 3 opcode to remove 2016-05-28 01:58:34 -04:00
rocky
0a64c478c3 Remove dup 3.x opcodes 2016-05-28 01:54:04 -04:00
rocky
949b9b504e Nuke Travis 3.2 and 3.3 testing for now 2016-05-28 01:16:25 -04:00
rocky
b18b3e5d47 xdis for Python 3 opcodes 2016-05-28 01:14:18 -04:00
rocky
64191aa2d3 use xdis 3.4-3.5 opcodes 2016-05-28 00:58:27 -04:00
rocky
8e2c6aaa96 More travis versions 2016-05-27 19:24:39 -04:00
rocky
4398b5b2e0 Use xdis for code, magics, and marshal 2016-05-27 19:18:06 -04:00
rocky
eebe8249a8 Merge branch 'master' of github.com:rocky/python-uncompyle6 2016-05-25 20:08:37 -04:00
rocky
b6a0c5a704 Remove bytecode that doesn't exist on CircleCI 2016-05-25 20:08:12 -04:00
R. Bernstein
450d103760 Merge pull request #21 from rocky/fragments-state-fix
Fixed bug in pysource / fragments where the use of deparse_code from …
2016-05-25 19:00:33 -04:00
Daniel Bradburn
ebee84228b Fixed bug in pysource / fragments where the use of deparse_code from fragments could break subsequent calls to deparse_code from pysource due to amending to the global TABLE_DIRECT. 2016-05-25 20:48:35 +02:00
rocky
79593d6ef1 Small change
0 shouldn't be used as False.
2016-05-24 12:38:44 -04:00
rocky
79f4893cd9 final RETURN removal bug
We want to remove a final return from a module, but otherwise not.
Note we'll no lonager be able to verify functools.pyc as there
is now a return after a raise statement. That will have to be
delt with separately.

May address Issue #17.
2016-05-23 22:41:46 -04:00
rocky
544cb334e8 pydisassemble is in pyxdis now
Some small ReST tag fixes
2016-05-22 18:12:42 -04:00
Daniel Bradburn
fd9ecdecc7 Excluding experimental branch from travis ci 2016-05-22 01:03:59 +02:00
Daniel Bradburn
bec66bfb44 Excluding experimental branch from travis ci 2016-05-22 00:52:28 +02:00
Daniel Bradburn
913decaaec Merge pull request #16 from rocky/multi-gen--bug-3.5
Fix 3.x generator bug...
2016-05-21 20:40:17 +02:00
rocky
b6e7f365c5 Remove the JUMP_ABSOLUTE in comp_for altogether
Supposition is this was added as a result of a bug in my code from
earlier.

If we find we need it, we'll add it back again.
2016-05-21 05:45:56 -04:00
rocky
09f6286bec Fix 3.x generator bug...
found by Daniel Brandburn. See
af61622960
2016-05-21 05:09:27 -04:00
rocky
95bc1a76cb Check Python version in uncompile.py
Seems this is the only place that uses that.
2016-05-21 04:37:21 -04:00
rocky
207edbd53d Small changes
test_pyenvlib.py: cleanup code a little
uncompyle6/main.py: more explicit decompile msg
2016-05-20 22:19:17 -04:00
rocky
68ff878b3e Small pyflakes stuff 2016-05-20 21:37:46 -04:00
rocky
f834b46b84 Fragment fixes
fragments.py:
 * Use "%x" specifier if for iterators
 * Add '%D' interpretation

pysource.py:
  TABLE_DIRECT can get messed up from running fragments
  duplicate "%x" specifier to igore fragment stuff
2016-05-20 06:18:41 -04:00
rocky
6956e88e0e Small changes and administrivia 2016-05-19 08:40:20 -04:00
rocky
1121ff2456 Handle marshal frozenset 2016-05-18 17:01:40 -04:00
rocky
fbcdc7a181 Allow PyPy 2.7 opcodes and magic and ...
disas.py:
  * more aggressive code checking
magics.py:
  * Add PYPY magic
opcodes_27.py:
  * Add PYPY opcodes
2016-05-18 15:04:06 -04:00
rocky
06edeeeb46 Get ready for release 2.4.0 2016-05-18 12:46:23 -04:00
rocky
b629a0c5df Add 3.5 to verify 2016-05-18 10:59:57 -04:00
rocky
a08ece371e pydisassemble improvements; DRY scannners
disas.py:
 - disassembles *all* code objects found

scanner*.py:
 - no longer need to pass in version numbers; this
   is obtained from the class name
 - no longer pass in opcodes; this is done at
   initialization from the scanner name
 - all Pythoin 3 scanners support native disassembly
2016-05-18 10:58:48 -04:00
rocky
d42f84a59c Go over disassembly routine...
* tok.py:
  - add arg value when it is an integer
* pydisassemble.py:
  - add option -U --uncomplyle for which flavor of disassembly
  - remove -o option
* scanner27.py:
  - allow for native (non-uncompyle6) output
2016-05-17 22:52:16 -04:00
rocky
a3dd61c981 Fix marshal bug in handling complex numbers 2016-05-17 19:25:34 -04:00
rocky
9462e33f48 Fix Python 3.x bugs
* class definitions made via closures
* Add "make check-short" to top-level
* parse3.py: Python 3.3 uses STORE_LOGALS
2016-05-17 04:00:54 -04:00
rocky
f69c76c351 Fix a number of small bugs...
test_peynv.py: make Python3 compatible
marsh.py: remove duplicate test
scanner3.py: fix opcode typo
2016-05-16 21:31:02 -04:00
rocky
09bf364d89 Fix Python 3.x bug in function VAR and KW args 2016-05-16 20:41:22 -04:00
rocky
3d261a38c7 Readd some 3.x loop tests 2016-05-16 20:20:53 -04:00
rocky
bb384bc0b3 pytest for last commit 2016-05-16 19:44:35 -04:00
rocky
09a01dc783 Correct bugs in Python 3.2 source generation 2016-05-16 15:50:45 -04:00
rocky
73d784510a Travis can't handle pytest on Python 3.5 2016-05-16 13:48:00 -04:00
rocky
bdd7df6040 Python 2 loop scanner detection in Python 3
scanner*.py: Make scanner27 and scanner3 more aligned
Makefile: we can run py.test on Python 3.5
HISTORY.md: grammar changes
2016-05-16 13:40:55 -04:00
rocky
134b67d952 Misc small changes
Go over history yet again
code cleanups.
2016-05-16 10:15:55 -04:00
rocky
ebfe5e3ba8 Python3 mklambda bug 2016-05-15 21:16:53 -04:00
rocky
b5eaa9445d Python 3 genexpr bug 2016-05-15 20:59:28 -04:00
rocky
007328b353 Correct info on parser 2016-05-15 19:44:18 -04:00
rocky
6be6632e96 Bug in Python 3.x genexpr 2016-05-15 19:35:45 -04:00
rocky
2c121545f0 Fix bug in Python 3 lambda expression handling
Some other small cleanup changes
2016-05-15 18:14:22 -04:00
rocky
bb31629c35 pydisassemble disassemble without grammar mangling
Some other small cleanups as well
2016-05-15 13:55:21 -04:00
rocky
56dc270145 Fix verify bug in 3.2 2016-05-15 06:40:12 -04:00
rocky
4cba5a28ef 3.4 if/while bug 2016-05-15 05:37:44 -04:00
rocky
e79cecbb71 force Travis 2.7.11 for Python 2.7 2016-05-15 04:28:32 -04:00
rocky
38a5180e02 Add more Python 2.7 verify tests 2016-05-15 04:24:29 -04:00
rocky
2fdcdcb154 Fix bug in kvlist handling on Python 2.7
Created from previous DRY code in Python 3
2016-05-15 03:47:30 -04:00
rocky
b9692c9b1f DRY scanner34 and scanner35
handle 3.0..3.4 build maps as key/value pairs
2016-05-15 03:29:08 -04:00
rocky
b16a166d84 Optimize Python 2/3 code2num 2016-05-15 02:25:39 -04:00
rocky
4da2b8e2ed Python2 comptability in using Python 3 disassembly
Also fixes ablility to run bytecode 3.5 tests from 2.x now

For Python 2 reading python3 bytstrings, we need to
make sure we confer the character to a number.
2016-05-14 20:43:14 -04:00
rocky
1d9ab4e1d1 Start to DRY Python 3.4 and 3.5 scanners 2016-05-14 16:55:44 -04:00
rocky
51df8d8cbe See if travis will take spark 1.2.1 2016-05-14 15:28:16 -04:00
rocky
b69001ccbf Fix names for <program> -V 2016-05-14 00:53:46 -04:00
rocky
8c560a4791 Fix botched entry point names
Get ready for relase 2.3.6
2016-05-14 00:42:13 -04:00
rocky
931eb4a7e5 Get ready for release 2.3.5 2016-05-14 00:13:39 -04:00
rocky
2db380a77f More fragment bugs 2016-05-13 23:55:27 -04:00
rocky
de0ec195b7 More packaging crap.
Did I tell you how much I hate python packaging?

fragments.py: track recent change in class decorators.
2016-05-13 23:35:31 -04:00
rocky
e0eba6998f Python packaging - yet again.
Did I ever mention how much Python sucks at packaging?
2016-05-13 22:59:15 -04:00
rocky
e1a2860013 Test for class decorator
See https://github.com/rocky/python-uncompyle6/pull/15
2016-05-13 16:25:07 -04:00
R. Bernstein
cce40bef21 Merge pull request #15 from Tey/master
Fix for class decorators
2016-05-13 16:18:00 -04:00
Teyut
ca10f5652f Fix for class decorators 2016-05-13 17:59:12 +02:00
rocky
05898dc7cb Back off spark 1.2.0 for now 2016-05-12 13:06:13 -04:00
rocky
37406557bc More small changes 2016-05-12 12:59:31 -04:00
rocky
7929e4b57d Clean up test byte-compile directory 2016-05-12 11:40:54 -04:00
rocky
5babde61c4 Misc changes
Back off of some validation tests for now.
2016-05-12 11:22:00 -04:00
rocky
6f6f1db576 Misc fixups/cleanups
* parse3.py Had botched if-for-else test by grammar addition
* semantics/*.py: Show errorstack in failed parse when -g (requires sparck 1.2.0)
* some optimization in scanner3
2016-05-12 09:27:25 -04:00
R. Bernstein
8d51456f59 Merge pull request #14 from rocky/make-function-rewrite
Make function rewrite
2016-05-12 03:38:19 -04:00
rocky
a6320359c8 Merge branch 'make-function-rewrite' of github.com:rocky/python-uncompyle6 into make-function-rewrite 2016-05-11 20:36:13 -04:00
rocky
631d7be921 Redo make_function for *, arg
main(*, file='foo') and things like that now work
2016-05-11 20:34:20 -04:00
rocky
1e22734b6b WIP Make function redo 2016-05-11 09:53:33 -04:00
rocky
b134d08e91 add pos_arg ::= expr to make params of fns clear 2016-05-10 18:05:25 -04:00
rocky
8a66fd0be3 * call WIP 2016-05-09 20:23:54 -04:00
rocky
9ae45b363f 3.2 class bug 2016-05-09 20:11:25 -04:00
rocky
b287a305ea 3.2 WhileTrue grammar bug 2016-05-09 19:39:37 -04:00
rocky
d823dfb5d3 Python 3 "while True" bug 2016-05-09 14:44:34 -04:00
rocky
378cca27da Dan Pascu's contribution via Dan 2016-05-09 12:47:16 -04:00
rocky
f9dc797aa0 Another history tweak 2016-05-09 12:13:42 -04:00
rocky
8b9e0eca42 Some grammar cleanup 2016-05-09 11:58:05 -04:00
rocky
41f9e9e53e Track recent lc changes in fragment semantics 2016-05-09 06:57:13 -04:00
rocky
1179dc72da Another closure wrapping bug 2016-05-09 06:47:03 -04:00
rocky
e63bcd54e9 Another Python 3 closure grammar bug 2016-05-09 06:21:57 -04:00
rocky
73461d323e More small history tweaks 2016-05-09 05:34:01 -04:00
rocky
e37b197db9 Fix Python 3 list comprehansion closure bug 2016-05-09 05:03:49 -04:00
rocky
196495c40e Python 3 DUP_TOP_TWO bug 2016-05-08 18:41:59 -04:00
rocky
dddb486d78 DRY parse{2,3} code
Add test for last bug.
2016-05-08 18:15:07 -04:00
rocky
ce2ae463c4 Fix another if/loop parse bug 2016-05-08 18:07:04 -04:00
rocky
739ce7b1fd Go over history yet again. 2016-05-08 16:44:17 -04:00
rocky
b11f6d94f7 come_from_opt handles and/or precidence properly
main.py: give a better error message when file is not found.
2016-05-08 15:51:54 -04:00
rocky
debb46b0fe Semantic routine nonterminal typo 2016-05-08 13:49:15 -04:00
rocky
400153ea53 Yet another Python 3.x COME_FROM grammar problem 2016-05-08 13:08:12 -04:00
rocky
a65a8bb68e Fix 3.2 for/if loopback bug
problem was handling in Python 3.2

 for ...
    if ...
    else:
      ....
      jump for
    come from if
    jump for

In later Python 3's a "come from" is removed.

Also, start to DRY parser{,2,3} grammar rules.
2016-05-08 12:09:50 -04:00
rocky
4a79082872 Fix 3.5 if..pass bug
Update HISTORY.MD to include Dan Pascu. Some minor doc corrections
2016-05-08 10:32:11 -04:00
rocky
61c4a711a2 DRY scanner 3.{4,5} code 2016-05-08 00:52:02 -04:00
rocky
406df297df Python 3 build class parsing 2016-05-07 23:32:59 -04:00
rocky
36ffd4c31f Handle Python 3 yield from
Start dealing with MAKE_FUNCTION flags - not done yet.
2016-05-07 11:33:18 -04:00
rocky
039c115679 More Python3 deparsing
- grammar rule genexpr
- More Python3 docstring formatted
2016-05-06 23:51:25 -04:00
rocky
15b2a742e9 Administrivia
setup.py:
  don't need to import pkg_resources

pydisassemble:
  give an error is no file or directory is given
  usage should go to stderr, not stdout
2016-05-06 06:01:10 -04:00
rocky
163dfd888d Minor tweaks 2016-05-05 22:09:22 -04:00
rocky
408ba8c564 All Python 2.7 lib files decompile 2016-05-05 21:34:56 -04:00
rocky
c58481a9eb More Python 2 and 3 deparsing bugs fixed
* while + if break
* try + finall /pass
2016-05-05 20:56:41 -04:00
rocky
845a4a2003 Again, not GPL3 but MIT 2016-05-05 12:04:01 -04:00
rocky
469cadd5c9 Start PYPY 2.7 tolerance 2016-05-05 11:27:56 -04:00
rocky
4377354cf9 Get ready for release 2.3.4 2016-05-05 05:05:01 -04:00
rocky
6caa2c12fa Remove pypy3 add python 3.2 testing
Reorder list for testing preference
2016-05-05 04:45:00 -04:00
rocky
3153a955d4 Remove pypy 2016-05-05 04:42:23 -04:00
rocky
6f3a88d7e2 Fix up 3.2 tests
Remove pypy
2016-05-05 04:41:23 -04:00
rocky
109737cbef Try pypy and pypy3 2016-05-05 04:14:03 -04:00
rocky
05733c6171 Python 3.5 abc.py bug distilled 2016-05-05 04:11:53 -04:00
rocky
6765a2ea97 Add cross-Python-protable 3.5 dis module 2016-05-05 03:17:25 -04:00
rocky
c85496a92d Handle 3.5 with [as]
scanner35.py: Fix a small variable-name typo
2016-05-04 22:15:03 -04:00
rocky
e4ba73adfb One more test 2016-05-03 22:27:26 -04:00
rocky
7bf93980ce Don't repeat next_except_jump 2016-05-03 19:39:01 -04:00
rocky
8241a5e3a8 Wrong package name 2016-05-03 14:35:00 -04:00
rocky
faac11ad8c More package administrivia 2016-05-03 05:50:57 -04:00
rocky
fe04b97c6b Remove one more old-style Python class 2016-05-03 03:55:43 -04:00
rocky
62f6220082 DRY Python 2.7 scanner more 2016-05-03 03:29:56 -04:00
rocky
11e6eff427 Include LICENSE in package 2016-05-03 03:14:17 -04:00
1084 changed files with 91638 additions and 13148 deletions

7
.gitignore vendored
View File

@@ -1,3 +1,5 @@
*.pyo
*.pyc
*_dis
*~
/.cache
@@ -8,7 +10,12 @@
/__pkginfo__.pyc
/dist
/how-to-make-a-release.txt
/nose-*.egg
/tmp
/uncompyle6.egg-info
/unpyc
__pycache__
build
/.venv*
/.idea
/.hypothesis

View File

@@ -3,14 +3,22 @@ language: python
sudo: false
python:
- '2.6'
- '2.7'
- '3.4'
- '3.5'
- '2.7.12'
- '2.6'
- '3.3'
- '3.4'
- '3.2'
- '3.6'
install:
- pip install -r requirements.txt
- pip install -e .
- pip install -r requirements-dev.txt
script:
- python ./setup.py develop && COMPILE='--compile' make check
# blacklist
branches:
except:
- data-driven-pytest

5355
ChangeLog

File diff suppressed because it is too large Load Diff

131
DECOMPYLE-2.4-CHANGELOG.txt Normal file
View File

@@ -0,0 +1,131 @@
This is the changelog from *decompyle*'s release 2.4 and before
passed on by Dan Pascu
release 2.4 (Dan Pascu)
- Replaced the way code structures are identified by the parser.
Previously, the scanner introduced some COME_FROM entries in the
dissasembly output to mark all the destinations of jump instructions.
Using these COME_FROM labels the parser was then able to identify the
code structures (if tests, while loops, etc). Up to python-2.3 this was
possible because the code structures were clearly defined and jump
targets were always to the same points in a given strcuture making it
easy to identify the structure. Python 2.3 however introduced optimized
jumps to increase code performance. In the previous version of decompyle
(2.3) we used a technique to identify the code structures and then used
these structures to determine where the jump targets would have been if
not optimized. Using this information we then added COME_FROM labels at
the points where they would have been if not optimized, thus emulating
the way decompyle worked with versions before python 2.3. However with
the introduction of even more optimizations in python 2.4 this technique
no longer works. Not only the jump targets are no longer an effective
mean for the parser to identify the code structures, but also trying to
emulate the old way things were solved when it clearly no longer works
is not the right solution. To solve this issue, the code to identify the
structures that we had developed in version 2.3, was used to add real
start/end points for strcuture identification, instead of the COME_FROM
labels. Now these new start/end labels are used by the parser to more
precisely identify the structures and the COME_FROM labels were removed
completely. The scanner is responsible to identify these code structures
and use any knowledge of optimizations that python applies to determine
the start/end points of any structure and then mark them with certain
keywords that are understood by the parser.
- Correctly identify certain `while 1' structures that were not
recognized in the previous version.
- Added support for new byte code constructs used by python 2.4
release 2.3.2
- tidied up copyright and changelog information for releases 2.3 and later
release 2.3.1 (Dan Pascu)
- implemented a structure detection technique that fixes problems with
optimised jumps in Python >= 2.3. In the previous release (decompyle 2.3),
these problems meant that some files were incorrectly decompiled and
others could not be decompiled at all. With this new structure detection
technique, thorough testing over the standard python libraries suggests
that decompyle 2.3.1 can handle everything that decompyle 2.2beta1 could,
plus new Python 2.3 bytecodes and constructs.
release 2.3 (Dan Pascu)
- support for Python 2.3 added
- use the marshal and disassembly code from their respective python
versions, so that decompyle can manipulate bytecode independently
of the interpreter that runs decompyle itself (for example it can
decompile python2.3 bytecode even when running under python2.2)
——————————————————
release 2.2beta1 (hartmut Goebel)
- support for Python 1.5 up to Python 2.2
- no longer requires to be run with the Python interpreter version
which generated the byte-code.
- requires Python 2.2
- pretty-prints docstrings, hashes, lists and tuples
- decompyle is now a script and a package
- added emacs mode-hint and tab-width for each file output
- enhanced test suite: more test patterns, .pyc/.pyo included
- avoids unnecessary 'global' statements
- still untested: EXTENDED_ARG
internal changes:
- major code overhoul: splitted into several modules, clean-ups
- use a list of valid magics instead of the single one from imp.py
- uses copies of 'dis.py' for every supported version. This ensures
correct disassemling of the byte-code.
- use a single Walker and a single Parser, thus saving time and memory
- use augmented assign and 'print >>' internally
- optimized 'Walker.engine', the main part of code generation
release 0.6.0: (hartmut Goebel)
- extended print (Python 2.0)
- extended import (Python 2.0) (may not cover all cases)
- augmented assign (Python 2.0) (may not cover all cases)
- list comprehensions (Python 2.0)
- equivalent for 'apply' (Python 1.6)
- if .. elif .. else are now nested as expected
- assert test, data
- unpack list corrected (was the same as unpack tuple)
- fixed unpack tuple (trailing semicolon was missing)
- major speed up :-)
- reduced memory usage (pre-alpha-0.5 has increased it a lot)
- still missing: EXTENDED_ARG
pre-alpha-0.5: (hartmut Goebel)
- *args, **kwargs
- global
- formal tuple parameters (eg. def a(self, (x,y,z)) )
- actual lambda parameters (eg. X(lambda z: z**2) )
- remove last 'return None' in procedures
- remove last 'return locals()' in class definitions
- docstrings
pre-alpha-0.4: (hartmut Goebel)
- assert
- try/except/finally
- parentheses in expressions
- nested expressions
- extracted dissassemble() from module dis and
removed ugly redirect of stdout, thus saved a lot of
ugly code and a lot of memory
pre-alpha-0.3: (hartmut Goebel)
- keyword arguments
- some boolean expressions
- and/or
- complex conditions in if/while
- read byte-code from .pyc without importing
- access to the body of classes and modules
- class and function definitions
- a = b = c = xxx
pre-alpha-0.1 -> pre-alpha-0.2:
- SET_LINENO filtered out in lexer now
- added support for subscripts (just for Christian Tismer :-)
- fixed bug with handling of BUILD_{LIST,TUPLE} & CALL_FUNCTION
- dict-building support
- comparison support
- exec support
- del support
- pass support
- slice support
- no more extraneous (albeit legal) commas
- finally, it excepts try [sic] but not all 42 variations of it

View File

@@ -4,7 +4,8 @@ There have been a number of people who have worked on this. I am awed
by the amount of work, number of people who have contributed to this,
and the cleverness in the code.
The below is an annotated history from my reading of the sources cited.
The below is an annotated history from talking to participants
involved and my reading of the code and sources cited.
In 1998, John Aycock first wrote a grammar parser in Python,
eventually called SPARK, that was usable inside a Python program. This
@@ -23,10 +24,14 @@ working on his thesis, John realized SPARK could be used to deparse
Python bytecode. In the fall of 1999, he started writing the Python
program, "decompyle", to do this.
This code introduced another clever idea: using table-driven
semantics routines, using format specifiers.
To help with control structure deparsing the instruction sequence was
augmented with pseudo instruction COME_FROM. This code introduced
another clever idea: using table-driven semantics routines, using
format specifiers.
The last mention of a release of SPARK from John is around 2002.
The last mention of a release of SPARK from John is around 2002. As
released, although the Earley Algorithm parser was in good shape, this
code was woefully lacking as serious Python deparser.
In the fall of 2000, Hartmut Goebel
[took over maintaining the code](https://groups.google.com/forum/#!searchin/comp.lang.python/hartmut$20goebel/comp.lang.python/35s3mp4-nuY/UZALti6ujnQJ). The
@@ -36,10 +41,11 @@ first subsequent public release announcement that I can find is
From the CHANGES file found in
[the tarball for that release](http://old-releases.ubuntu.com/ubuntu/pool/universe/d/decompyle2.2/decompyle2.2_2.2beta1.orig.tar.gz),
it appears that Hartmut did most of the work to get this code to
accept the full Python language. He added precidence to the table
accept the full Python language. He added precedence to the table
specifiers, support for multiple versions of Python, the
pretty-printing of docstrings, lists, and hashes. He also wrote test and verification routines of
deparsed bytecode, and used this in an extensive set of tests that he also wrote. He could verify against the entire Python library.
deparsed bytecode, and used this in an extensive set of tests that he also wrote. He says he could verify against the
entire Python library. However I have subsequently found small and relatively obscure bugs in the decompilation code.
decompyle2.2 was packaged for Debian (sarge) by
[Ben Burton around 2002](https://packages.qa.debian.org/d/decompyle.html). As
@@ -55,32 +61,88 @@ it doesn't look like he's done anything compiler-wise since SPARK). So
I hope people will use the crazy-compilers service. I wish them the
success that his good work deserves.
Next we get to
["uncompyle" and PyPI](https://pypi.python.org/pypi/uncompyle/1.1) and
the era of git repositories. In contrast to decompyle, this now runs
only on Python 2.7 although it accepts bytecode back to Python
Dan Pascu did a bit of work from late 2004 to early 2006 to get this
code to handle first Python 2.3 and then 2.4 bytecodes. Because of
jump optimization introduced in the CPython bytecode compiler at that
time, various JUMP instructions were classifed as going backwards, and
COME FROM instructions were reintroduced. See
[RELEASE-2.4-CHANGELOG.txt](https://github.com/rocky/python-uncompyle6/blob/master/DECOMPYLE-2.4-CHANGELOG.txt)
for more details here. There wasn't a public
release of RELEASE-2.4 and bytecodes other than Python 2.4 weren't
supported. Dan says the Python 2.3 version could verify the entire
Python library. But given subsequent bugs found like simply
recognizing complex-number constants in bytecode, decompilation wasn't perfect.
Next we get to ["uncompyle" and
PyPI](https://pypi.python.org/pypi/uncompyle/1.1) and the era of
public version control. (Dan's code although not public used
[darcs](http://darcs.net/) for version control.)
In contrast to _decompyle_, _uncompyle_ at least in its final versions,
runs only on Python 2.7. However it accepts bytecode back to Python
2.5. Thomas Grainger is the package owner of this, although Hartmut is
listed as the author.
still listed as the author.
The project exists not only on
[github](https://github.com/gstarnberger/uncompyle) but also on
[bitbucket](https://bitbucket.org/gstarnberger/uncompyle) where the
git history goes back to 2009. Somewhere in there the name was changed
from "decompyle" to "uncompyle".
[bitbucket](https://bitbucket.org/gstarnberger/uncompyle) and later
the defunct [google
code](https://code.google.com/archive/p/unpyc/). The git/svn history
goes back to 2009. Somewhere in there the name was changed from
"decompyle" to "unpyc" by Keknehv, and then to "uncompyle" by Guenther Starnberger.
The name Thomas Grainger isn't found in (m)any of the commits in the
several years of active development. Guenther Starnberger, Keknehv,
hamled, and Eike Siewertsen are principle committers here.
several years of active development. First Keknehv worked on this up
to Python 2.5 or so while acceping Python bytecode back to 2.0 or
so. Then hamled made a few commits earler on, while Eike Siewertsen
made a few commits later on. But mostly wibiti, and Guenther
Starnberger got the code to where uncompyle2 was around 2012.
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
deparsing to be exactly the same, and the transformation process can
remove instructions. _Adding_ instructions with psuedo offsets is
however okay.
`Uncompyle6` however owes its existence to the fork of `uncompyle2` by
Myst herie (Mysterie) whose first commit picks up at
2012. I chose this since it seemed to have been at that time the most
actively, if briefly, worked on. Also starting around 2012 is Dark
Fenx's uncompyle3 which I used for inspiration for Python3 support.
I started working on this late 2015, mostly to add fragment support.
In that, I decided to make this runnable on Python 3.2+ and Python 2.6+
while, handling Python bytecodes from Python versions 2.5+ and
3.2+. In doing so, it has been expedient to separate this into three
projects:
* marshaling/unmarshaling, bytecode loading and disassembly ([xdis](https://pypi.python.org/pypi/xdis)),
* parsing and tree building ([spark_parser](https://pypi.python.org/pypi/spark_parser)),
* this project - grammar and semantic actions for decompiling
([uncompyle6](https://pypi.python.org/pypi/uncompyle6)).
This project, uncompyle6, however owes its existence to uncompyle2 by
Myst herie (Mysterie) whose first commit seems to goes back to 2012;
it is also based on Hartmut's code. I chose this as it seems had been
the most actively worked on most recently.
Over the many years, code styles and Python features have
changed. However brilliant the code was and still is, it hasn't really
had a single public active maintainer. And there have been many forks
of the code.
of the code. I have spent a great deal of time trying to organize and
modularize the code so that it can handle more Python versions more
gracefully (with still only moderate success).
That it has been in need of an overhaul has been recognized by the
Hartmut a decade an a half ago:
@@ -90,15 +152,29 @@ Hartmut a decade an a half ago:
NB. This is not a masterpiece of software, but became more like a hack.
Probably a complete rewrite would be sensefull. hG/2000-12-27
Lastly, I should mention [unpyc](https://code.google.com/p/unpyc3/)
and most especially [pycdc](https://github.com/zrax/pycdc), largely by
Michael Hansen and Darryl Pogue. If they supported getting source-code
fragments and I could call it from Python, I'd probably ditch this and
use that. From what I've seen, the code runs blindingly fast and spans
all versions of Python.
This project deparses using an Earley-algorithm parse with lots of
massaging of tokens and the grammar in the scanner
phase. Earley-algorithm parsers are context free and tend to be linear
if the grammar is LR or left recursive.
Another approach that doesn't use grammars is to do something like
simulate execution symbolically and build expression trees off of
stack results. Control flow in that apprproach still needs to be
handled somewhat ad hoc. The two important projects that work this
way are [unpyc3](https://code.google.com/p/unpyc3/) and most
especially [pycdc](https://github.com/zrax/pycdc) The latter project
is largely by Michael Hansen and Darryl Pogue. If they supported
getting source-code fragments, did a better job in supporting Python
more fully, and had a way I could call it from Python, I'd probably
would have ditched this and used that. The code runs blindingly fast
and spans all versions of Python, although more recently Python 3
support has been lagging.
Tests for the project have been, or are being, culled from all of the
projects mentioned.
NB. If you find mistakes, want corrections, or want your name added (or removed),
please contact me.
For a little bit of the history of changes to the Early-algorithm parser,
see the file [NEW-FEATURES.rst](https://github.com/rocky/python-spark/blob/master/NEW-FEATURES.rst) in the [python-spark github repository](https://github.com/rocky/python-spark).
NB. If you find mistakes, want corrections, or want your name added
(or removed), please contact me.

187
HOW-TO-REPORT-A-BUG.md Normal file
View File

@@ -0,0 +1,187 @@
# How to report a Bug
## The difficulty of the problem
This decompiler is a constant work in progress: Python keeps
changing, and so does its code generation.
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.
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)
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. 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
* Python interpreter version used
### But I don't *have* the source code!
Sure, I get it. No problem. There is Python assembly code on parse
errors, so simply by hand decompile that. To get a full disassembly,
use pydisasm from the [xdis](https://pypi.python.org/pypi/xdis)
package. Opcodes are described in the documentation for
the [dis](https://docs.python.org/3.6/library/dis.html) module.
### But I don't *have* the source code and am incapable of figuring how how to do a hand disassembly!
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 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
the functions or classes. So please chop down the source code by
removing those parts that do to decompile properly.
By doing this, you'll probably have a better sense of what exactly is
the problem. Perhaps you can find the boundary of what decompiles, and
what doesn't. That is useful. Or maybe the same file will decompile
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.

View File

@@ -1,6 +1,6 @@
Copyright (c) 1998-2002 John Aycock
Copyright (c) 2000 by hartmut Goebel <h.goebel@crazy-compilers.com>
Copyright (c) 2015 by Rocky Bernstein
Copyright (c) 2000 by hartmut Goebel <h.goebel@crazy-compilers.com>
Copyright (c) 1998-2002 John Aycock
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the

View File

@@ -1,9 +1,18 @@
include README.rst
include HISTORY.md
include ChangeLog
include HISTORY.md
include HOW-TO-REPORT-A-BUG.md
include LICENSE
include Makefile
include requirements.txt
include requirements-dev.txt
include DECOMPYLE-2.4-CHANGELOG.txt
include __pkginfo__.py
recursive-include uncompyle6 *.py
include bin/uncompyle6
include bin/pydisassemble
recursive-include test *.py
include pytest/Makefile
include test/Makefile
recursive-include test *.py *.pyc
recursive-include pytest *.py
recursive-include pytest/testdata *

View File

@@ -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
@@ -23,18 +23,33 @@ check:
@PYTHON_VERSION=`$(PYTHON) -V 2>&1 | cut -d ' ' -f 2 | cut -d'.' -f1,2`; \
$(MAKE) check-$$PYTHON_VERSION
# Run all quick tests
check-short: pytest
$(MAKE) -C test check-short
#: Tests for Python 2.7, 3.3 and 3.4
check-2.7 check-3.3 check-3.4: pytest
$(MAKE) -C test $@
#: Tests for Python 3.5 - pytest doesn't work here
check-3.5:
#: Tests for Python 3.2 and 3.5 - pytest doesn't work here
# Or rather 3.5 doesn't work not on Travis
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 PyPy 5.0.1, or PyPy 5.8.0-beta0
# Skip for now
2.6 5.0 5.3 5.6 5.8:
#:PyPy pypy3-2.4.0 Python 3:
pypy-3.2 2.4:
$(MAKE) -C test $@
#: Run py.test tests
pytest:
$(MAKE) -C pytest check
@@ -44,9 +59,13 @@ clean: clean_pyc
$(PYTHON) ./setup.py $@
(cd test && $(MAKE) clean)
#: Create source (tarball) and binary (egg) distribution
dist:
$(PYTHON) ./setup.py sdist bdist_egg
#: Create source (tarball) and wheel distribution
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:
@@ -73,6 +92,11 @@ bdist_egg:
$(PYTHON) ./setup.py bdist_egg
#: Create binary wheel distribution
wheel:
$(PYTHON) ./setup.py bdist_wheel
# It is too much work to figure out how to add a new command to distutils
# to do the following. I'm sure distutils will someday get there.
DISTCLEAN_FILES = build dist *.pyc

400
NEWS
View File

@@ -1,3 +1,401 @@
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,
e.g. 2.7.1 We allow a float here, but if passed a string like '2.7'. or
* 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-forced change adjust for COMPARE_OP "is-not" in
semanatic routines. We need "is not".
* Some PyPy tolerance in validate testing.
* Some pyston tolerance
uncompyle6 2.11.3 2017-08-09
Very minor changes
- RsT doc fixes and updates
- use newer xdis, but not too new; 3.5.2 breaks uncompyle6
- use xdis opcode sets
- xdis "exception match" is now "exception-match"
uncompyle6 2.11.2 2017-07-09
- Start supporting Pypy 3.5 (5.7.1-beta)
- use xdis 3.5.0's opcode sets and require xdis 3.5.0
- Correct some Python 2.4-2.6 loop detection
- guard against badly formatted bytecode
uncompyle6 2.11.1 2017-06-25
- Python 3.x annotation and function signature fixes
- Bump xdis version
- Small pysource bug fixes
uncompyle6 2.11.0 2017-06-18 Fleetwood
- Major improvements in fragment tracking
* Add nonterminal node in extractInfo
* tag more offsets in expressions
* tag array subscripts
* set YIELD value offset in a <yield> expr
* fix a long-standing bug in not adjusting final AST when melding other deparse ASTs
- Fixes yet again for make_function node handling; document what's up here
- Fix bug in snowflake Python 3.5 *args kwargs
uncompyle6 2.10.1 2017-06-3 Marylin Frankel
- fix some fragments parsing bugs
- was returning the wrong type sometimes in deparse_code_around_offset()
- capture function name in offsets
- track changes to ifelstrmtr node from pysource into fragments
uncompyle6 2.10.0 2017-05-30 Elaine Gordon
- Add fuzzy offset deparse look up
- 3.6 bug fixes
- fix EXTENDED_ARGS handling (and in 2.6 and others)
- semantic routine make_function fragments.py
- MAKE_FUNCTION handling
- CALL_FUNCTION_EX handling
- async property on defs
- support for CALL_FUNCTION_KW (moagstar)
- 3.5+ UNMAP_PACK and BUILD_UNMAP_PACK handling
- 3.5 FUNCTION_VAR bug
- 3.x pass statement insdie while True
- Improve 3.2 decompilation
- Fixed -o argument processing (grkov90)
- Reduce scope of LOAD_ASSERT as expr to 3.4+
- "await" statement fixes
- 2.3, 2.4 "if 1 .." fixes
- 3.x annotation fixes
uncompyle6 2.9.11 2017-04-06
- Better support for Python 3.5+ BUILD_MAP_UNPACK
- Start 3.6 CALL_FUNCTION_EX support
- Many decompilation bug fixes. (Many more remain). See ChangeLog
uncompyle6 2.9.10 2017-02-25
- Python grammar rule fixes
- Add ability to get grammar coverage on runs
- Handle Python 3.6 opcode BUILD_CONST_KEYMAP
uncompyle6 2.9.9 2016-12-16
- Remaining Python 3.5 ops handled
(this also means more Python 3.6 ops are handled)
- Python 3.5 and 3.6 async and await handled
- Python 3.0 decompilation improved
- Python 3 annotations fixed
- Better control-flow detection
- Code cleanups and misc bug fixes
uncompyle6 2.9.8 2016-12-16
- Better control-flow detection
- pseudo instruction THEN in 2.x
to disambiguate if from and
- fix bug in --verify option
- DRY (a little) control-flow detection
- fix syntax in tuples with one element
- if AST rule inheritence in Python 2.5
- NAME_MODULE removal for Python <= 2.4
- verifycall fixes for Python <= 2.4
- more Python lint
uncompyle6 2.9.7 2016-12-16
- Start to handle 3.5/3.6 build_map_unpack_with_call
- Some Python 3.6 bytecode to wordcode conversion fixes
- option -g: show start-end range when possible
- track print_docstring move to help (used in python 3.1)
- verify: allow RETURN_VALUE to match RETURN_END_IF
- some 3.2 compatibility
- Better Python 3 control flow detection by adding Pseudo ELSE opcodes
uncompyle6 2.9.6 2016-12-04
- Shorten Python3 grammars with + and *
this requires spark parser 1.5.1
- Add some AST reduction checks to improve
decompile accuracy. This too requires
spark parser 1.5.1
uncompyle6 2.9.6 2016-11-20
- Correct MANIFEST.in
- More AST grammar checking
- --linemapping option or linenumbers.line_number_mapping()
Shows correspondence of lines between source
and decompiled source
- Some control flow adjustments in code for 2.x.
This is probably an improvement in 2.6 and before.
For 2.7 things are just shuffled around a little. Sigh.
Overall I think we are getting more precise in
or analysis even if it is not always reflected
in the results.
- better control flow debugging output
- Python 2 and 3 detect structure code is more similar
- Handle Docstrings with embedded tiple quotes (""")
uncompyle6 2.9.5 2016-11-13
- Fix Python 3 bugs:
* improper while 1 else
* docstring indent
* 3.3 default values in lambda expressions
* start 3.0 decompilation (needs newer xdis)
- Start grammar misparse checking
uncompyle6 2.9.4 2016-11-02
- Handle Python 3.x function annotations
- track def keyword-parameter line-splitting in source code better
- bump min xdis version to mask previous xdis bug
uncompyle6 2.9.3 2016-10-26
Release forced by incompatibility change in xdis 3.2.0.
- Python 3.1 bugs:
* handle "with ... as"
* handle "with"
* Start handling def (...) -> yy (has bugs still)
- DRY Python 3.x via inheritance
- Python 3.6 work (from Daniel Bradburn)
* Handle 3.6 buildstring
* Handle 3.6 handle single and multiple fstring better
uncompyle6 2.9.2 2016-10-15
- use source-code line breaks to assist in where to break
in tuples and maps
- Fix Python 1.5 decompyle bugs
- Fix some Python 2.6 and below bugs
- DRY fragments.py code a little
uncompyle6 2.9.1 2016-10-09
- Improved Python 1.5 decompiling
- Handle old-style pre Python 2.2 classes
uncompyle6 2.9.0 2016-10-09
- Use xdis 3.0.0 protocol load_module.
this Forces change in requirements.txt and _pkg_info_.py
- Start Python 1.5 decompiling; another round of work is needed to
remove bugs
- Simplify python 2.1 grammar
- Fix bug with -t ... Wasn't showing source text when -t option was given
- Fix 2.1-2.6 bug in list comprehension
uncompyle6 2.8.4 2016-10-08
- Python 3 disassembly bug fixes
- Python 3.6 fstring bug fixes (from moagstar)
- Python 2.1 disassembly
- COME_FROM suffixes added in Python3
- use .py extension in verification disassembly
uncompyle6 2.8.3 2016-09-11 live from NYC!
NOTE: this is possibly the last release before a major reworking of
control-flow structure detection is done.
- Lots of bug fixes in decompilation:
* 3.0 .. 3.4 whileTrue bug
* 3.x function declaration deparsing:
. 3.0 .. 3.2 *args processing
. 3.0 .. 3.2 call name and kwargs bug
. 3.0 .. getting parameter of *
. 3.0 .. handling variable number of args
. 3.0 .. "if" structure bugs
* 3.5+ if/else bugs
* 2.2-2.6 bugs
. try/except control flow
. a == b == c -like detection
. generator detection
. "while .. and" statement bugs
. handle "except <cond>, <var>"
. use older raise format in 2.x
- scanner "disassemble" is now "ingest". True disassembly is done by xdis
- Start accepting Python 3.1 bytecode
- Add --weak-verify option on test_pyenvlib and test_pythonlib. This
catches more bugs more easily
- bump xdis requirement so we can deparse dropbox 2.5 code
- Added H. Goebel's changes before 2.4 in DECOMPYLE-2.4-CHANGELOG.txt
uncompyle6 2.8.2 2016-08-29
- Handle Python 3.6 format string conversions !r, !s, !a
- Start to handle 3.1 bytecode
- Fix some PyPy translation bugs
- We now only handle 3.6.0a3+ since that is incompatible with 3.6 before that
uncompyle6 2.8.1 2016-08-20
- Add Python 2.2 decompilation
- Fix bugs
* PyPy LOOKUP_METHOD bug
* Python 3.6 FORMAT_VALUE handles expressions now
uncompyle6 2.8.0 2016-08-03
- Start Python 3.6 support (moagstar)
more work on PEP 498 needed
- tidy bytecode/word output
- numerous decompiling bugs fixed
- grammar testing started
- show magic number in deparsed output
- better grammar and semantic action segregation based
on python bytecode version
uncompyle6 2.7.1 2016-07-26
- PyPy bytecodes for 2.7 and 3.2 added
- Instruction formatting improved slightly
- 2.7 bytecode "continue" bug fixed
uncompyle6 2.7.0 2016-07-15
- Many Syntax and verification bugs removed
tested on standard libraries from 2.3.7 to 3.5.1
and they all decompile and verify fine.
I'm sure there are more bugs though.
uncompyle6 2.6.2 2016-07-11 Manhattenhenge
- Extend bytecodes back to 2.3
- Fix bugs:
* 3.x and 2.7 set comprehensions,
* while1 loops
* continue statements
- DRY and segregate grammar more
uncompyle6 2.6.1 2016-07-08
- Go over Python 2.5 bytecode deparsing
all library programs now deparse
- Fix a couple bugs in 2.6 deparsing
uncompyle6 2.6.0 2016-07-07
- Improve Python 2.6 bytecode deparsing:
stdlib now will deparse something
- Better <2.6 vs. 2.7 grammar separation
- Fix some 2.7 deparsing bugs
- Fix bug in installing uncompyle6 script
- Doc improvements
uncompyle6 2.5.0 2016-06-22 Summer Solstice
- Much better Python 3.2-3.5 coverage.
3.4.6 is probably the best;3.2 and 3.5 are weaker
- Better AST printing with -t
- Better error reporting
- Better fragment offset tracking
- Some (much-needed) code refactoring
uncompyle6 2.4.0 2016-05-18 (in memory of Lewis Bernstein)
- Many Python 3 bugs fixed:
* Python 3.2 to 3.5 libraries largely
uncompyle and most verify
- pydisassembler:
* disassembles all code objects in a file
* can select showing bytecode before
or after uncompyle mangling, option -U
- DRY scanner code (but more is desired)
- Some code cleanup (but more is desired)
- Misc Bugs fixed:
* handle complex number unmarshaling
* Running on Python 2 to works on Python 3.5 bytecodes now
uncompyle6 2.3.5 and 2.3.6 2016-05-14
- Python 2 class decorator fix (thanks to Tey)
- Fix fragment parsing bugs
- Fix some Python 3 parsing bugs:
* Handling single in * parameter
* "while True"
* escape from for inside if
* yield expressions
- Correct history based on info from Dan Pascu
- Fix up pip packaging, ugh.
uncompyle6 2.3.4 2016-05-5
- More Python 3.5 parsing bugs addressed
- decompiling Python 3.5 from other Python versions works
- test from Python 3.2
- remove "__module__ = __name__" in 3.0 <= Python 3.2
uncompyle6 2.3.3 2016-05-3
- Fix bug in running uncompyle6 script on Python 3
@@ -25,7 +423,7 @@ uncompyle6 2.2.0 2016-04-30
uncompyle6 2.2.0 2016-04-02
- Support single-mode (in addtion to exec-mode) compilation
- Support single-mode (in addition to exec-mode) compilation
- Start to DRY Python 2 and Python 3 grammars
- Fix bug in if else ternary construct
- Fix bug in uncomplye6 -d and -r options (via lelicopter)

View File

@@ -5,6 +5,6 @@ Summary: Python byte-code to source-code converter
Home-page: http://github.com/rocky/python-uncompyle6
Author: Rocky
Author-email: rb@dustyfeet.com
License: GPLv3
License: MIT
Description: UNKNOWN
Platform: UNKNOWN

View File

@@ -3,29 +3,37 @@
uncompyle6
==========
A native Python bytecode Disassembler, Decompiler, Fragment Decompiler
and bytecode library. Follows in the tradition of decompyle, uncompyle, and uncompyle2.
A native Python cross-version Decompiler and Fragment Decompiler.
The successor to decompyle, uncompyle, and uncompyle2.
Introduction
------------
*uncompyle6* translates Python bytecode back into equivalent Python
source code. It accepts bytecodes from Python version 2.5 to 3.4 or
so. The code requires Python 2.6 or later and has been tested on Python
running versions 2.6, 2.7, 3.3, 3.4 and 3.5.
source code. It accepts bytecodes from Python version 1.5, and 2.1 to
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
forks around. All of them come basically from the same code base, and
almost all of them not maintained very well. This code pulls these together
and addresses a number of open issues in those.
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.
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
@@ -39,12 +47,13 @@ location in more detail than just a line number. It can be also used
when source-code information does not exist and there is just bytecode
information.
Other parts of the library can be used inside Python for various
bytecode-related tasks. For example you can read in bytecode,
i.e. perform a version-independent `marshal.loads()`, and disassemble
the bytecode using a version of Python different from the one used to
compile the bytecode.
Requirements
------------
This project requires Python 2.6 or later, PyPy 3-2.4, or PyPy-5.0.1.
Python versions 2.4-2.7 are supported in the python-2.4 branch.
The bytecode files it can read has been tested on Python bytecodes from
versions 1.5, 2.1-2.7, and 3.0-3.6 and the above-mentioned PyPy versions.
Installation
------------
@@ -53,13 +62,13 @@ This uses setup.py, so it follows the standard Python routine:
::
pip install -r requirements.txt
pip install -e .
pip install -r requirements-dev.txt
python setup.py install # may need sudo
# or if you have pyenv:
python setup.py develop
A GNU makefile is also provided so `make install` (possibly as root or
A GNU makefile is also provided so :code:`make install` (possibly as root or
sudo) will do the steps above.
Testing
@@ -73,7 +82,7 @@ A GNU makefile has been added to smooth over setting running the right
command, and running tests from fastest to slowest.
If you have remake_ installed, you can see the list of all tasks
including tests via `remake --tasks`
including tests via :code:`remake --tasks`
Usage
@@ -83,33 +92,116 @@ Run
::
./bin/uncompyle6 -h
./bin/pydisassemble -h
$ uncompyle6 *compiled-python-file-pyc-or-pyo*
for usage help.
For usage help:
::
$ uncompyle6 -h
If you want strong verification of the correctness of the
decompilation process, add the `--verify` option. But there are
situations where this will indicate a failure, although the generated
program is semantically equivalent. Using option `--weak-verify` will
tell you if there is something definitely wrong. Generally, large
swaths of code are decompiled correctly, if not the entire program.
You can also cross compare the results with pycdc_ . Since they work
differently, bugs here often aren't in that, and vice versa.
Known Bugs/Restrictions
-----------------------
Python 2 deparsing is probably as solid as the various versions of
uncompyle2. Python 3 deparsing is okay but not as solid. Python 3.5 is missing some of new opcodes added, but still often works.
The biggest known and possibly fixable (but hard) problem has to do
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.)
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
produced by the decompiled/compiled program. Some allowance is made
for inessential differences. But other semantically equivalent
differences are not caught. For example ``1 and 0`` is decompiled to
the equivalent ``0``; remnants of the first true evaluation (1) is
lost when Python compiles this. When Python next compiles ``0`` the
resulting code is simpler.
*Weak Verification*
on the other hand doesn't check bytecode for equivalence but does
check to see if the resulting decompiled source is a valid Python
program by running the Python interpreter. Because the Python language
has changed so much, for best results you should use the same Python
Version in checking as used in the bytecode.
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,
and 2.0.
In the Python 3 series, Python support is is strongest around 3.4 or
3.3 and drops off as you move further away from those versions. Python
3.6 changes things drastically by using word codes rather than byte
codes. That has been addressed, but then it also changes function call
opcodes and its semantics and has more problems with control flow than
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
changes several times within a version. We support only the released
magic. There are also customized Python interpreters, notably Dropbox,
which use their own magic and encrypt bytcode. With the exception of
the Dropbox's old Python 2.5 interpreter this kind of thing is not
handled.
We also don't handle PJOrion_ obfuscated code. For that try: PJOrion
Deobfuscator_ to unscramble the bytecode to get valid bytecode before
trying this tool.
Handling pathologically long lists of expressions or statements is
slow.
There is lots to do, so please dig in and help.
See Also
--------
* https://github.com/zrax/pycdc : supports all versions of Python and is written in C++
* https://code.google.com/archive/p/unpyc3/ : supports Python 3.2 only
* 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. 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
* https://github.com/rocky/python-xasm : Cross Python version assembler
The above projects use a different decompiling technique what is used here.
The HISTORY file.
.. |downloads| image:: https://img.shields.io/pypi/dd/uncompyle6.svg
.. _trepan: https://pypi.python.org/pypi/trepan
.. _trepan: https://pypi.python.org/pypi/trepan2
.. _HISTORY: https://github.com/rocky/python-uncompyle6/blob/master/HISTORY.md
.. _debuggers: https://pypi.python.org/pypi/trepan3k
.. _remake: https://bashdb.sf.net/remake
.. _pycdc: https://github.com/zrax/pycdc
.. _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
.. _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

View File

@@ -9,20 +9,23 @@
# Things that change more often go here.
copyright = """
Copyright (C) 2015, 2016 Rocky Bernstein <rb@dustyfeet.com>.
Copyright (C) 2015-2017 Rocky Bernstein <rb@dustyfeet.com>.
"""
classifiers = ['Development Status :: 3 - Alpha',
classifiers = ['Development Status :: 5 - Production/Stable',
'Intended Audience :: Developers',
'Operating System :: OS Independent',
'Programming Language :: Python',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.4',
'Programming Language :: Python :: 2.5',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.1',
'Programming Language :: Python :: 3.2',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Topic :: Software Development :: Debuggers',
'Topic :: Software Development :: Libraries :: Python Modules',
]
@@ -30,33 +33,35 @@ classifiers = ['Development Status :: 3 - Alpha',
# The rest in alphabetic order
author = "Rocky Bernstein, Hartmut Goebel, John Aycock, and others"
author_email = "rb@dustyfeet.com"
entry_points = {
'console_scripts': [
'uncompyle6=uncompyle6.bin.uncompile:main_bin',
'pydisassemble=uncompyle6.bin.pydisassemble:main',
]}
ftp_url = None
install_requires = ['python-spark >= 1.1.0']
license = 'GPL'
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'
packages = ['uncompyle6', 'uncompyle6.opcodes', 'uncompyle6.semantics', 'uncompyle6.scanners', 'uncompyle6.parsers']
py_modules = None
short_desc = 'Python byte-code disassembler and source-code converter'
scripts = ['bin/uncompyle6', 'bin/pydisassemble']
import os.path
def get_srcdir():
filename = os.path.normcase(os.path.dirname(os.path.abspath(__file__)))
return os.path.realpath(filename)
ns = {}
short_desc = 'Python cross-version byte-code deparser'
web = 'https://github.com/rocky/python-uncompyle6/'
# tracebacks in zip files are funky and not debuggable
zip_safe = True
def read(*rnames):
return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
import os.path
def get_srcdir():
filename = os.path.normcase(os.path.dirname(os.path.abspath(__file__)))
return os.path.realpath(filename)
srcdir = get_srcdir()
def read(*rnames):
return open(os.path.join(srcdir, *rnames)).read()
# Get info from files; set: long_description and VERSION
long_description = ( read("README.rst") + '\n' )
exec(read('uncompyle6/version.py'))

11
admin-tools/README.md Normal file
View 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

View 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

View 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

View 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
View 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
View 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

View 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'

View 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
View 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
View 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

78
appveyor.yml Normal file
View File

@@ -0,0 +1,78 @@
environment:
global:
# SDK v7.0 MSVC Express 2008's SetEnv.cmd script will fail if the
# /E:ON and /V:ON options are not enabled in the batch script intepreter
# See: http://stackoverflow.com/a/13751649/163740
CMD_IN_ENV: "cmd /E:ON /V:ON /C .\\appveyor\\run_with_env.cmd"
matrix:
# Pre-installed Python versions, which Appveyor may upgrade to
# a later point release.
# See: http://www.appveyor.com/docs/installed-software#python
# - PYTHON: "C:\\Python27"
# PYTHON_VERSION: "2.7.x"
# PYTHON_ARCH: "32"
- PYTHON: "C:\\Python27-x64"
PYTHON_VERSION: "2.7.x"
PYTHON_ARCH: "64"
# - PYTHON: "C:\\Python26"
# PYTHON_VERSION: "2.6.x"
# PYTHON_ARCH: "32"
# - PYTHON: "C:\\Python26-x64"
# PYTHON_VERSION: "2.6.x"
# PYTHON_ARCH: "64"
install:
# We need wheel installed to build wheels
- "%PYTHON%\\python.exe -m pip install wheel"
# Install Python (from the official .msi of http://python.org) and pip when
# not already installed.
- ps: if (-not(Test-Path($env:PYTHON))) { & appveyor\install.ps1 }
# Prepend newly installed Python to the PATH of this build (this cannot be
# done from inside the powershell script as it would require to restart
# the parent CMD process).
- "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%"
- "SET HOME=."
# Check that we have the expected version and architecture for Python
- "python --version"
- "python -c \"import struct; print(struct.calcsize('P') * 8)\""
# Upgrade to the latest version of pip to avoid it displaying warnings
# about it being out of date.
- "pip install --disable-pip-version-check --user --upgrade pip"
# Install the build dependencies of the project. If some dependencies contain
# compiled extensions and are not provided as pre-built wheel packages,
# pip will build them from source using the MSVC compiler matching the
# target Python version and architecture
- "%CMD_IN_ENV% pip install -r requirements.txt"
build_script:
# Build the compiled extension
- "%CMD_IN_ENV% python setup.py build"
test_script:
# Run the project tests
- "%CMD_IN_ENV% python test/test_pyenvlib.py --native --weak-verify"
after_test:
# If tests are successful, create binary packages for the project.
- "%CMD_IN_ENV% python setup.py bdist_wininst"
- "%CMD_IN_ENV% python setup.py bdist_msi"
- ps: "ls dist"
artifacts:
# Archive the generated packages in the ci.appveyor.com build report.
- path: dist\*
#on_success:
# - TODO: upload the content of dist/*.whl to a public wheelhouse
#

229
appveyor/install.ps1 Normal file
View File

@@ -0,0 +1,229 @@
# Sample script to install Python and pip under Windows
# Authors: Olivier Grisel, Jonathan Helmus, Kyle Kastner, and Alex Willmer
# License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/
$MINICONDA_URL = "http://repo.continuum.io/miniconda/"
$BASE_URL = "https://www.python.org/ftp/python/"
$GET_PIP_URL = "https://bootstrap.pypa.io/get-pip.py"
$GET_PIP_PATH = "C:\get-pip.py"
$PYTHON_PRERELEASE_REGEX = @"
(?x)
(?<major>\d+)
\.
(?<minor>\d+)
\.
(?<micro>\d+)
(?<prerelease>[a-z]{1,2}\d+)
"@
function Download ($filename, $url) {
$webclient = New-Object System.Net.WebClient
$basedir = $pwd.Path + "\"
$filepath = $basedir + $filename
if (Test-Path $filename) {
Write-Host "Reusing" $filepath
return $filepath
}
# Download and retry up to 3 times in case of network transient errors.
Write-Host "Downloading" $filename "from" $url
$retry_attempts = 2
for ($i = 0; $i -lt $retry_attempts; $i++) {
try {
$webclient.DownloadFile($url, $filepath)
break
}
Catch [Exception]{
Start-Sleep 1
}
}
if (Test-Path $filepath) {
Write-Host "File saved at" $filepath
} else {
# Retry once to get the error message if any at the last try
$webclient.DownloadFile($url, $filepath)
}
return $filepath
}
function ParsePythonVersion ($python_version) {
if ($python_version -match $PYTHON_PRERELEASE_REGEX) {
return ([int]$matches.major, [int]$matches.minor, [int]$matches.micro,
$matches.prerelease)
}
$version_obj = [version]$python_version
return ($version_obj.major, $version_obj.minor, $version_obj.build, "")
}
function DownloadPython ($python_version, $platform_suffix) {
$major, $minor, $micro, $prerelease = ParsePythonVersion $python_version
if (($major -le 2 -and $micro -eq 0) `
-or ($major -eq 3 -and $minor -le 2 -and $micro -eq 0) `
) {
$dir = "$major.$minor"
$python_version = "$major.$minor$prerelease"
} else {
$dir = "$major.$minor.$micro"
}
if ($prerelease) {
if (($major -le 2) `
-or ($major -eq 3 -and $minor -eq 1) `
-or ($major -eq 3 -and $minor -eq 2) `
-or ($major -eq 3 -and $minor -eq 3) `
) {
$dir = "$dir/prev"
}
}
if (($major -le 2) -or ($major -le 3 -and $minor -le 4)) {
$ext = "msi"
if ($platform_suffix) {
$platform_suffix = ".$platform_suffix"
}
} else {
$ext = "exe"
if ($platform_suffix) {
$platform_suffix = "-$platform_suffix"
}
}
$filename = "python-$python_version$platform_suffix.$ext"
$url = "$BASE_URL$dir/$filename"
$filepath = Download $filename $url
return $filepath
}
function InstallPython ($python_version, $architecture, $python_home) {
Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home
if (Test-Path $python_home) {
Write-Host $python_home "already exists, skipping."
return $false
}
if ($architecture -eq "32") {
$platform_suffix = ""
} else {
$platform_suffix = "amd64"
}
$installer_path = DownloadPython $python_version $platform_suffix
$installer_ext = [System.IO.Path]::GetExtension($installer_path)
Write-Host "Installing $installer_path to $python_home"
$install_log = $python_home + ".log"
if ($installer_ext -eq '.msi') {
InstallPythonMSI $installer_path $python_home $install_log
} else {
InstallPythonEXE $installer_path $python_home $install_log
}
if (Test-Path $python_home) {
Write-Host "Python $python_version ($architecture) installation complete"
} else {
Write-Host "Failed to install Python in $python_home"
Get-Content -Path $install_log
Exit 1
}
}
function InstallPythonEXE ($exepath, $python_home, $install_log) {
$install_args = "/quiet InstallAllUsers=1 TargetDir=$python_home"
RunCommand $exepath $install_args
}
function InstallPythonMSI ($msipath, $python_home, $install_log) {
$install_args = "/qn /log $install_log /i $msipath TARGETDIR=$python_home"
$uninstall_args = "/qn /x $msipath"
RunCommand "msiexec.exe" $install_args
if (-not(Test-Path $python_home)) {
Write-Host "Python seems to be installed else-where, reinstalling."
RunCommand "msiexec.exe" $uninstall_args
RunCommand "msiexec.exe" $install_args
}
}
function RunCommand ($command, $command_args) {
Write-Host $command $command_args
Start-Process -FilePath $command -ArgumentList $command_args -Wait -Passthru
}
function InstallPip ($python_home) {
$pip_path = $python_home + "\Scripts\pip.exe"
$python_path = $python_home + "\python.exe"
if (-not(Test-Path $pip_path)) {
Write-Host "Installing pip..."
$webclient = New-Object System.Net.WebClient
$webclient.DownloadFile($GET_PIP_URL, $GET_PIP_PATH)
Write-Host "Executing:" $python_path $GET_PIP_PATH
& $python_path $GET_PIP_PATH
} else {
Write-Host "pip already installed."
}
}
function DownloadMiniconda ($python_version, $platform_suffix) {
if ($python_version -eq "3.4") {
$filename = "Miniconda3-3.5.5-Windows-" + $platform_suffix + ".exe"
} else {
$filename = "Miniconda-3.5.5-Windows-" + $platform_suffix + ".exe"
}
$url = $MINICONDA_URL + $filename
$filepath = Download $filename $url
return $filepath
}
function InstallMiniconda ($python_version, $architecture, $python_home) {
Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home
if (Test-Path $python_home) {
Write-Host $python_home "already exists, skipping."
return $false
}
if ($architecture -eq "32") {
$platform_suffix = "x86"
} else {
$platform_suffix = "x86_64"
}
$filepath = DownloadMiniconda $python_version $platform_suffix
Write-Host "Installing" $filepath "to" $python_home
$install_log = $python_home + ".log"
$args = "/S /D=$python_home"
Write-Host $filepath $args
Start-Process -FilePath $filepath -ArgumentList $args -Wait -Passthru
if (Test-Path $python_home) {
Write-Host "Python $python_version ($architecture) installation complete"
} else {
Write-Host "Failed to install Python in $python_home"
Get-Content -Path $install_log
Exit 1
}
}
function InstallMinicondaPip ($python_home) {
$pip_path = $python_home + "\Scripts\pip.exe"
$conda_path = $python_home + "\Scripts\conda.exe"
if (-not(Test-Path $pip_path)) {
Write-Host "Installing pip..."
$args = "install --yes pip"
Write-Host $conda_path $args
Start-Process -FilePath "$conda_path" -ArgumentList $args -Wait -Passthru
} else {
Write-Host "pip already installed."
}
}
function main () {
InstallPython $env:PYTHON_VERSION $env:PYTHON_ARCH $env:PYTHON
InstallPip $env:PYTHON
}
main

87
appveyor/run_with_env.cmd Normal file
View File

@@ -0,0 +1,87 @@
:: To build extensions for 64 bit Python 3, we need to configure environment
:: variables to use the MSVC 2010 C++ compilers from GRMSDKX_EN_DVD.iso of:
:: MS Windows SDK for Windows 7 and .NET Framework 4 (SDK v7.1)
::
:: To build extensions for 64 bit Python 2, we need to configure environment
:: variables to use the MSVC 2008 C++ compilers from GRMSDKX_EN_DVD.iso of:
:: MS Windows SDK for Windows 7 and .NET Framework 3.5 (SDK v7.0)
::
:: 32 bit builds, and 64-bit builds for 3.5 and beyond, do not require specific
:: environment configurations.
::
:: Note: this script needs to be run with the /E:ON and /V:ON flags for the
:: cmd interpreter, at least for (SDK v7.0)
::
:: More details at:
:: https://github.com/cython/cython/wiki/64BitCythonExtensionsOnWindows
:: http://stackoverflow.com/a/13751649/163740
::
:: Author: Olivier Grisel
:: License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/
::
:: Notes about batch files for Python people:
::
:: Quotes in values are literally part of the values:
:: SET FOO="bar"
:: FOO is now five characters long: " b a r "
:: If you don't want quotes, don't include them on the right-hand side.
::
:: The CALL lines at the end of this file look redundant, but if you move them
:: outside of the IF clauses, they do not run properly in the SET_SDK_64==Y
:: case, I don't know why.
@ECHO OFF
SET COMMAND_TO_RUN=%*
SET WIN_SDK_ROOT=C:\Program Files\Microsoft SDKs\Windows
SET WIN_WDK=c:\Program Files (x86)\Windows Kits\10\Include\wdf
:: Extract the major and minor versions, and allow for the minor version to be
:: more than 9. This requires the version number to have two dots in it.
SET MAJOR_PYTHON_VERSION=%PYTHON_VERSION:~0,1%
IF "%PYTHON_VERSION:~3,1%" == "." (
SET MINOR_PYTHON_VERSION=%PYTHON_VERSION:~2,1%
) ELSE (
SET MINOR_PYTHON_VERSION=%PYTHON_VERSION:~2,2%
)
:: Based on the Python version, determine what SDK version to use, and whether
:: to set the SDK for 64-bit.
IF %MAJOR_PYTHON_VERSION% == 2 (
SET WINDOWS_SDK_VERSION="v7.0"
SET SET_SDK_64=Y
) ELSE (
IF %MAJOR_PYTHON_VERSION% == 3 (
SET WINDOWS_SDK_VERSION="v7.1"
IF %MINOR_PYTHON_VERSION% LEQ 4 (
SET SET_SDK_64=Y
) ELSE (
SET SET_SDK_64=N
IF EXIST "%WIN_WDK%" (
:: See: https://connect.microsoft.com/VisualStudio/feedback/details/1610302/
REN "%WIN_WDK%" 0wdf
)
)
) ELSE (
ECHO Unsupported Python version: "%MAJOR_PYTHON_VERSION%"
EXIT 1
)
)
IF %PYTHON_ARCH% == 64 (
IF %SET_SDK_64% == Y (
ECHO Configuring Windows SDK %WINDOWS_SDK_VERSION% for Python %MAJOR_PYTHON_VERSION% on a 64 bit architecture
SET DISTUTILS_USE_SDK=1
SET MSSdk=1
"%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Setup\WindowsSdkVer.exe" -q -version:%WINDOWS_SDK_VERSION%
"%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Bin\SetEnv.cmd" /x64 /release
ECHO Executing: %COMMAND_TO_RUN%
call %COMMAND_TO_RUN% || EXIT 1
) ELSE (
ECHO Using default MSVC build environment for 64 bit architecture
ECHO Executing: %COMMAND_TO_RUN%
call %COMMAND_TO_RUN% || EXIT 1
)
) ELSE (
ECHO Using default MSVC build environment for 32 bit architecture
ECHO Executing: %COMMAND_TO_RUN%
call %COMMAND_TO_RUN% || EXIT 1
)

View File

@@ -1,83 +1,3 @@
#!/usr/bin/env python
# Mode: -*- python -*-
#
# Copyright (c) 2015-2016 by Rocky Bernstein <rb@dustyfeet.com>
#
from __future__ import print_function
import sys, os, getopt
program = os.path.basename(__file__)
__doc__ = """
Usage:
%s [OPTIONS]... FILE
%s [--help | -h | -V | --version]
Examples:
%s foo.pyc
%s foo.py
%s -o foo.pydis foo.pyc
%s -o /tmp foo.pyc
Options:
-o <path> output decompiled files to this path:
if multiple input files are decompiled, the common prefix
is stripped from these names and the remainder appended to
<path>
--help show this message
""" % ((program,) * 6)
Usage_short = \
"%s [--help] [--verify] [--showasm] [--showast] [-o <path>] FILE|DIR..." % program
from uncompyle6 import check_python_version
from uncompyle6.disas import disassemble_files
from uncompyle6.version import VERSION
check_python_version(program)
outfile = '-'
out_base = None
try:
opts, files = getopt.getopt(sys.argv[1:], 'hVo:', ['help', 'version'])
except getopt.GetoptError as e:
print('%s: %s' % (os.path.basename(sys.argv[0]), e), file=sys.stderr)
sys.exit(-1)
for opt, val in opts:
if opt in ('-h', '--help'):
print(__doc__)
sys.exit(1)
elif opt in ('-V', '--version'):
print("%s %s" % (program, VERSION))
sys.exit(0)
elif opt == '-o':
outfile = val
else:
print(opt)
print(Usage_short)
sys.exit(1)
# argl, commonprefix works on strings, not on path parts,
# thus we must handle the case with files in 'some/classes'
# and 'some/cmds'
src_base = os.path.commonprefix(files)
if src_base[-1:] != os.sep:
src_base = os.path.dirname(src_base)
if src_base:
sb_len = len( os.path.join(src_base, '') )
files = [f[sb_len:] for f in files]
del sb_len
if outfile == '-':
outfile = None # use stdout
elif outfile and os.path.isdir(outfile):
out_base = outfile; outfile = None
elif outfile and len(files) > 1:
out_base = outfile; outfile = None
disassemble_files(src_base, out_base, files, outfile)
from uncompyle6.bin.pydisassemble import main
main()

View File

@@ -1,222 +1,3 @@
#!/usr/bin/env python
# Mode: -*- python -*-
#
# Copyright (c) 2015-2016 by Rocky Bernstein
# Copyright (c) 2000-2002 by hartmut Goebel <h.goebel@crazy-compilers.com>
#
from __future__ import print_function
import sys, os, getopt, time
program = os.path.basename(__file__)
__doc__ = """
Usage:
%s [OPTIONS]... [ FILE | DIR]...
%s [--help | -h | --V | --version]
Examples:
%s foo.pyc bar.pyc # decompile foo.pyc, bar.pyc to stdout
%s -o . foo.pyc bar.pyc # decompile to ./foo.pyc_dis and ./bar.pyc_dis
%s -o /tmp /usr/lib/python1.5 # decompile whole library
Options:
-o <path> output decompiled files to this path:
if multiple input files are decompiled, the common prefix
is stripped from these names and the remainder appended to
<path>
uncompyle6 -o /tmp bla/fasel.pyc bla/foo.pyc
-> /tmp/fasel.pyc_dis, /tmp/foo.pyc_dis
uncompyle6 -o /tmp bla/fasel.pyc bar/foo.pyc
-> /tmp/bla/fasel.pyc_dis, /tmp/bar/foo.pyc_dis
uncompyle6 -o /tmp /usr/lib/python1.5
-> /tmp/smtplib.pyc_dis ... /tmp/lib-tk/FixTk.pyc_dis
-c <file> attempts a disassembly after compiling <file>
-d print timestamps
-p <integer> use <integer> number of processes
-r recurse directories looking for .pyc and .pyo files
--verify compare generated source with input byte-code
(requires -o)
--help show this message
Debugging Options:
--asm -a include byte-code (disables --verify)
--grammar -g show matching grammar
--tree -t include syntax tree (disables --verify)
Extensions of generated files:
'.pyc_dis' '.pyo_dis' successfully decompiled (and verified if --verify)
+ '_unverified' successfully decompile but --verify failed
+ '_failed' decompile failed (contact author for enhancement)
""" % ((program,) * 5)
program = os.path.basename(__file__)
from uncompyle6 import verify, check_python_version
from uncompyle6.main import main, status_msg
from uncompyle6.version import VERSION
def usage():
print("""usage:
%s [--verify] [--asm] [--tree] [--grammar] [-o <path>] FILE|DIR...
%s [--help | -h | --version | -V]
""" % (program, program))
sys.exit(1)
check_python_version(program)
showasm = showast = do_verify = recurse_dirs = False
numproc = 0
outfile = '-'
out_base = None
codes = []
timestamp = False
timestampfmt = "# %Y.%m.%d %H:%M:%S %Z"
try:
opts, files = getopt.getopt(sys.argv[1:], 'hagtdrVo:c:p:',
'help asm grammar recurse timestamp tree verify version '
'showgrammar'.split(' '))
except getopt.GetoptError as e:
print('%s: %s' % (os.path.basename(sys.argv[0]), e), file=sys.stderr)
sys.exit(-1)
options = {}
for opt, val in opts:
if opt in ('-h', '--help'):
print(__doc__)
sys.exit(0)
elif opt in ('-V', '--version'):
print("%s %s" % (program, VERSION))
sys.exit(0)
elif opt == '--verify':
options['do_verify'] = True
elif opt in ('--asm', '-a'):
options['showasm'] = True
options['do_verify'] = False
elif opt in ('--tree', '-t'):
options['showast'] = True
options['do_verify'] = False
elif opt in ('--grammar', '-g'):
options['showgrammar'] = True
elif opt == '-o':
outfile = val
elif opt in ('--timestamp', '-d'):
timestamp = True
elif opt == '-c':
codes.append(val)
elif opt == '-p':
numproc = int(val)
elif opt in ('--recurse', '-r'):
recurse_dirs = True
else:
print(opt, file=sys.stderr)
usage()
# expand directory if specified
if recurse_dirs:
expanded_files = []
for f in files:
if os.path.isdir(f):
for root, _, dir_files in os.walk(f):
for df in dir_files:
if df.endswith('.pyc') or df.endswith('.pyo'):
expanded_files.append(os.path.join(root, df))
files = expanded_files
# argl, commonprefix works on strings, not on path parts,
# thus we must handle the case with files in 'some/classes'
# and 'some/cmds'
src_base = os.path.commonprefix(files)
if src_base[-1:] != os.sep:
src_base = os.path.dirname(src_base)
if src_base:
sb_len = len( os.path.join(src_base, '') )
files = [f[sb_len:] for f in files]
del sb_len
if not files:
print("No files given", file=sys.stderr)
usage()
if outfile == '-':
outfile = None # use stdout
elif outfile and os.path.isdir(outfile):
out_base = outfile; outfile = None
elif outfile and len(files) > 1:
out_base = outfile; outfile = None
if timestamp:
print(time.strftime(timestampfmt))
if numproc <= 1:
try:
result = main(src_base, out_base, files, codes, outfile,
**options)
if len(files) > 1:
mess = status_msg(do_verify, *result)
print('# ' + mess)
pass
except (KeyboardInterrupt):
pass
except verify.VerifyCmpError:
raise
else:
from multiprocessing import Process, Queue
try:
from Queue import Empty
except ImportError:
from Queue import Empty
fqueue = Queue(len(files)+numproc)
for f in files:
fqueue.put(f)
for i in range(numproc):
fqueue.put(None)
rqueue = Queue(numproc)
def process_func():
try:
(tot_files, okay_files, failed_files, verify_failed_files) = (0, 0, 0, 0)
while 1:
f = fqueue.get()
if f is None:
break
(t, o, f, v) = \
main(src_base, out_base, [f], codes, outfile, **options)
tot_files += t
okay_files += o
failed_files += f
verify_failed_files += v
except (Empty, KeyboardInterrupt):
pass
rqueue.put((tot_files, okay_files, failed_files, verify_failed_files))
rqueue.close()
try:
procs = [Process(target=process_func) for i in range(numproc)]
for p in procs:
p.start()
for p in procs:
p.join()
try:
(tot_files, okay_files, failed_files, verify_failed_files) = (0, 0, 0, 0)
while True:
(t, o, f, v) = rqueue.get(False)
tot_files += t
okay_files += o
failed_files += f
verify_failed_files += v
except Empty:
pass
print('# decompiled %i files: %i okay, %i failed, %i verify failed' %
(tot_files, okay_files, failed_files, verify_failed_files))
except (KeyboardInterrupt, OSError):
pass
if timestamp:
print(time.strftime(timestampfmt))
from uncompyle6.bin.uncompile import main_bin
main_bin()

View File

@@ -1,12 +1,12 @@
machine:
python:
version: 2.7.8
version: 2.7.10
environment:
COMPILE: --compile
dependencies:
override:
- pip install -r requirements.txt
- pip install -e .
- pip install -r requirements-dev.txt
test:
override:

1
pytest/.gitignore vendored
View File

@@ -1 +1,2 @@
/.hypothesis
/__pycache__

View File

@@ -0,0 +1,6 @@
source ../.venv.3.6/bin/activate
py.test -k test_CALL_FUNCTION_KW
source ../.venv.3.5/bin/activate
py.test -k test_CALL_FUNCTION_KW
source ../.venv.2.7/bin/activate
py.test -k test_CALL_FUNCTION_KW

11
pytest/test_basic.py Normal file
View File

@@ -0,0 +1,11 @@
from uncompyle6.scanner import get_scanner
from uncompyle6.parser import get_python_parser
def test_get_scanner():
# See that we can retrieve a scanner using a full version number
assert get_scanner('2.7.13')
def test_get_parser():
# See that we can retrieve a sparser using a full version number
assert get_python_parser('2.7.13')

View File

@@ -0,0 +1,21 @@
import pytest
# uncompyle6
from uncompyle6 import PYTHON_VERSION
from validate import validate_uncompyle
@pytest.mark.skipif(PYTHON_VERSION < 3.6, reason='need at least python 3.6')
@pytest.mark.parametrize('text', (
"{0.: 'a', -1: 'b'}", # BUILD_MAP
"{'a':'b'}", # BUILD_MAP
"{0: 1}", # BUILD_MAP
"{b'0':1, b'2':3}", # BUILD_CONST_KEY_MAP
"{0: 1, 2: 3}", # BUILD_CONST_KEY_MAP
"{'a':'b','c':'d'}", # BUILD_CONST_KEY_MAP
"{0: 1, 2: 3}", # BUILD_CONST_KEY_MAP
"{'a': 1, 'b': 2}", # BUILD_CONST_KEY_MAP
"{'a':'b','c':'d'}", # BUILD_CONST_KEY_MAP
"{0.0:'b',0.1:'d'}", # BUILD_CONST_KEY_MAP
))
def test_build_const_key_map(text):
validate_uncompyle(text)

View File

@@ -20,12 +20,20 @@ def for_range_stmt():
for i in range(2):
i+1
# # FIXME: add this test - but for Python 2.7+ only
# def set_comp():
# {y for y in range(3)}
# FIXME: add this test
def list_comp():
[y for y in range(3)]
def get_parsed_for_fn(fn):
code = fn.__code__ if PYTHON3 else fn.func_code
return deparse(PYTHON_VERSION, code)
def check_expect(expect, parsed):
debug = True
debug = False
i = 2
max_expect = len(expect)
for name, offset in sorted(parsed.offsets.keys()):
@@ -160,7 +168,7 @@ return (x, y)
-------------
""".split("\n")
check_expect(expect, parsed)
# ########################################################
########################################################
# # try
# expect = """
@@ -291,6 +299,12 @@ return
Contained in...
i + 1
-----
31
return
------
Contained in...
for i in range(2): ...
------------------ ...
34
return
------

View File

@@ -24,7 +24,7 @@ os.chdir(src_dir)
def test_funcoutput(capfd, test_tuple, function_to_test):
in_file , filename_expected = test_tuple
function_to_test(in_file)
function_to_test(in_file, native=False)
resout, reserr = capfd.readouterr()
expected = open(filename_expected, "r").read()
if resout != expected:

78
pytest/test_docstring.py Normal file
View File

@@ -0,0 +1,78 @@
import sys
from uncompyle6 import PYTHON3
if PYTHON3:
from io import StringIO
minint = -sys.maxsize-1
maxint = sys.maxsize
else:
from StringIO import StringIO
minint = -sys.maxint-1
maxint = sys.maxint
from uncompyle6.semantics.helper import print_docstring
class PrintFake():
def __init__(self):
self.pending_newlines = 0
self.f = StringIO()
def write(self, *data):
if (len(data) == 0) or (len(data) == 1 and data[0] == ''):
return
out = ''.join((str(j) for j in data))
n = 0
for i in out:
if i == '\n':
n += 1
if n == len(out):
self.pending_newlines = max(self.pending_newlines, n)
return
elif n:
self.pending_newlines = max(self.pending_newlines, n)
out = out[n:]
break
else:
break
if self.pending_newlines > 0:
self.f.write('\n'*self.pending_newlines)
self.pending_newlines = 0
for i in out[::-1]:
if i == '\n':
self.pending_newlines += 1
else:
break
if self.pending_newlines:
out = out[:-self.pending_newlines]
self.f.write(out)
def println(self, *data):
if data and not(len(data) == 1 and data[0] ==''):
self.write(*data)
self.pending_newlines = max(self.pending_newlines, 1)
return
pass
def test_docstring():
for doc, expect in (
("Now is the time",
' """Now is the time"""'),
("""
Now is the time
""",
''' """
Now is the time
"""''')
# (r'''func placeholder - ' and with ("""\nstring\n """)''',
# """ r'''func placeholder - ' and with (\"\"\"\nstring\n\"\"\")'''"""),
# (r"""func placeholder - ' and with ('''\nstring\n''') and \"\"\"\nstring\n\"\"\" """,
# """ r\"\"\"func placeholder - ' and with ('''\nstring\n''') and \"\"\"\nstring\n\"\"\" \"\"\"""")
):
o = PrintFake()
# print(doc)
# print(expect)
print_docstring(o, ' ', doc)
assert expect == o.f.getvalue()

77
pytest/test_fjt.py Normal file
View File

@@ -0,0 +1,77 @@
#!/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:
if slotstate is not None:
for key, value in slotstate.items():
setattr(state, key, 2)
# From 2.7 disassemble
# Problem is not getting while, because
# COME_FROM not added
def bug_loop(disassemble, tb=None):
if tb:
try:
tb = 5
except AttributeError:
raise RuntimeError
while tb: tb = tb.tb_next
disassemble(tb)
def test_if_in_for():
code = bug.__code__
scan = get_scanner(PYTHON_VERSION)
print(PYTHON_VERSION)
if 2.7 <= PYTHON_VERSION <= 3.0 and not IS_PYPY:
n = scan.setup_code(code)
scan.build_lines_data(code, n)
scan.build_prev_op(n)
fjt = scan.find_jump_targets(False)
## 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)
scan.build_lines_data(code, n)
scan.build_prev_op(n)
fjt = scan.find_jump_targets(False)
assert{64: [42], 67: [42, 42], 42: [16, 41], 19: [6]} == fjt
assert scan.structs == [
{'start': 0, 'end': 80, 'type': 'root'},
{'start': 3, 'end': 64, 'type': 'if-then'},
{'start': 6, 'end': 15, 'type': 'try'},
{'start': 19, 'end': 38, 'type': 'except'},
{'start': 45, 'end': 67, 'type': 'while-loop'},
{'start': 70, 'end': 64, 'type': 'while-else'},
# previous bug was not mistaking while-loop for if-then
{'start': 48, 'end': 67, 'type': 'while-loop'}]
elif 3.2 < PYTHON_VERSION <= 3.4:
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 == \
[{'end': 72, 'type': 'root', 'start': 0},
{'end': 66, 'type': 'if-then', 'start': 6},
{'end': 63, 'type': 'if-then', 'start': 18},
{'end': 59, 'type': 'for-loop', 'start': 31},
{'end': 63, 'type': 'for-else', 'start': 62}]
else:
assert True, "FIXME: should note fixed"
return

150
pytest/test_fstring.py Normal file
View File

@@ -0,0 +1,150 @@
# std
import os
# test
import pytest
import hypothesis
from hypothesis import strategies as st
# uncompyle6
from uncompyle6 import PYTHON_VERSION, deparse_code
@st.composite
def expressions(draw):
# todo : would be nice to generate expressions using hypothesis however
# this is pretty involved so for now just use a corpus of expressions
# from which to select.
return draw(st.sampled_from((
'abc',
'len(items)',
'x + 1',
'lineno',
'container',
'self.attribute',
'self.method()',
# These expressions are failing, I think these are control
# flow problems rather than problems with FORMAT_VALUE,
# however I need to confirm this...
#'sorted(items, key=lambda x: x.name)',
#'func(*args, **kwargs)',
#'text or default',
#'43 if life_the_universe and everything else None'
)))
@st.composite
def format_specifiers(draw):
"""
Generate a valid format specifier using the rules:
format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]
fill ::= <any character>
align ::= "<" | ">" | "=" | "^"
sign ::= "+" | "-" | " "
width ::= integer
precision ::= integer
type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
See https://docs.python.org/2/library/string.html
:param draw: Let hypothesis draw from other strategies.
:return: An example format_specifier.
"""
alphabet_strategy = st.characters(min_codepoint=ord('a'), max_codepoint=ord('z'))
fill = draw(st.one_of(alphabet_strategy, st.none()))
align = draw(st.sampled_from(list('<>=^')))
fill_align = (fill + align or '') if fill else ''
type_ = draw(st.sampled_from('bcdeEfFgGnosxX%'))
can_have_sign = type_ in 'deEfFgGnoxX%'
can_have_comma = type_ in 'deEfFgG%'
can_have_precision = type_ in 'fFgG'
can_have_pound = type_ in 'boxX%'
can_have_zero = type_ in 'oxX'
sign = draw(st.sampled_from(list('+- ') + [''])) if can_have_sign else ''
pound = draw(st.sampled_from(('#', '',))) if can_have_pound else ''
zero = draw(st.sampled_from(('0', '',))) if can_have_zero else ''
int_strategy = st.integers(min_value=1, max_value=1000)
width = draw(st.one_of(int_strategy, st.none()))
width = str(width) if width is not None else ''
comma = draw(st.sampled_from((',', '',))) if can_have_comma else ''
if can_have_precision:
precision = draw(st.one_of(int_strategy, st.none()))
precision = '.' + str(precision) if precision else ''
else:
precision = ''
return ''.join((fill_align, sign, pound, zero, width, comma, precision, type_,))
@st.composite
def fstrings(draw):
"""
Generate a valid f-string.
See https://www.python.org/dev/peps/pep-0498/#specification
:param draw: Let hypothsis draw from other strategies.
:return: A valid f-string.
"""
character_strategy = st.characters(
blacklist_characters='\r\n\'\\s{}',
min_codepoint=1,
max_codepoint=1000,
)
is_raw = draw(st.booleans())
integer_strategy = st.integers(min_value=0, max_value=3)
expression_count = draw(integer_strategy)
content = []
for _ in range(expression_count):
expression = draw(expressions())
conversion = draw(st.sampled_from(('', '!s', '!r', '!a',)))
has_specifier = draw(st.booleans())
specifier = ':' + draw(format_specifiers()) if has_specifier else ''
content.append('{{{}{}}}'.format(expression, conversion, specifier))
content.append(draw(st.text(character_strategy)))
content = ''.join(content)
return "f{}'{}'".format('r' if is_raw else '', content)
@pytest.mark.skipif(PYTHON_VERSION < 3.6, reason='need at least python 3.6')
@hypothesis.given(format_specifiers())
def test_format_specifiers(format_specifier):
"""Verify that format_specifiers generates valid specifiers"""
try:
exec('"{:' + format_specifier + '}".format(0)')
except ValueError as e:
if 'Unknown format code' not in str(e):
raise
def run_test(text):
hypothesis.assume(len(text))
hypothesis.assume("f'{" in text)
expr = text + '\n'
code = compile(expr, '<string>', 'single')
deparsed = deparse_code(PYTHON_VERSION, code, compile_mode='single')
recompiled = compile(deparsed.text, '<string>', 'single')
if recompiled != code:
assert 'dis(' + deparsed.text.strip('\n') + ')' == 'dis(' + expr.strip('\n') + ')'
@pytest.mark.skipif(PYTHON_VERSION < 3.6, reason='need at least python 3.6')
@hypothesis.given(fstrings())
def test_uncompyle_fstring(fstring):
"""Verify uncompyling fstring bytecode"""
run_test(fstring)
@pytest.mark.skipif(PYTHON_VERSION < 3.6, reason='need at least python 3.6')
@pytest.mark.parametrize('fstring', [
"f'{abc}{abc!s}'",
"f'{abc}0'",
])
def test_uncompyle_direct(fstring):
"""useful for debugging"""
run_test(fstring)

View File

@@ -0,0 +1,175 @@
# std
import string
# 3rd party
from hypothesis import given, assume, example, settings, strategies as st
import pytest
# uncompyle
from validate import validate_uncompyle
from test_fstring import expressions
alpha = st.sampled_from(string.ascii_lowercase)
numbers = st.sampled_from(string.digits)
alphanum = st.sampled_from(string.ascii_lowercase + string.digits)
@st.composite
def function_calls(draw,
min_keyword_args=0, max_keyword_args=5,
min_positional_args=0, max_positional_args=5,
min_star_args=0, max_star_args=1,
min_double_star_args=0, max_double_star_args=1):
"""
Strategy factory for generating function calls.
:param draw: Callable which draws examples from other strategies.
:return: The function call text.
"""
st_positional_args = st.lists(
alpha,
min_size=min_positional_args,
max_size=max_positional_args
)
st_keyword_args = st.lists(
alpha,
min_size=min_keyword_args,
max_size=max_keyword_args
)
st_star_args = st.lists(
alpha,
min_size=min_star_args,
max_size=max_star_args
)
st_double_star_args = st.lists(
alpha,
min_size=min_double_star_args,
max_size=max_double_star_args
)
positional_args = draw(st_positional_args)
keyword_args = draw(st_keyword_args)
st_values = st.lists(
expressions(),
min_size=len(keyword_args),
max_size=len(keyword_args)
)
keyword_args = [
x + '=' + e
for x, e in
zip(keyword_args, draw(st_values))
]
star_args = ['*' + x for x in draw(st_star_args)]
double_star_args = ['**' + x for x in draw(st_double_star_args)]
arguments = positional_args + keyword_args + star_args + double_star_args
draw(st.randoms()).shuffle(arguments)
arguments = ','.join(arguments)
function_call = 'fn({arguments})'.format(arguments=arguments)
try:
# TODO: Figure out the exact rules for ordering of positional, keyword,
# star args, double star args and in which versions the various
# types of arguments are supported so we don't need to check that the
# expression compiles like this.
compile(function_call, '<string>', 'single')
except:
assume(False)
return function_call
def test_function_no_args():
validate_uncompyle("fn()")
def isolated_function_calls(which):
"""
Returns a strategy for generating function calls, but isolated to
particular types of arguments, for example only positional arguments.
This can help reason about debugging errors in specific types of function
calls.
:param which: One of 'keyword', 'positional', 'star', 'double_star'
:return: Strategy for generating an function call isolated to specific
argument types.
"""
kwargs = dict(
max_keyword_args=0,
max_positional_args=0,
max_star_args=0,
max_double_star_args=0,
)
kwargs['_'.join(('min', which, 'args'))] = 1
kwargs['_'.join(('max', which, 'args'))] = 5 if 'star' not in which else 1
return function_calls(**kwargs)
with settings(max_examples=25):
@given(isolated_function_calls('positional'))
@example("fn(0)")
def test_function_positional_only(expr):
validate_uncompyle(expr)
@given(isolated_function_calls('keyword'))
@example("fn(a=0)")
def test_function_call_keyword_only(expr):
validate_uncompyle(expr)
@given(isolated_function_calls('star'))
@example("fn(*items)")
def test_function_call_star_only(expr):
validate_uncompyle(expr)
@given(isolated_function_calls('double_star'))
@example("fn(**{})")
def test_function_call_double_star_only(expr):
validate_uncompyle(expr)
@pytest.mark.xfail()
def test_BUILD_CONST_KEY_MAP_BUILD_MAP_UNPACK_WITH_CALL_BUILD_TUPLE_CALL_FUNCTION_EX():
validate_uncompyle("fn(w=0,m=0,**v)")
@pytest.mark.xfail()
def test_BUILD_MAP_BUILD_MAP_UNPACK_WITH_CALL_BUILD_TUPLE_CALL_FUNCTION_EX():
validate_uncompyle("fn(a=0,**g)")
@pytest.mark.xfail()
def test_CALL_FUNCTION_EX():
validate_uncompyle("fn(*g,**j)")
@pytest.mark.xfail()
def test_BUILD_MAP_CALL_FUNCTION_EX():
validate_uncompyle("fn(*z,u=0)")
@pytest.mark.xfail()
def test_BUILD_TUPLE_CALL_FUNCTION_EX():
validate_uncompyle("fn(**a)")
@pytest.mark.xfail()
def test_BUILD_MAP_BUILD_TUPLE_BUILD_TUPLE_UNPACK_WITH_CALL_CALL_FUNCTION_EX():
validate_uncompyle("fn(b,b,b=0,*a)")
@pytest.mark.xfail()
def test_BUILD_TUPLE_BUILD_TUPLE_UNPACK_WITH_CALL_CALL_FUNCTION_EX():
validate_uncompyle("fn(*c,v)")
@pytest.mark.xfail()
def test_BUILD_CONST_KEY_MAP_CALL_FUNCTION_EX():
validate_uncompyle("fn(i=0,y=0,*p)")
@pytest.mark.skip(reason='skipping property based test until all individual tests are passing')
@given(function_calls())
def test_function_call(function_call):
validate_uncompyle(function_call)

85
pytest/test_grammar.py Normal file
View File

@@ -0,0 +1,85 @@
import re
from uncompyle6 import PYTHON_VERSION, PYTHON3, IS_PYPY # , PYTHON_VERSION
from uncompyle6.parser import get_python_parser, python_parser
from uncompyle6.scanner import get_scanner
def test_grammar():
def check_tokens(tokens, opcode_set):
remain_tokens = set(tokens) - opcode_set
remain_tokens = set([re.sub('_\d+$','', t) for t in remain_tokens])
remain_tokens = set([re.sub('_CONT$','', t) for t in remain_tokens])
remain_tokens = set(remain_tokens) - opcode_set
assert remain_tokens == set([]), \
"Remaining tokens %s\n====\n%s" % (remain_tokens, p.dump_grammar())
p = get_python_parser(PYTHON_VERSION, is_pypy=IS_PYPY)
(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',])
expect_right_recursive = frozenset([('designList',
('designator', 'DUP_TOP', 'designList'))])
if PYTHON3:
expect_lhs.add('load_genexpr')
unused_rhs = unused_rhs.union(set("""
except_pop_except genexpr classdefdeco2 listcomp
""".split()))
if 3.0 <= PYTHON_VERSION:
expect_lhs.add("annotate_arg")
expect_lhs.add("annotate_tuple")
unused_rhs.add("mkfunc_annotate")
pass
else:
expect_lhs.add('kwarg')
# 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
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_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)
check_tokens(tokens, opcode_set)
elif PYTHON_VERSION == 3.4:
ignore_set.add('LOAD_CLASSNAME')
ignore_set.add('STORE_LOCALS')
opcode_set = set(s.opc.opname).union(ignore_set)
check_tokens(tokens, opcode_set)
def test_dup_rule():
import inspect
python_parser(PYTHON_VERSION, inspect.currentframe().f_code,
is_pypy=IS_PYPY,
parser_debug={
'dups': True, 'transition': False, 'reduce': False,
'rules': False, 'errorstack': None, 'context': True})

View File

@@ -1,10 +0,0 @@
import sys
from uncompyle6.load import load_file, check_object_path, load_module
def test_load():
"""Basic test of load_file, check_object_path and load_module"""
co = load_file(__file__)
obj_path = check_object_path(__file__)
version, timestamp, magic_int, co2 = load_module(obj_path)
assert sys.version[0:3] == str(version)
assert co == co2

176
pytest/test_pysource.py Normal file
View 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))

View File

@@ -9,8 +9,6 @@ def test_single_mode():
'i = j % 4',
'i = {}',
'i = []',
'while i < 1 or stop:\n i\n',
'while i < 1 or stop:\n print%s\n' % ('(i)' if PYTHON3 else ' i'),
'for i in range(10):\n i\n',
'for i in range(10):\n for j in range(10):\n i + j\n',
'try:\n i\nexcept Exception:\n j\nelse:\n k\n'

View File

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

View File

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

149
pytest/validate.py Normal file
View File

@@ -0,0 +1,149 @@
# future
from __future__ import print_function
# std
import os
import difflib
import subprocess
import tempfile
import functools
# compatability
import six
# uncompyle6 / xdis
from uncompyle6 import PYTHON_VERSION, IS_PYPY, deparse_code
# TODO : I think we can get xdis to support the dis api (python 3 version) by doing something like this there
from xdis.bytecode import Bytecode
from xdis.main import get_opcode
opc = get_opcode(PYTHON_VERSION, IS_PYPY)
Bytecode = functools.partial(Bytecode, opc=opc)
def _dis_to_text(co):
return Bytecode(co).dis()
def print_diff(original, uncompyled):
"""
Try and display a pretty html line difference between the original and
uncompyled code and bytecode if elinks and BeautifulSoup are installed
otherwise just show the diff.
:param original: Text describing the original code object.
:param uncompyled: Text describing the uncompyled code object.
"""
original_lines = original.split('\n')
uncompyled_lines = uncompyled.split('\n')
args = original_lines, uncompyled_lines, 'original', 'uncompyled'
try:
from bs4 import BeautifulSoup
diff = difflib.HtmlDiff().make_file(*args)
diff = BeautifulSoup(diff, "html.parser")
diff.select_one('table[summary="Legends"]').extract()
except ImportError:
print('\nTo display diff highlighting run:\n pip install BeautifulSoup4')
diff = difflib.HtmlDiff().make_table(*args)
with tempfile.NamedTemporaryFile(delete=False) as f:
f.write(str(diff).encode('utf-8'))
try:
print()
html = subprocess.check_output([
'elinks',
'-dump',
'-no-references',
'-dump-color-mode',
'1',
f.name,
]).decode('utf-8')
print(html)
except:
print('\nFor side by side diff install elinks')
diff = difflib.Differ().compare(original_lines, uncompyled_lines)
print('\n'.join(diff))
finally:
os.unlink(f.name)
def are_instructions_equal(i1, i2):
"""
Determine if two instructions are approximately equal,
ignoring certain fields which we allow to differ, namely:
* code objects are ignore (should probaby be checked) due to address
* line numbers
:param i1: left instruction to compare
:param i2: right instruction to compare
:return: True if the two instructions are approximately equal, otherwise False.
"""
result = (1==1
and i1.opname == i2.opname
and i1.opcode == i2.opcode
and i1.arg == i2.arg
# ignore differences due to code objects
# TODO : Better way of ignoring address
and (i1.argval == i2.argval or '<code object' in str(i1.argval))
# TODO : Should probably recurse to check code objects
and (i1.argrepr == i2.argrepr or '<code object' in i1.argrepr)
and i1.offset == i2.offset
# ignore differences in line numbers
#and i1.starts_line
and i1.is_jump_target == i2.is_jump_target
)
return result
def are_code_objects_equal(co1, co2):
"""
Determine if two code objects are approximately equal,
see are_instructions_equal for more information.
:param i1: left code object to compare
:param i2: right code object to compare
:return: True if the two code objects are approximately equal, otherwise False.
"""
instructions1 = Bytecode(co1)
instructions2 = Bytecode(co2)
for opcode1, opcode2 in zip(instructions1, instructions2):
if not are_instructions_equal(opcode1, opcode2):
return False
return True
def validate_uncompyle(text, mode='exec'):
"""
Validate decompilation of the given source code.
:param text: Source to validate decompilation of.
"""
original_code = compile(text, '<string>', mode)
original_dis = _dis_to_text(original_code)
original_text = text
deparsed = deparse_code(PYTHON_VERSION, original_code,
compile_mode=mode,
out=six.StringIO(),
is_pypy=IS_PYPY)
uncompyled_text = deparsed.text
uncompyled_code = compile(uncompyled_text, '<string>', 'exec')
if not are_code_objects_equal(uncompyled_code, original_code):
uncompyled_dis = _dis_to_text(uncompyled_text)
def output(text, dis):
width = 60
return '\n\n'.join([
' SOURCE CODE '.center(width, '#'),
text.strip(),
' BYTECODE '.center(width, '#'),
dis
])
original = output(original_text, original_dis)
uncompyled = output(uncompyled_text, uncompyled_dis)
print_diff(original, uncompyled)
assert 'original' == 'uncompyled'

View File

@@ -1,2 +1,3 @@
pytest
pytest>=3.0.0
flake8
hypothesis

View File

@@ -1 +1,2 @@
spark_parser >= 1.1.0
# Pick up stuff from setup.py
-e .

View File

@@ -3,30 +3,27 @@
"""Setup script for the 'uncompyle6' distribution."""
from __pkginfo__ import \
author, author_email, \
license, long_description, \
modname, packages, py_modules, scripts, \
short_desc, web, zip_safe
__import__('pkg_resources')
from setuptools import setup
exec(open('uncompyle6/version.py').read())
author, author_email, install_requires, \
license, long_description, classifiers, \
entry_points, modname, py_modules, \
short_desc, VERSION, web, \
zip_safe
from setuptools import setup, find_packages
setup(
author = author,
author_email = author_email,
# classifiers = classifiers,
classifiers = classifiers,
description = short_desc,
# install_requires = install_requires,
entry_points = entry_points,
install_requires = install_requires,
license = license,
long_description = long_description,
py_modules = py_modules,
name = modname,
packages = packages,
packages = find_packages(),
py_modules = py_modules,
test_suite = 'nose.collector',
url = web,
setup_requires = ['nose>=1.0'],
scripts = scripts,
tests_require = ['nose>=1.0'],
version = VERSION,
zip_safe = zip_safe)

View File

@@ -3,11 +3,12 @@ PHONY=check clean dist distclean test test-unit test-functional rmChangeLog clea
GIT2CL ?= git2cl
PYTHON ?= python
PYTHON_VERSION = $(shell $(PYTHON) -V | cut -d ' ' -f 2 | cut -d'.' -f1,2)
PYTHON_VERSION = $(shell $(PYTHON) -V 2>&1 | cut -d ' ' -f 2 | cut -d'.' -f1,2)
NATIVE_CHECK = check-$(PYTHON_VERSION)
# Set COMPILE='--compile' to force compilation before check
COMPILE ?=
COVER_DIR=../tmp/grammar-cover
# Run short tests
check-short:
@@ -16,52 +17,148 @@ check-short:
# Run all tests
check:
@$(PYTHON) -V && PYTHON_VERSION=`$(PYTHON) -V 2>&1 | cut -d ' ' -f 2 | cut -d'.' -f1,2`; \
$(MAKE) check-$$PYTHON_VERSION
$(MAKE) check-$(PYTHON_VERSION)
#: Run working tests from Python 2.6 or 2.7
check-2.6 check-2.7: check-bytecode-sans-3.5 check-2.7-ok
check-2.6 check-2.7: check-bytecode-2 check-bytecode-3 check-bytecode-1 check-native-short
#: Run working tests from Python 3.0
check-3.0: check-bytecode
$(PYTHON) test_pythonlib.py --bytecode-3.0 --weak-verify $(COMPILE)
#: Run working tests from Python 3.1
check-3.1: check-bytecode
$(PYTHON) test_pythonlib.py --bytecode-3.1 --weak-verify $(COMPILE)
#: Run working tests from Python 3.2
check-3.2: check-bytecode
$(PYTHON) test_pythonlib.py --bytecode-3.2 --weak-verify $(COMPILE)
#: Run working tests from Python 3.3
check-3.3: check-bytecode
$(PYTHON) test_pythonlib.py --bytecode-3.3 --verify $(COMPILE)
#: Run working tests from Python 3.5
check-3.5: check-bytecode
$(PYTHON) test_pythonlib.py --bytecode-3.3 --weak-verify $(COMPILE)
#: 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
$(PYTHON) test_pythonlib.py --bytecode-3.5 --verify $(COMPILE)
#: Run working tests from Python 3.6
check-3.6: check-bytecode
$(PYTHON) test_pythonlib.py --bytecode-3.6 --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:
$(PYTHON) dis-compare.py
#: Check deparsing bytecode only
#: Check deparsing bytecode 1.x only
check-bytecode-1:
$(PYTHON) test_pythonlib.py --bytecode-1.5
#: Check deparsing bytecode 2.x only
check-bytecode-2:
$(PYTHON) test_pythonlib.py --bytecode-2.5 --bytecode-2.6 --bytecode-2.7
$(PYTHON) test_pythonlib.py \
--bytecode-2.1 --bytecode-2.2 --bytecode-2.3 --bytecode-2.4 \
--bytecode-2.5 --bytecode-2.6 --bytecode-2.7 --bytecode-pypy2.7
#: Check deparsing bytecode only
check-bytecode:
$(PYTHON) test_pythonlib.py --bytecode-2.5 --bytecode-2.6 --bytecode-2.7 \
--bytecode-3.2 --bytecode-3.3 --bytecode-3.4 --bytecode-3.5
#: Check deparsing bytecode 3.x only
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-3.6 --bytecode-pypy3.2
#: Check deparsing bytecode only
check-bytecode-sans-3.5:
$(PYTHON) test_pythonlib.py --bytecode-2.5 --bytecode-2.6 --bytecode-2.7 \
--bytecode-3.2 --bytecode-3.3 --bytecode-3.4
#: Check deparsing bytecode that works running Python 2 and Python 3
check-bytecode: check-bytecode-3
$(PYTHON) test_pythonlib.py \
--bytecode-2.1 --bytecode-2.2 --bytecode-2.3 --bytecode-2.4 \
--bytecode-2.5 --bytecode-2.6 --bytecode-2.7 \
--bytecode-pypy2.7 --bytecode-1
#: Check deparsing Python 2.1
check-bytecode-2.1:
$(PYTHON) test_pythonlib.py --bytecode-2.1
#: Check deparsing Python 2.2
check-bytecode-2.2:
$(PYTHON) test_pythonlib.py --bytecode-2.2
#: Check deparsing Python 2.3
check-bytecode-2.3:
$(PYTHON) test_pythonlib.py --bytecode-2.3
#: Check deparsing Python 2.4
check-bytecode-2.4:
$(PYTHON) test_pythonlib.py --bytecode-2.4
#: Check deparsing Python 2.5
check-bytecode-2.5:
$(PYTHON) test_pythonlib.py --bytecode-2.5
#: Get grammar coverage for Python 2.5
grammar-coverage-2.5:
-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:
-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:
-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:
$(PYTHON) test_pythonlib.py --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
$(PYTHON) test_pythonlib.py --bytecode-2.7 --weak-verify
#: Check deparsing Python 3.0
check-bytecode-3.0:
$(PYTHON) test_pythonlib.py --bytecode-3.0
#: Check deparsing Python 3.1
check-bytecode-3.1:
$(PYTHON) test_pythonlib.py --bytecode-3.1
#: Check deparsing Python 3.2
check-bytecode-3.2:
@@ -73,15 +170,23 @@ 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:
$(PYTHON) test_pythonlib.py --bytecode-3.5
#: Check deparsing Python 3.6
check-bytecode-3.6:
$(PYTHON) test_pythonlib.py --bytecode-3.6
#: short tests for bytecodes only for this version of Python
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 --weak-verify $(COMPILE)
#: Run longer Python 2.7's lib files known to be okay
check-2.7-ok:
@@ -95,6 +200,18 @@ check-3.2-ok:
check-3.4-ok:
$(PYTHON) test_pythonlib.py --ok-3.4 --verify $(COMPILE)
#: PyPy of some sort. E.g. [PyPy 5.0.1 with GCC 4.8.4]
# Skip for now
2.6:
#: PyPy 5.0.x with Python 2.7 ...
pypy-2.7 5.0 5.3:
$(PYTHON) test_pythonlib.py --bytecode-pypy2.7 --verify
#: PyPy 2.4.x with Python 3.2 ...
pypy-3.2 2.4:
$(PYTHON) test_pythonlib.py --bytecode-pypy3.2 --verify
clean: clean-py-dis clean-dis clean-unverified
clean-dis:
@@ -103,6 +220,6 @@ clean-dis:
clean-unverified:
find . -name '*_unverified' -exec rm -v '{}' ';'
#: Clean temporary compile/decompile/verify direcotries in /tmp
#: Clean temporary compile/decompile/verify directories in /tmp
clean-py-dis:
rm -fr /tmp/py-dis-* || true

View File

@@ -2,11 +2,15 @@
""" Trivial helper program to bytecompile and run an uncompile
"""
import os, sys, py_compile
assert len(sys.argv) == 2
path = sys.argv[1]
short = os.path.basename(path)
assert len(sys.argv) >= 2
version = sys.version[0:3]
cfile = "bytecode_%s/%s" % (version, short) + 'c'
print("byte-compiling %s to %s" % (path, cfile))
py_compile.compile(path, cfile)
os.system("../bin/uncompyle6 -a -t %s" % cfile)
for path in sys.argv[1:]:
short = os.path.basename(path)
if hasattr(sys, 'pypy_version_info'):
cfile = "bytecode_pypy%s/%s" % (version, short) + 'c'
else:
cfile = "bytecode_%s/%s" % (version, short) + 'c'
print("byte-compiling %s to %s" % (path, cfile))
py_compile.compile(path, cfile)
if isinstance(version, str) or version >= (2, 6, 0):
os.system("../bin/uncompyle6 -a -t %s" % cfile)

Binary file not shown.

Binary file not shown.

BIN
test/bytecode_1.5/exec.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_1.5/misc.pyc Normal file

Binary file not shown.

Binary file not shown.

BIN
test/bytecode_1.5/print.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.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

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