You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-03 16:59:52 +08:00
Merge branch 'master' into python-2.4
This commit is contained in:
@@ -189,11 +189,9 @@ Deobfuscator_ to unscramble the bytecode to get valid bytecode before
|
|||||||
trying this tool. This program can't decompile Microsoft Windows EXE
|
trying this tool. This program can't decompile Microsoft Windows EXE
|
||||||
files created by Py2EXE_, although we can probably decompile the code
|
files created by Py2EXE_, although we can probably decompile the code
|
||||||
after you extract the bytecode properly. For situations like this, you
|
after you extract the bytecode properly. For situations like this, you
|
||||||
might want to consider a decompilation service like [Crazy
|
might want to consider a decompilation service like `Crazy Compilers
|
||||||
Compilers](http://www.crazy-compilers.com/decompyle/).
|
<http://www.crazy-compilers.com/decompyle/>`_. Handling
|
||||||
|
pathologically long lists of expressions or statements is slow.
|
||||||
Handling pathologically long lists of expressions or statements is
|
|
||||||
slow.
|
|
||||||
|
|
||||||
|
|
||||||
There is lots to do, so please dig in and help.
|
There is lots to do, so please dig in and help.
|
||||||
|
@@ -6,6 +6,9 @@ FULLVERSION=$(pyenv local)
|
|||||||
PYVERSION=${FULLVERSION%.*}
|
PYVERSION=${FULLVERSION%.*}
|
||||||
MINOR=${FULLVERSION##?.?.}
|
MINOR=${FULLVERSION##?.?.}
|
||||||
|
|
||||||
|
# DECOMPILER=uncompyle2
|
||||||
|
DECOMPILER="$fulldir/../../bin/uncompyle6"
|
||||||
|
|
||||||
typeset -i STOP_ONERROR=1
|
typeset -i STOP_ONERROR=1
|
||||||
|
|
||||||
typeset -A SKIP_TESTS
|
typeset -A SKIP_TESTS
|
||||||
@@ -169,7 +172,7 @@ for file in $files; do
|
|||||||
$fulldir/compile-file.py $file && \
|
$fulldir/compile-file.py $file && \
|
||||||
mv $file{,.orig} && \
|
mv $file{,.orig} && \
|
||||||
echo ========== $(date +%X) Decompiling $file ===========
|
echo ========== $(date +%X) Decompiling $file ===========
|
||||||
$fulldir/../../bin/uncompyle6 $decompiled_file > $file
|
$DECOMPILER $decompiled_file > $file
|
||||||
rc=$?
|
rc=$?
|
||||||
if (( rc == 0 )) ; then
|
if (( rc == 0 )) ; then
|
||||||
echo ========== $(date +%X) Running $file ===========
|
echo ========== $(date +%X) Running $file ===========
|
||||||
|
@@ -549,7 +549,7 @@ class PythonParser(GenericASTBuilder):
|
|||||||
|
|
||||||
|
|
||||||
def parse(p, tokens, customize):
|
def parse(p, tokens, customize):
|
||||||
p.add_custom_rules(tokens, customize)
|
p.customize_grammar_rules(tokens, customize)
|
||||||
ast = p.parse(tokens)
|
ast = p.parse(tokens)
|
||||||
# p.cleanup()
|
# p.cleanup()
|
||||||
return ast
|
return ast
|
||||||
|
@@ -216,7 +216,7 @@ class Python2Parser(PythonParser):
|
|||||||
binary_op ::= BINARY_DIVIDE
|
binary_op ::= BINARY_DIVIDE
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def add_custom_rules(self, tokens, customize):
|
def customize_grammar_rules(self, tokens, customize):
|
||||||
"""The base grammar we start out for a Python version even with the
|
"""The base grammar we start out for a Python version even with the
|
||||||
subclassing is, well, is pretty base. And we want it that way: lean and
|
subclassing is, well, is pretty base. And we want it that way: lean and
|
||||||
mean so that parsing will go faster.
|
mean so that parsing will go faster.
|
||||||
|
@@ -20,8 +20,8 @@ class Python22Parser(Python23Parser):
|
|||||||
COME_FROM POP_TOP COME_FROM
|
COME_FROM POP_TOP COME_FROM
|
||||||
'''
|
'''
|
||||||
|
|
||||||
def add_custom_rules(self, tokens, customize):
|
def customize_grammar_rules(self, tokens, customize):
|
||||||
super(Python22Parser, self).add_custom_rules(tokens, customize)
|
super(Python22Parser, self).customize_grammar_rules(tokens, customize)
|
||||||
self.remove_rules("""
|
self.remove_rules("""
|
||||||
kvlist ::= kvlist kv2
|
kvlist ::= kvlist kv2
|
||||||
""")
|
""")
|
||||||
|
@@ -52,8 +52,8 @@ class Python23Parser(Python24Parser):
|
|||||||
conditional ::= expr jmp_false expr JUMP_FORWARD expr COME_FROM
|
conditional ::= expr jmp_false expr JUMP_FORWARD expr COME_FROM
|
||||||
'''
|
'''
|
||||||
|
|
||||||
def add_custom_rules(self, tokens, customize):
|
def customize_grammar_rules(self, tokens, customize):
|
||||||
super(Python23Parser, self).add_custom_rules(tokens, customize)
|
super(Python23Parser, self).customize_grammar_rules(tokens, customize)
|
||||||
|
|
||||||
def reduce_is_invalid(self, rule, ast, tokens, first, last):
|
def reduce_is_invalid(self, rule, ast, tokens, first, last):
|
||||||
invalid = super(Python24Parser,
|
invalid = super(Python24Parser,
|
||||||
|
@@ -52,7 +52,7 @@ class Python24Parser(Python25Parser):
|
|||||||
kv2 ::= DUP_TOP expr expr ROT_THREE STORE_SUBSCR
|
kv2 ::= DUP_TOP expr expr ROT_THREE STORE_SUBSCR
|
||||||
'''
|
'''
|
||||||
|
|
||||||
def add_custom_rules(self, tokens, customize):
|
def customize_grammar_rules(self, tokens, customize):
|
||||||
self.remove_rules("""
|
self.remove_rules("""
|
||||||
gen_comp_body ::= expr YIELD_VALUE POP_TOP
|
gen_comp_body ::= expr YIELD_VALUE POP_TOP
|
||||||
kvlist ::= kvlist kv3
|
kvlist ::= kvlist kv3
|
||||||
@@ -67,7 +67,7 @@ class Python24Parser(Python25Parser):
|
|||||||
stmt ::= withstmt
|
stmt ::= withstmt
|
||||||
stmt ::= withasstmt
|
stmt ::= withasstmt
|
||||||
""")
|
""")
|
||||||
super(Python24Parser, self).add_custom_rules(tokens, customize)
|
super(Python24Parser, self).customize_grammar_rules(tokens, customize)
|
||||||
if self.version == 2.4:
|
if self.version == 2.4:
|
||||||
self.check_reduce['nop_stmt'] = 'tokens'
|
self.check_reduce['nop_stmt'] = 'tokens'
|
||||||
|
|
||||||
|
@@ -48,7 +48,7 @@ class Python25Parser(Python26Parser):
|
|||||||
kv ::= DUP_TOP expr ROT_TWO expr STORE_SUBSCR
|
kv ::= DUP_TOP expr ROT_TWO expr STORE_SUBSCR
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def add_custom_rules(self, tokens, customize):
|
def customize_grammar_rules(self, tokens, customize):
|
||||||
# Remove grammar rules inherited from Python 2.6 or Python 2
|
# Remove grammar rules inherited from Python 2.6 or Python 2
|
||||||
self.remove_rules("""
|
self.remove_rules("""
|
||||||
setupwith ::= DUP_TOP LOAD_ATTR ROT_TWO LOAD_ATTR CALL_FUNCTION_0 POP_TOP
|
setupwith ::= DUP_TOP LOAD_ATTR ROT_TWO LOAD_ATTR CALL_FUNCTION_0 POP_TOP
|
||||||
@@ -77,7 +77,7 @@ class Python25Parser(Python26Parser):
|
|||||||
conditional_lambda ::= expr jmp_false_then expr return_if_lambda
|
conditional_lambda ::= expr jmp_false_then expr return_if_lambda
|
||||||
return_stmt_lambda LAMBDA_MARKER
|
return_stmt_lambda LAMBDA_MARKER
|
||||||
""")
|
""")
|
||||||
super(Python25Parser, self).add_custom_rules(tokens, customize)
|
super(Python25Parser, self).customize_grammar_rules(tokens, customize)
|
||||||
if self.version == 2.5:
|
if self.version == 2.5:
|
||||||
self.check_reduce['tryelsestmt'] = 'tokens'
|
self.check_reduce['tryelsestmt'] = 'tokens'
|
||||||
|
|
||||||
|
@@ -298,13 +298,13 @@ class Python26Parser(Python2Parser):
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def add_custom_rules(self, tokens, customize):
|
def customize_grammar_rules(self, tokens, customize):
|
||||||
self.remove_rules("""
|
self.remove_rules("""
|
||||||
withasstmt ::= expr SETUP_WITH store suite_stmts_opt
|
withasstmt ::= expr SETUP_WITH store suite_stmts_opt
|
||||||
POP_BLOCK LOAD_CONST COME_FROM_WITH
|
POP_BLOCK LOAD_CONST COME_FROM_WITH
|
||||||
WITH_CLEANUP END_FINALLY
|
WITH_CLEANUP END_FINALLY
|
||||||
""")
|
""")
|
||||||
super(Python26Parser, self).add_custom_rules(tokens, customize)
|
super(Python26Parser, self).customize_grammar_rules(tokens, customize)
|
||||||
self.check_reduce['and'] = 'AST'
|
self.check_reduce['and'] = 'AST'
|
||||||
self.check_reduce['list_for'] = 'AST'
|
self.check_reduce['list_for'] = 'AST'
|
||||||
|
|
||||||
|
@@ -138,14 +138,14 @@ class Python27Parser(Python2Parser):
|
|||||||
kv3 ::= expr expr STORE_MAP
|
kv3 ::= expr expr STORE_MAP
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def add_custom_rules(self, tokens, customize):
|
def customize_grammar_rules(self, tokens, customize):
|
||||||
# 2.7 changes COME_FROM to COME_FROM_FINALLY
|
# 2.7 changes COME_FROM to COME_FROM_FINALLY
|
||||||
self.remove_rules("""
|
self.remove_rules("""
|
||||||
while1stmt ::= SETUP_LOOP l_stmts JUMP_BACK COME_FROM
|
while1stmt ::= SETUP_LOOP l_stmts JUMP_BACK COME_FROM
|
||||||
while1elsestmt ::= SETUP_LOOP l_stmts JUMP_BACK else_suite COME_FROM
|
while1elsestmt ::= SETUP_LOOP l_stmts JUMP_BACK else_suite COME_FROM
|
||||||
tryfinallystmt ::= SETUP_FINALLY suite_stmts_opt POP_BLOCK LOAD_CONST COME_FROM suite_stmts_opt END_FINALLY
|
tryfinallystmt ::= SETUP_FINALLY suite_stmts_opt POP_BLOCK LOAD_CONST COME_FROM suite_stmts_opt END_FINALLY
|
||||||
""")
|
""")
|
||||||
super(Python27Parser, self).add_custom_rules(tokens, customize)
|
super(Python27Parser, self).customize_grammar_rules(tokens, customize)
|
||||||
self.check_reduce['and'] = 'AST'
|
self.check_reduce['and'] = 'AST'
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@@ -529,7 +529,7 @@ class Python3Parser(PythonParser):
|
|||||||
return args_pos, args_kw
|
return args_pos, args_kw
|
||||||
|
|
||||||
|
|
||||||
def add_custom_rules(self, tokens, customize):
|
def customize_grammar_rules(self, tokens, customize):
|
||||||
"""The base grammar we start out for a Python version even with the
|
"""The base grammar we start out for a Python version even with the
|
||||||
subclassing is, well, is pretty base. And we want it that way: lean and
|
subclassing is, well, is pretty base. And we want it that way: lean and
|
||||||
mean so that parsing will go faster.
|
mean so that parsing will go faster.
|
||||||
|
@@ -43,8 +43,8 @@ class Python30Parser(Python31Parser):
|
|||||||
setup_finally ::= STORE_FAST SETUP_FINALLY LOAD_FAST DELETE_FAST
|
setup_finally ::= STORE_FAST SETUP_FINALLY LOAD_FAST DELETE_FAST
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def add_custom_rules(self, tokens, customize):
|
def customize_grammar_rules(self, tokens, customize):
|
||||||
super(Python30Parser, self).add_custom_rules(tokens, customize)
|
super(Python30Parser, self).customize_grammar_rules(tokens, customize)
|
||||||
return
|
return
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@@ -32,8 +32,8 @@ class Python31Parser(Python32Parser):
|
|||||||
load ::= LOAD_NAME
|
load ::= LOAD_NAME
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def add_custom_rules(self, tokens, customize):
|
def customize_grammar_rules(self, tokens, customize):
|
||||||
super(Python31Parser, self).add_custom_rules(tokens, customize)
|
super(Python31Parser, self).customize_grammar_rules(tokens, customize)
|
||||||
return
|
return
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@@ -56,7 +56,7 @@ class Python32Parser(Python3Parser):
|
|||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def add_custom_rules(self, tokens, customize):
|
def customize_grammar_rules(self, tokens, customize):
|
||||||
self.remove_rules("""
|
self.remove_rules("""
|
||||||
except_handler ::= JUMP_FORWARD COME_FROM except_stmts END_FINALLY COME_FROM
|
except_handler ::= JUMP_FORWARD COME_FROM except_stmts END_FINALLY COME_FROM
|
||||||
except_handler ::= JUMP_FORWARD COME_FROM except_stmts END_FINALLY COME_FROM_EXCEPT
|
except_handler ::= JUMP_FORWARD COME_FROM except_stmts END_FINALLY COME_FROM_EXCEPT
|
||||||
@@ -66,7 +66,7 @@ class Python32Parser(Python3Parser):
|
|||||||
whileTruestmt ::= SETUP_LOOP l_stmts_opt JUMP_BACK NOP COME_FROM_LOOP
|
whileTruestmt ::= SETUP_LOOP l_stmts_opt JUMP_BACK NOP COME_FROM_LOOP
|
||||||
whileTruestmt ::= SETUP_LOOP l_stmts_opt JUMP_BACK POP_BLOCK NOP COME_FROM_LOOP
|
whileTruestmt ::= SETUP_LOOP l_stmts_opt JUMP_BACK POP_BLOCK NOP COME_FROM_LOOP
|
||||||
""")
|
""")
|
||||||
super(Python32Parser, self).add_custom_rules(tokens, customize)
|
super(Python32Parser, self).customize_grammar_rules(tokens, customize)
|
||||||
for i, token in enumerate(tokens):
|
for i, token in enumerate(tokens):
|
||||||
opname = token.kind
|
opname = token.kind
|
||||||
if opname.startswith('MAKE_FUNCTION_A'):
|
if opname.startswith('MAKE_FUNCTION_A'):
|
||||||
|
@@ -25,13 +25,13 @@ class Python33Parser(Python32Parser):
|
|||||||
jump_excepts come_from_except_clauses
|
jump_excepts come_from_except_clauses
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def add_custom_rules(self, tokens, customize):
|
def customize_grammar_rules(self, tokens, customize):
|
||||||
self.remove_rules("""
|
self.remove_rules("""
|
||||||
# 3.3+ adds POP_BLOCKS
|
# 3.3+ adds POP_BLOCKS
|
||||||
whileTruestmt ::= SETUP_LOOP l_stmts_opt JUMP_BACK NOP COME_FROM_LOOP
|
whileTruestmt ::= SETUP_LOOP l_stmts_opt JUMP_BACK NOP COME_FROM_LOOP
|
||||||
whileTruestmt ::= SETUP_LOOP l_stmts_opt JUMP_BACK POP_BLOCK NOP COME_FROM_LOOP
|
whileTruestmt ::= SETUP_LOOP l_stmts_opt JUMP_BACK POP_BLOCK NOP COME_FROM_LOOP
|
||||||
""")
|
""")
|
||||||
super(Python33Parser, self).add_custom_rules(tokens, customize)
|
super(Python33Parser, self).customize_grammar_rules(tokens, customize)
|
||||||
return
|
return
|
||||||
|
|
||||||
class Python33ParserSingle(Python33Parser, PythonParserSingle):
|
class Python33ParserSingle(Python33Parser, PythonParserSingle):
|
||||||
|
@@ -29,10 +29,10 @@ class Python34Parser(Python33Parser):
|
|||||||
yield_from ::= expr GET_ITER LOAD_CONST YIELD_FROM
|
yield_from ::= expr GET_ITER LOAD_CONST YIELD_FROM
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def add_custom_rules(self, tokens, customize):
|
def customize_grammar_rules(self, tokens, customize):
|
||||||
# self.remove_rules("""
|
# self.remove_rules("""
|
||||||
# """)
|
# """)
|
||||||
super(Python34Parser, self).add_custom_rules(tokens, customize)
|
super(Python34Parser, self).customize_grammar_rules(tokens, customize)
|
||||||
return
|
return
|
||||||
|
|
||||||
class Python34ParserSingle(Python34Parser, PythonParserSingle):
|
class Python34ParserSingle(Python34Parser, PythonParserSingle):
|
||||||
|
@@ -113,7 +113,7 @@ class Python35Parser(Python34Parser):
|
|||||||
yield_from ::= expr GET_YIELD_FROM_ITER LOAD_CONST YIELD_FROM
|
yield_from ::= expr GET_YIELD_FROM_ITER LOAD_CONST YIELD_FROM
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def add_custom_rules(self, tokens, customize):
|
def customize_grammar_rules(self, tokens, customize):
|
||||||
self.remove_rules("""
|
self.remove_rules("""
|
||||||
yield_from ::= expr GET_ITER LOAD_CONST YIELD_FROM
|
yield_from ::= expr GET_ITER LOAD_CONST YIELD_FROM
|
||||||
yield_from ::= expr expr YIELD_FROM
|
yield_from ::= expr expr YIELD_FROM
|
||||||
@@ -124,7 +124,7 @@ class Python35Parser(Python34Parser):
|
|||||||
POP_BLOCK LOAD_CONST COME_FROM_WITH
|
POP_BLOCK LOAD_CONST COME_FROM_WITH
|
||||||
WITH_CLEANUP END_FINALLY
|
WITH_CLEANUP END_FINALLY
|
||||||
""")
|
""")
|
||||||
super(Python35Parser, self).add_custom_rules(tokens, customize)
|
super(Python35Parser, self).customize_grammar_rules(tokens, customize)
|
||||||
for i, token in enumerate(tokens):
|
for i, token in enumerate(tokens):
|
||||||
opname = token.kind
|
opname = token.kind
|
||||||
if opname == 'BUILD_MAP_UNPACK_WITH_CALL':
|
if opname == 'BUILD_MAP_UNPACK_WITH_CALL':
|
||||||
|
@@ -51,8 +51,8 @@ class Python36Parser(Python35Parser):
|
|||||||
try_except36 ::= SETUP_EXCEPT return_stmts except_handler36 opt_come_from_except
|
try_except36 ::= SETUP_EXCEPT return_stmts except_handler36 opt_come_from_except
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def add_custom_rules(self, tokens, customize):
|
def customize_grammar_rules(self, tokens, customize):
|
||||||
super(Python36Parser, self).add_custom_rules(tokens, customize)
|
super(Python36Parser, self).customize_grammar_rules(tokens, customize)
|
||||||
for i, token in enumerate(tokens):
|
for i, token in enumerate(tokens):
|
||||||
opname = token.kind
|
opname = token.kind
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user