Author: Raffael Tfirst <[email protected]>
Branch: py3.5
Changeset: r85216:bad2cce14a59
Date: 2016-06-17 20:05 +0200
http://bitbucket.org/pypy/pypy/changeset/bad2cce14a59/

Log:    Write starunpack and assignment assist methods for tuple and list

diff --git a/pypy/interpreter/astcompiler/codegen.py 
b/pypy/interpreter/astcompiler/codegen.py
--- a/pypy/interpreter/astcompiler/codegen.py
+++ b/pypy/interpreter/astcompiler/codegen.py
@@ -1017,8 +1017,33 @@
         ifexp.orelse.walkabout(self)
         self.use_next_block(end)
 
-    def _visit_list_or_tuple_starunpack(self, node, elts, ctx, op):
-        #TODO
+    def _visit_list_or_tuple_starunpack(self, node, elts, ctx, single_op, 
inner_op, outer_op):
+        elt_count = len(elts) if elts else 0
+        seen_star = 0
+        elt_subitems = 0
+        for i in range(elt_count):
+            elt = elts[i]
+            is_starred = isinstance(elt, ast.Starred)
+            if is_starred:
+                if seen_star:
+                    self.emit_op_arg(inner_op, seen_star)
+                    seen_star = 0
+                    elt_subitems += 1
+                elt.value.walkabout(self)
+                elt_subitems += 1
+            else:
+                elt.walkabout(self)
+                seen_star += 1
+        if elt_subitems:
+            if seen_star:
+                self.emit_op_arg(inner_op, seen_star)
+                elt_subitems += 1
+            self.emit_op_arg(outer_op, elt_subitems)
+        else:
+            self.emit_op_arg(single_op, seen_star)
+    
+    #_visit_starunpack
+    def _visit_list_or_tuple_assignment(self, node, elts, ctx):
         elt_count = len(elts) if elts else 0
         if ctx == ast.Store:
             seen_star = False
@@ -1038,32 +1063,6 @@
             if not seen_star:
                 self.emit_op_arg(ops.UNPACK_SEQUENCE, elt_count)
         self.visit_sequence(elts)
-        if ctx == ast.Load:
-            self.emit_op_arg(op, elt_count)
-    
-    #_visit_starunpack
-    def _visit_list_or_tuple_assignment(self, node, elts, ctx, single_op, 
innter_op, outer_op):
-        elt_count = len(elts) if elts else 0
-        if ctx == ast.Store:
-            seen_star = False
-            for i in range(elt_count):
-                elt = elts[i]
-                is_starred = isinstance(elt, ast.Starred)
-                if is_starred and not seen_star:
-                    if i >= 1 << 8 or elt_count - i - 1 >= (C_INT_MAX >> 8):
-                        self.error("too many expressions in star-unpacking "
-                                   "assignment", node)
-                    self.emit_op_arg(ops.UNPACK_EX,
-                                     i + ((elt_count - i - 1) << 8))
-                    seen_star = True
-                    elts[i] = elt.value
-                elif is_starred:
-                    self.error("two starred expressions in assignment", node)
-            if not seen_star:
-                self.emit_op_arg(ops.UNPACK_SEQUENCE, elt_count)
-        self.visit_sequence(elts)
-        #if ctx == ast.Load:
-        #    self.emit_op_arg(op, elt_count)
 
     def visit_Starred(self, star):
         if star.ctx != ast.Store:
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to