diff --git a/src/dataset.jl b/src/dataset.jl index e409129..543f832 100644 --- a/src/dataset.jl +++ b/src/dataset.jl @@ -22,7 +22,7 @@ cdf = CDFDataset("data.cdf") ``` """ function CDFDataset(filename) - fname = String(filename) + fname = String(filename)::String # `open(f, name, mode) do` form: routes through varargs splatting (`_apply_iterate`) which `juliac --trim` can't resolve. io = open(fname, "r") try diff --git a/src/loading/variable.jl b/src/loading/variable.jl index 809f61d..90a0786 100644 --- a/src/loading/variable.jl +++ b/src/loading/variable.jl @@ -65,7 +65,7 @@ function _majority_swap!(data::Ptr{UInt8}, esz::Int, rdims::Vector{Int}, nrec::I end sstrides[k+1] = record_bytes chunk = clamp((1 << 20) รท record_bytes, 1, nrec) - dims = [rdims; chunk] + dims = push!(copy(rdims), chunk) temp = Vector{UInt8}(undef, chunk * record_bytes) GC.@preserve temp for r0 in 0:chunk:(nrec-1) n = min(chunk, nrec - r0) @@ -89,7 +89,7 @@ function _copy_subblock!(dst::Ptr{UInt8}, src::Ptr{UInt8}, esz::Int, rdims::Vect s *= rdims[i] end sstrides[k+1] = s - dims = [length.(ranges); nrec] + dims = push!(length.(ranges), nrec) _copy_block!(dst, src + off, esz, dims, sstrides) return end @@ -104,7 +104,7 @@ function DiskArrays.readblock!(var::CDFVariable{T,N}, dest::AbstractArray{T}, ra rdims = Int[Base.front(var.dims)...] other_ranges = UnitRange{Int}[Int(first(r)):Int(last(r)) for r in Base.front(ranges)] rec_range = Int(first(ranges[end])):Int(last(ranges[end])) - GC.@preserve dest _readblock!(Ptr{UInt8}(pointer(dest)), sizeof(T), rdims, other_ranges, rec_range, var.vdr, var.parentdataset) + GC.@preserve dest _readblock!(Ptr{UInt8}(_ptr(dest)), sizeof(T), rdims, other_ranges, rec_range, var.vdr, var.parentdataset) is_big_endian_encoding(var) && _byte_swap!(dest) return dest end diff --git a/src/parsing.jl b/src/parsing.jl index cef79f8..3453843 100644 --- a/src/parsing.jl +++ b/src/parsing.jl @@ -98,5 +98,9 @@ function _swap_words!(p::Ptr{U}, n::Int) where {U} end return end +# `pointer` goes through `cconvert`, so when `T` is not inferred any new +# `cconvert(::Type{Ptr{X}}, ::Vector)` method (e.g. LibGit2's) invalidates the caller. +_ptr(a::Array{T}) where {T} = Base.unsafe_convert(Ptr{T}, a) + _byte_swap!(data::Array{T}) where {T} = - GC.@preserve data _byte_swap!(Ptr{UInt8}(pointer(data)), sizeof(data), _swap_unit(T)) + GC.@preserve data _byte_swap!(Ptr{UInt8}(_ptr(data)), sizeof(data), _swap_unit(T)) diff --git a/src/records/aedr.jl b/src/records/aedr.jl index 7800d27..675eb11 100644 --- a/src/records/aedr.jl +++ b/src/records/aedr.jl @@ -37,7 +37,7 @@ end function load_attribute_data(::Type{T}, buffer::Vector{UInt8}, pos, NumElems, needs_byte_swap) where {T} data = Vector{T}(undef, NumElems) - dst_ptr = pointer(data) + dst_ptr = _ptr(data) src_ptr = convert(Ptr{T}, pointer(buffer, pos)) unsafe_copyto!(dst_ptr, src_ptr, NumElems) needs_byte_swap && _byte_swap!(data)