Merge branch 'master' into python-3.3-to-3.5

This commit is contained in:
rocky
2023-07-29 12:57:37 -04:00
19 changed files with 189 additions and 148 deletions

View File

@@ -17,9 +17,9 @@ are trying to solve that involve the use of uncompyle6 along the way,
although I may be more tolerant of this if you sponsor the project.
Bugs are also not for general or novice kind help on how to install
this Python program in your environment in the way you would like to
have it set up, or how to interpret a Python traceback e.g. that winds
up saying Python X.Y.Z is not supported.
this Python program and its dependencies in your environment, or in
the way you would like to have it set up, or how to interpret a Python
traceback e.g. that winds up saying Python X.Y.Z is not supported.
For these kinds of things, you will save yourself time by asking
instead on forums like StackOverflow that are geared to helping people
@@ -113,6 +113,7 @@ If this is too long, then try narrowing the problem to something short.
Please modify for your setup
- Uncompyle6 version: output from `uncompyle6 --version` or `pip show uncompyle6`
- xdis version: output from `pydisasm --version` or or `pip show xdis`
- Python version for the version of Python the byte-compiled the file: `python -c "import sys; print(sys.version)"` where `python` is the correct CPython or PyPy binary.
- OS and Version: [e.g. Ubuntu bionic]

View File

@@ -1,7 +1,7 @@
# In Python 3.3+ this uses grammar rule
# compare_chained2 ::= expr COMPARE_OP RETURN_VALUE
# compare_chained_right ::= expr COMPARE_OP RETURN_VALUE
# In Python 3.6 uses this uses grammar rule
# compare_chained2 ::= expr COMPARE_OP come_froms JUMP_FORWARD
# compare_chained_right ::= expr COMPARE_OP come_froms JUMP_FORWARD
# Seen in Python 3.3 ipaddress.py

View File

@@ -122,7 +122,9 @@ def main_bin():
print("%s: %s" % (os.path.basename(sys.argv[0]), e), file=sys.stderr)
sys.exit(-1)
options = {}
options = {
"showasm": None
}
for opt, val in opts:
if opt in ("-h", "--help"):
print(__doc__)
@@ -141,7 +143,10 @@ def main_bin():
elif opt == "--linemaps":
options["do_linemaps"] = True
elif opt in ("--asm", "-a"):
options["showasm"] = "after"
if options["showasm"] == None:
options["showasm"] = "after"
else:
options["showasm"] = "both"
options["do_verify"] = None
elif opt in ("--tree", "-t"):
if "showast" not in options:
@@ -247,6 +252,8 @@ def main_bin():
rqueue = Queue(numproc)
tot_files = okay_files = failed_files = verify_failed_files = 0
def process_func():
try:
(tot_files, okay_files, failed_files, verify_failed_files) = (

View File

@@ -49,7 +49,7 @@ def decompile(
co,
bytecode_version = PYTHON_VERSION_TRIPLE,
out=sys.stdout,
showasm=None,
showasm: Optional[str]=None,
showast={},
timestamp=None,
showgrammar=False,
@@ -106,14 +106,11 @@ def decompile(
if source_size:
write("# Size of source mod 2**32: %d bytes" % source_size)
# maybe a second -a will do before as well
asm = "after" if showasm else None
grammar = dict(PARSER_DEFAULT_DEBUG)
if showgrammar:
grammar["reduce"] = True
debug_opts = {"asm": asm, "tree": showast, "grammar": grammar}
debug_opts = {"asm": showasm, "tree": showast, "grammar": grammar}
try:
if mapstream:
@@ -243,7 +240,7 @@ def main(
compiled_files,
source_files,
outfile=None,
showasm=None,
showasm: Optional[str] = None,
showast={},
do_verify=False,
showgrammar=False,

View File

@@ -597,9 +597,10 @@ class PythonParser(GenericASTBuilder):
compare ::= compare_single
compare_single ::= expr expr COMPARE_OP
# A compare_chained is two comparisions like x <= y <= z
compare_chained ::= expr compare_chained1 ROT_TWO POP_TOP _come_froms
compare_chained2 ::= expr COMPARE_OP JUMP_FORWARD
# A compare_chained is two comparisions, as in: x <= y <= z
compare_chained ::= expr compared_chained_middle ROT_TWO POP_TOP
_come_froms
compare_chained_right ::= expr COMPARE_OP JUMP_FORWARD
# Non-null kvlist items are broken out in the indiviual grammars
kvlist ::=

View File

@@ -1,4 +1,4 @@
# Copyright (c) 2017-2022 Rocky Bernstein
# Copyright (c) 2017-2023 Rocky Bernstein
"""
spark grammar differences over Python2 for Python 2.6.
"""
@@ -307,21 +307,22 @@ class Python26Parser(Python2Parser):
and ::= expr JUMP_IF_FALSE POP_TOP expr JUMP_IF_FALSE POP_TOP
# compare_chained is like x <= y <= z
compare_chained ::= expr compare_chained1 ROT_TWO COME_FROM POP_TOP _come_froms
compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP
jmp_false compare_chained1 _come_froms
compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP
jmp_false compare_chained2 _come_froms
# A "compare_chained" is two comparisions like x <= y <= z
compare_chained ::= expr compared_chained_middle ROT_TWO
COME_FROM POP_TOP _come_froms
compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP
jmp_false compared_chained_middle _come_froms
compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP
jmp_false compare_chained_right _come_froms
compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP
jmp_false_then compare_chained1 _come_froms
compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP
jmp_false_then compare_chained2 _come_froms
compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP
jmp_false_then compared_chained_middle _come_froms
compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP
jmp_false_then compare_chained_right _come_froms
compare_chained2 ::= expr COMPARE_OP return_expr_lambda
compare_chained2 ::= expr COMPARE_OP RETURN_END_IF_LAMBDA
compare_chained2 ::= expr COMPARE_OP RETURN_END_IF COME_FROM
compare_chained_right ::= expr COMPARE_OP return_expr_lambda
compare_chained_right ::= expr COMPARE_OP RETURN_END_IF_LAMBDA
compare_chained_right ::= expr COMPARE_OP RETURN_END_IF COME_FROM
return_if_lambda ::= RETURN_END_IF_LAMBDA POP_TOP
stmt ::= if_exp_lambda
@@ -565,7 +566,7 @@ if __name__ == "__main__":
remain_tokens = set(tokens) - opcode_set
import re
remain_tokens = set([re.sub("_\d+$", "", t) for t in remain_tokens])
remain_tokens = set([re.sub(r"_\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
print(remain_tokens)

View File

@@ -1,4 +1,4 @@
# Copyright (c) 2016-2020, 2022 Rocky Bernstein
# Copyright (c) 2016-2020, 2023 Rocky Bernstein
# Copyright (c) 2005 by Dan Pascu <dan@windowmaker.org>
# Copyright (c) 2000-2002 by hartmut Goebel <hartmut@goebel.noris.de>
@@ -115,17 +115,18 @@ class Python27Parser(Python2Parser):
or ::= expr_jitop expr COME_FROM
and ::= expr JUMP_IF_FALSE_OR_POP expr COME_FROM
# compare_chained{1,2} is used exclusively in chained_compare
compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP
compare_chained1 COME_FROM
compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP
compare_chained2 COME_FROM
# compare_chained{middle,2} is used exclusively in chained_compare
compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP
JUMP_IF_FALSE_OR_POP compared_chained_middle
COME_FROM
compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP
JUMP_IF_FALSE_OR_POP compare_chained_right COME_FROM
return_lambda ::= RETURN_VALUE
return_lambda ::= RETURN_VALUE_LAMBDA
compare_chained2 ::= expr COMPARE_OP return_lambda
compare_chained2 ::= expr COMPARE_OP return_lambda
compare_chained_right ::= expr COMPARE_OP return_lambda
compare_chained_right ::= expr COMPARE_OP return_lambda
# if_exp_true are for conditions which always evaluate true
# There is dead or non-optional remnants of the condition code though,
@@ -177,11 +178,13 @@ class Python27Parser(Python2Parser):
while1stmt ::= SETUP_LOOP returns pb_come_from
while1stmt ::= SETUP_LOOP l_stmts_opt JUMP_BACK POP_BLOCK COME_FROM
whilestmt ::= SETUP_LOOP testexpr l_stmts_opt JUMP_BACK POP_BLOCK _come_froms
whilestmt ::= SETUP_LOOP testexpr l_stmts_opt JUMP_BACK POP_BLOCK
_come_froms
# Should this be JUMP_BACK+ ?
# JUMP_BACK should all be to the same location
whilestmt ::= SETUP_LOOP testexpr l_stmts_opt JUMP_BACK JUMP_BACK POP_BLOCK _come_froms
whilestmt ::= SETUP_LOOP testexpr l_stmts_opt JUMP_BACK
JUMP_BACK POP_BLOCK _come_froms
while1elsestmt ::= SETUP_LOOP l_stmts JUMP_BACK POP_BLOCK
else_suitel COME_FROM

View File

@@ -346,14 +346,15 @@ class Python3Parser(PythonParser):
# FIXME: Common with 2.7
ret_and ::= expr JUMP_IF_FALSE_OR_POP return_expr_or_cond COME_FROM
ret_or ::= expr JUMP_IF_TRUE_OR_POP return_expr_or_cond COME_FROM
if_exp_ret ::= expr POP_JUMP_IF_FALSE expr RETURN_END_IF COME_FROM return_expr_or_cond
if_exp_ret ::= expr POP_JUMP_IF_FALSE expr RETURN_END_IF COME_FROM
return_expr_or_cond
# compare_chained1 is used exclusively in chained_compare
compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP
compare_chained1 COME_FROM
compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP
compare_chained2 COME_FROM
# compared_chained_middle is used exclusively in chained_compare
compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP
compared_chained_middle COME_FROM
compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP
compare_chained_right COME_FROM
"""
def p_stmt3(self, args):
@@ -419,24 +420,24 @@ class Python3Parser(PythonParser):
for ::= SETUP_LOOP expr for_iter store for_block POP_BLOCK
COME_FROM_LOOP
forelsestmt ::= SETUP_LOOP expr for_iter store for_block POP_BLOCK else_suite
COME_FROM_LOOP
forelsestmt ::= SETUP_LOOP expr for_iter store for_block POP_BLOCK
else_suite COME_FROM_LOOP
forelselaststmt ::= SETUP_LOOP expr for_iter store for_block POP_BLOCK else_suitec
COME_FROM_LOOP
forelselaststmt ::= SETUP_LOOP expr for_iter store for_block POP_BLOCK
else_suitec COME_FROM_LOOP
forelselaststmtl ::= SETUP_LOOP expr for_iter store for_block POP_BLOCK else_suitel
COME_FROM_LOOP
forelselaststmtl ::= SETUP_LOOP expr for_iter store for_block POP_BLOCK
else_suitel COME_FROM_LOOP
whilestmt ::= SETUP_LOOP testexpr l_stmts_opt COME_FROM JUMP_BACK POP_BLOCK
COME_FROM_LOOP
whilestmt ::= SETUP_LOOP testexpr l_stmts_opt COME_FROM JUMP_BACK
POP_BLOCK COME_FROM_LOOP
whilestmt ::= SETUP_LOOP testexpr l_stmts_opt JUMP_BACK POP_BLOCK JUMP_BACK
COME_FROM_LOOP
whilestmt ::= SETUP_LOOP testexpr l_stmts_opt JUMP_BACK POP_BLOCK
JUMP_BACK COME_FROM_LOOP
whilestmt ::= SETUP_LOOP testexpr l_stmts_opt JUMP_BACK POP_BLOCK
COME_FROM_LOOP
whilestmt ::= SETUP_LOOP testexpr returns POP_BLOCK
whilestmt ::= SETUP_LOOP testexpr returns POP_BLOCK
COME_FROM_LOOP
while1elsestmt ::= SETUP_LOOP l_stmts JUMP_BACK

View File

@@ -14,13 +14,14 @@ class Python30Parser(Python31Parser):
pt_bp ::= POP_TOP POP_BLOCK
assert ::= assert_expr jmp_true LOAD_ASSERT RAISE_VARARGS_1 COME_FROM POP_TOP
assert2 ::= assert_expr jmp_true LOAD_ASSERT expr CALL_FUNCTION_1 RAISE_VARARGS_1
come_froms
assert ::= assert_expr jmp_true LOAD_ASSERT RAISE_VARARGS_1
COME_FROM POP_TOP
assert2 ::= assert_expr jmp_true LOAD_ASSERT expr CALL_FUNCTION_1
RAISE_VARARGS_1 come_froms
call_stmt ::= expr _come_froms POP_TOP
return_if_lambda ::= RETURN_END_IF_LAMBDA COME_FROM POP_TOP
compare_chained2 ::= expr COMPARE_OP RETURN_END_IF_LAMBDA
return_if_lambda ::= RETURN_END_IF_LAMBDA COME_FROM POP_TOP
compare_chained_right ::= expr COMPARE_OP RETURN_END_IF_LAMBDA
# FIXME: combine with parse3.2
whileTruestmt ::= SETUP_LOOP l_stmts_opt
@@ -205,12 +206,12 @@ class Python30Parser(Python31Parser):
come_froms POP_TOP POP_BLOCK COME_FROM_LOOP
# compare_chained is like x <= y <= z
compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP
jmp_false compare_chained1 _come_froms
compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP
jmp_false compare_chained2 _come_froms
compare_chained2 ::= expr COMPARE_OP RETURN_END_IF
# A "compare_chained" is two comparisions like x <= y <= z
compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP
jmp_false compared_chained_middle _come_froms
compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP
jmp_false compare_chained_right _come_froms
compare_chained_right ::= expr COMPARE_OP RETURN_END_IF
"""
@@ -270,10 +271,11 @@ class Python30Parser(Python31Parser):
jmp_true ::= JUMP_IF_TRUE_OR_POP POP_TOP
jmp_true ::= POP_JUMP_IF_TRUE
compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP
compare_chained1 COME_FROM
compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP
compare_chained2 COME_FROM
compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP
JUMP_IF_FALSE_OR_POP compared_chained_middle
COME_FROM
compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP
JUMP_IF_FALSE_OR_POP compare_chained_right COME_FROM
ret_or ::= expr JUMP_IF_TRUE_OR_POP return_expr_or_cond COME_FROM
ret_and ::= expr JUMP_IF_FALSE_OR_POP return_expr_or_cond COME_FROM
if_exp_ret ::= expr POP_JUMP_IF_FALSE expr RETURN_END_IF

View File

@@ -25,10 +25,9 @@ class Python32Parser(Python3Parser):
"""
if_exp ::= expr jmp_false expr jump_forward_else expr COME_FROM
# compare_chained2 is used in a "chained_compare": x <= y <= z
# used exclusively in compare_chained
compare_chained2 ::= expr COMPARE_OP RETURN_VALUE
compare_chained2 ::= expr COMPARE_OP RETURN_VALUE_LAMBDA
# compare_chained_right is used in a "chained_compare": x <= y <= z
compare_chained_right ::= expr COMPARE_OP RETURN_VALUE
compare_chained_right ::= expr COMPARE_OP RETURN_VALUE_LAMBDA
# Python < 3.5 no POP BLOCK
whileTruestmt ::= SETUP_LOOP l_stmts_opt JUMP_BACK COME_FROM_LOOP

View File

@@ -1,4 +1,4 @@
# Copyright (c) 2016-2020, 2022 Rocky Bernstein
# Copyright (c) 2016-2020, 2022-2023 Rocky Bernstein
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -190,7 +190,7 @@ class Python36Parser(Python35Parser):
tryfinally_return_stmt ::= SETUP_FINALLY suite_stmts_opt POP_BLOCK LOAD_CONST
COME_FROM_FINALLY
compare_chained2 ::= expr COMPARE_OP come_froms JUMP_FORWARD
compare_chained_right ::= expr COMPARE_OP come_froms JUMP_FORWARD
"""
# Some of this is duplicated from parse37. Eventually we'll probably rebase from

View File

@@ -1,4 +1,4 @@
# Copyright (c) 2017-2020, 2022 Rocky Bernstein
# Copyright (c) 2017-2020, 2022-2023 Rocky Bernstein
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -130,7 +130,8 @@ class Python37Parser(Python37BaseParser):
stmt ::= return
return ::= return_expr RETURN_VALUE
# "returns" nonterminal is a sequence of statements that ends in a RETURN statement.
# "returns" nonterminal is a sequence of statements that ends in a
# RETURN statement.
# In later Python versions with jump optimization, this can cause JUMPs
# that would normally appear to be omitted.
@@ -221,8 +222,8 @@ class Python37Parser(Python37BaseParser):
compare_single ::= expr expr COMPARE_OP
# A compare_chained is two comparisions like x <= y <= z
compare_chained ::= expr compare_chained1 ROT_TWO POP_TOP _come_froms
compare_chained2 ::= expr COMPARE_OP JUMP_FORWARD
compare_chained ::= expr compared_chained_middle ROT_TWO POP_TOP _come_froms
compare_chained_right ::= expr COMPARE_OP JUMP_FORWARD
# Non-null kvlist items are broken out in the indiviual grammars
kvlist ::=
@@ -439,10 +440,10 @@ class Python37Parser(Python37BaseParser):
"""
if_exp::= expr jmp_false expr jump_forward_else expr COME_FROM
# compare_chained2 is used in a "chained_compare": x <= y <= z
# compare_chained_right is used in a "chained_compare": x <= y <= z
# used exclusively in compare_chained
compare_chained2 ::= expr COMPARE_OP RETURN_VALUE
compare_chained2 ::= expr COMPARE_OP RETURN_VALUE_LAMBDA
compare_chained_right ::= expr COMPARE_OP RETURN_VALUE
compare_chained_right ::= expr COMPARE_OP RETURN_VALUE_LAMBDA
# Python < 3.5 no POP BLOCK
whileTruestmt ::= SETUP_LOOP l_stmts_opt JUMP_BACK COME_FROM_LOOP
@@ -625,41 +626,41 @@ class Python37Parser(Python37BaseParser):
compare_chained ::= compare_chained37
compare_chained ::= compare_chained37_false
compare_chained37 ::= expr compare_chained1a_37
compare_chained37 ::= expr compare_chained1c_37
compare_chained37 ::= expr compared_chained_middlea_37
compare_chained37 ::= expr compared_chained_middlec_37
compare_chained37_false ::= expr compare_chained1_false_37
compare_chained37_false ::= expr compare_chained1b_false_37
compare_chained37_false ::= expr compare_chained2_false_37
compare_chained37_false ::= expr compared_chained_middle_false_37
compare_chained37_false ::= expr compared_chained_middleb_false_37
compare_chained37_false ::= expr compare_chained_right_false_37
compare_chained1a_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE
compare_chained1a_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE
compare_chained2a_37 COME_FROM POP_TOP COME_FROM
compare_chained1b_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE
compare_chained2b_false_37 POP_TOP _jump COME_FROM
compared_chained_middlea_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE
compared_chained_middlea_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE
compare_chained_righta_37 COME_FROM POP_TOP COME_FROM
compared_chained_middleb_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE
compare_chained_rightb_false_37 POP_TOP _jump COME_FROM
compare_chained1c_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE
compare_chained2a_37 POP_TOP
compared_chained_middlec_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE
compare_chained_righta_37 POP_TOP
compare_chained1_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE
compare_chained2c_37 POP_TOP JUMP_FORWARD COME_FROM
compare_chained1_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE
compare_chained2b_false_37 POP_TOP _jump COME_FROM
compared_chained_middle_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE
compare_chained_rightc_37 POP_TOP JUMP_FORWARD COME_FROM
compared_chained_middle_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE
compare_chained_rightb_false_37 POP_TOP _jump COME_FROM
compare_chained2_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE
compare_chained2a_false_37 POP_TOP JUMP_BACK COME_FROM
compare_chained_right_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE
compare_chained_righta_false_37 POP_TOP JUMP_BACK COME_FROM
compare_chained2a_37 ::= expr COMPARE_OP come_from_opt POP_JUMP_IF_TRUE JUMP_FORWARD
compare_chained2a_37 ::= expr COMPARE_OP come_from_opt POP_JUMP_IF_TRUE JUMP_BACK
compare_chained2a_false_37 ::= expr COMPARE_OP come_from_opt POP_JUMP_IF_FALSE jf_cfs
compare_chained_righta_37 ::= expr COMPARE_OP come_from_opt POP_JUMP_IF_TRUE JUMP_FORWARD
compare_chained_righta_37 ::= expr COMPARE_OP come_from_opt POP_JUMP_IF_TRUE JUMP_BACK
compare_chained_righta_false_37 ::= expr COMPARE_OP come_from_opt POP_JUMP_IF_FALSE jf_cfs
compare_chained2b_false_37 ::= expr COMPARE_OP come_from_opt POP_JUMP_IF_FALSE JUMP_FORWARD COME_FROM
compare_chained2b_false_37 ::= expr COMPARE_OP come_from_opt POP_JUMP_IF_FALSE JUMP_FORWARD
compare_chained_rightb_false_37 ::= expr COMPARE_OP come_from_opt POP_JUMP_IF_FALSE JUMP_FORWARD COME_FROM
compare_chained_rightb_false_37 ::= expr COMPARE_OP come_from_opt POP_JUMP_IF_FALSE JUMP_FORWARD
compare_chained2c_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP come_from_opt POP_JUMP_IF_FALSE
compare_chained2a_false_37 ELSE
compare_chained2c_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP come_from_opt POP_JUMP_IF_FALSE
compare_chained2a_false_37
compare_chained_rightc_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP come_from_opt POP_JUMP_IF_FALSE
compare_chained_righta_false_37 ELSE
compare_chained_rightc_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP come_from_opt POP_JUMP_IF_FALSE
compare_chained_righta_false_37
"""
def p_37_conditionals(self, args):
@@ -667,11 +668,13 @@ class Python37Parser(Python37BaseParser):
expr ::= if_exp37
if_exp37 ::= expr expr jf_cfs expr COME_FROM
jf_cfs ::= JUMP_FORWARD _come_froms
ifelsestmt ::= testexpr c_stmts_opt jf_cfs else_suite opt_come_from_except
ifelsestmt ::= testexpr c_stmts_opt jf_cfs else_suite
opt_come_from_except
# This is probably more realistically an "ifstmt" (with a null else)
# see _cmp() of python3.8/distutils/__pycache__/version.cpython-38.opt-1.pyc
ifelsestmt ::= testexpr stmts jf_cfs else_suite_opt opt_come_from_except
ifelsestmt ::= testexpr stmts jf_cfs else_suite_opt
opt_come_from_except
expr_pjit ::= expr POP_JUMP_IF_TRUE
@@ -694,7 +697,8 @@ class Python37Parser(Python37BaseParser):
expr ::= if_exp_37a
expr ::= if_exp_37b
if_exp_37a ::= and_not expr JUMP_FORWARD come_froms expr COME_FROM
if_exp_37b ::= expr jmp_false expr POP_JUMP_IF_FALSE jump_forward_else expr
if_exp_37b ::= expr jmp_false expr POP_JUMP_IF_FALSE
jump_forward_else expr
jmp_false_cf ::= POP_JUMP_IF_FALSE COME_FROM
comp_if ::= or jmp_false_cf comp_iter
"""
@@ -1014,11 +1018,11 @@ class Python37Parser(Python37BaseParser):
and ::= expr jmp_false expr COME_FROM
or ::= expr_jt expr COME_FROM
# compare_chained1 is used exclusively in chained_compare
compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP
compare_chained1 COME_FROM
compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP
compare_chained2 COME_FROM
# compared_chained_middle is used exclusively in chained_compare
compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP
compared_chained_middle COME_FROM
compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP
compare_chained_right COME_FROM
"""
def p_stmt3(self, args):
@@ -1205,7 +1209,7 @@ class Python37Parser(Python37BaseParser):
tryfinally_return_stmt ::= SETUP_FINALLY suite_stmts_opt POP_BLOCK LOAD_CONST
COME_FROM_FINALLY
compare_chained2 ::= expr COMPARE_OP come_froms JUMP_FORWARD
compare_chained_right ::= expr COMPARE_OP come_froms JUMP_FORWARD
"""
def p_37_misc(self, args):

View File

@@ -206,10 +206,17 @@ class Scanner2(Scanner):
bytecode = self.build_instructions(co)
# show_asm = 'after'
if show_asm in ("both", "before"):
for instr in bytecode.get_instructions(co):
print(instr.disassemble())
print("\n# ---- before tokenization:")
bytecode.disassemble_bytes(
co.co_code,
varnames=co.co_varnames,
names=co.co_names,
constants=co.co_consts,
cells=bytecode._cell_names,
linestarts=bytecode._linestarts,
asm_format="extended",
)
# list of tokens/instructions
new_tokens = []
@@ -484,6 +491,7 @@ class Scanner2(Scanner):
pass
if show_asm in ("both", "after"):
print("\n# ---- after tokenization:")
for t in new_tokens:
print(t.format(line_prefix=""))
print()

View File

@@ -411,8 +411,16 @@ class Scanner3(Scanner):
# show_asm = 'both'
if show_asm in ("both", "before"):
for instr in bytecode.get_instructions(co):
print(instr.disassemble())
print("\n# ---- before tokenization:")
bytecode.disassemble_bytes(
co.co_code,
varnames=co.co_varnames,
names=co.co_names,
constants=co.co_consts,
cells=bytecode._cell_names,
linestarts=bytecode._linestarts,
asm_format="extended",
)
# "customize" is in the process of going away here
customize = {}
@@ -776,6 +784,7 @@ class Scanner3(Scanner):
pass
if show_asm in ("both", "after"):
print("\n# ---- after tokenization:")
for t in new_tokens:
print(t.format(line_prefix=""))
print()

View File

@@ -1,4 +1,4 @@
# Copyright (c) 2015-2020, 2022 by Rocky Bernstein
# Copyright (c) 2015-2020, 2022-2023 by Rocky Bernstein
# Copyright (c) 2005 by Dan Pascu <dan@windowmaker.org>
# Copyright (c) 2000-2002 by hartmut Goebel <h.goebel@crazy-compilers.com>
#
@@ -217,10 +217,17 @@ class Scanner37Base(Scanner):
bytecode = self.build_instructions(co)
# show_asm = 'both'
if show_asm in ("both", "before"):
for instr in bytecode.get_instructions(co):
print(instr.disassemble(self.opc))
print("\n# ---- before tokenization:")
bytecode.disassemble_bytes(
co.co_code,
varnames=co.co_varnames,
names=co.co_names,
constants=co.co_consts,
cells=bytecode._cell_names,
linestarts=bytecode._linestarts,
asm_format="extended",
)
# "customize" is in the process of going away here
customize = {}
@@ -523,6 +530,7 @@ class Scanner37Base(Scanner):
pass
if show_asm in ("both", "after"):
print("\n# ---- after tokenization:")
for t in tokens:
print(t.format(line_prefix=""))
print()

View File

@@ -338,8 +338,8 @@ TABLE_DIRECT = {
"if_exp_not_lambda": ("%p if not %c else %c", (2, "expr", 27), 0, 4),
"compare_single": ('%p %[-1]{pattr.replace("-", " ")} %p', (0, 19), (1, 19)),
"compare_chained": ("%p %p", (0, 29), (1, 30)),
"compare_chained1": ('%[3]{pattr.replace("-", " ")} %p %p', (0, 19), (-2, 19)),
"compare_chained2": ('%[1]{pattr.replace("-", " ")} %p', (0, 19)),
"compared_chained_middle": ('%[3]{pattr.replace("-", " ")} %p %p', (0, 19), (-2, 19)),
"compare_chained_right": ('%[1]{pattr.replace("-", " ")} %p', (0, 19)),
# "classdef": (), # handled by n_classdef()
# A custom rule in n_function def distinguishes whether to call this or
# function_def_async

View File

@@ -99,44 +99,44 @@ def customize_for_version37(self, version):
"await_stmt": ("%|%c\n", 0),
"c_async_with_stmt": ("%|async with %c:\n%+%c%-", (0, "expr"), 3),
"call_ex": ("%c(%p)", (0, "expr"), (1, 100)),
"compare_chained1a_37": (
"compared_chained_middlea_37": (
' %[3]{pattr.replace("-", " ")} %p %p',
(0, PRECEDENCE["compare"] - 1),
(-4, PRECEDENCE["compare"] - 1),
),
"compare_chained1_false_37": (
"compared_chained_middle_false_37": (
' %[3]{pattr.replace("-", " ")} %p %p',
(0, PRECEDENCE["compare"] - 1),
(-4, PRECEDENCE["compare"] - 1),
),
"compare_chained2_false_37": (
"compare_chained_right_false_37": (
' %[3]{pattr.replace("-", " ")} %p %p',
(0, PRECEDENCE["compare"] - 1),
(-5, PRECEDENCE["compare"] - 1),
),
"compare_chained1b_false_37": (
"compared_chained_middleb_false_37": (
' %[3]{pattr.replace("-", " ")} %p %p',
(0, PRECEDENCE["compare"] - 1),
(-4, PRECEDENCE["compare"] - 1),
),
"compare_chained1c_37": (
"compared_chained_middlec_37": (
' %[3]{pattr.replace("-", " ")} %p %p',
(0, PRECEDENCE["compare"] - 1),
(-2, PRECEDENCE["compare"] - 1),
),
"compare_chained2a_37": (
"compare_chained_righta_37": (
'%[1]{pattr.replace("-", " ")} %p',
(0, PRECEDENCE["compare"] - 1),
),
"compare_chained2b_false_37": (
"compare_chained_rightb_false_37": (
'%[1]{pattr.replace("-", " ")} %p',
(0, PRECEDENCE["compare"] - 1),
),
"compare_chained2a_false_37": (
"compare_chained_righta_false_37": (
'%[1]{pattr.replace("-", " ")} %p',
(0, PRECEDENCE["compare"] - 1),
),
"compare_chained2c_37": (
"compare_chained_rightc_37": (
'%[3]{pattr.replace("-", " ")} %p %p',
(0, PRECEDENCE["compare"] - 1),
(6, PRECEDENCE["compare"] - 1),
@@ -461,12 +461,12 @@ def customize_for_version37(self, version):
compare_chained37 = node[0]
if (
compare_chained37 == "compare_chained37"
and compare_chained37[1] == "compare_chained1b_37"
and compare_chained37[1] == "compared_chained_middleb_37"
):
compare_chained1b_37 = compare_chained37[1]
compared_chained_middleb_37 = compare_chained37[1]
if (
len(compare_chained1b_37) > 2
and compare_chained1b_37[-2] == "JUMP_FORWARD"
len(compared_chained_middleb_37) > 2
and compared_chained_middleb_37[-2] == "JUMP_FORWARD"
):
node.kind = "testfalse"
pass

View File

@@ -2137,7 +2137,7 @@ def code_deparse_around_offset(
offset,
co,
out=StringIO(),
version=None,
version=Optional[tuple],
is_pypy=None,
debug_opts=DEFAULT_DEBUG_OPTS,
):

View File

@@ -699,7 +699,7 @@ class NonterminalActions:
self.write("(")
iter_index = 3
if self.version > (3, 2):
if self.version >= (3, 4):
if self.version >= (3, 3):
if node[0].kind in (
"load_closure",
"load_genexpr",