From b81789af7ff9886dc3203ef0340a969e555f48a5 Mon Sep 17 00:00:00 2001 From: rocky Date: Wed, 4 Oct 2023 12:17:30 -0400 Subject: [PATCH] Handle parens in generator better? --- decompyle3/semantics/consts.py | 9 +- decompyle3/semantics/customize37.py | 31 ++++--- decompyle3/semantics/customize38.py | 4 +- .../generator/03_generator_compendium.pyc | Bin 0 -> 412 bytes .../03_generator_compendium.py | 84 ++++++++++++++++++ 5 files changed, 113 insertions(+), 15 deletions(-) create mode 100644 test/bytecode_3.7/code-fragment/generator/03_generator_compendium.pyc create mode 100644 test/simple_source/generator_start/03_generator_compendium.py diff --git a/decompyle3/semantics/consts.py b/decompyle3/semantics/consts.py index 301fb664..06b5d26f 100644 --- a/decompyle3/semantics/consts.py +++ b/decompyle3/semantics/consts.py @@ -592,9 +592,12 @@ "store": MAP_R, } -ASSIGN_TUPLE_PARAM = lambda param_name: SyntaxTree( # noqa - "expr", [Token("LOAD_FAST", pattr=param_name)] -) + +def assign_tuple_parameter_tree(param_name) -> SyntaxTree: + return SyntaxTree("expr", [Token("LOAD_FAST", pattr=param_name)]) + + +ASSIGN_TUPLE_PARAM = assign_tuple_parameter_tree escape = re.compile( r""" diff --git a/decompyle3/semantics/customize37.py b/decompyle3/semantics/customize37.py index 655382c1..86effce5 100644 --- a/decompyle3/semantics/customize37.py +++ b/decompyle3/semantics/customize37.py @@ -24,6 +24,7 @@ from decompyle3.scanners.tok import Token from decompyle3.semantics.consts import ( INDENT_PER_LEVEL, + NO_PARENTHESIS_EVER, PRECEDENCE, TABLE_DIRECT, TABLE_R, @@ -41,6 +42,7 @@ def escape_format(s): FSTRING_CONVERSION_MAP = {1: "!s", 2: "!r", 3: "!a", "X": ":X"} + ####################### def customize_for_version37(self, version): ######################## @@ -162,7 +164,7 @@ def customize_for_version37(self, version): "await_expr": ("await %p", (0, PRECEDENCE["await_expr"] - 1)), "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)), + "call_ex": ("%c(%p)", (0, "expr"), (1, NO_PARENTHESIS_EVER)), "compare_chained_middlea_37": ( "%p %p", (0, PRECEDENCE["compare"] - 1), @@ -419,7 +421,7 @@ def customize_for_version37(self, version): TABLE_R.update( { - "CALL_FUNCTION_EX": ("%c(*%P)", 0, (1, 2, ", ", 100)), + "CALL_FUNCTION_EX": ("%c(*%P)", 0, (1, 2, ", ", NO_PARENTHESIS_EVER)), # Not quite right "CALL_FUNCTION_EX_KW": ("%c(**%C)", 0, (2, 3, ",")), } @@ -465,7 +467,7 @@ def call36_dict(node): We will source-code use line breaks to guide us when to break. """ p = self.prec - self.prec = 100 + self.prec = NO_PARENTHESIS_EVER self.indent_more(INDENT_PER_LEVEL) sep = INDENT_PER_LEVEL[:-1] @@ -770,7 +772,7 @@ def n_call(node): if args_node in ("pos_arg", "expr"): args_node = args_node[0] if args_node == "build_list_unpack": - template = ("*%P)", (0, len(args_node) - 1, ", *", 100)) + template = ("*%P)", (0, len(args_node) - 1, ", *", NO_PARENTHESIS_EVER)) self.template_engine(template, args_node) else: if len(node) - nargs > 3: @@ -789,10 +791,19 @@ def n_call(node): and opname == "CALL_FUNCTION_1" or not re.match(r"\d", opname[-1]) ): - template = "(%c)(%p)" if node[0][0] == "lambda_body" else "%c(%p)" - self.template_engine( - (template, (0, "expr"), (1, PRECEDENCE["yield"] - 1)), node - ) + if node[0][0] == "lambda_body": + self.template_engine( + ( + "(\n%+%|%c%-\n)(%p)", + (0, ("expr", "arg")), + (1, PRECEDENCE["yield"] - 1), + ), + node, + ) + else: + self.template_engine( + ("%c(%p)", (0, ("expr", "arg")), (1, NO_PARENTHESIS_EVER)), node + ) self.prec = p self.prune() else: @@ -1190,7 +1201,7 @@ def n_call_ex_kw(node): if value == "": fmt = "%c(%p)" else: - fmt = "%c" + ("(%s, " % value).replace('%', '%%') + "%p)" + fmt = "%c" + ("(%s, " % value).replace("%", "%%") + "%p)" self.template_engine( (fmt, (0, "expr"), (2, "build_map_unpack_with_call", 100)), node @@ -1209,7 +1220,7 @@ def n_call_ex_kw2(node): if value == "": fmt = "%c(%p)" else: - fmt = "%c" + ("(%s, " % value).replace('%', '%%') + "%p)" + fmt = "%c" + ("(%s, " % value).replace("%", "%%") + "%p)" self.template_engine( (fmt, (0, "expr"), (2, "build_map_unpack_with_call", 100)), node diff --git a/decompyle3/semantics/customize38.py b/decompyle3/semantics/customize38.py index 2022832f..0893a643 100644 --- a/decompyle3/semantics/customize38.py +++ b/decompyle3/semantics/customize38.py @@ -19,7 +19,7 @@ # Python 3.8+ changes ####################### -from decompyle3.semantics.consts import PRECEDENCE, TABLE_DIRECT +from decompyle3.semantics.consts import NO_PARENTHESIS_EVER, PRECEDENCE, TABLE_DIRECT from decompyle3.semantics.customize37 import FSTRING_CONVERSION_MAP from decompyle3.semantics.helper import escape_string, strip_quotes @@ -380,7 +380,7 @@ def n_set_afor(node): def n_formatted_value_debug(node): p = self.prec - self.prec = 100 + self.prec = NO_PARENTHESIS_EVER formatted_value = node[1] value_equal = node[0].attr diff --git a/test/bytecode_3.7/code-fragment/generator/03_generator_compendium.pyc b/test/bytecode_3.7/code-fragment/generator/03_generator_compendium.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79fb29ec5fae247beb05339f810fc9b7a9d765cc GIT binary patch literal 412 zcmZ8cJx{|x47Kl)QYx}^L}DjPTZx6CLI^RJ0f`MoQSMX)nh$)51X4Pcp8^Aa=~gEG zLMQA1DqzVz``z>1dlykO0*;rfBl{Wxyvy(tnwxV@cg)3r!Dp~w)CMnMg9sLl?lC2^ zASSqmILwgg66!lMKHZp02e+d&c6b8_56S?uaq$MR@@g{kn3HVwWqa!KqF&j=RV`(9 zy0oRGw5cd@O-jvlc9QI%tSV|-n!GJ0_0x8LE;o-go$blLA|gOyZ}1^j|ELp(y}Cng zSlxJy4Rm;~N&Qn9BMCWHBoBJL+i9hMk^X~-8z)nMN-bjTLrTk~^