Commit a97c7c10 authored by Stefan Behnel's avatar Stefan Behnel

merged in latest cython-devel

parents 25432a57 172daf17
...@@ -792,11 +792,19 @@ class IntNode(ConstNode): ...@@ -792,11 +792,19 @@ class IntNode(ConstNode):
unsigned = "" unsigned = ""
longness = "" longness = ""
type = PyrexTypes.c_long_type
def __init__(self, pos, **kwds):
ExprNode.__init__(self, pos, **kwds)
if 'type' not in kwds:
rank = max(1, len(self.longness))
sign = not self.unsigned
self.type = PyrexTypes.modifiers_and_name_to_type[sign, rank, "int"]
def coerce_to(self, dst_type, env): def coerce_to(self, dst_type, env):
if self.type is dst_type: if self.type is dst_type:
return self return self
elif dst_type.is_float:
return FloatNode(self.pos, value=repr(float(self.value)))
node = IntNode(self.pos, value=self.value, node = IntNode(self.pos, value=self.value,
unsigned=self.unsigned, longness=self.longness) unsigned=self.unsigned, longness=self.longness)
if dst_type.is_numeric and not dst_type.is_complex: if dst_type.is_numeric and not dst_type.is_complex:
...@@ -5233,7 +5241,7 @@ class NumBinopNode(BinopNode): ...@@ -5233,7 +5241,7 @@ class NumBinopNode(BinopNode):
return return
if self.type.is_complex: if self.type.is_complex:
self.infix = False self.infix = False
if not self.infix: if not self.infix or (type1.is_numeric and type2.is_numeric):
self.operand1 = self.operand1.coerce_to(self.type, env) self.operand1 = self.operand1.coerce_to(self.type, env)
self.operand2 = self.operand2.coerce_to(self.type, env) self.operand2 = self.operand2.coerce_to(self.type, env)
......
...@@ -3490,7 +3490,7 @@ class InPlaceAssignmentNode(AssignmentNode): ...@@ -3490,7 +3490,7 @@ class InPlaceAssignmentNode(AssignmentNode):
import ExprNodes import ExprNodes
if self.lhs.type.is_pyobject: if self.lhs.type.is_pyobject:
self.rhs = self.rhs.coerce_to_pyobject(env) self.rhs = self.rhs.coerce_to_pyobject(env)
elif self.rhs.type.is_pyobject: elif self.rhs.type.is_pyobject or (self.lhs.type.is_numeric and self.rhs.type.is_numeric):
self.rhs = self.rhs.coerce_to(self.lhs.type, env) self.rhs = self.rhs.coerce_to(self.lhs.type, env)
if self.lhs.type.is_pyobject: if self.lhs.type.is_pyobject:
self.result_value_temp = ExprNodes.PyTempNode(self.pos, env) self.result_value_temp = ExprNodes.PyTempNode(self.pos, env)
......
...@@ -6,6 +6,7 @@ __doc__ = u""" ...@@ -6,6 +6,7 @@ __doc__ = u"""
""" """
import sys import sys
from cython cimport typeof
if sys.version_info[0] >= 3: if sys.version_info[0] >= 3:
__doc__ = __doc__.replace(u'L', u'') __doc__ = __doc__.replace(u'L', u'')
...@@ -35,3 +36,20 @@ def large_literal(): ...@@ -35,3 +36,20 @@ def large_literal():
return 0xFFFFFFFFFFFF return 0xFFFFFFFFFFFF
else: else:
return 0xFFFFFFF return 0xFFFFFFF
def c_long_types():
"""
>>> c_long_types()
long
long
long long
unsigned long
unsigned long
unsigned long long
"""
print typeof(1)
print typeof(1L)
print typeof(1LL)
print typeof(1U)
print typeof(1UL)
print typeof(1ULL)
...@@ -62,3 +62,12 @@ def test_complex(x): ...@@ -62,3 +62,12 @@ def test_complex(x):
True True
""" """
return x == 0.3333333333333333j return x == 0.3333333333333333j
def test_large_int(double x):
"""
>>> test_large_int(0)
2e+100
"""
a = x + 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
a += 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
return a
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