Skip to content

Commit 8eb4d6a

Browse files
committed
Fix bit rot in fragments.py
build_ast() added a code argument n_dict(): was out of sync with corresponding pysource routine pysource.py: small doc typo
1 parent b4db22d commit 8eb4d6a

2 files changed

Lines changed: 95 additions & 33 deletions

File tree

uncompyle6/semantics/fragments.py

Lines changed: 94 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,7 +1200,7 @@ def build_ast(self, tokens, customize, code, is_lambda=False,
12001200
p_insts = self.p.insts
12011201
self.p.insts = self.scanner.insts
12021202
self.p.offset2inst_index = self.scanner.offset2inst_index
1203-
ast = parser.parse(self.p, tokens, customize)
1203+
ast = parser.parse(self.p, tokens, customize, code)
12041204
self.p.insts = p_insts
12051205
except (parser.ParserError, AssertionError) as e:
12061206
raise ParserError(e, tokens, {})
@@ -1544,7 +1544,8 @@ def n_dict(self, node):
15441544
line_seperator = ",\n" + self.indent
15451545
sep = INDENT_PER_LEVEL[:-1]
15461546
start = len(self.f.getvalue())
1547-
self.write("{")
1547+
if node[0] != "dict_entry":
1548+
self.write("{")
15481549
self.set_pos_info(node[0], start, start + 1)
15491550

15501551
if self.version >= 3.0 and not self.is_pypy:
@@ -1570,7 +1571,7 @@ def n_dict(self, node):
15701571
i += 2
15711572
pass
15721573
pass
1573-
elif node[1].kind.startswith("kvlist"):
1574+
elif len(node) > 1 and node[1].kind.startswith("kvlist"):
15741575
# Python 3.0..3.4 style key/value list in dict
15751576
kv_node = node[1]
15761577
l = list(kv_node)
@@ -1596,37 +1597,98 @@ def n_dict(self, node):
15961597
i += 3
15971598
pass
15981599
pass
1600+
elif node[-1].kind.startswith("BUILD_CONST_KEY_MAP"):
1601+
# Python 3.6+ style const map
1602+
keys = node[-2].pattr
1603+
values = node[:-2]
1604+
# FIXME: Line numbers?
1605+
for key, value in zip(keys, values):
1606+
self.write(sep)
1607+
self.write(repr(key))
1608+
line_number = self.line_number
1609+
self.write(":")
1610+
self.write(self.traverse(value[0]))
1611+
sep = ", "
1612+
if line_number != self.line_number:
1613+
sep += "\n" + self.indent + INDENT_PER_LEVEL[:-1]
1614+
line_number = self.line_number
1615+
else:
1616+
sep += " "
1617+
pass
1618+
pass
1619+
if sep.startswith(",\n"):
1620+
self.write(sep[1:])
1621+
pass
1622+
elif node[0].kind.startswith("dict_entry"):
1623+
assert self.version >= 3.5
1624+
template = ("%C", (0, len(node[0]), ", **"))
1625+
self.template_engine(template, node[0])
1626+
sep = ""
1627+
elif node[-1].kind.startswith("BUILD_MAP_UNPACK") or node[
1628+
-1
1629+
].kind.startswith("dict_entry"):
1630+
assert self.version >= 3.5
1631+
# FIXME: I think we can intermingle dict_comp's with other
1632+
# dictionary kinds of things. The most common though is
1633+
# a sequence of dict_comp's
1634+
kwargs = node[-1].attr
1635+
template = ("**%C", (0, kwargs, ", **"))
1636+
self.template_engine(template, node)
1637+
sep = ""
1638+
15991639
pass
16001640
else:
1601-
# Python 2 style kvlist
1602-
assert node[-1].kind.startswith("kvlist")
1603-
kv_node = node[-1] # goto kvlist
1604-
1605-
for kv in kv_node:
1606-
assert kv in ("kv", "kv2", "kv3")
1607-
# kv ::= DUP_TOP expr ROT_TWO expr STORE_SUBSCR
1608-
# kv2 ::= DUP_TOP expr expr ROT_THREE STORE_SUBSCR
1609-
# kv3 ::= expr expr STORE_MAP
1610-
if kv == "kv":
1611-
name = self.traverse(kv[-2], indent="")
1612-
kv[1].parent = kv_node
1613-
value = self.traverse(
1614-
kv[1], indent=self.indent + (len(name) + 2) * " "
1615-
)
1616-
elif kv == "kv2":
1617-
name = self.traverse(kv[1], indent="")
1618-
kv[-3].parent = kv_node
1619-
value = self.traverse(
1620-
kv[-3], indent=self.indent + (len(name) + 2) * " "
1621-
)
1622-
elif kv == "kv3":
1623-
name = self.traverse(kv[-2], indent="")
1624-
kv[0].parent = kv_node
1625-
value = self.traverse(
1626-
kv[0], indent=self.indent + (len(name) + 2) * " "
1627-
)
1628-
self.write(sep, name, ": ", value)
1629-
sep = line_seperator
1641+
# Python 2 style kvlist. Find beginning of kvlist.
1642+
indent = self.indent + " "
1643+
line_number = self.line_number
1644+
if node[0].kind.startswith("BUILD_MAP"):
1645+
if len(node) > 1 and node[1].kind in ("kvlist", "kvlist_n"):
1646+
kv_node = node[1]
1647+
else:
1648+
kv_node = node[1:]
1649+
self.kv_map(kv_node, sep, line_number, indent)
1650+
1651+
else:
1652+
sep = ""
1653+
opname = node[-1].kind
1654+
if self.is_pypy and self.version >= 3.5:
1655+
if opname.startswith("BUILD_CONST_KEY_MAP"):
1656+
keys = node[-2].attr
1657+
# FIXME: DRY this and the above
1658+
for i in range(len(keys)):
1659+
key = keys[i]
1660+
value = self.traverse(node[i], indent="")
1661+
self.write(sep, key, ": ", value)
1662+
sep = ", "
1663+
if line_number != self.line_number:
1664+
sep += "\n" + self.indent + " "
1665+
line_number = self.line_number
1666+
pass
1667+
pass
1668+
pass
1669+
else:
1670+
if opname.startswith("kvlist"):
1671+
list_node = node[0]
1672+
else:
1673+
list_node = node
1674+
1675+
assert list_node[-1].kind.startswith("BUILD_MAP")
1676+
for i in range(0, len(list_node) - 1, 2):
1677+
key = self.traverse(list_node[i], indent="")
1678+
value = self.traverse(list_node[i + 1], indent="")
1679+
self.write(sep, key, ": ", value)
1680+
sep = ", "
1681+
if line_number != self.line_number:
1682+
sep += "\n" + self.indent + " "
1683+
line_number = self.line_number
1684+
pass
1685+
pass
1686+
pass
1687+
elif opname.startswith("kvlist"):
1688+
kv_node = node[-1]
1689+
self.kv_map(node[-1], sep, line_number, indent)
1690+
1691+
pass
16301692
self.write("}")
16311693
finish = len(self.f.getvalue())
16321694
self.set_pos_info(node, start, finish)

uncompyle6/semantics/pysource.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1660,7 +1660,7 @@ def n_dict(self, node):
16601660
"""
16611661
prettyprint a dict
16621662
'dict' is something like k = {'a': 1, 'b': 42}"
1663-
We will source-code use line breaks to guide us when to break.
1663+
We will use source-code line breaks to guide us when to break.
16641664
"""
16651665
p = self.prec
16661666
self.prec = 100

0 commit comments

Comments
 (0)