| changeset 1182: |
935277286000 |
| parent 1181: | 4bde563221e2 |
| child 1183: | 3152381ccf89 |
| author: |
Robert Bradshaw <robertwb@math.washington.edu> |
| date: |
Sat Sep 27 13:52:44 2008 -0700 (3 months ago) |
| files: |
Cython/Compiler/ExprNodes.py Cython/Compiler/Symtab.py tests/errors/e_modop.pyx tests/run/fmod.pyx |
| description: |
Implement mod for floats. |
--- a/Cython/Compiler/ExprNodes.py Thu Sep 25 23:33:31 2008 +0200
+++ b/Cython/Compiler/ExprNodes.py Sat Sep 27 13:52:44 2008 -0700
@@ -3414,21 +3414,26 @@ class FloorDivNode(NumBinopNode):
self.operand2.result())
-class ModNode(IntBinopNode):
+class ModNode(NumBinopNode):
# '%' operator.
def is_py_operation(self):
return (self.operand1.type.is_string
or self.operand2.type.is_string
- or IntBinopNode.is_py_operation(self))
-
+ or NumBinopNode.is_py_operation(self))
+
+ def calculate_result_code(self):
+ if self.operand1.type.is_float or self.operand2.type.is_float:
+ return "fmod(%s, %s)" % (
+ self.operand1.result(),
+ self.operand2.result())
+ else:
+ return "(%s %% %s)" % (
+ self.operand1.result(),
+ self.operand2.result())
class PowNode(NumBinopNode):
# '**' operator.
-
- def analyse_types(self, env):
- env.pow_function_used = 1
- NumBinopNode.analyse_types(self, env)
def compute_c_result_type(self, type1, type2):
if self.c_types_okay(type1, type2):
--- a/Cython/Compiler/Symtab.py Thu Sep 25 23:33:31 2008 +0200
+++ b/Cython/Compiler/Symtab.py Sat Sep 27 13:52:44 2008 -0700
@@ -167,7 +167,6 @@ class Scope:
# temp_counter integer Counter for naming temp vars
# cname_to_entry {string : Entry} Temp cname to entry mapping
# int_to_entry {int : Entry} Temp cname to entry mapping
- # pow_function_used boolean The C pow() function is used
# return_type PyrexType or None Return type of function owning scope
# is_py_class_scope boolean Is a Python class scope
# is_c_class_scope boolean Is an extension type scope
@@ -221,7 +220,6 @@ class Scope:
#self.pending_temp_entries = [] # TEMPORARY
self.temp_counter = 1
self.cname_to_entry = {}
- self.pow_function_used = 0
self.string_to_entry = {}
self.identifier_to_entry = {}
self.num_to_entry = {}
@@ -637,8 +635,6 @@ class Scope:
def generate_library_function_declarations(self, code):
# Generate extern decls for C library funcs used.
- #if self.pow_function_used:
- # code.putln("%s double pow(double, double);" % Naming.extern_c_macro)
pass
def defines_any(self, names):
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/run/fmod.pyx Sat Sep 27 13:52:44 2008 -0700
@@ -0,0 +1,7 @@
+__doc__ = """
+ >>> fmod(7, 1.25)
+ 0.75
+"""
+
+def fmod(double a, double b):
+ return a % b
--- a/tests/errors/e_modop.pyx Thu Sep 25 23:33:31 2008 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-def f():
- cdef float flt1, flt2, flt3
- flt1 = flt2 % flt3 # error
-_ERRORS = u"""
-/Local/Projects/D/Pyrex/Source/Tests/Errors2/e_modop.pyx:3:13: Invalid operand types for '%' (float; float)
-"""