implement in-place assignment operators on SliceIndexNode by converting it into an...
authorStefan Behnel <stefan_ml@behnel.de>
Wed, 2 Jan 2013 20:33:09 +0000 (21:33 +0100)
committerStefan Behnel <stefan_ml@behnel.de>
Wed, 2 Jan 2013 20:33:09 +0000 (21:33 +0100)
Cython/Compiler/Parsing.py

index 3026f51..91ea03d 100644 (file)
@@ -1091,7 +1091,13 @@ def p_expression_or_assignment(s):
     if len(expr_list) == 1:
         if re.match(r"([+*/\%^\&|-]|<<|>>|\*\*|//)=", s.sy):
             lhs = expr_list[0]
-            if not isinstance(lhs, (ExprNodes.AttributeNode, ExprNodes.IndexNode, ExprNodes.NameNode) ):
+            if isinstance(lhs, ExprNodes.SliceIndexNode):
+                # implementation requires IndexNode
+                lhs = ExprNodes.IndexNode(
+                    lhs.pos,
+                    base=lhs.base,
+                    index=make_slice_node(lhs.pos, lhs.start, lhs.stop))
+            elif not isinstance(lhs, (ExprNodes.AttributeNode, ExprNodes.IndexNode, ExprNodes.NameNode) ):
                 error(lhs.pos, "Illegal operand for inplace operation.")
             operator = s.sy[:-1]
             s.next()