From 9607b5448ae48458d9eb7971d0e8c1ea3eadc765 Mon Sep 17 00:00:00 2001 From: Robert Bradshaw Date: Mon, 31 Dec 2007 11:13:26 -0800 Subject: [PATCH] Fix bug for python targets in for...from loops, allow non-integer numeric arguments. --- Cython/Compiler/ExprNodes.py | 4 ++-- Cython/Compiler/Nodes.py | 12 ++++++++---- Cython/Compiler/Version.py | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index 53629b9d..c64d5577 100644 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -2599,7 +2599,7 @@ class TypecastNode(ExprNode): error(self.pos, "Casting temporary Python object to non-Python type") if to_py and not from_py: self.result_ctype = py_object_type - self.is_temp = 1 + self.is_temp = 1 def check_const(self): self.operand.check_const() @@ -2846,7 +2846,7 @@ class NumBinopNode(BinopNode): "/": "PyNumber_Divide", "//": "PyNumber_FloorDivide", "%": "PyNumber_Remainder", - "**": "PyNumber_Power" + "**": "PyNumber_Power" } diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index cff1b93c..7f9807cb 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -2532,8 +2532,12 @@ class ForFromStatNode(StatNode): self.target.analyse_target_types(env) self.bound1.analyse_types(env) self.bound2.analyse_types(env) - self.bound1 = self.bound1.coerce_to(self.target.type, env) - self.bound2 = self.bound2.coerce_to(self.target.type, env) + if self.target.type.is_numeric: + self.bound1 = self.bound1.coerce_to(self.target.type, env) + self.bound2 = self.bound2.coerce_to(self.target.type, env) + else: + self.bound1 = self.bound1.coerce_to_integer(env) + self.bound2 = self.bound2.coerce_to_integer(env) if self.step is not None: if isinstance(self.step, ExprNodes.UnaryMinusNode): warning(self.step.pos, "Probable infinite loop in for-from-by statment. Consider switching the directions of the relations.", 2) @@ -2542,14 +2546,14 @@ class ForFromStatNode(StatNode): if not (self.bound2.is_name or self.bound2.is_literal): self.bound2 = self.bound2.coerce_to_temp(env) target_type = self.target.type - if not (target_type.is_pyobject or target_type.is_int): + if not (target_type.is_pyobject or target_type.is_numeric): error(self.target.pos, "Integer for-loop variable must be of type int or Python object") #if not (target_type.is_pyobject # or target_type.assignable_from(PyrexTypes.c_int_type)): # error(self.target.pos, # "Cannot assign integer to variable of type '%s'" % target_type) - if target_type.is_int: + if target_type.is_numeric: self.is_py_target = 0 self.loopvar_name = self.target.entry.cname self.py_loopvar_node = None diff --git a/Cython/Compiler/Version.py b/Cython/Compiler/Version.py index 5ae5a497..b71c2779 100644 --- a/Cython/Compiler/Version.py +++ b/Cython/Compiler/Version.py @@ -1 +1 @@ -version = '0.9.6.10' +version = '0.9.6.10.1' -- 2.26.2