@@ -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 )
0 commit comments