aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2024-01-02 10:49:43 +0100
committerThomas White <taw@physics.org>2024-02-06 16:59:35 +0100
commit8b67ec27c563d35fa8c5604b3475ff7b017abcb2 (patch)
tree23f21082cdcae4b248630efa13ae62792eae41ff
parente018c10216d79637f0bcb2915a00e9a744c58085 (diff)
Julia: Free old peak list on re-assignment
-rw-r--r--julia/CrystFEL/src/image.jl64
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