1
2cdef class Owner:
3    cdef object x
4
5cdef call_me_with_owner(Owner owner, x):
6    owner.x = "def" # overwrite external reference
7    return x        # crashes if x is not owned by function or caller
8
9def test_ext_type_attr():
10    """
11    >>> test_ext_type_attr()
12    'abc5'
13    """
14    owner = Owner()
15    owner.x = ''.join("abc%d" % 5) # non-interned object
16    return call_me_with_owner(owner, owner.x)
17
18
19cdef void call_me_without_gil(Owner owner, x) with gil:
20    owner.x = "def" # overwrite external reference
21    print x         # crashes if x is not owned by function or caller
22
23def test_ext_type_attr_nogil():
24    """
25    >>> test_ext_type_attr_nogil()
26    abc5
27    """
28    owner = Owner()
29    owner.x = ''.join("abc%d" % 5) # non-interned object
30    with nogil:
31        call_me_without_gil(owner, owner.x)
32
33
34# the following isn't dangerous as long as index access uses temps
35
36cdef call_me_with_list(list l, x):
37    l[:] = [(1,2), (3,4)] # overwrite external reference
38    return x              # crashes if x is not owned by function or caller
39
40def test_index():
41    """
42    >>> test_index()
43    [3, 4]
44    """
45    l = [[1,2],[3,4]]
46    return call_me_with_list(l, l[1])
47