Commit 213f561f authored by Robert Bradshaw's avatar Robert Bradshaw

long long indexing failed when sizeof(long long) < sizeof(Py_ssize_t)

parent ade90e67
...@@ -1423,7 +1423,7 @@ class IndexNode(ExprNode): ...@@ -1423,7 +1423,7 @@ class IndexNode(ExprNode):
elif not skip_child_analysis: elif not skip_child_analysis:
self.index.analyse_types(env) self.index.analyse_types(env)
if self.base.type.is_pyobject: if self.base.type.is_pyobject:
if self.index.type.is_int: if self.index.type.is_int and not self.index.type.is_longlong:
self.original_index_type = self.index.type self.original_index_type = self.index.type
self.index = self.index.coerce_to(PyrexTypes.c_py_ssize_t_type, env).coerce_to_simple(env) self.index = self.index.coerce_to(PyrexTypes.c_py_ssize_t_type, env).coerce_to_simple(env)
if getting: if getting:
......
...@@ -29,6 +29,7 @@ class PyrexType(BaseType): ...@@ -29,6 +29,7 @@ class PyrexType(BaseType):
# is_extension_type boolean Is a Python extension type # is_extension_type boolean Is a Python extension type
# is_numeric boolean Is a C numeric type # is_numeric boolean Is a C numeric type
# is_int boolean Is a C integer type # is_int boolean Is a C integer type
# is_longlong boolean Is a long long or unsigned long long.
# is_float boolean Is a C floating point type # is_float boolean Is a C floating point type
# is_void boolean Is the C void type # is_void boolean Is the C void type
# is_array boolean Is a C array type # is_array boolean Is a C array type
...@@ -79,6 +80,7 @@ class PyrexType(BaseType): ...@@ -79,6 +80,7 @@ class PyrexType(BaseType):
is_builtin_type = 0 is_builtin_type = 0
is_numeric = 0 is_numeric = 0
is_int = 0 is_int = 0
is_longlong = 0
is_float = 0 is_float = 0
is_void = 0 is_void = 0
is_array = 0 is_array = 0
...@@ -553,12 +555,14 @@ class CULongType(CUIntType): ...@@ -553,12 +555,14 @@ class CULongType(CUIntType):
class CLongLongType(CUIntType): class CLongLongType(CUIntType):
is_longlong = 1
to_py_function = "PyLong_FromLongLong" to_py_function = "PyLong_FromLongLong"
from_py_function = "__pyx_PyInt_AsLongLong" from_py_function = "__pyx_PyInt_AsLongLong"
class CULongLongType(CUIntType): class CULongLongType(CUIntType):
is_longlong = 1
to_py_function = "PyLong_FromUnsignedLongLong" to_py_function = "PyLong_FromUnsignedLongLong"
from_py_function = "__pyx_PyInt_AsUnsignedLongLong" from_py_function = "__pyx_PyInt_AsUnsignedLongLong"
......
__doc__ = """
>>> D = set_longlong(2**40, 2**50, 2, "yelp")
>>> D[2**40]
'yelp'
>>> D[2**50]
'yelp'
>>> D[2]
'yelp'
"""
ctypedef long long foo
def set_longlong(long long ob, foo x, long y, val):
tank = {}
tank[ob] = val
tank[x] = val
tank[y] = val
return tank
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