Commit b8860831 authored by DaniloFreitas's avatar DaniloFreitas

general best_match and analyse_cpp_operation

parent 9ffea24c
......@@ -4302,6 +4302,22 @@ class NumBinopNode(BinopNode):
self.operand1 = self.operand1.coerce_to(self.type, env)
self.operand2 = self.operand2.coerce_to(self.type, env)
def analyse_cpp_operation(self, env):
type1 = self.operand1.type
type2 = self.operand2.type
if type1.is_ptr:
type1 = type1.base_type
if type2.is_ptr:
type2 = type2.base_type
entry = env.lookup(type1.name)
function = entry.type.scope.lookup(self.operators[self.operator])
if not function:
error(self.pos, "'%s' operator not defined for '%s %s %s'"
% (self.operator, type1, type2, self.operator))
self.type_error()
return
self.type = self.best_match(function)
def compute_c_result_type(self, type1, type2):
if self.c_types_okay(type1, type2):
return PyrexTypes.widest_numeric_type(type1, type2)
......@@ -4391,6 +4407,12 @@ class NumBinopNode(BinopNode):
"**": "PyNumber_Power"
}
operators = {
"+": u"__add__",
"-": u"__sub__",
"*": u"__mul__"
} #for now
class IntBinopNode(NumBinopNode):
# Binary operation taking integer arguments.
......@@ -4404,22 +4426,6 @@ class IntBinopNode(NumBinopNode):
class AddNode(NumBinopNode):
# '+' operator.
def analyse_cpp_operation(self, env):
type1 = self.operand1.type
type2 = self.operand2.type
if type1.is_ptr:
type1 = type1.base_type
if type2.is_ptr:
type2 = type2.base_type
entry = env.lookup(type1.name)
function = entry.type.scope.lookup(u'__add__')
if not function:
error(self.pos, "'+' operator not defined for '%s + %s'"
% (type1, type2))
self.type_error()
return
self.type = self.best_match(function)
def is_py_operation(self):
if self.operand1.type.is_string \
and self.operand2.type.is_string:
......@@ -4441,22 +4447,6 @@ class AddNode(NumBinopNode):
class SubNode(NumBinopNode):
# '-' operator.
def analyse_cpp_operation(self, env):
type1 = self.operand1.type
type2 = self.operand2.type
if type1.is_ptr:
type1 = type1.base_type
if type2.is_ptr:
type2 = type2.base_type
entry = env.lookup(type1.name)
function = entry.type.scope.lookup(u'__sub__')
if not function:
error(self.pos, "'-' operator not defined for '%s - %s'"
% (type1, type2))
self.type_error()
return
self.type = self.best_match(function)
def compute_c_result_type(self, type1, type2):
if (type1.is_ptr or type1.is_array) and (type2.is_int or type2.is_enum):
return type1
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment