summaryrefslogtreecommitdiff
path: root/Cython/Compiler/ExprNodes.py
diff options
context:
space:
mode:
Diffstat (limited to 'Cython/Compiler/ExprNodes.py')
-rw-r--r--Cython/Compiler/ExprNodes.py28
1 files changed, 19 insertions, 9 deletions
diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py
index 746e1772b..305eae9eb 100644
--- a/Cython/Compiler/ExprNodes.py
+++ b/Cython/Compiler/ExprNodes.py
@@ -12118,30 +12118,40 @@ class CondExprNode(ExprNode):
return self.analyse_result_type(env)
def analyse_result_type(self, env):
- self.type = PyrexTypes.independent_spanning_type(
- self.true_val.type, self.false_val.type)
+ true_val_type = self.true_val.type
+ false_val_type = self.false_val.type
+ self.type = PyrexTypes.independent_spanning_type(true_val_type, false_val_type)
+
if self.type.is_reference:
self.type = PyrexTypes.CFakeReferenceType(self.type.ref_base_type)
if self.type.is_pyobject:
self.result_ctype = py_object_type
elif self.true_val.is_ephemeral() or self.false_val.is_ephemeral():
error(self.pos, "Unsafe C derivative of temporary Python reference used in conditional expression")
- if self.true_val.type.is_pyobject or self.false_val.type.is_pyobject:
- self.true_val = self.true_val.coerce_to(self.type, env)
- self.false_val = self.false_val.coerce_to(self.type, env)
+
+ if true_val_type.is_pyobject or false_val_type.is_pyobject:
+ if true_val_type != self.type:
+ self.true_val = self.true_val.coerce_to(self.type, env)
+ if false_val_type != self.type:
+ self.false_val = self.false_val.coerce_to(self.type, env)
+
if self.type.is_error:
self.type_error()
return self
def coerce_to_integer(self, env):
- self.true_val = self.true_val.coerce_to_integer(env)
- self.false_val = self.false_val.coerce_to_integer(env)
+ if not self.true_val.type.is_int:
+ self.true_val = self.true_val.coerce_to_integer(env)
+ if not self.false_val.type.is_int:
+ self.false_val = self.false_val.coerce_to_integer(env)
self.result_ctype = None
return self.analyse_result_type(env)
def coerce_to(self, dst_type, env):
- self.true_val = self.true_val.coerce_to(dst_type, env)
- self.false_val = self.false_val.coerce_to(dst_type, env)
+ if self.true_val.type != dst_type:
+ self.true_val = self.true_val.coerce_to(dst_type, env)
+ if self.false_val.type != dst_type:
+ self.false_val = self.false_val.coerce_to(dst_type, env)
self.result_ctype = None
return self.analyse_result_type(env)