Author: Raffael Tfirst <raffael.tfi...@gmail.com>
Branch: py3.5
Changeset: r85319:bfeac9d99b15
Date: 2016-06-21 22:57 +0200
http://bitbucket.org/pypy/pypy/changeset/bfeac9d99b15/

Log:    change handling dicts in astbuilder

diff --git a/pypy/interpreter/astcompiler/astbuilder.py 
b/pypy/interpreter/astcompiler/astbuilder.py
--- a/pypy/interpreter/astcompiler/astbuilder.py
+++ b/pypy/interpreter/astcompiler/astbuilder.py
@@ -1136,6 +1136,17 @@
                 raise
             return self.space.call_function(self.space.w_float, w_num_str)
 
+    def handle_dictelement(self, node, i):
+        if node.get_child(i).type == tokens.DOUBLESTAR:
+            key = None
+            value = self.handle_expr(node.get_child(i+1))
+            i += 2
+        else:
+            key = self.handle_expr(node.get_child(i))
+            value = self.handle_expr(node.get_child(i+2))
+            i += 3
+        return [i,key,value]
+    
     def handle_atom(self, atom_node):
         first_child = atom_node.get_child(0)
         first_child_type = first_child.type
@@ -1198,26 +1209,31 @@
             return self.handle_listcomp(second_child)
         elif first_child_type == tokens.LBRACE:
             maker = atom_node.get_child(1)
+            n_maker_children = maker.num_children()
             if maker.type == tokens.RBRACE:
+                # an empty dict
                 return ast.Dict(None, None, atom_node.get_lineno(), 
atom_node.get_column())
-            n_maker_children = maker.num_children()
-            #import pdb;pdb.set_trace()
-            if n_maker_children == 1 or maker.get_child(1).type == 
tokens.COMMA:
-                elts = []
-                for i in range(0, n_maker_children, 2):
-                    elts.append(self.handle_expr(maker.get_child(i)))
-                return ast.Set(elts, atom_node.get_lineno(), 
atom_node.get_column())
-            if maker.get_child(1).type == syms.comp_for:
-                return self.handle_setcomp(maker)
-            if (n_maker_children > 3 and
-                maker.get_child(3).type == syms.comp_for):
-                return self.handle_dictcomp(maker)
-            keys = []
-            values = []
-            for i in range(0, n_maker_children, 4):
-                keys.append(self.handle_expr(maker.get_child(i)))
-                values.append(self.handle_expr(maker.get_child(i + 2)))
-            return ast.Dict(keys, values, atom_node.get_lineno(), 
atom_node.get_column())
+            else:
+                is_dict = maker.get_child(0).type == tokens.DOUBLESTAR
+                if (n_maker_children == 1 or
+                    (n_maker_children > 1 and
+                     maker.get_child(1).type == tokens.COMMA)):
+                    # a set display
+                    return handle_setdisplay(maker)
+                elif n_maker_children > 1 and maker.get_child(1).type == 
syms.comp_for:
+                    # a set comprehension
+                    return self.handle_setcomp(maker)
+                elif (n_maker_children > 3 - is_dict and
+                      maker.get_child(3-is_dict).type == syms.comp_for):
+                    # a dictionary comprehension
+                    if is_dict:
+                        raise self.error("dict unpacking cannot be used in "
+                                         "dict comprehension", atom_node)
+                    
+                    return self.handle_dictcomp(maker)
+                else:
+                    # a dictionary display
+                    return handle_dictdisplay(maker)
         else:
             raise AssertionError("unknown atom")
 
@@ -1316,11 +1332,19 @@
                            set_maker.get_column())
 
     def handle_dictcomp(self, dict_maker):
-        key = self.handle_expr(dict_maker.get_child(0))
-        value = self.handle_expr(dict_maker.get_child(2))
-        comps = self.comprehension_helper(dict_maker.get_child(3))
+        i = 0
+        dictelement = self.handle_dictelement(dict_maker, i)
+        i = dictelement[0]
+        key = dictelement[1]
+        value = dictelement[2]
+        comps = self.comprehension_helper(dict_maker.get_child(i))
         return ast.DictComp(key, value, comps, dict_maker.get_lineno(),
                             dict_maker.get_column())
+    
+    def handle_dictdisplay(self, node):
+        size = (node.num_children()+1) / 3
+        
+        return ast.Dict(keys, values, node.get_lineno(), node.get_column())
 
     def handle_exprlist(self, exprlist, context):
         exprs = []
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to