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