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):
return PyrexTypes.c_double_type
# 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
#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 = {}
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
-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)
-"""