make the RHS of assignments safe if the LHS target is a subset of a RHS attribute...
authorStefan Behnel <stefan_ml@behnel.de>
Sat, 17 Nov 2012 11:24:39 +0000 (12:24 +0100)
committerStefan Behnel <stefan_ml@behnel.de>
Sat, 17 Nov 2012 11:24:39 +0000 (12:24 +0100)
--HG--
extra : transplant_source : %D5%C52%5C7%CD%85%8F%3D7%9C%27%C6%8AGb%DBX%AEe

Cython/Compiler/Nodes.py

index c3a4112..8e8a7a7 100644 (file)
@@ -4430,8 +4430,11 @@ class SingleAssignmentNode(AssignmentNode):
             dtype = self.lhs.type
 
         self.rhs = self.rhs.coerce_to(dtype, env)
-        if use_temp:
+        if use_temp or self.rhs.is_attribute:
+            # cdef attribute access traverses pointers
             self.rhs = self.rhs.coerce_to_temp(env)
+        else:
+            self.rhs = self.rhs.coerce_to_simple(env)
 
     def generate_rhs_evaluation_code(self, code):
         self.rhs.generate_evaluation_code(code)
@@ -4470,11 +4473,11 @@ class CascadedAssignmentNode(AssignmentNode):
         from ExprNodes import CloneNode, ProxyNode
 
         self.rhs.analyse_types(env)
-        if not self.rhs.is_simple():
-            if use_temp:
-                self.rhs = self.rhs.coerce_to_temp(env)
-            else:
-                self.rhs = self.rhs.coerce_to_simple(env)
+        if use_temp or self.rhs.is_attribute:
+            # (cdef) attribute access traverses pointers
+            self.rhs = self.rhs.coerce_to_temp(env)
+        else:
+            self.rhs = self.rhs.coerce_to_simple(env)
 
         self.rhs = ProxyNode(self.rhs)
         self.coerced_rhs_list = []