Handle sequence in DelStatNode, see #668
authorVitja Makarov <vitja.makarov@gmail.com>
Wed, 9 Mar 2011 06:01:14 +0000 (09:01 +0300)
committerVitja Makarov <vitja.makarov@gmail.com>
Wed, 9 Mar 2011 06:01:14 +0000 (09:01 +0300)
Cython/Compiler/Nodes.py
Cython/Compiler/TypeInference.py
tests/run/delete.pyx

index 609489f1758a09bde72f7a7476c64ed54c8d809f..f84bc8c8cd92ef70f2505cc248053051c32abe9e 100644 (file)
@@ -3785,12 +3785,23 @@ class DelStatNode(StatNode):
 
     child_attrs = ["args"]
 
+    def flatten_args(self):
+        return self._flatten_args(self, [])
+
+    def _flatten_args(self, seq, result):
+        for arg in seq.args:
+            if arg.is_sequence_constructor:
+                self._flatten_args(arg, result)
+            else:
+                result.append(arg)
+        return result
+
     def analyse_declarations(self, env):
-        for arg in self.args:
+        for arg in self.flatten_args():
             arg.analyse_target_declaration(env)
 
     def analyse_expressions(self, env):
-        for arg in self.args:
+        for arg in self.flatten_args():
             arg.analyse_target_expression(env, None)
             if arg.type.is_pyobject:
                 pass
@@ -3803,14 +3814,14 @@ class DelStatNode(StatNode):
             #arg.release_target_temp(env)
 
     def nogil_check(self, env):
-        for arg in self.args:
+        for arg in self.flatten_args():
             if arg.type.is_pyobject:
                 self.gil_error()
 
     gil_message = "Deleting Python object"
 
     def generate_execution_code(self, code):
-        for arg in self.args:
+        for arg in self.flatten_args():
             if arg.type.is_pyobject:
                 arg.generate_deletion_code(code)
             elif arg.type.is_ptr and arg.type.base_type.is_cpp_class:
index c788d02c3897a515dd62adbc70cc733d6758c95a..87fcb869837a85d07bc2872fc809ebc6d4874eec 100644 (file)
@@ -122,7 +122,7 @@ class MarkAssignments(CythonTransform):
         return node
 
     def visit_DelStatNode(self, node):
-        for arg in node.args:
+        for arg in node.flatten_args():
             self.mark_assignment(arg, arg)
         self.visitchildren(node)
         return node
index 7157078a0ba3b99f92162457d1ad1db275d5efd8..efe121c7994fb3c6c7ee4a191e902de55f0df24e 100644 (file)
@@ -87,3 +87,12 @@ def del_local(a):
     """
     del a
     assert a is None # Until we have unbound locals...
+
+def del_seq(a, b, c):
+    """
+    >>> del_seq(1, 2, 3)
+    """
+    del a, (b, c)
+    assert a is None # Until we have unbound locals...
+    assert b is None # Until we have unbound locals...
+    assert c is None # Until we have unbound locals...