Compare commits

..

46 Commits

Author SHA1 Message Date
rocky
02f502c40a New grammar rule often imples expanded reduce rule 2020-06-12 21:12:02 -04:00
rocky
de4fbb08f2 Get ready for release 3.7.1 2020-06-12 20:20:58 -04:00
rocky
e14675c2dc Handle 3.7+ "else" branch removal...
As seen in _cmp() of python3.8/distutils/version.py with optimization -O2
2020-06-12 13:18:33 -04:00
rocky
3449be024b CI take 3. 2020-06-10 22:18:28 -04:00
rocky
8b50b15f0a CI update take 2 2020-06-10 22:17:13 -04:00
rocky
e2e925679d Update CI to use git xdis 2020-06-10 22:15:55 -04:00
rocky
7deeee8502 Push "with" grammar improvements back to 3.6 2020-06-04 05:53:21 -04:00
rocky
acdd025162 ast-check "for" is a loop; sync "withas" test ..
with decompyle3.
2020-06-04 05:34:19 -04:00
rocky
9acb3cf068 Fix bug in 3.8 with .. as 2020-06-04 05:24:22 -04:00
rocky
40a653cd3b Bump min xdis version...
it fixes a bug in stdlib testing
2020-05-31 03:17:09 -04:00
rocky
3ac3979535 With a newer xdis, some stdlib test work now 2020-05-31 03:10:52 -04:00
rocky
7eba933cfa More excludes 2020-05-24 21:25:07 -04:00
rocky
ad5d3333da A regression regarding "and"/"or" with "continue" 2020-05-19 10:20:08 -04:00
rocky
e046323b31 Some typos 2020-05-19 01:35:50 -04:00
rocky
e80c13170a Administrivia 2020-05-19 01:29:09 -04:00
rocky
889417caeb Get ready for release 3.7.0 2020-05-19 01:17:58 -04:00
rocky
5a83c7c643 Simplify imports again using xdis 4.6.0 2020-05-19 00:53:53 -04:00
rocky
31db2f3e04 Small typo 2020-05-18 23:29:33 -04:00
rocky
7fa851765d Regularize "or" so args are in 1..2 and ...
correct "return None" semantic action
2020-05-18 22:55:26 -04:00
rocky
d7c3b8454b 3.8 needs call_stmt -> call
Simplify/regularize how "return" works
2020-05-18 22:26:18 -04:00
rocky
3fb8d90407 Revise for xdis 3.6.0 ...
Simplify xdis imports where we can.
Blacken (most) of those buffers too
2020-05-18 21:49:16 -04:00
rocky
ff43565981 3.4-3.4 mixed "and"/"or" parsing ...
Fix by limiting more the bogus come from.
2020-05-18 05:33:57 -04:00
rocky
4365022f40 Adapt decompyle3's 3.8 try/return grammar rules 2020-05-17 10:18:10 -04:00
rocky
d343384db7 A runnable "async" and "async with" test 2020-05-16 07:55:51 -04:00
rocky
87a891ca54 Skip 2.6 test until I can get around to it. 2020-05-14 23:50:55 -04:00
rocky
b94c649776 3.7 change rule to match op "or" expr's 2020-05-14 21:32:45 -04:00
R. Bernstein
f34375ba99 Create FUNDING.yml 2020-05-14 12:12:18 -04:00
rocky
81b704f597 Simpify an import, blacken a file. 2020-05-09 09:32:44 -04:00
rocky
5233a0716b Correct wong class names in super() 2020-05-08 05:59:20 -04:00
rocky
a810ed1280 Merge branch 'master' of github.com:rocky/python-uncompyle6 2020-05-05 22:18:22 -04:00
rocky
ab54caae34 Runtest.sh improvements 2020-05-05 22:18:15 -04:00
rocky
d3cf87e2d9 Start marking test suite since this is going to be copied 2020-05-04 11:43:16 -04:00
rocky
c5228dbdc4 Small test doc typo 2020-05-01 23:19:31 -04:00
rocky
a72163f6f9 lint 2020-04-30 18:00:04 -04:00
rocky
3e1300eb23 Bugs in nested async for...
* Generalize asyc_for rule
 Fix bug in picking out comprehension iterator in async for
* fix bug in getting expression in such a comprehension
* Add %[n]{%x} pattern to template_engine()
2020-04-29 10:12:54 -04:00
rocky
a4eaeea5b2 See above. 2020-04-27 23:05:05 -04:00
rocky
1141dfefc2 Typo in appveyor config 2020-04-27 23:03:46 -04:00
rocky
302a5d53d4 Get ready for release 3.6.7 2020-04-27 22:52:39 -04:00
R. Bernstein
698a3073d0 Merge pull request #313 from rocky/task/separate-dis
Task/separate dis
2020-04-24 02:29:52 -04:00
rocky
e6adf822cc Bump xdis version now that this is released 2020-04-24 02:25:07 -04:00
rocky
8c5acef792 Appveyor needs to install xdis from github 2020-04-21 23:03:00 -04:00
rocky
7578253f7d CI from xdis *branch* 2020-04-21 22:49:14 -04:00
rocky
9e193fd7cb Track branch changes in xdis 2020-04-21 22:42:57 -04:00
rocky
ab6b12be56 Small fixes in fragment parser 2020-04-21 19:58:03 -04:00
rocky
5bd97aa756 lint 2020-04-21 13:49:05 -04:00
rocky
5237d704fa Remove stray debug stmt 2020-04-20 23:13:06 -04:00
178 changed files with 1903 additions and 1248 deletions

View File

@@ -1,6 +1,7 @@
version: 2 version: 2
jobs: jobs:
build: build:
working_directory: ~/rocky/python-uncompyle6
parallelism: 1 parallelism: 1
shell: /bin/bash --login shell: /bin/bash --login
# CircleCI 2.0 does not support environment variables that refer to each other the same way as 1.0 did. # CircleCI 2.0 does not support environment variables that refer to each other the same way as 1.0 did.
@@ -12,7 +13,7 @@ jobs:
# To see the list of pre-built images that CircleCI provides for most common languages see # To see the list of pre-built images that CircleCI provides for most common languages see
# https://circleci.com/docs/2.0/circleci-images/ # https://circleci.com/docs/2.0/circleci-images/
docker: docker:
- image: circleci/python:2.7 - image: circleci/python:3.6.9
steps: steps:
# Machine Setup # Machine Setup
# If you break your build into multiple jobs with workflows, you will probably want to do the parts of this that are relevant in each # If you break your build into multiple jobs with workflows, you will probably want to do the parts of this that are relevant in each
@@ -22,6 +23,10 @@ jobs:
# In many cases you can simplify this from what is generated here. # In many cases you can simplify this from what is generated here.
# 'See docs on artifact collection here https://circleci.com/docs/2.0/artifacts/' # 'See docs on artifact collection here https://circleci.com/docs/2.0/artifacts/'
- run: mkdir -p $CIRCLE_ARTIFACTS $CIRCLE_TEST_REPORTS - run: mkdir -p $CIRCLE_ARTIFACTS $CIRCLE_TEST_REPORTS
# This is based on your 1.0 configuration file or project settings
- run:
working_directory: ~/rocky/python-uncompyle6
command: pip install --user virtualenv && pip install --user nose && pip install --user pep8
# Dependencies # Dependencies
# This would typically go in either a build or a build-and-test job when using workflows # This would typically go in either a build or a build-and-test job when using workflows
# Restore the dependency cache # Restore the dependency cache
@@ -31,9 +36,11 @@ jobs:
# fallback to using the latest cache if no exact match is found # fallback to using the latest cache if no exact match is found
- v2-dependencies- - v2-dependencies-
# This is based on your 1.0 configuration file or project settings
- run: - run:
command: sudo easy_install xdis spark-parser && sudo pip install -e . && sudo pip install -r requirements-dev.txt command: | # Use pip to install dependengcies
pip install --user --upgrade setuptools
pip install --user -e .
pip install --user -r requirements-dev.txt
# Save dependency cache # Save dependency cache
- save_cache: - save_cache:
@@ -51,8 +58,8 @@ jobs:
# Test # Test
# This would typically be a build job when using workflows, possibly combined with build # This would typically be a build job when using workflows, possibly combined with build
# This is based on your 1.0 configuration file or project settings # This is based on your 1.0 configuration file or project settings
- run: sudo python ./setup.py develop && make check-2.7 - run: sudo python ./setup.py develop && make check-3.6
- run: cd test/stdlib && bash ./runtests.sh 'test_[p-z]*.py' - run: cd ./test/stdlib && bash ./runtests.sh 'test_[p-z]*.py'
# Teardown # Teardown
# If you break your build into multiple jobs with workflows, you will probably want to do the parts of this that are relevant in each # If you break your build into multiple jobs with workflows, you will probably want to do the parts of this that are relevant in each
# Save test results # Save test results

12
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,12 @@
# These are supported funding model platforms
github: [rocky]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

1
.gitignore vendored
View File

@@ -10,6 +10,7 @@
/.pytest_cache /.pytest_cache
/.python-version /.python-version
/.tox /.tox
.mypy_cache
/.venv* /.venv*
/README /README
/__pkginfo__.pyc /__pkginfo__.pyc

View File

@@ -1,7 +1,16 @@
language: python language: python
python: python:
- 2.7 # this is a cheat here because travis doesn't do 2.4-2.6 # - '3.5'
# - '2.7'
# - '3.4'
- '3.6'
- '3.8'
matrix:
include:
- python: '3.7'
dist: xenial # required for Python >= 3.7 (travis-ci/travis-ci#9069)
install: install:
- pip install -e . - pip install -e .

View File

@@ -40,9 +40,8 @@ check-3.0 check-3.1 check-3.2 check-3.6:
check-3.7: pytest check-3.7: pytest
$(MAKE) -C test check $(MAKE) -C test check
#:Tests for Python 2.4-2.5 (don't have pytest) check-3.8:
check-2.4 check-2.5: $(MAKE) -C test check
$(MAKE) -C test $@
#:PyPy 2.6.1 PyPy 5.0.1, or PyPy 5.8.0-beta0 #:PyPy 2.6.1 PyPy 5.0.1, or PyPy 5.8.0-beta0
# Skip for now # Skip for now

23
NEWS.md
View File

@@ -1,3 +1,26 @@
3.7.1: 2020-6-12 Fleetwood66
====================================================
Released to pick up new xdis version which has fixes to read bytestings better on 3.x
* Handle 3.7+ "else" branch removal adAs seen in `_cmp()` of `python3.8/distutils/version.py` with optimization `-O2`
* 3.6+ "with" and "with .. as" grammar improvements
* ast-check for "for" loop was missing some grammar rules
3.7.0: 2020-5-19 Primidi 1st Prairial - Alfalfa - HF
====================================================
The main impetus for this release is to pull in the recent changes from xdis.
We simplify imports using xdis 4.6.0.
There were some bugfixes to Python 3.4-3.8. See the ChangeLog for details
3.6.7: 2020-4-27 xdis again
===========================
More upheaval in xdis which we need to track here.
3.6.6: 2020-4-20 Love in the time of Cholera 3.6.6: 2020-4-20 Love in the time of Cholera
============================================ ============================================

View File

@@ -89,7 +89,8 @@ This uses setup.py, so it follows the standard Python routine:
:: ::
$ pip install -e . # set up to run from source tree, or... $ pip install -e . # set up to run from source tree
# Or if you want to install instead
$ python setup.py install # may need sudo $ python setup.py install # may need sudo
A GNU makefile is also provided so :code:`make install` (possibly as root or A GNU makefile is also provided so :code:`make install` (possibly as root or
@@ -100,7 +101,7 @@ Running Tests
:: ::
$ make check make check
A GNU makefile has been added to smooth over setting running the right A GNU makefile has been added to smooth over setting running the right
command, and running tests from fastest to slowest. command, and running tests from fastest to slowest.
@@ -210,7 +211,7 @@ however that the magic of a released version is usually the same as
the *last* candidate version prior to release. the *last* candidate version prior to release.
There are also customized Python interpreters, notably Dropbox, There are also customized Python interpreters, notably Dropbox,
which use their own magic and encrypt bytcode. With the exception of which use their own magic and encrypt bytecode. With the exception of
the Dropbox's old Python 2.5 interpreter this kind of thing is not the Dropbox's old Python 2.5 interpreter this kind of thing is not
handled. handled.
@@ -229,7 +230,7 @@ There is lots to do, so please dig in and help.
See Also See Also
-------- --------
* https://github.com/rocky/python-decompile3 : Much smaller and more modern code, focusing on 3.7+. Changes in that will get migrated back ehre. * https://github.com/rocky/python-decompile3 : Much smaller and more modern code, focusing on 3.7+. Changes in that will get migrated back here.
* 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. Currently unmaintained. * 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. Currently unmaintained.
* https://github.com/figment/unpyc3/ : fork of above, but supports Python 3.3 only. Includes some fixes like supporting function annotations. Currently unmaintained. * https://github.com/figment/unpyc3/ : fork of above, but supports Python 3.3 only. Includes some fixes like supporting function annotations. Currently unmaintained.
* https://github.com/wibiti/uncompyle2 : supports Python 2.7 only, but does that fairly well. There are situations where :code:`uncompyle6` results are incorrect while :code:`uncompyle2` results are not, but more often uncompyle6 is correct when uncompyle2 is not. Because :code:`uncompyle6` adheres to accuracy over idiomatic Python, :code:`uncompyle2` can produce more natural-looking code when it is correct. Currently :code:`uncompyle2` is lightly maintained. See its issue `tracker <https://github.com/wibiti/uncompyle2/issues>`_ for more details * https://github.com/wibiti/uncompyle2 : supports Python 2.7 only, but does that fairly well. There are situations where :code:`uncompyle6` results are incorrect while :code:`uncompyle2` results are not, but more often uncompyle6 is correct when uncompyle2 is not. Because :code:`uncompyle6` adheres to accuracy over idiomatic Python, :code:`uncompyle2` can produce more natural-looking code when it is correct. Currently :code:`uncompyle2` is lightly maintained. See its issue `tracker <https://github.com/wibiti/uncompyle2/issues>`_ for more details
@@ -251,11 +252,14 @@ See Also
.. _uncompyle2: https://github.com/wibiti/uncompyle2 .. _uncompyle2: https://github.com/wibiti/uncompyle2
.. _unpyc37: https://github.com/andrew-tavera/unpyc37 .. _unpyc37: https://github.com/andrew-tavera/unpyc37
.. _this: https://github.com/rocky/python-uncompyle6/wiki/Deparsing-technology-and-its-use-in-exact-location-reporting .. _this: https://github.com/rocky/python-uncompyle6/wiki/Deparsing-technology-and-its-use-in-exact-location-reporting
.. |buildstatus| image:: https://travis-ci.org/rocky/python-uncompyle6.svg :target: https://travis-ci.org/rocky/python-uncompyle6 .. |buildstatus| image:: https://travis-ci.org/rocky/python-uncompyle6.svg
.. |packagestatus| image:: https://repology.org/badge/vertical-allrepos/python:uncompyle6.svg :target: https://repology.org/project/python:uncompyle6/versions :target: https://travis-ci.org/rocky/python-uncompyle6
.. |packagestatus| image:: https://repology.org/badge/vertical-allrepos/python:uncompyle6.svg
:target: https://repology.org/project/python:uncompyle6/versions
.. _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 .. _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 .. _Deobfuscator: https://github.com/extremecoders-re/PjOrion-Deobfuscator
.. _Py2EXE: https://en.wikipedia.org/wiki/Py2exe .. _Py2EXE: https://en.wikipedia.org/wiki/Py2exe
.. |Supported Python Versions| image:: https://img.shields.io/pypi/pyversions/uncompyle6.svg .. |Supported Python Versions| image:: https://img.shields.io/pypi/pyversions/uncompyle6.svg
.. |Latest Version| image:: https://badge.fury.io/py/uncompyle6.svg :target: https://badge.fury.io/py/uncompyle6 .. |Latest Version| image:: https://badge.fury.io/py/uncompyle6.svg
:target: https://badge.fury.io/py/uncompyle6
.. |Pypi Installs| image:: https://pepy.tech/badge/uncompyle6/month .. |Pypi Installs| image:: https://pepy.tech/badge/uncompyle6/month

View File

@@ -21,6 +21,17 @@
# less elegant than having it here with reduced code, albeit there # less elegant than having it here with reduced code, albeit there
# still is some room for improvement. # still is some room for improvement.
# Python-version | package | last-version |
# -----------------------------------------
# 2.5 | pip | 1.1 |
# 2.6 | pip | 1.5.6 |
# 2.7 | pip | 19.2.3 |
# 2.7 | pip | 1.2.1 |
# 3.1 | pip | 1.5.6 |
# 3.2 | pip | 7.1.2 |
# 3.3 | pip | 10.0.1 |
# 3.4 | pip | 19.1.1 |
# Things that change more often go here. # Things that change more often go here.
copyright = """ copyright = """
Copyright (C) 2015-2020 Rocky Bernstein <rb@dustyfeet.com>. Copyright (C) 2015-2020 Rocky Bernstein <rb@dustyfeet.com>.
@@ -58,7 +69,7 @@ entry_points = {
]} ]}
ftp_url = None ftp_url = None
install_requires = ["spark-parser >= 1.8.9, < 1.9.0", install_requires = ["spark-parser >= 1.8.9, < 1.9.0",
"xdis >= 4.4.0, < 4.5.0"] "xdis >= 4.6.1, < 4.8.0"]
license = "GPL3" license = "GPL3"
mailing_list = "python-debugger@googlegroups.com" mailing_list = "python-debugger@googlegroups.com"

0
admin-tools/check-newer-versions.sh Normal file → Executable file
View File

3
admin-tools/check-older-versions.sh Normal file → Executable file
View File

@@ -20,9 +20,8 @@ for version in $PYVERSIONS; do
exit $? exit $?
fi fi
make clean && python setup.py develop make clean && python setup.py develop
if ! make check-short ; then if ! make check ; then
exit $? exit $?
fi fi
echo === $version === echo === $version ===
done done
make check

View File

@@ -55,11 +55,8 @@
# Make packages and tag # Make packages and tag
$ . ./admin-tools/make-dist-older.sh $ . ./admin-tools/make-dist-older.sh
$ pyenv local 3.8.2 $ pyenv local 3.8.3
$ twine check dist/uncompyle6-$VERSION* $ twine check dist/uncompyle6-$VERSION*
$ git tag release-python-2.4-$VERSION
$ twine check dist/uncompyle6-$VERSION*
$ git tag release-python-2.4-$VERSION
$ . ./admin-tools/make-dist-newer.sh $ . ./admin-tools/make-dist-newer.sh
$ twine check dist/uncompyle6-$VERSION* $ twine check dist/uncompyle6-$VERSION*

View File

@@ -1,46 +0,0 @@
git pull
Change version in 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
make check
git commit --amend .
git push
Make sure pyenv is running
# Pyenv
source admin-tools/check-newer-versions.sh
# Switch to python-2.4 and build that first...
source admin-tools/setup-python-2.4
rm ChangeLog
git merge master
Update NEWS from master branch
git commit -m"Get ready for release $VERSION" .
source admin-tools/check-older-versions.sh
source admin-tools/check-newer-versions.sh
make-dist-older.sh
git tag release-python-2.4-$VERSION
./make-dist-newer.sh
git tag release-$VERSION
twine upload dist/uncompyle6-${VERSION}*

View File

@@ -5,4 +5,4 @@ if [[ $0 == ${BASH_SOURCE[0]} ]] ; then
echo "This script should be *sourced* rather than run directly through bash" echo "This script should be *sourced* rather than run directly through bash"
exit 1 exit 1
fi fi
export PYVERSIONS='3.5.9 3.6.10 2.6.9 3.3.7 2.7.17 3.2.6 3.1.5 3.4.10 3.7.7 3.8.2' export PYVERSIONS='3.5.9 3.6.10 2.6.9 3.3.7 2.7.18 3.2.6 3.1.5 3.4.10 3.7.7 3.8.3'

View File

@@ -6,4 +6,4 @@ if [[ $0 == ${BASH_SOURCE[0]} ]] ; then
echo "This script should be *sourced* rather than run directly through bash" echo "This script should be *sourced* rather than run directly through bash"
exit 1 exit 1
fi fi
export PYVERSIONS='2.4.6 2.5.6' export PYVERSIONS='2.4.6 2.5.6 2.6.9'

0
admin-tools/setup-master.sh Normal file → Executable file
View File

1
admin-tools/setup-python-2.4.sh Normal file → Executable file
View File

@@ -15,4 +15,3 @@ cd $fulldir/..
git checkout python-2.4 && pyenv local $PYTHON_VERSION && git pull git checkout python-2.4 && pyenv local $PYTHON_VERSION && git pull
cd $owd cd $owd
rm -v */.python-version || true rm -v */.python-version || true
pyenv local $PYTHON_VERSION

View File

@@ -1,3 +0,0 @@
#!/bin/bash
cd $(dirname ${BASH_SOURCE[0]})/..
git pull

View File

@@ -53,6 +53,7 @@ install:
# compiled extensions and are not provided as pre-built wheel packages, # compiled extensions and are not provided as pre-built wheel packages,
# pip will build them from source using the MSVC compiler matching the # pip will build them from source using the MSVC compiler matching the
# target Python version and architecture # target Python version and architecture
- "%CMD_IN_ENV% pip install git+git://github.com/rocky/python-uncompyle6.git#egg=uncompyle6-3.6.6"
- "%CMD_IN_ENV% pip install -r requirements.txt" - "%CMD_IN_ENV% pip install -r requirements.txt"
build_script: build_script:

View File

@@ -30,7 +30,7 @@ def list_comp():
[y for y in range(3)] [y for y in range(3)]
def get_parsed_for_fn(fn): def get_parsed_for_fn(fn):
code = fn.func_code code = fn.__code__ if PYTHON3 else fn.func_code
return deparse(code, version=PYTHON_VERSION) return deparse(code, version=PYTHON_VERSION)
def check_expect(expect, parsed, fn_name): def check_expect(expect, parsed, fn_name):

View File

@@ -20,7 +20,7 @@ def bug_loop(disassemble, tb=None):
disassemble(tb) disassemble(tb)
def test_if_in_for(): def test_if_in_for():
code = bug.func_code code = bug.__code__
scan = get_scanner(PYTHON_VERSION) scan = get_scanner(PYTHON_VERSION)
if 2.7 <= PYTHON_VERSION <= 3.0 and not IS_PYPY: if 2.7 <= PYTHON_VERSION <= 3.0 and not IS_PYPY:
scan.build_instructions(code) scan.build_instructions(code)

View File

@@ -45,9 +45,6 @@ def test_grammar():
expect_lhs.add("kvlist") expect_lhs.add("kvlist")
expect_lhs.add("kv3") expect_lhs.add("kv3")
unused_rhs.add("dict") unused_rhs.add("dict")
else:
# NOTE: this may disappear
expect_lhs.add("except_handler_else")
if PYTHON_VERSION < 3.7 and PYTHON_VERSION != 2.7: if PYTHON_VERSION < 3.7 and PYTHON_VERSION != 2.7:
# NOTE: this may disappear # NOTE: this may disappear

View File

@@ -8,8 +8,12 @@ from uncompyle6.semantics.consts import (
if PYTHON3: if PYTHON3:
from io import StringIO from io import StringIO
def iteritems(d):
return d.items()
else: else:
from StringIO import StringIO from StringIO import StringIO
def iteritems(d):
return d.iteritems()
from uncompyle6.semantics.pysource import (SourceWalker, deparse_code2str) from uncompyle6.semantics.pysource import (SourceWalker, deparse_code2str)
@@ -26,7 +30,7 @@ def test_template_engine():
# FIXME: and so on... # FIXME: and so on...
from uncompyle6.semantics.consts import ( from uncompyle6.semantics.consts import (
TABLE_R, TABLE_DIRECT, TABLE_DIRECT, TABLE_R,
) )
from uncompyle6.semantics.fragments import ( from uncompyle6.semantics.fragments import (
@@ -40,7 +44,7 @@ def test_tables():
(TABLE_DIRECT, 'TABLE_DIRECT', False), (TABLE_DIRECT, 'TABLE_DIRECT', False),
(TABLE_R, 'TABLE_R', False), (TABLE_R, 'TABLE_R', False),
(TABLE_DIRECT_FRAGMENT, 'TABLE_DIRECT_FRAGMENT', True)): (TABLE_DIRECT_FRAGMENT, 'TABLE_DIRECT_FRAGMENT', True)):
for k, entry in t.iteritems(): for k, entry in iteritems(t):
if k in skip_for_now: if k in skip_for_now:
continue continue
fmt = entry[0] fmt = entry[0]

View File

@@ -1,4 +1,7 @@
import pytest
from uncompyle6 import PYTHON_VERSION, code_deparse from uncompyle6 import PYTHON_VERSION, code_deparse
pytestmark = pytest.mark.skip(PYTHON_VERSION < 2.7,
reason="need at least Python 2.7")
if PYTHON_VERSION > 2.6: if PYTHON_VERSION > 2.6:
def test_single_mode(): def test_single_mode():

View File

@@ -9,4 +9,4 @@
12 JUMP_FORWARD 0 'to 15' 12 JUMP_FORWARD 0 'to 15'
15_0 COME_FROM 12 '12' 15_0 COME_FROM 12 '12'
15 LOAD_CONST None 15 LOAD_CONST None
18 RETURN_VALUE 18 RETURN_VALUE

View File

@@ -12,4 +12,4 @@
18 STORE_NAME 2 'd' 18 STORE_NAME 2 'd'
21_0 COME_FROM 12 '12' 21_0 COME_FROM 12 '12'
21 LOAD_CONST None 21 LOAD_CONST None
24 RETURN_VALUE 24 RETURN_VALUE

View File

@@ -12,8 +12,7 @@ import functools
from uncompyle6 import PYTHON_VERSION, PYTHON3, IS_PYPY, code_deparse from uncompyle6 import PYTHON_VERSION, PYTHON3, IS_PYPY, code_deparse
# TODO : I think we can get xdis to support the dis api (python 3 version) by doing something like this there # 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 import Bytecode, get_opcode
from xdis.main import get_opcode
opc = get_opcode(PYTHON_VERSION, IS_PYPY) opc = get_opcode(PYTHON_VERSION, IS_PYPY)
Bytecode = functools.partial(Bytecode, opc=opc) Bytecode = functools.partial(Bytecode, opc=opc)

View File

@@ -1,43 +1,57 @@
#!/usr/bin/env python #!/usr/bin/env python
"""Setup script for the 'uncompyle6' distribution."""
import sys import sys
"""Setup script for the 'uncompyle6' distribution."""
SYS_VERSION = sys.version_info[0:2] SYS_VERSION = sys.version_info[0:2]
if not ((2, 4) <= SYS_VERSION <= (2, 7)): if not ((2, 6) <= SYS_VERSION <= (3, 9)):
mess = "Python Release 2.4 .. 2.7 are supported in this code branch." mess = "Python Release 2.6 .. 3.9 are supported in this code branch."
if ((3, 2) <= SYS_VERSION <= (3, 8)): if (2, 4) <= SYS_VERSION <= (2, 7):
mess += ("\nFor your Python, version %s, use the master code/branch." % mess += (
sys.version[0:3]) "\nFor your Python, version %s, use the python-2.4 code/branch."
else: % sys.version[0:3]
mess += ("\nThis package is not supported before Python 2.4. Your Python version is %s." )
% sys.version[0:3]) elif SYS_VERSION < (2, 4):
mess += (
"\nThis package is not supported for Python version %s." % sys.version[0:3]
)
print(mess) print(mess)
raise Exception(mess) raise Exception(mess)
from __pkginfo__ import \ from __pkginfo__ import (
author, author_email, install_requires, \ author,
license, long_description, classifiers, \ author_email,
entry_points, modname, py_modules, \ install_requires,
short_desc, VERSION, web, \ license,
zip_safe long_description,
classifiers,
entry_points,
modname,
py_modules,
short_desc,
VERSION,
web,
zip_safe,
)
from setuptools import setup, find_packages from setuptools import setup, find_packages
setup( setup(
author = author, author=author,
author_email = author_email, author_email=author_email,
classifiers = classifiers, classifiers=classifiers,
description = short_desc, description=short_desc,
entry_points = entry_points, entry_points=entry_points,
install_requires = install_requires, install_requires=install_requires,
license = license, license=license,
long_description = long_description, long_description=long_description,
long_description_content_type = "text/x-rst", long_description_content_type="text/x-rst",
name = modname, name=modname,
packages = find_packages(), packages=find_packages(),
py_modules = py_modules, py_modules=py_modules,
test_suite = 'nose.collector', test_suite="nose.collector",
url = web, url=web,
tests_require = ['nose>=1.0'], tests_require=["nose>=1.0"],
version = VERSION, version=VERSION,
zip_safe = zip_safe) zip_safe=zip_safe,
)

View File

@@ -1,55 +0,0 @@
import re
import unittest
from uncompyle6 import PYTHON_VERSION, IS_PYPY # , PYTHON_VERSION
from uncompyle6.parser import get_python_parser, python_parser
class TestGrammar(unittest.TestCase):
def test_grammar(self):
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
self.assertEqual(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(['pos_arg', 'get_iter', 'attribute'])
unused_rhs = set(['list', 'call', 'mkfunc',
'mklambda',
'unpack',])
expect_right_recursive = frozenset([('designList',
('store', 'DUP_TOP', 'designList'))])
expect_lhs.add('kwarg')
self.assertEqual(expect_lhs, set(lhs))
self.assertEqual(unused_rhs, set(rhs))
self.assertEqual(expect_right_recursive, right_recursive)
expect_dup_rhs = frozenset([('COME_FROM',), ('CONTINUE',), ('JUMP_ABSOLUTE',),
('LOAD_CONST',),
('JUMP_BACK',), ('JUMP_FORWARD',)])
reduced_dup_rhs = {}
for k in dup_rhs:
if k not in expect_dup_rhs:
reduced_dup_rhs[k] = dup_rhs[k]
pass
pass
for k in reduced_dup_rhs:
print(k, reduced_dup_rhs[k])
# assert not reduced_dup_rhs, reduced_dup_rhs
def test_dup_rule(self):
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})
if __name__ == '__main__':
unittest.main()

5
test/.gitignore vendored
View File

@@ -1,3 +1,8 @@
/.coverage /.coverage
/.python-version /.python-version
/nohup.out /nohup.out
/pycdc
/test_pycdc_tests.sh
/test_uncompyle2.py
/test_unpy33.py
/test_unpy37.py

View File

@@ -30,7 +30,7 @@ check:
$(MAKE) check-$(PYTHON_VERSION) $(MAKE) check-$(PYTHON_VERSION)
#: Run working tests from Python 2.6 or 2.7 #: Run working tests from Python 2.6 or 2.7
check-2.4 check-2.5 check-2.6 check-2.7: check-bytecode-2 check-bytecode-3 check-bytecode-1 check-native-short 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 #: Run working tests from Python 3.0
check-3.0: check-bytecode check-3.0: check-bytecode
@@ -72,10 +72,10 @@ check-3.7: check-bytecode
$(PYTHON) test_pythonlib.py --bytecode-3.7-run --verify-run $(PYTHON) test_pythonlib.py --bytecode-3.7-run --verify-run
$(PYTHON) test_pythonlib.py --bytecode-3.7 --syntax-verify $(COMPILE) $(PYTHON) test_pythonlib.py --bytecode-3.7 --syntax-verify $(COMPILE)
# #: Run working tests from Python 3.8 #: Run working tests from Python 3.8
# check-3.8: check-bytecode check-3.8: check-bytecode
# $(PYTHON) test_pythonlib.py --bytecode-3.8-run --verify-run $(PYTHON) test_pythonlib.py --bytecode-3.8-run --verify-run
# $(PYTHON) test_pythonlib.py --bytecode-3.8 --syntax-verify $(COMPILE) $(PYTHON) test_pythonlib.py --bytecode-3.8 --syntax-verify $(COMPILE)
# FIXME # FIXME
#: this is called when running under pypy3.5-5.8.0, pypy2-5.6.0, or pypy3.6-7.3.0 #: this is called when running under pypy3.5-5.8.0, pypy2-5.6.0, or pypy3.6-7.3.0
@@ -173,7 +173,6 @@ check-bytecode-2.3:
#: Check deparsing Python 2.4 #: Check deparsing Python 2.4
check-bytecode-2.4: check-bytecode-2.4:
$(PYTHON) test_pythonlib.py --bytecode-2.4-run --verify-run
$(PYTHON) test_pythonlib.py --bytecode-2.4 $(PYTHON) test_pythonlib.py --bytecode-2.4
#: Check deparsing Python 2.5 #: Check deparsing Python 2.5
@@ -302,20 +301,16 @@ check-bytecode-3.7:
$(PYTHON) test_pythonlib.py --bytecode-3.7-run --verify-run $(PYTHON) test_pythonlib.py --bytecode-3.7-run --verify-run
$(PYTHON) test_pythonlib.py --bytecode-3.7 --syntax-verify $(PYTHON) test_pythonlib.py --bytecode-3.7 --syntax-verify
# #: Check deparsing Python 3.8 #: Check deparsing Python 3.8
# check-bytecode-3.8: check-bytecode-3.8:
# $(PYTHON) test_pythonlib.py --bytecode-3.8-run --verify-run $(PYTHON) test_pythonlib.py --bytecode-3.8-run --verify-run
# $(PYTHON) test_pythonlib.py --bytecode-3.8 --syntax-verify $(PYTHON) test_pythonlib.py --bytecode-3.8 --syntax-verify
#: short tests for bytecodes only for this version of Python #: short tests for bytecodes only for this version of Python
check-native-short: check-native-short:
$(PYTHON) test_pythonlib.py --bytecode-$(PYTHON_VERSION) --syntax-verify $(COMPILE) $(PYTHON) test_pythonlib.py --bytecode-$(PYTHON_VERSION) --syntax-verify $(COMPILE)
$(PYTHON) test_pythonlib.py --bytecode-$(PYTHON_VERSION)-run --verify-run $(COMPILE) $(PYTHON) test_pythonlib.py --bytecode-$(PYTHON_VERSION)-run --verify-run $(COMPILE)
#: Run longer Python 2.6's lib files known to be okay
check-2.4-ok:
$(PYTHON) test_pythonlib.py --ok-2.4 --verify $(COMPILE)
#: Run longer Python 2.6's lib files known to be okay #: Run longer Python 2.6's lib files known to be okay
check-2.6-ok: check-2.6-ok:
$(PYTHON) test_pythonlib.py --ok-2.6 --syntax-verify $(COMPILE) $(PYTHON) test_pythonlib.py --ok-2.6 --syntax-verify $(COMPILE)

View File

@@ -19,6 +19,7 @@ for path in py_source:
else: else:
cfile = "bytecode_%s%s/%s" % (version, suffix, short) + "c" cfile = "bytecode_%s%s/%s" % (version, suffix, short) + "c"
print("byte-compiling %s to %s" % (path, cfile)) print("byte-compiling %s to %s" % (path, cfile))
py_compile.compile(path, cfile) optimize = 2
py_compile.compile(path, cfile, optimize=optimize)
if isinstance(version, str) or version >= (2, 6, 0): if isinstance(version, str) or version >= (2, 6, 0):
os.system("../bin/uncompyle6 -a -T %s" % cfile) os.system("../bin/uncompyle6 -a -T %s" % cfile)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,8 +1,9 @@
#!/usr/bin/env python #!/usr/bin/env python
# Mode: -*- python -*- # Mode: -*- python -*-
# #
# Copyright (c) 2015, 2017 by Rocky Bernstein <rb@dustyfeet.com> # Copyright (c) 2015 by Rocky Bernstein <rb@dustyfeet.com>
# #
from __future__ import print_function
import dis, os.path import dis, os.path

View File

@@ -34,9 +34,10 @@ else
fi fi
MAIN="test_pyenvlib.py" MAIN="test_pyenvlib.py"
USER=${USER:-rocky} USER=${USER:-rocky}
EMAIL=${EMAIL:-rb@dustyfeet.com} EMAIL=${EMAIL:-rb@dustyfeet.com}
WHAT="uncompyle6 2.4 ${MAIN}" WHAT="uncompyle6 ${MAIN}"
MAX_TESTS=${MAX_TESTS:-800} MAX_TESTS=${MAX_TESTS:-800}
export BATCH=1 export BATCH=1
@@ -44,7 +45,7 @@ typeset -i RUN_STARTTIME=$(date +%s)
# PYVERSIONS="3.5.6" # PYVERSIONS="3.5.6"
MAILBODY=/tmp/${MAIN}-mailbody-$$.txt MAILBODY=/tmp/${MAIN}-mailbody-$$.txt
# for VERSION in 2.4.6 2.5.9 ; do # for VERSION in 3.3.7 ; do
for VERSION in $PYVERSIONS ; do for VERSION in $PYVERSIONS ; do
typeset -i rc=0 typeset -i rc=0
LOGFILE=/tmp/${MAIN}-$VERSION-$$.log LOGFILE=/tmp/${MAIN}-$VERSION-$$.log

View File

@@ -1,8 +1,9 @@
#!/usr/bin/env python #!/usr/bin/env python
from uncompyle6 import uncompyle from __future__ import print_function
from uncompyle6.main import decompile from uncompyle6.main import decompile
from xdis.magics import sysinfo2float from xdis import sysinfo2float
import sys, inspect import sys, inspect
def uncompyle_test(): def uncompyle_test():

View File

@@ -1,7 +0,0 @@
# From 2.4 test_array.py
# In Python 2.4 and earlier "yield" is not valid and instead
# we must use "yield None". Bug was not adding "None"
def yield_bug():
yield None
return

View File

@@ -1,19 +0,0 @@
# From 2.4 test_sax.py
# Bug was distinguishing try from try/else
def verify_empty_attrs():
gvqk = 3
try:
gvk = 1/0
except ZeroDivisionError:
gvk = 1
try:
gvqk = 0
except KeyError:
gvqk = 1
# If try/else was used above the return will be 4
return gvk + gvqk
assert 1 == verify_empty_attrs()

View File

@@ -1,6 +1,8 @@
# Python 3.3+
#
# From Python 3.3.6 hmac.py # From Python 3.3.6 hmac.py
# Problem was getting wrong placement of positional args. # Problem was getting wrong placement of positional args.
# In 3.6+ paramter handling changes # In 3.6+ parameter handling changes
# RUNNABLE! # RUNNABLE!

View File

@@ -2,6 +2,7 @@
# Bug was code not knowing which Python versions # Bug was code not knowing which Python versions
# have kwargs coming before positional args in code. # have kwargs coming before positional args in code.
"""This program is self-checking!"""
# RUNNABLE! # RUNNABLE!
def tometadata(self, metadata, schema, Table, args, name=None): def tometadata(self, metadata, schema, Table, args, name=None):

View File

@@ -1,6 +1,9 @@
# 3.6+ type annotations on variables # 3.6+ type annotations on variables
from typing import List from typing import List
# This test program is part of the uncompyle6 test suite
# tests STORE_ANNOTATION and SETUP_ANOTATIONS
# RUNNABLE! # RUNNABLE!
y = 2 y = 2
x: bool x: bool

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