diff options
author | Thomas White <taw@physics.org> | 2024-01-02 10:49:43 +0100 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2024-02-06 16:59:35 +0100 |
commit | 8b67ec27c563d35fa8c5604b3475ff7b017abcb2 (patch) | |
tree | 23f21082cdcae4b248630efa13ae62792eae41ff | |
parent | e018c10216d79637f0bcb2915a00e9a744c58085 (diff) |
Julia: Free old peak list on re-assignment
-rw-r--r-- | julia/CrystFEL/src/image.jl | 64 |
1 files changed, 37 insertions, 27 deletions
diff --git a/julia/CrystFEL/src/image.jl b/julia/CrystFEL/src/image.jl index 3f74d8cd..de46af4b 100644 --- a/julia/CrystFEL/src/image.jl +++ b/julia/CrystFEL/src/image.jl @@ -91,44 +91,54 @@ end strdup(str) = @ccall strdup(str::Cstring)::Cstring +function assert_type(val, type) + if !(val isa type) + throw(ArgumentError("Must be a "*string(type)*" (have "*string(typeof(val))*" instead)")) + end +end + + +function set_peaklist(image, val) + assert_type(val, PeakList) + if val.in_image + throw(ArgumentError("PeakList is already in an image. "* + "Add a copy (use `deepcopy`) instead.")) + end + val.in_image = true + val = val.internalptr + idata = unsafe_load(image.internalptr) + old = swapproperty!(idata, :peaklist, val) + unsafe_store!(image.internalptr, idata) + + if old != C_NULL + @ccall libcrystfel.image_feature_list_free(old::Ptr{InternalPeakList})::Cvoid + end + +end + + function Base.setproperty!(image::Image, name::Symbol, val) if name === :internalptr setfield!(image, :internalptr, val) else - idata = unsafe_load(image.internalptr) + if name === :peaklist - if val isa PeakList - if val.in_image - throw(ArgumentError("PeakList is already in an image. "* - "Add a copy (use `deepcopy`) instead.")) - end - setproperty!(idata, name, val.internalptr) - val.in_image = true - unsafe_store!(image.internalptr, idata) - else - throw(ArgumentError("Must be a PeakList")) - end + return set_peaklist(image, val) elseif name === :filename - if val isa AbstractString - setproperty!(idata, :filename, strdup(val)) - unsafe_store!(image.internalptr, idata) - else - throw(ArgumentError("Must be a string")) - end + assert_type(val, AbstractString) + val = strdup(val) elseif name === :ev - if val isa AbstractString - setproperty!(idata, :ev, strdup(val)) - unsafe_store!(image.internalptr, idata) - else - throw(ArgumentError("Must be a string")) - end + assert_type(val, AbstractString) + val = strdup(val) - else - setproperty!(idata, name, val) - unsafe_store!(image.internalptr, idata) end + + idata = unsafe_load(image.internalptr) + setproperty!(idata, name, val) + unsafe_store!(image.internalptr, idata) + end end |