You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-03 16:59:52 +08:00
Sync up decompyle3 customize37 somewhat
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2019-2021 by Rocky Bernstein
|
# Copyright (c) 2019-2022 by Rocky Bernstein
|
||||||
#
|
#
|
||||||
# This program is free software: you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@@ -19,10 +19,12 @@ import re
|
|||||||
from uncompyle6.semantics.consts import (
|
from uncompyle6.semantics.consts import (
|
||||||
PRECEDENCE,
|
PRECEDENCE,
|
||||||
TABLE_DIRECT,
|
TABLE_DIRECT,
|
||||||
maxint,
|
INDENT_PER_LEVEL,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
from uncompyle6.semantics.helper import flatten_list
|
||||||
|
|
||||||
|
#######################
|
||||||
def customize_for_version37(self, version):
|
def customize_for_version37(self, version):
|
||||||
########################
|
########################
|
||||||
# Python 3.7+ changes
|
# Python 3.7+ changes
|
||||||
@@ -40,7 +42,9 @@ def customize_for_version37(self, version):
|
|||||||
PRECEDENCE["formatted_value1"] = 100
|
PRECEDENCE["formatted_value1"] = 100
|
||||||
PRECEDENCE["if_exp_37a"] = 28
|
PRECEDENCE["if_exp_37a"] = 28
|
||||||
PRECEDENCE["if_exp_37b"] = 28
|
PRECEDENCE["if_exp_37b"] = 28
|
||||||
|
PRECEDENCE["dict_unpack"] = 0 # **{...}
|
||||||
|
|
||||||
|
# fmt: on
|
||||||
TABLE_DIRECT.update(
|
TABLE_DIRECT.update(
|
||||||
{
|
{
|
||||||
"and_not": ("%c and not %c", (0, "expr"), (2, "expr")),
|
"and_not": ("%c and not %c", (0, "expr"), (2, "expr")),
|
||||||
@@ -84,42 +88,45 @@ def customize_for_version37(self, version):
|
|||||||
# nested await expressions like:
|
# nested await expressions like:
|
||||||
# return await (await bar())
|
# return await (await bar())
|
||||||
# need parenthesis.
|
# need parenthesis.
|
||||||
|
# Note there are async dictionary expressions are like await expr's
|
||||||
|
# the below is just the default fersion
|
||||||
"await_expr": ("await %p", (0, PRECEDENCE["await_expr"]-1)),
|
"await_expr": ("await %p", (0, PRECEDENCE["await_expr"]-1)),
|
||||||
|
|
||||||
"await_stmt": ("%|%c\n", 0),
|
"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, 100)),
|
||||||
"compare_chained1a_37": (
|
"compare_chained1a_37": (
|
||||||
' %[3]{pattr.replace("-", " ")} %p %p',
|
' %[3]{pattr.replace("-", " ")} %p %p',
|
||||||
(0, 19),
|
(0, PRECEDENCE["compare"] - 1),
|
||||||
(-4, 19),
|
(-4, PRECEDENCE["compare"] - 1),
|
||||||
),
|
),
|
||||||
"compare_chained1_false_37": (
|
"compare_chained1_false_37": (
|
||||||
' %[3]{pattr.replace("-", " ")} %p %p',
|
' %[3]{pattr.replace("-", " ")} %p %p',
|
||||||
(0, 19),
|
(0, PRECEDENCE["compare"] - 1),
|
||||||
(-4, 19),
|
(-4, PRECEDENCE["compare"] - 1),
|
||||||
),
|
),
|
||||||
"compare_chained2_false_37": (
|
"compare_chained2_false_37": (
|
||||||
' %[3]{pattr.replace("-", " ")} %p %p',
|
' %[3]{pattr.replace("-", " ")} %p %p',
|
||||||
(0, 19),
|
(0, PRECEDENCE["compare"] - 1),
|
||||||
(-5, 19),
|
(-5, PRECEDENCE["compare"] - 1),
|
||||||
),
|
),
|
||||||
"compare_chained1b_false_37": (
|
"compare_chained1b_false_37": (
|
||||||
' %[3]{pattr.replace("-", " ")} %p %p',
|
' %[3]{pattr.replace("-", " ")} %p %p',
|
||||||
(0, 19),
|
(0, PRECEDENCE["compare"] - 1),
|
||||||
(-4, 19),
|
(-4, PRECEDENCE["compare"] - 1),
|
||||||
),
|
),
|
||||||
"compare_chained1c_37": (
|
"compare_chained1c_37": (
|
||||||
' %[3]{pattr.replace("-", " ")} %p %p',
|
' %[3]{pattr.replace("-", " ")} %p %p',
|
||||||
(0, 19),
|
(0, PRECEDENCE["compare"] - 1),
|
||||||
(-2, 19),
|
(-2, PRECEDENCE["compare"] - 1),
|
||||||
),
|
),
|
||||||
"compare_chained2a_37": ('%[1]{pattr.replace("-", " ")} %p', (0, 19)),
|
"compare_chained2a_37": ('%[1]{pattr.replace("-", " ")} %p', (0, PRECEDENCE["compare"] - 1)),
|
||||||
"compare_chained2b_false_37": ('%[1]{pattr.replace("-", " ")} %p', (0, 19)),
|
"compare_chained2b_false_37": ('%[1]{pattr.replace("-", " ")} %p', (0, PRECEDENCE["compare"] - 1)),
|
||||||
"compare_chained2a_false_37": ('%[1]{pattr.replace("-", " ")} %p', (0, 19)),
|
"compare_chained2a_false_37": ('%[1]{pattr.replace("-", " ")} %p', (0, PRECEDENCE["compare"] - 1)),
|
||||||
"compare_chained2c_37": (
|
"compare_chained2c_37": (
|
||||||
'%[3]{pattr.replace("-", " ")} %p %p',
|
'%[3]{pattr.replace("-", " ")} %p %p',
|
||||||
(0, 19),
|
(0, PRECEDENCE["compare"] - 1),
|
||||||
(6, 19),
|
(6, PRECEDENCE["compare"] - 1),
|
||||||
),
|
),
|
||||||
'if_exp37': ( '%p if %c else %c',
|
'if_exp37': ( '%p if %c else %c',
|
||||||
(1, 'expr', 27), 0, 3 ),
|
(1, 'expr', 27), 0, 3 ),
|
||||||
@@ -143,7 +150,6 @@ def customize_for_version37(self, version):
|
|||||||
(3, 'importlist37') ),
|
(3, 'importlist37') ),
|
||||||
|
|
||||||
"importattr37": ("%c", (0, "IMPORT_NAME_ATTR")),
|
"importattr37": ("%c", (0, "IMPORT_NAME_ATTR")),
|
||||||
"importlist37": ("%C", (0, maxint, ", ")),
|
|
||||||
|
|
||||||
"list_afor": (
|
"list_afor": (
|
||||||
" async for %[1]{%c} in %c%[1]{%c}",
|
" async for %[1]{%c} in %c%[1]{%c}",
|
||||||
@@ -195,6 +201,18 @@ def customize_for_version37(self, version):
|
|||||||
|
|
||||||
self.n_assert_invert = n_assert_invert
|
self.n_assert_invert = n_assert_invert
|
||||||
|
|
||||||
|
def n_async_call(node):
|
||||||
|
self.f.write("async ")
|
||||||
|
node.kind == "call"
|
||||||
|
p = self.prec
|
||||||
|
self.prec = 80
|
||||||
|
self.template_engine(("%c(%P)", 0, (1, -4, ", ", 100)), node)
|
||||||
|
self.prec = p
|
||||||
|
node.kind == "async_call"
|
||||||
|
self.prune()
|
||||||
|
|
||||||
|
self.n_async_call = n_async_call
|
||||||
|
|
||||||
def n_attribute37(node):
|
def n_attribute37(node):
|
||||||
expr = node[0]
|
expr = node[0]
|
||||||
assert expr == "expr"
|
assert expr == "expr"
|
||||||
@@ -209,6 +227,92 @@ def customize_for_version37(self, version):
|
|||||||
|
|
||||||
self.n_attribute37 = n_attribute37
|
self.n_attribute37 = n_attribute37
|
||||||
|
|
||||||
|
def n_build_list_unpack(node):
|
||||||
|
"""
|
||||||
|
prettyprint a list or tuple
|
||||||
|
"""
|
||||||
|
p = self.prec
|
||||||
|
self.prec = 100
|
||||||
|
lastnode = node.pop()
|
||||||
|
lastnodetype = lastnode.kind
|
||||||
|
|
||||||
|
# If this build list is inside a CALL_FUNCTION_VAR,
|
||||||
|
# then the first * has already been printed.
|
||||||
|
# Until I have a better way to check for CALL_FUNCTION_VAR,
|
||||||
|
# will assume that if the text ends in *.
|
||||||
|
last_was_star = self.f.getvalue().endswith("*")
|
||||||
|
|
||||||
|
if lastnodetype.startswith("BUILD_LIST"):
|
||||||
|
self.write("[")
|
||||||
|
endchar = "]"
|
||||||
|
|
||||||
|
flat_elems = flatten_list(node)
|
||||||
|
|
||||||
|
self.indent_more(INDENT_PER_LEVEL)
|
||||||
|
sep = ""
|
||||||
|
for elem in flat_elems:
|
||||||
|
if elem in ("ROT_THREE", "EXTENDED_ARG"):
|
||||||
|
continue
|
||||||
|
assert elem == "expr"
|
||||||
|
line_number = self.line_number
|
||||||
|
use_star = True
|
||||||
|
value = self.traverse(elem)
|
||||||
|
if value.startswith("("):
|
||||||
|
assert value.endswith(")")
|
||||||
|
use_star = False
|
||||||
|
value = value[1:-1].rstrip(
|
||||||
|
" "
|
||||||
|
) # Remove starting '(' and trailing ')' and additional spaces
|
||||||
|
if value == "":
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
if value.endswith(","): # if args has only one item
|
||||||
|
value = value[:-1]
|
||||||
|
if line_number != self.line_number:
|
||||||
|
sep += "\n" + self.indent + INDENT_PER_LEVEL[:-1]
|
||||||
|
else:
|
||||||
|
if sep != "":
|
||||||
|
sep += " "
|
||||||
|
if not last_was_star and use_star:
|
||||||
|
sep += "*"
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
last_was_star = False
|
||||||
|
self.write(sep, value)
|
||||||
|
sep = ","
|
||||||
|
self.write(endchar)
|
||||||
|
self.indent_less(INDENT_PER_LEVEL)
|
||||||
|
|
||||||
|
self.prec = p
|
||||||
|
self.prune()
|
||||||
|
return
|
||||||
|
|
||||||
|
self.n_build_list_unpack = n_build_list_unpack
|
||||||
|
|
||||||
|
def n_c_with(node):
|
||||||
|
if len(node) == 1 and node[0] == "with":
|
||||||
|
node = node[0]
|
||||||
|
else:
|
||||||
|
node.kind = "with"
|
||||||
|
self.default(node)
|
||||||
|
|
||||||
|
self.n_c_with = n_c_with
|
||||||
|
|
||||||
|
def n_c_except_suite(node):
|
||||||
|
node_len = len(node)
|
||||||
|
if node_len == 1 and node[0] in ("except_suite", "c_returns"):
|
||||||
|
node = node[0]
|
||||||
|
self.default(node)
|
||||||
|
elif node[1] in ("c_suite_stmts", "c_except_suite"):
|
||||||
|
node = node[1][0]
|
||||||
|
template = ("%+%c%-", 0)
|
||||||
|
self.template_engine(template, node)
|
||||||
|
self.prune()
|
||||||
|
|
||||||
|
self.n_c_except_suite = n_c_except_suite
|
||||||
|
|
||||||
|
self.n_c_with = n_c_with
|
||||||
|
|
||||||
def n_call(node):
|
def n_call(node):
|
||||||
p = self.prec
|
p = self.prec
|
||||||
self.prec = 100
|
self.prec = 100
|
||||||
@@ -277,10 +381,7 @@ def customize_for_version37(self, version):
|
|||||||
and opname == "CALL_FUNCTION_1"
|
and opname == "CALL_FUNCTION_1"
|
||||||
or not re.match(r"\d", opname[-1])
|
or not re.match(r"\d", opname[-1])
|
||||||
):
|
):
|
||||||
if node[0][0] == "_lambda_body":
|
template = "(%c)(%p)" if node[0][0] == "lambda_body" else "%c(%p)"
|
||||||
template = "(%c)(%p)"
|
|
||||||
else:
|
|
||||||
template = "%c(%p)"
|
|
||||||
self.template_engine(
|
self.template_engine(
|
||||||
(template, (0, "expr"), (1, PRECEDENCE["yield"] - 1)), node
|
(template, (0, "expr"), (1, PRECEDENCE["yield"] - 1)), node
|
||||||
)
|
)
|
||||||
|
Reference in New Issue
Block a user