|
Packit |
562c7a |
# cython: infer_types = True
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cimport cython
|
|
Packit |
562c7a |
from cython cimport typeof, infer_types
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
from cpython cimport bool
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
##################################################
|
|
Packit |
562c7a |
# type inference tests in 'full' mode
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef class MyType:
|
|
Packit |
562c7a |
pass
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def simple():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> simple()
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
i = 3
|
|
Packit |
562c7a |
assert typeof(i) == "long", typeof(i)
|
|
Packit |
562c7a |
x = 1.41
|
|
Packit |
562c7a |
assert typeof(x) == "double", typeof(x)
|
|
Packit |
562c7a |
xptr = &x
|
|
Packit |
562c7a |
assert typeof(xptr) == "double *", typeof(xptr)
|
|
Packit |
562c7a |
xptrptr = &xptr
|
|
Packit |
562c7a |
assert typeof(xptrptr) == "double **", typeof(xptrptr)
|
|
Packit |
562c7a |
b = b"abc"
|
|
Packit |
562c7a |
assert typeof(b) == "bytes object", typeof(b)
|
|
Packit |
562c7a |
s = "abc"
|
|
Packit |
562c7a |
assert typeof(s) == "str object", typeof(s)
|
|
Packit |
562c7a |
u = u"xyz"
|
|
Packit |
562c7a |
assert typeof(u) == "unicode object", typeof(u)
|
|
Packit |
562c7a |
L = [1,2,3]
|
|
Packit |
562c7a |
assert typeof(L) == "list object", typeof(L)
|
|
Packit |
562c7a |
t = (4,5,6,())
|
|
Packit |
562c7a |
assert typeof(t) == "tuple object", typeof(t)
|
|
Packit |
562c7a |
t2 = (4, 5.0, 6)
|
|
Packit |
562c7a |
assert typeof(t2) == "(long, double, long)", typeof(t)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def builtin_types():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> builtin_types()
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
b = bytes()
|
|
Packit |
562c7a |
assert typeof(b) == "bytes object", typeof(b)
|
|
Packit |
562c7a |
u = unicode()
|
|
Packit |
562c7a |
assert typeof(u) == "unicode object", typeof(u)
|
|
Packit |
562c7a |
L = list()
|
|
Packit |
562c7a |
assert typeof(L) == "list object", typeof(L)
|
|
Packit |
562c7a |
t = tuple()
|
|
Packit |
562c7a |
assert typeof(t) == "tuple object", typeof(t)
|
|
Packit |
562c7a |
d = dict()
|
|
Packit |
562c7a |
assert typeof(d) == "dict object", typeof(d)
|
|
Packit |
562c7a |
B = bool()
|
|
Packit |
562c7a |
assert typeof(B) == "bool", typeof(B)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def slicing():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> slicing()
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
b = b"abc"
|
|
Packit |
562c7a |
assert typeof(b) == "bytes object", typeof(b)
|
|
Packit |
562c7a |
b1 = b[1:2]
|
|
Packit |
562c7a |
assert typeof(b1) == "bytes object", typeof(b1)
|
|
Packit |
562c7a |
b2 = b[1:2:2]
|
|
Packit |
562c7a |
assert typeof(b2) == "bytes object", typeof(b2)
|
|
Packit |
562c7a |
u = u"xyz"
|
|
Packit |
562c7a |
assert typeof(u) == "unicode object", typeof(u)
|
|
Packit |
562c7a |
u1 = u[1:2]
|
|
Packit |
562c7a |
assert typeof(u1) == "unicode object", typeof(u1)
|
|
Packit |
562c7a |
u2 = u[1:2:2]
|
|
Packit |
562c7a |
assert typeof(u2) == "unicode object", typeof(u2)
|
|
Packit |
562c7a |
s = "xyz"
|
|
Packit |
562c7a |
assert typeof(s) == "str object", typeof(s)
|
|
Packit |
562c7a |
s1 = s[1:2]
|
|
Packit |
562c7a |
assert typeof(s1) == "str object", typeof(s1)
|
|
Packit |
562c7a |
s2 = s[1:2:2]
|
|
Packit |
562c7a |
assert typeof(s2) == "str object", typeof(s2)
|
|
Packit |
562c7a |
L = [1,2,3]
|
|
Packit |
562c7a |
assert typeof(L) == "list object", typeof(L)
|
|
Packit |
562c7a |
L1 = L[1:2]
|
|
Packit |
562c7a |
assert typeof(L1) == "list object", typeof(L1)
|
|
Packit |
562c7a |
L2 = L[1:2:2]
|
|
Packit |
562c7a |
assert typeof(L2) == "list object", typeof(L2)
|
|
Packit |
562c7a |
t = (4,5,6,())
|
|
Packit |
562c7a |
assert typeof(t) == "tuple object", typeof(t)
|
|
Packit |
562c7a |
t1 = t[1:2]
|
|
Packit |
562c7a |
assert typeof(t1) == "tuple object", typeof(t1)
|
|
Packit |
562c7a |
t2 = t[1:2:2]
|
|
Packit |
562c7a |
assert typeof(t2) == "tuple object", typeof(t2)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def indexing():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> indexing()
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
b = b"abc"
|
|
Packit |
562c7a |
assert typeof(b) == "bytes object", typeof(b)
|
|
Packit |
562c7a |
b1 = b[1]
|
|
Packit |
562c7a |
assert typeof(b1) == "Python object", typeof(b1) # Py2: bytes, Py3: int
|
|
Packit |
562c7a |
u = u"xyz"
|
|
Packit |
562c7a |
assert typeof(u) == "unicode object", typeof(u)
|
|
Packit |
562c7a |
u1 = u[1]
|
|
Packit |
562c7a |
assert typeof(u1) == "Py_UCS4", typeof(u1)
|
|
Packit |
562c7a |
s = "xyz"
|
|
Packit |
562c7a |
assert typeof(s) == "str object", typeof(s)
|
|
Packit |
562c7a |
s1 = s[1]
|
|
Packit |
562c7a |
assert typeof(s1) == "str object", typeof(s1)
|
|
Packit |
562c7a |
L = [1,2,3]
|
|
Packit |
562c7a |
assert typeof(L) == "list object", typeof(L)
|
|
Packit |
562c7a |
L1 = L[1]
|
|
Packit |
562c7a |
assert typeof(L1) == "Python object", typeof(L1)
|
|
Packit |
562c7a |
t = (4,5,())
|
|
Packit |
562c7a |
assert typeof(t) == "tuple object", typeof(t)
|
|
Packit |
562c7a |
t1 = t[1]
|
|
Packit |
562c7a |
assert typeof(t1) == "long", typeof(t1)
|
|
Packit |
562c7a |
t2 = ('abc', 'def', 'ghi')
|
|
Packit |
562c7a |
assert typeof(t2) == "tuple object", typeof(t2)
|
|
Packit |
562c7a |
t2_1 = t2[1]
|
|
Packit |
562c7a |
assert typeof(t2_1) == "str object", typeof(t2_1)
|
|
Packit |
562c7a |
t2_2 = t2[t[0]-3]
|
|
Packit |
562c7a |
assert typeof(t2_2) == "str object", typeof(t2_2)
|
|
Packit |
562c7a |
t5 = (b'abc', 'def', u'ghi')
|
|
Packit |
562c7a |
t5_0 = t5[0]
|
|
Packit |
562c7a |
assert typeof(t5_0) == "bytes object", typeof(t5_0)
|
|
Packit |
562c7a |
t5_1 = t5[1]
|
|
Packit |
562c7a |
assert typeof(t5_1) == "str object", typeof(t5_1)
|
|
Packit |
562c7a |
t5_2 = t5[2]
|
|
Packit |
562c7a |
assert typeof(t5_2) == "unicode object", typeof(t5_2)
|
|
Packit |
562c7a |
t5_3 = t5[t[0]-3]
|
|
Packit |
562c7a |
assert typeof(t5_3) == "Python object", typeof(t5_3)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def multiple_assignments():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> multiple_assignments()
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
a = 3
|
|
Packit |
562c7a |
a = 4
|
|
Packit |
562c7a |
a = 5
|
|
Packit |
562c7a |
assert typeof(a) == "long", typeof(a)
|
|
Packit |
562c7a |
b = a
|
|
Packit |
562c7a |
b = 3.1
|
|
Packit |
562c7a |
b = 3.14159
|
|
Packit |
562c7a |
assert typeof(b) == "double", typeof(b)
|
|
Packit |
562c7a |
c = a
|
|
Packit |
562c7a |
c = b
|
|
Packit |
562c7a |
c = [1,2,3]
|
|
Packit |
562c7a |
assert typeof(c) == "Python object", typeof(c)
|
|
Packit |
562c7a |
d = b'abc'
|
|
Packit |
562c7a |
d = bytes()
|
|
Packit |
562c7a |
d = bytes(b'xyz')
|
|
Packit |
562c7a |
d = None
|
|
Packit |
562c7a |
assert typeof(d) == "bytes object", typeof(d)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def arithmetic():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> arithmetic()
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
a = 1 + 2
|
|
Packit |
562c7a |
assert typeof(a) == "long", typeof(a)
|
|
Packit |
562c7a |
b = 1 + 1.5
|
|
Packit |
562c7a |
assert typeof(b) == "double", typeof(b)
|
|
Packit |
562c7a |
c = 1 + <object>2
|
|
Packit |
562c7a |
assert typeof(c) == "Python object", typeof(c)
|
|
Packit |
562c7a |
d = 1 * 1.5 ** 2
|
|
Packit |
562c7a |
assert typeof(d) == "double", typeof(d)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef class some_class:
|
|
Packit |
562c7a |
pass
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def unary_operators():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> unary_operators()
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef int x = 1
|
|
Packit |
562c7a |
assert typeof(~x) == "int", typeof(~x)
|
|
Packit |
562c7a |
cdef some_class obj
|
|
Packit |
562c7a |
assert typeof(~obj) == "Python object", typeof(~obj)
|
|
Packit |
562c7a |
a = int(1)
|
|
Packit |
562c7a |
assert typeof(a) == "Python object", typeof(a)
|
|
Packit |
562c7a |
b = not int(3)
|
|
Packit |
562c7a |
assert typeof(b) == "bint", typeof(b)
|
|
Packit |
562c7a |
c = +int(3)
|
|
Packit |
562c7a |
assert typeof(c) == "Python object", typeof(c)
|
|
Packit |
562c7a |
d = -int(5)
|
|
Packit |
562c7a |
assert typeof(d) == "Python object", typeof(d)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def builtin_type_operations():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> builtin_type_operations()
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
b1 = b'a' * 10
|
|
Packit |
562c7a |
b1 = 10 * b'a'
|
|
Packit |
562c7a |
b1 = 10 * b'a' * 10
|
|
Packit |
562c7a |
assert typeof(b1) == "bytes object", typeof(b1)
|
|
Packit |
562c7a |
b2 = b'a' + b'b'
|
|
Packit |
562c7a |
assert typeof(b2) == "bytes object", typeof(b2)
|
|
Packit |
562c7a |
u1 = u'a' * 10
|
|
Packit |
562c7a |
u1 = 10 * u'a'
|
|
Packit |
562c7a |
assert typeof(u1) == "unicode object", typeof(u1)
|
|
Packit |
562c7a |
u2 = u'a' + u'b'
|
|
Packit |
562c7a |
assert typeof(u2) == "unicode object", typeof(u2)
|
|
Packit |
562c7a |
u3 = u'a%s' % u'b'
|
|
Packit |
562c7a |
u3 = u'a%s' % 10
|
|
Packit |
562c7a |
assert typeof(u3) == "unicode object", typeof(u3)
|
|
Packit |
562c7a |
s1 = "abc %s" % "x"
|
|
Packit |
562c7a |
s1 = "abc %s" % 10
|
|
Packit |
562c7a |
assert typeof(s1) == "str object", typeof(s1)
|
|
Packit |
562c7a |
s2 = "abc %s" + "x"
|
|
Packit |
562c7a |
assert typeof(s2) == "str object", typeof(s2)
|
|
Packit |
562c7a |
s3 = "abc %s" * 10
|
|
Packit |
562c7a |
s3 = "abc %s" * 10 * 10
|
|
Packit |
562c7a |
s3 = 10 * "abc %s" * 10
|
|
Packit |
562c7a |
assert typeof(s3) == "str object", typeof(s3)
|
|
Packit |
562c7a |
L1 = [] + []
|
|
Packit |
562c7a |
assert typeof(L1) == "list object", typeof(L1)
|
|
Packit |
562c7a |
L2 = [] * 2
|
|
Packit |
562c7a |
assert typeof(L2) == "list object", typeof(L2)
|
|
Packit |
562c7a |
T1 = () + ()
|
|
Packit |
562c7a |
assert typeof(T1) == "tuple object", typeof(T1)
|
|
Packit |
562c7a |
T2 = () * 2
|
|
Packit |
562c7a |
assert typeof(T2) == "tuple object", typeof(T2)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def builtin_type_methods():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> builtin_type_methods()
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
l = []
|
|
Packit |
562c7a |
assert typeof(l) == 'list object', typeof(l)
|
|
Packit |
562c7a |
append = l.append
|
|
Packit |
562c7a |
assert typeof(append) == 'Python object', typeof(append)
|
|
Packit |
562c7a |
append(1)
|
|
Packit |
562c7a |
assert l == [1], str(l)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef int cfunc(int x):
|
|
Packit |
562c7a |
return x+1
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def c_functions():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> c_functions()
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
f = cfunc
|
|
Packit |
562c7a |
assert typeof(f) == 'int (*)(int)', typeof(f)
|
|
Packit |
562c7a |
assert 2 == f(1)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def builtin_functions():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> _abs, _getattr = builtin_functions()
|
|
Packit |
562c7a |
Python object
|
|
Packit |
562c7a |
Python object
|
|
Packit |
562c7a |
>>> _abs(-1)
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
>>> class o(object): pass
|
|
Packit |
562c7a |
>>> o.x = 1
|
|
Packit |
562c7a |
>>> _getattr(o, 'x')
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
_abs = abs
|
|
Packit |
562c7a |
print(typeof(_abs))
|
|
Packit |
562c7a |
_getattr = getattr
|
|
Packit |
562c7a |
print(typeof(_getattr))
|
|
Packit |
562c7a |
return _abs, _getattr
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def cascade():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> cascade()
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
a = 1.0
|
|
Packit |
562c7a |
b = a + 2
|
|
Packit |
562c7a |
c = b + 3
|
|
Packit |
562c7a |
d = c + 4
|
|
Packit |
562c7a |
assert typeof(d) == "double"
|
|
Packit |
562c7a |
e = a + b + c + d
|
|
Packit |
562c7a |
assert typeof(e) == "double"
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def cascaded_assignment():
|
|
Packit |
562c7a |
a = b = c = d = 1.0
|
|
Packit |
562c7a |
assert typeof(a) == "double"
|
|
Packit |
562c7a |
assert typeof(b) == "double"
|
|
Packit |
562c7a |
assert typeof(c) == "double"
|
|
Packit |
562c7a |
assert typeof(d) == "double"
|
|
Packit |
562c7a |
e = a + b + c + d
|
|
Packit |
562c7a |
assert typeof(e) == "double"
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def increment():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> increment()
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
a = 5
|
|
Packit |
562c7a |
a += 1
|
|
Packit |
562c7a |
assert typeof(a) == "long"
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def loop():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> loop()
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
for a in range(10):
|
|
Packit |
562c7a |
pass
|
|
Packit |
562c7a |
assert typeof(a) == "long"
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
b = 1.0
|
|
Packit |
562c7a |
for b in range(5):
|
|
Packit |
562c7a |
pass
|
|
Packit |
562c7a |
assert typeof(b) == "double"
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
for c from 0 <= c < 10 by .5:
|
|
Packit |
562c7a |
pass
|
|
Packit |
562c7a |
assert typeof(c) == "double"
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
for d in range(0, 10L, 2):
|
|
Packit |
562c7a |
pass
|
|
Packit |
562c7a |
assert typeof(a) == "long"
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def loop_over_charptr():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> print( loop_over_charptr() )
|
|
Packit |
562c7a |
char
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef char* char_ptr_string = 'abcdefg'
|
|
Packit |
562c7a |
for c in char_ptr_string:
|
|
Packit |
562c7a |
pass
|
|
Packit |
562c7a |
return typeof(c)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def loop_over_bytes_literal():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> print( loop_over_bytes_literal() )
|
|
Packit |
562c7a |
Python object
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
for c in b'abcdefg':
|
|
Packit |
562c7a |
pass
|
|
Packit |
562c7a |
return typeof(c)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def loop_over_bytes():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> print( loop_over_bytes() )
|
|
Packit |
562c7a |
Python object
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef bytes bytes_string = b'abcdefg'
|
|
Packit |
562c7a |
# bytes in Py2, int in Py3
|
|
Packit |
562c7a |
for c in bytes_string:
|
|
Packit |
562c7a |
pass
|
|
Packit |
562c7a |
return typeof(c)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def loop_over_str():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> print( loop_over_str() )
|
|
Packit |
562c7a |
str object
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef str string = 'abcdefg'
|
|
Packit |
562c7a |
# str (bytes) in Py2, str (unicode) in Py3
|
|
Packit |
562c7a |
for c in string:
|
|
Packit |
562c7a |
pass
|
|
Packit |
562c7a |
return typeof(c)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def loop_over_unicode():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> print( loop_over_unicode() )
|
|
Packit |
562c7a |
Py_UCS4
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef unicode ustring = u'abcdefg'
|
|
Packit |
562c7a |
# Py_UCS4 can represent any Unicode character
|
|
Packit |
562c7a |
for uchar in ustring:
|
|
Packit |
562c7a |
pass
|
|
Packit |
562c7a |
return typeof(uchar)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def loop_over_unicode_literal():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> print( loop_over_unicode_literal() )
|
|
Packit |
562c7a |
Py_UCS4
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
# Py_UCS4 can represent any Unicode character
|
|
Packit |
562c7a |
for uchar in u'abcdefg':
|
|
Packit |
562c7a |
pass
|
|
Packit |
562c7a |
return typeof(uchar)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def loop_over_int_array():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> print( loop_over_int_array() )
|
|
Packit |
562c7a |
int
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef int[10] int_array
|
|
Packit |
562c7a |
for i in int_array:
|
|
Packit |
562c7a |
pass
|
|
Packit |
562c7a |
return typeof(i)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef struct MyStruct:
|
|
Packit |
562c7a |
int a
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def loop_over_struct_ptr():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> print( loop_over_struct_ptr() )
|
|
Packit |
562c7a |
MyStruct
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef MyStruct[10] a_list
|
|
Packit |
562c7a |
cdef MyStruct *a_ptr = a_list
|
|
Packit |
562c7a |
for i in a_list[:10]:
|
|
Packit |
562c7a |
pass
|
|
Packit |
562c7a |
return typeof(i)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef unicode retu():
|
|
Packit |
562c7a |
return u"12345"
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef bytes retb():
|
|
Packit |
562c7a |
return b"12345"
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def conditional(x):
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> conditional(True)
|
|
Packit |
562c7a |
(True, 'Python object')
|
|
Packit |
562c7a |
>>> conditional(False)
|
|
Packit |
562c7a |
(False, 'Python object')
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
if x:
|
|
Packit |
562c7a |
a = retu()
|
|
Packit |
562c7a |
else:
|
|
Packit |
562c7a |
a = retb()
|
|
Packit |
562c7a |
return type(a) is unicode, typeof(a)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
##################################################
|
|
Packit |
562c7a |
# type inference tests that work in 'safe' mode
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@infer_types(None)
|
|
Packit |
562c7a |
def double_inference():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> values, types = double_inference()
|
|
Packit |
562c7a |
>>> values == (1.0, 1.0*2, 1.0*2.0+2.0*2.0, 1.0*2.0)
|
|
Packit |
562c7a |
True
|
|
Packit |
562c7a |
>>> types
|
|
Packit |
562c7a |
('double', 'double', 'double', 'Python object')
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
d_a = 1.0
|
|
Packit |
562c7a |
d_b = d_a * float(2)
|
|
Packit |
562c7a |
d_c = d_a * float(some_float_value()) + d_b * float(some_float_value())
|
|
Packit |
562c7a |
o_d = d_a * some_float_value()
|
|
Packit |
562c7a |
return (d_a,d_b,d_c,o_d), (typeof(d_a), typeof(d_b), typeof(d_c), typeof(o_d))
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef object some_float_value():
|
|
Packit |
562c7a |
return 2.0
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@infer_types(None)
|
|
Packit |
562c7a |
@cython.test_fail_if_path_exists('//DefNode//NameNode[@type.is_pyobject = True]')
|
|
Packit |
562c7a |
@cython.test_assert_path_exists('//DefNode//NameNode[@type.is_pyobject]',
|
|
Packit |
562c7a |
'//DefNode//NameNode[@type.is_pyobject = False]')
|
|
Packit |
562c7a |
def double_loop():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> double_loop() == 1.0 * 10
|
|
Packit |
562c7a |
True
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef int i
|
|
Packit |
562c7a |
d = 1.0
|
|
Packit |
562c7a |
for i in range(9):
|
|
Packit |
562c7a |
d += 1.0
|
|
Packit |
562c7a |
return d
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@infer_types(None)
|
|
Packit |
562c7a |
def safe_only():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> safe_only()
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
a = 1.0
|
|
Packit |
562c7a |
assert typeof(a) == "double", typeof(c)
|
|
Packit |
562c7a |
b = 1;
|
|
Packit |
562c7a |
assert typeof(b) == "long", typeof(b)
|
|
Packit |
562c7a |
c = MyType()
|
|
Packit |
562c7a |
assert typeof(c) == "MyType", typeof(c)
|
|
Packit |
562c7a |
for i in range(10): pass
|
|
Packit |
562c7a |
assert typeof(i) == "long", typeof(i)
|
|
Packit |
562c7a |
d = 1
|
|
Packit |
562c7a |
res = ~d
|
|
Packit |
562c7a |
assert typeof(d) == "long", typeof(d)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
# we special-case inference to type str, see
|
|
Packit |
562c7a |
# trac #553
|
|
Packit |
562c7a |
s = "abc"
|
|
Packit |
562c7a |
assert typeof(s) == "Python object", typeof(s)
|
|
Packit |
562c7a |
cdef str t = "def"
|
|
Packit |
562c7a |
assert typeof(t) == "str object", typeof(t)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
# potentially overflowing arithmetic
|
|
Packit |
562c7a |
e = 1
|
|
Packit |
562c7a |
e += 1
|
|
Packit |
562c7a |
assert typeof(e) == "Python object", typeof(e)
|
|
Packit |
562c7a |
f = 1
|
|
Packit |
562c7a |
res = f * 10
|
|
Packit |
562c7a |
assert typeof(f) == "Python object", typeof(f)
|
|
Packit |
562c7a |
g = 1
|
|
Packit |
562c7a |
res = 10*(~g)
|
|
Packit |
562c7a |
assert typeof(g) == "Python object", typeof(g)
|
|
Packit |
562c7a |
for j in range(10):
|
|
Packit |
562c7a |
res = -j
|
|
Packit |
562c7a |
assert typeof(j) == "Python object", typeof(j)
|
|
Packit |
562c7a |
h = 1
|
|
Packit |
562c7a |
res = abs(h)
|
|
Packit |
562c7a |
assert typeof(h) == "Python object", typeof(h)
|
|
Packit |
562c7a |
cdef int c_int = 1
|
|
Packit |
562c7a |
assert typeof(abs(c_int)) == "int", typeof(abs(c_int))
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@infer_types(None)
|
|
Packit |
562c7a |
def safe_c_functions():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> safe_c_functions()
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
f = cfunc
|
|
Packit |
562c7a |
assert typeof(f) == 'int (*)(int)', typeof(f)
|
|
Packit |
562c7a |
assert 2 == f(1)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@infer_types(None)
|
|
Packit |
562c7a |
def ptr_types():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> ptr_types()
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef int a
|
|
Packit |
562c7a |
a_ptr = &a
|
|
Packit |
562c7a |
assert typeof(a_ptr) == "int *", typeof(a_ptr)
|
|
Packit |
562c7a |
a_ptr_ptr = &a_ptr
|
|
Packit |
562c7a |
assert typeof(a_ptr_ptr) == "int **", typeof(a_ptr_ptr)
|
|
Packit |
562c7a |
cdef int[1] b
|
|
Packit |
562c7a |
b_ref = b
|
|
Packit |
562c7a |
assert typeof(b_ref) == "int *", typeof(b_ref)
|
|
Packit |
562c7a |
ptr = &a
|
|
Packit |
562c7a |
ptr = b
|
|
Packit |
562c7a |
assert typeof(ptr) == "int *", typeof(ptr)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def const_types(const double x, double y, double& z):
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> const_types(1, 1, 1)
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
a = x
|
|
Packit |
562c7a |
a = y
|
|
Packit |
562c7a |
a = z
|
|
Packit |
562c7a |
assert typeof(a) == "double", typeof(a)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@infer_types(None)
|
|
Packit |
562c7a |
def args_tuple_keywords(*args, **kwargs):
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> args_tuple_keywords(1,2,3, a=1, b=2)
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
assert typeof(args) == "tuple object", typeof(args)
|
|
Packit |
562c7a |
assert typeof(kwargs) == "dict object", typeof(kwargs)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@infer_types(None)
|
|
Packit |
562c7a |
def args_tuple_keywords_reassign_same(*args, **kwargs):
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> args_tuple_keywords_reassign_same(1,2,3, a=1, b=2)
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
assert typeof(args) == "tuple object", typeof(args)
|
|
Packit |
562c7a |
assert typeof(kwargs) == "dict object", typeof(kwargs)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
args = ()
|
|
Packit |
562c7a |
kwargs = {}
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@infer_types(None)
|
|
Packit |
562c7a |
def args_tuple_keywords_reassign_pyobjects(*args, **kwargs):
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> args_tuple_keywords_reassign_pyobjects(1,2,3, a=1, b=2)
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
assert typeof(args) == "Python object", typeof(args)
|
|
Packit |
562c7a |
assert typeof(kwargs) == "Python object", typeof(kwargs)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
args = []
|
|
Packit |
562c7a |
kwargs = "test"
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
# / A -> AA -> AAA
|
|
Packit |
562c7a |
# Base0 -> Base -
|
|
Packit |
562c7a |
# \ B -> BB
|
|
Packit |
562c7a |
# C -> CC
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef class Base0: pass
|
|
Packit |
562c7a |
cdef class Base(Base0): pass
|
|
Packit |
562c7a |
cdef class A(Base): pass
|
|
Packit |
562c7a |
cdef class AA(A): pass
|
|
Packit |
562c7a |
cdef class AAA(AA): pass
|
|
Packit |
562c7a |
cdef class B(Base): pass
|
|
Packit |
562c7a |
cdef class BB(B): pass
|
|
Packit |
562c7a |
cdef class C: pass
|
|
Packit |
562c7a |
cdef class CC(C): pass
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@infer_types(None)
|
|
Packit |
562c7a |
def common_extension_type_base():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> common_extension_type_base()
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
x = A()
|
|
Packit |
562c7a |
x = AA()
|
|
Packit |
562c7a |
assert typeof(x) == "A", typeof(x)
|
|
Packit |
562c7a |
y = A()
|
|
Packit |
562c7a |
y = B()
|
|
Packit |
562c7a |
assert typeof(y) == "Base", typeof(y)
|
|
Packit |
562c7a |
z = AAA()
|
|
Packit |
562c7a |
z = BB()
|
|
Packit |
562c7a |
assert typeof(z) == "Base", typeof(z)
|
|
Packit |
562c7a |
w = A()
|
|
Packit |
562c7a |
w = CC()
|
|
Packit |
562c7a |
assert typeof(w) == "Python object", typeof(w)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef class AcceptsKeywords:
|
|
Packit |
562c7a |
def __init__(self, *args, **kwds):
|
|
Packit |
562c7a |
pass
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@infer_types(None)
|
|
Packit |
562c7a |
def constructor_call():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> constructor_call()
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
x = AcceptsKeywords(a=1, b=2)
|
|
Packit |
562c7a |
assert typeof(x) == "AcceptsKeywords", typeof(x)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@infer_types(None)
|
|
Packit |
562c7a |
def large_literals():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> large_literals()
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
# It's only safe to infer small integer literals.
|
|
Packit |
562c7a |
a = 10
|
|
Packit |
562c7a |
b = 100000000000000000000000000000000
|
|
Packit |
562c7a |
assert typeof(a) == "long", typeof(a)
|
|
Packit |
562c7a |
assert typeof(b) == "Python object", typeof(b)
|
|
Packit |
562c7a |
c, d = 10, 100000000000000000000000000000000
|
|
Packit |
562c7a |
assert typeof(c) == "long", typeof(c)
|
|
Packit |
562c7a |
assert typeof(d) == "Python object", typeof(d)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
class EmptyContextManager(object):
|
|
Packit |
562c7a |
def __enter__(self):
|
|
Packit |
562c7a |
return None
|
|
Packit |
562c7a |
def __exit__(self, *args):
|
|
Packit |
562c7a |
return 0
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def with_statement():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> with_statement()
|
|
Packit |
562c7a |
Python object
|
|
Packit |
562c7a |
Python object
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
x = 1.0
|
|
Packit |
562c7a |
with EmptyContextManager() as x:
|
|
Packit |
562c7a |
print(typeof(x))
|
|
Packit |
562c7a |
print(typeof(x))
|
|
Packit |
562c7a |
return x
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@cython.final
|
|
Packit |
562c7a |
cdef class TypedContextManager(object):
|
|
Packit |
562c7a |
cpdef double __enter__(self):
|
|
Packit |
562c7a |
return 2.0
|
|
Packit |
562c7a |
def __exit__(self, *args):
|
|
Packit |
562c7a |
return 0
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def with_statement_typed():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> with_statement_typed()
|
|
Packit |
562c7a |
double
|
|
Packit |
562c7a |
double
|
|
Packit |
562c7a |
2.0
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
x = 1.0
|
|
Packit |
562c7a |
with TypedContextManager() as x:
|
|
Packit |
562c7a |
print(typeof(x))
|
|
Packit |
562c7a |
print(typeof(x))
|
|
Packit |
562c7a |
return x
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def with_statement_untyped():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> with_statement_untyped()
|
|
Packit |
562c7a |
Python object
|
|
Packit |
562c7a |
Python object
|
|
Packit |
562c7a |
2.0
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
x = 1.0
|
|
Packit |
562c7a |
cdef object t = TypedContextManager()
|
|
Packit |
562c7a |
with t as x:
|
|
Packit |
562c7a |
print(typeof(x))
|
|
Packit |
562c7a |
print(typeof(x))
|
|
Packit |
562c7a |
return x
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def self_lookup(a):
|
|
Packit |
562c7a |
b = a
|
|
Packit |
562c7a |
b = b.foo(keyword=None)
|
|
Packit |
562c7a |
print typeof(b)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
# Regression test for trac #638.
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def bar(foo):
|
|
Packit |
562c7a |
qux = foo
|
|
Packit |
562c7a |
quux = foo[qux.baz]
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef enum MyEnum:
|
|
Packit |
562c7a |
enum_x = 1
|
|
Packit |
562c7a |
enum_y = 2
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
ctypedef long my_long
|
|
Packit |
562c7a |
def test_int_typedef_inference():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> test_int_typedef_inference()
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef long x = 1
|
|
Packit |
562c7a |
cdef my_long y = 2
|
|
Packit |
562c7a |
cdef long long z = 3
|
|
Packit |
562c7a |
assert typeof(x + y) == typeof(y + x) == 'my_long', typeof(x + y)
|
|
Packit |
562c7a |
assert typeof(y + z) == typeof(z + y) == 'long long', typeof(y + z)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
from libc.stdint cimport int32_t, int64_t
|
|
Packit |
562c7a |
def int64_long_sum():
|
|
Packit |
562c7a |
cdef long x = 1
|
|
Packit |
562c7a |
cdef int32_t x32 = 2
|
|
Packit |
562c7a |
cdef int64_t x64 = 3
|
|
Packit |
562c7a |
cdef unsigned long ux = 4
|
|
Packit |
562c7a |
assert typeof(x + x32) == typeof(x32 + x) == 'long', typeof(x + x32)
|
|
Packit |
562c7a |
assert typeof(x + x64) == typeof(x64 + x) == 'int64_t', typeof(x + x64)
|
|
Packit |
562c7a |
# The correct answer here is either unsigned long or int64_t, depending on
|
|
Packit |
562c7a |
# whether sizeof(long) == 64 or not. Incorrect signedness is probably
|
|
Packit |
562c7a |
# preferable to incorrect width.
|
|
Packit |
562c7a |
assert typeof(ux + x64) == typeof(x64 + ux) == 'int64_t', typeof(ux + x64)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef class InferInProperties:
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> InferInProperties().x
|
|
Packit |
562c7a |
('double', 'unicode object', 'MyEnum', 'MyEnum')
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef MyEnum attr
|
|
Packit |
562c7a |
def __cinit__(self):
|
|
Packit |
562c7a |
self.attr = enum_x
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
property x:
|
|
Packit |
562c7a |
def __get__(self):
|
|
Packit |
562c7a |
a = 1.0
|
|
Packit |
562c7a |
b = u'abc'
|
|
Packit |
562c7a |
c = self.attr
|
|
Packit |
562c7a |
d = enum_y
|
|
Packit |
562c7a |
c = d
|
|
Packit |
562c7a |
return typeof(a), typeof(b), typeof(c), typeof(d)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef class WithMethods:
|
|
Packit |
562c7a |
cdef int offset
|
|
Packit |
562c7a |
def __init__(self, offset):
|
|
Packit |
562c7a |
self.offset = offset
|
|
Packit |
562c7a |
cpdef int one_arg(self, int x):
|
|
Packit |
562c7a |
return x + self.offset
|
|
Packit |
562c7a |
cpdef int default_arg(self, int x, int y=0):
|
|
Packit |
562c7a |
return x + y + self.offset
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def test_bound_methods():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> test_bound_methods()
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
o = WithMethods(10)
|
|
Packit |
562c7a |
assert typeof(o) == 'WithMethods', typeof(o)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
one_arg = o.one_arg
|
|
Packit |
562c7a |
assert one_arg(2) == 12, one_arg(2)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
default_arg = o.default_arg
|
|
Packit |
562c7a |
assert default_arg(2) == 12, default_arg(2)
|
|
Packit |
562c7a |
assert default_arg(2, 3) == 15, default_arg(2, 2)
|