Skip to content

Commit debb678

Browse files
author
Christopher Doris
committed
GC.preserve paranoia
1 parent 6a45ade commit debb678

File tree

8 files changed

+12
-12
lines changed

8 files changed

+12
-12
lines changed

src/Py.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ the top level then `pycopy!(x, pything())` inside `__init__()`.
8686
8787
Assumes `dst` is NULL, otherwise a memory leak will occur.
8888
"""
89-
pycopy!(dst, src) = setptr!(dst, incref(getptr(src)))
89+
pycopy!(dst, src) = GC.@preserve src setptr!(dst, incref(getptr(src)))
9090

9191
"""
9292
pydel!(x::Py)
@@ -132,7 +132,7 @@ macro autopy(args...)
132132
end)
133133
end
134134

135-
Py(x::Py) = pynew(incref(getptr(x))) # copy, because Py must always return a new object
135+
Py(x::Py) = GC.@preserve x pynew(incref(getptr(x))) # copy, because Py must always return a new object
136136
Py(x::Nothing) = Py(pybuiltins.None)
137137
Py(x::Bool) = pybool(x)
138138
Py(x::Union{String, SubString{String}, Char}) = pystr(x)

src/abstract/iter.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,4 @@ export pynext
1919
2020
Return the next item in the iterator `x`. When there are no more items, return NULL.
2121
"""
22-
unsafe_pynext(x::Py) = pynew(errcheck_ambig(C.PyIter_Next(getptr(x))))
22+
unsafe_pynext(x::Py) = GC.@preserve x pynew(errcheck_ambig(C.PyIter_Next(getptr(x))))

src/concrete/bytes.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ pyisbytes(x) = pytypecheckfast(x, C.Py_TPFLAGS_BYTES_SUBCLASS)
1919
function pybytes_asdata(x::Py)
2020
ptr = Ref(Ptr{Cchar}(0))
2121
len = Ref(C.Py_ssize_t(0))
22-
errcheck(C.PyBytes_AsStringAndSize(getptr(x), ptr, len))
22+
GC.@preserve x errcheck(C.PyBytes_AsStringAndSize(getptr(x), ptr, len))
2323
ptr[], len[]
2424
end
2525

src/concrete/str.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ pystr(x::Char) = pystr(string(x))
1313
pystr(::Type{String}, x) = (s=pystr(x); ans=pystr_asstring(s); pydel!(s); ans)
1414
export pystr
1515

16-
pystr_asUTF8bytes(x::Py) = pynew(errcheck(C.PyUnicode_AsUTF8String(getptr(x))))
16+
pystr_asUTF8bytes(x::Py) = GC.@preserve x pynew(errcheck(C.PyUnicode_AsUTF8String(getptr(x))))
1717
pystr_asUTF8vector(x::Py) = (b=pystr_asUTF8bytes(x); ans=pybytes_asvector(b); pydel!(b); ans)
1818
pystr_asstring(x::Py) = (b=pystr_asUTF8bytes(x); ans=pybytes_asUTF8string(b); pydel!(b); ans)
1919

src/concrete/tuple.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ function pytuple_setitem(xs::Py, i, x)
99
end
1010

1111
function pytuple_getitem(xs::Py, i)
12-
pynew(incref(errcheck(C.PyTuple_GetItem(getptr(xs), i))))
12+
GC.@preserve xs pynew(incref(errcheck(C.PyTuple_GetItem(getptr(xs), i))))
1313
end
1414

1515
function pytuple_fromiter(xs)

src/err.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ function errget()
2525
(pynew(t[]), pynew(v[]), pynew(b[]))
2626
end
2727

28-
errset(t::Py) = C.PyErr_SetNone(getptr(t))
29-
errset(t::Py, v::Py) = C.PyErr_SetObject(getptr(t), getptr(v))
30-
errset(t::Py, v::String) = C.PyErr_SetString(getptr(t), v)
28+
errset(t::Py) = GC.@preserve y C.PyErr_SetNone(getptr(t))
29+
errset(t::Py, v::Py) = GC.@preserve t v C.PyErr_SetObject(getptr(t), getptr(v))
30+
errset(t::Py, v::String) = GC.@preserve t C.PyErr_SetString(getptr(t), v)
3131

3232
function errnormalize!(t::Py, v::Py, b::Py)
3333
tptr = getptr(t)

src/jlwrap/base.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ function C._pyjl_callmethod(f, self_::C.PyPtr, args_::C.PyPtr, nargs::C.Py_ssize
8989
return ptr
9090
catch exc
9191
if exc isa PyException
92-
C.PyErr_Restore(incref(getptr(exc._t)), incref(getptr(exc._v)), incref(getptr(exc._b)))
92+
GC.@preserve exc C.PyErr_Restore(incref(getptr(exc._t)), incref(getptr(exc._v)), incref(getptr(exc._b)))
9393
return C.PyNULL
9494
else
9595
try
@@ -120,7 +120,7 @@ function pyjl_handle_error(f, self, exc)
120120
return C.PyNULL
121121
else
122122
# Otherwise, return the given object (e.g. NotImplemented)
123-
return incref(getptr(t))
123+
return GC.@preserve t incref(getptr(t))
124124
end
125125
end
126126

src/pywrap/PyArray.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,7 @@ end
413413
pyarray_store!(p::Ptr{R}, x::R) where {R} = unsafe_store!(p, x)
414414
pyarray_store!(p::Ptr{UnsafePyObject}, x::Py) = begin
415415
decref(unsafe_load(p).ptr)
416-
unsafe_store!(p, UnsafePyObject(incref(getptr(x))))
416+
unsafe_store!(p, UnsafePyObject(GC.@preserve x incref(getptr(x))))
417417
end
418418

419419
pyarray_get_T(::Type{R}, ::Type{T0}, ::Type{T1}) where {R,T0,T1} = T0 <: R <: T1 ? R : error("not possible")

0 commit comments

Comments
 (0)