# incref it to properly keep track of refcounts.
for entry in lenv.arg_entries:
if entry.type.is_pyobject:
- if entry.assignments and not entry.in_closure:
+ if (acquire_gil or entry.assignments) and not entry.in_closure:
code.put_var_incref(entry)
# ----- Initialise local variables
for entry in lenv.var_entries:
if entry.type.is_pyobject:
if entry.in_closure:
code.put_var_giveref(entry)
- elif entry.assignments:
+ elif acquire_gil or entry.assignments:
code.put_var_decref(entry)
if self.needs_closure:
code.put_decref(Naming.cur_scope_cname, lenv.scope_class.type)
owner.x = ''.join("abc%d" % 5) # non-interned object
return call_me_with_owner(owner, owner.x)
+
+cdef void call_me_without_gil(Owner owner, x) with gil:
+ owner.x = "def" # overwrite external reference
+ print x # crashes if x is not owned by function or caller
+
+def test_ext_type_attr_nogil():
+ """
+ >>> test_ext_type_attr_nogil()
+ abc5
+ """
+ owner = Owner()
+ owner.x = ''.join("abc%d" % 5) # non-interned object
+ with nogil:
+ call_me_without_gil(owner, owner.x)
+
+
+# the following isn't dangerous as long as index access uses temps
+
cdef call_me_with_list(list l, x):
l[:] = [(1,2), (3,4)] # overwrite external reference
return x # crashes if x is not owned by function or caller