You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-03 08:49:51 +08:00
handle long literal constants faster
This commit is contained in:
@@ -282,6 +282,7 @@ TABLE_DIRECT = {
|
||||
"comp_if": (" if %c%c", 0, 2),
|
||||
"comp_if_not": (" if not %p%c", (0, "expr", PRECEDENCE["unary_not"]), 2),
|
||||
"comp_body": ("",), # ignore when recusing
|
||||
|
||||
"set_comp_body": ("%c", 0),
|
||||
"gen_comp_body": ("%c", 0),
|
||||
"dict_comp_body": ("%c:%c", 1, 0),
|
||||
|
@@ -277,8 +277,16 @@ def make_function36(self, node, is_lambda, nested=1, code_node=None):
|
||||
# FIXME: handle free_tup, ann_dict, and default_tup
|
||||
if kw_dict:
|
||||
assert kw_dict == "dict"
|
||||
defaults = [self.traverse(n, indent="") for n in kw_dict[:-2]]
|
||||
names = eval(self.traverse(kw_dict[-2]))
|
||||
const_list = kw_dict[0]
|
||||
if kw_dict[0] == "const_list":
|
||||
add_consts = const_list[1]
|
||||
assert add_consts == "add_consts"
|
||||
names = add_consts[-1].attr
|
||||
defaults = [v.pattr for v in add_consts[:-1]]
|
||||
else:
|
||||
defaults = [self.traverse(n, indent="") for n in kw_dict[:-2]]
|
||||
names = eval(self.traverse(kw_dict[-2]))
|
||||
|
||||
assert len(defaults) == len(names)
|
||||
# FIXME: possibly handle line breaks
|
||||
for i, n in enumerate(names):
|
||||
|
@@ -202,6 +202,68 @@ class NonterminalActions:
|
||||
|
||||
n_classdefdeco2 = n_classdef
|
||||
|
||||
def n_const_list(self, node):
|
||||
"""
|
||||
prettyprint a constant dict, list, set or tuple.
|
||||
"""
|
||||
p = self.prec
|
||||
|
||||
lastnodetype = node[2].kind
|
||||
flat_elems = node[1]
|
||||
is_dict = lastnodetype.endswith("DICT")
|
||||
|
||||
if lastnodetype.endswith("LIST"):
|
||||
self.write("[")
|
||||
endchar = "]"
|
||||
elif lastnodetype.endswith("SET") or is_dict:
|
||||
self.write("{")
|
||||
endchar = "}"
|
||||
else:
|
||||
# from trepan.api import debug; debug()
|
||||
raise TypeError(
|
||||
f"Internal Error: n_const_list expects dict, list set, or set; got {lastnodetype}"
|
||||
)
|
||||
|
||||
self.indent_more(INDENT_PER_LEVEL)
|
||||
sep = ""
|
||||
if is_dict:
|
||||
keys = flat_elems[-1].pattr
|
||||
assert isinstance(keys, tuple)
|
||||
assert len(keys) == len(flat_elems) - 1
|
||||
for i, elem in enumerate(flat_elems[:-1]):
|
||||
assert elem.kind == "ADD_VALUE"
|
||||
value = elem.pattr
|
||||
if elem.linestart is not None:
|
||||
if elem.linestart != self.line_number:
|
||||
sep += "\n" + self.indent + INDENT_PER_LEVEL[:-1]
|
||||
self.line_number = elem.linestart
|
||||
else:
|
||||
if sep != "":
|
||||
sep += " "
|
||||
self.write(f"{sep} {repr(keys[i])}: {value}")
|
||||
sep = ","
|
||||
else:
|
||||
for elem in flat_elems:
|
||||
if elem.kind != "ADD_VALUE":
|
||||
from trepan.api import debug; debug()
|
||||
assert elem.kind == "ADD_VALUE"
|
||||
value = elem.pattr
|
||||
if elem.linestart is not None:
|
||||
if elem.linestart != self.line_number:
|
||||
sep += "\n" + self.indent + INDENT_PER_LEVEL[:-1]
|
||||
self.line_number = elem.linestart
|
||||
else:
|
||||
if sep != "":
|
||||
sep += " "
|
||||
self.write(sep, value)
|
||||
sep = ","
|
||||
self.write(endchar)
|
||||
self.indent_less(INDENT_PER_LEVEL)
|
||||
|
||||
self.prec = p
|
||||
self.prune()
|
||||
return
|
||||
|
||||
def n_delete_subscript(self, node):
|
||||
if node[-2][0] == "build_list" and node[-2][0][-1].kind.startswith(
|
||||
"BUILD_TUPLE"
|
||||
@@ -498,6 +560,11 @@ class NonterminalActions:
|
||||
"""
|
||||
prettyprint a dict, list, set or tuple.
|
||||
"""
|
||||
if len(node) == 1 and node[0] == "const_list":
|
||||
self.preorder(node[0])
|
||||
self.prune()
|
||||
return
|
||||
|
||||
p = self.prec
|
||||
self.prec = PRECEDENCE["yield"] - 1
|
||||
lastnode = node.pop()
|
||||
@@ -547,7 +614,6 @@ class NonterminalActions:
|
||||
self.write("(")
|
||||
endchar = ")"
|
||||
else:
|
||||
# from trepan.api import debug; debug()
|
||||
raise TypeError(
|
||||
"Internal Error: n_build_list expects list, tuple, set, or unpack"
|
||||
)
|
||||
|
Reference in New Issue
Block a user