Merge branch 'python-3.3-to-3.5' into python-3.0-to-3.2

This commit is contained in:
rocky
2024-02-11 23:41:27 -05:00
7 changed files with 88 additions and 96 deletions

View File

@@ -14,6 +14,7 @@ import click
from xdis.version_info import version_tuple_to_str
from uncompyle6.main import main, status_msg
from uncompyle6.verify import VerifyCmpError
from uncompyle6.version import __version__
program = "uncompyle6"
@@ -157,12 +158,20 @@ def main_bin(
version_tuple = sys.version_info[0:2]
if not ((3, 3) <= version_tuple < (3, 6)):
print(
"Error: This version of the {program} runs from Python 3.3 to 3.5."
"You need another branch of this code for other Python versions."
" \n\tYou have version: %s." % version_tuple_to_str()
)
sys.exit(-1)
if version_tuple > (3, 5):
print(
"This version of the {program} is tailored for Python 3.3 to 3.5.\n"
"It may run on other versions, but there are problems, switch to code "
"from another branch.\n"
"You have version: %s." % version_tuple_to_str()
)
else:
print(
"Error: This version of the {program} runs from Python 3.3 to 3.5.\n"
"You need another branch of this code for other Python versions."
" \n\tYou have version: %s." % version_tuple_to_str()
)
sys.exit(-1)
numproc = 0
out_base = None
@@ -242,7 +251,7 @@ def main_bin(
sys.exit(2)
except KeyboardInterrupt:
pass
except verify.VerifyCmpError:
except VerifyCmpError:
raise
else:
from multiprocessing import Process, Queue
@@ -263,18 +272,18 @@ def main_bin(
tot_files = okay_files = failed_files = verify_failed_files = 0
def process_func():
(tot_files, okay_files, failed_files, verify_failed_files) = (
0,
0,
0,
0,
)
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], [], outfile, **options)
(t, o, f, v) = main(src_base, out_base, [f], [], outfile)
tot_files += t
okay_files += o
failed_files += f

View File

@@ -382,25 +382,14 @@ def main(
check_type = "syntax check"
if do_verify == "run":
check_type = "run"
if PYTHON_VERSION_TRIPLE >= (3, 7):
result = subprocess.run(
[sys.executable, deparsed_object.f.name],
capture_output=True,
)
valid = result.returncode == 0
output = result.stdout.decode()
if output:
print(output)
pass
else:
result = subprocess.run(
[sys.executable, deparsed_object.f.name],
)
valid = result.returncode == 0
pass
return_code = subprocess.call(
[sys.executable, deparsed_object.f.name],
stdout=sys.stdout,
stderr=sys.stderr,
)
valid = return_code == 0
if not valid:
print(result.stderr.decode())
sys.stderr.write("Got return code %d\n" % return_code)
else:
valid = syntax_check(deparsed_object.f.name)

View File

@@ -1,4 +1,4 @@
# Copyright (c) 2015-2023 Rocky Bernstein
# Copyright (c) 2015-2024 Rocky Bernstein
# Copyright (c) 2005 by Dan Pascu <dan@windowmaker.org>
# Copyright (c) 2000-2002 by hartmut Goebel <h.goebel@crazy-compilers.com>
# Copyright (c) 1999 John Aycock
@@ -1221,9 +1221,24 @@ class Python3Parser(PythonParser):
)
)
else:
rule = "mkfunc ::= %s%sload_closure LOAD_CODE LOAD_STR %s" % (
kwargs_str,
"pos_arg " * pos_args_count,
if self.version == (3, 3):
# 3.3 puts kwargs before pos_arg
pos_kw_tuple = (
("kwargs " * kw_args_count),
("pos_arg " * pos_args_count),
)
else:
# 3.4 and 3.5 puts pos_arg before kwargs
pos_kw_tuple = (
"pos_arg " * (pos_args_count),
("kwargs " * kw_args_count),
)
rule = (
"mkfunc ::= %s%s%s " "load_closure LOAD_CODE LOAD_STR %s"
) % (
pos_kw_tuple[0],
pos_kw_tuple[1],
"annotate_tuple " * (annotate_args),
opname,
)
self.add_unique_rule(rule, opname, token.attr, customize)
@@ -1465,12 +1480,12 @@ class Python3Parser(PythonParser):
)
self.add_unique_rule(rule, opname, token.attr, customize)
rule = (
"mkfunc_annotate ::= %s%sannotate_tuple LOAD_CODE LOAD_STR %s"
% (
("pos_arg " * pos_args_count),
("annotate_arg " * annotate_args),
opname,
)
"mkfunc_annotate ::= %s%sannotate_tuple LOAD_CODE "
"LOAD_STR %s"
) % (
("pos_arg " * pos_args_count),
("annotate_arg " * annotate_args),
opname,
)
if self.version >= (3, 3):
if self.version == (3, 3):
@@ -1480,29 +1495,19 @@ class Python3Parser(PythonParser):
("pos_arg " * pos_args_count),
)
else:
# 3.4 and 3.5puts pos_arg before kwargs
# 3.4 and 3.5 puts pos_arg before kwargs
pos_kw_tuple = (
"pos_arg " * (pos_args_count),
("kwargs " * kw_args_count),
)
rule = (
"mkfunc_annotate ::= %s%s%sannotate_tuple LOAD_CODE LOAD_STR %s"
% (
pos_kw_tuple[0],
pos_kw_tuple[1],
("annotate_arg " * annotate_args),
opname,
)
)
self.add_unique_rule(rule, opname, token.attr, customize)
rule = (
"mkfunc_annotate ::= %s%s%sannotate_tuple LOAD_CODE LOAD_STR %s"
% (
pos_kw_tuple[0],
pos_kw_tuple[1],
("annotate_arg " * annotate_args),
opname,
)
"mkfunc_annotate ::= %s%s%sannotate_tuple LOAD_CODE "
"LOAD_STR %s"
) % (
pos_kw_tuple[0],
pos_kw_tuple[1],
("annotate_arg " * annotate_args),
opname,
)
else:
rule = (

View File

@@ -1,4 +1,4 @@
# Copyright (c) 2015-2019, 2021-2023 by Rocky Bernstein
# Copyright (c) 2015-2019, 2021-2024 by Rocky Bernstein
# Copyright (c) 2005 by Dan Pascu <dan@windowmaker.org>
# Copyright (c) 2000-2002 by hartmut Goebel <h.goebel@crazy-compilers.com>
#
@@ -479,7 +479,6 @@ class Scanner3(Scanner):
last_op_was_break = False
new_tokens = []
operand_value = 0
for i, inst in enumerate(self.insts):
opname = inst.opname
@@ -531,11 +530,9 @@ class Scanner3(Scanner):
op = inst.opcode
if opname == "EXTENDED_ARG":
if i + 1 < n:
operand_value = argval << 16
continue
else:
operand_value = 0
# EXTEND_ARG adjustments to the operand value should have
# already been accounted for in xdis instruction creation.
continue
if inst.offset in jump_targets:
jump_idx = 0
@@ -642,7 +639,7 @@ class Scanner3(Scanner):
attr = attr[:4] # remove last value: attr[5] == False
else:
pos_args, name_pair_args, annotate_args = parse_fn_counts_30_35(
inst.argval + operand_value
inst.argval
)
pattr = "%s positional, %s keyword only, %s annotated" % (

View File

@@ -1,4 +1,4 @@
# Copyright (c) 2017, 2021-2022 by Rocky Bernstein
# Copyright (c) 2017, 2021-2022, 2024 by 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
@@ -22,21 +22,22 @@ This sets up opcodes Python's 3.5 and calls a generalized
scanner routine for Python 3.
"""
from __future__ import print_function
# bytecode verification, verify(), uses JUMP_OPs from here
from xdis.opcodes import opcode_35 as opc
from uncompyle6.scanners.scanner3 import Scanner3
# bytecode verification, verify(), uses JUMP_OPs from here
from xdis.opcodes import opcode_35 as opc
JUMP_OPS = opc.JUMP_OPS
class Scanner35(Scanner3):
class Scanner35(Scanner3):
def __init__(self, show_asm=None, is_pypy=False):
Scanner3.__init__(self, (3, 5), show_asm, is_pypy)
return
pass
if __name__ == "__main__":
from xdis.version_info import PYTHON_VERSION_TRIPLE, version_tuple_to_str

View File

@@ -1,4 +1,4 @@
# Copyright (c) 2015-2020, 2022-2023 by Rocky Bernstein
# Copyright (c) 2015-2020, 2022-2024 by Rocky Bernstein
# Copyright (c) 2005 by Dan Pascu <dan@windowmaker.org>
# Copyright (c) 2000-2002 by hartmut Goebel <h.goebel@crazy-compilers.com>
#
@@ -15,7 +15,7 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Python 37 bytecode scanner/deparser base.
Python 3.7 bytecode scanner/deparser base.
Also we *modify* the instruction sequence to assist deparsing code.
For example:
@@ -318,12 +318,6 @@ class Scanner37Base(Scanner):
argval = inst.argval
op = inst.opcode
if inst.opname == "EXTENDED_ARG":
# FIXME: The EXTENDED_ARG is used to signal annotation
# parameters
if i + 1 < n and self.insts[i + 1].opcode != self.opc.MAKE_FUNCTION:
continue
if inst.offset in jump_targets:
jump_idx = 0
# We want to process COME_FROMs to the same offset to be in *descending*

View File

@@ -1,4 +1,4 @@
# Copyright (c) 2015-2021 by Rocky Bernstein
# Copyright (c) 2015-2021, 2024 by 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
@@ -16,18 +16,18 @@
All the crazy things we have to do to handle Python functions in 3.0-3.5 or so.
The saga of changes before and after is in other files.
"""
from xdis import iscode, code_has_star_arg, code_has_star_star_arg, CO_GENERATOR
from uncompyle6.scanner import Code
from uncompyle6.parsers.treenode import SyntaxTree
from uncompyle6.semantics.parser_error import ParserError
from xdis import CO_GENERATOR, code_has_star_arg, code_has_star_star_arg, iscode
from uncompyle6.parser import ParserError as ParserError2
from uncompyle6.parsers.treenode import SyntaxTree
from uncompyle6.scanner import Code
from uncompyle6.semantics.helper import (
print_docstring,
find_all_globals,
find_globals_and_nonlocals,
find_none,
print_docstring,
)
from uncompyle6.semantics.parser_error import ParserError
from uncompyle6.show import maybe_show_tree_param_default
# FIXME: DRY the below code...
@@ -42,8 +42,8 @@ def make_function3_annotate(
def build_param(ast, name, default):
"""build parameters:
- handle defaults
- handle format tuple parameters
- handle defaults
- handle format tuple parameters
"""
if default:
value = self.traverse(default, indent="")
@@ -300,7 +300,7 @@ def make_function3_annotate(
def make_function3(self, node, is_lambda, nested=1, code_node=None):
"""Dump function definition, doc string, and function body in
Python version 3.0 and above
Python version 3.0 and above
"""
# For Python 3.3, the evaluation stack in MAKE_FUNCTION is:
@@ -333,8 +333,8 @@ def make_function3(self, node, is_lambda, nested=1, code_node=None):
def build_param(ast, name, default, annotation=None):
"""build parameters:
- handle defaults
- handle format tuple parameters
- handle defaults
- handle format tuple parameters
"""
value = self.traverse(default, indent="")
maybe_show_tree_param_default(self.showast, name, value)
@@ -419,7 +419,6 @@ def make_function3(self, node, is_lambda, nested=1, code_node=None):
pass
if len(node) > 2 and (have_kwargs or node[lc_index].kind != "load_closure"):
# Find the index in "node" where the first default
# parameter value is located. Note this is in contrast to
# key-word arguments, pairs of (name, value), which appear after "*".
@@ -492,8 +491,6 @@ def make_function3(self, node, is_lambda, nested=1, code_node=None):
self.ERROR = p
return
kw_pairs = 0
i = len(paramnames) - len(defparams)
# build parameters