From ea6a71acb5c79afb080855be1cb6ca30d283ec25 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Sat, 17 Nov 2012 12:24:39 +0100 Subject: [PATCH] make the RHS of assignments safe if the LHS target is a subset of a RHS attribute access --- Cython/Compiler/Nodes.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index 5f604c0..6e43475 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -4466,8 +4466,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) @@ -4506,11 +4509,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 = [] -- 2.7.4