Skip to content

Commit 8db1be2

Browse files
author
Andy Ferris
committed
Fix references to immutables
Resolves #53 using the changes suggested by Jameson Nash @vtjnash. However, we don't wan't to actually call these functions for speed (for that we want to use `ccall` and `&`) but it does aid in compatibility.
1 parent 4e6c064 commit 8db1be2

File tree

4 files changed

+18
-13
lines changed

4 files changed

+18
-13
lines changed

src/FieldVector.jl

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ abstract FieldVector{T} <: StaticVector{T}
2727
@inline getindex(v::FieldVector, i::Integer) = getfield(v, i)
2828
@inline setindex!(v::FieldVector, x, i::Integer) = setfield!(v, i, x)
2929

30-
@inline function Base.unsafe_convert{T}(::Type{Ptr{T}}, v::FieldVector{T})
31-
Base.unsafe_convert(Ptr{T}, Base.data_pointer_from_objref(v))
32-
end
30+
# See #53
31+
Base.cconvert{T}(::Type{Ptr{T}}, v::FieldVector) = Ref(v)
32+
Base.unsafe_convert{T, FV <: FieldVector}(::Type{Ptr{T}}, m::Ref{FV}) =
33+
_unsafe_convert(Ptr{T}, eltype(FV), m)
34+
_unsafe_convert{T, FV <: FieldVector}(::Type{Ptr{T}}, ::Type{T}, m::Ref{FV}) =
35+
Ptr{T}(Base.unsafe_convert(Ptr{FV}, m))

src/SArray.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ end
6464

6565
@inline SArray(a::StaticArray) = SArray{size(typeof(a))}(Tuple(a))
6666

67-
6867
# Some more advanced constructor-like functions
6968
@inline eye{Size}(::Type{SArray{Size}}) = eye(SArray{Size,Float64})
7069
@inline zeros{Size}(::Type{SArray{Size}}) = zeros(SArray{Size,Float64})
@@ -87,9 +86,10 @@ end
8786

8887
@inline Tuple(v::SArray) = v.data
8988

90-
@inline function Base.unsafe_convert{Size,T}(::Type{Ptr{T}}, a::SArray{Size,T})
91-
Base.unsafe_convert(Ptr{T}, Base.data_pointer_from_objref(a))
92-
end
89+
# See #53
90+
Base.cconvert{T}(::Type{Ptr{T}}, a::SArray) = Ref(a)
91+
Base.unsafe_convert{S,T,D,L}(::Type{Ptr{T}}, a::Ref{SArray{S,T,D,L}}) =
92+
Ptr{T}(Base.unsafe_convert(Ptr{SArray{S,T,D,L}}, a))
9393

9494
macro SArray(ex)
9595
if !isa(ex, Expr)

src/SMatrix.jl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,10 @@ end
118118

119119
@inline Tuple(v::SMatrix) = v.data
120120

121-
@inline function Base.unsafe_convert{N,M,T}(::Type{Ptr{T}}, m::SMatrix{N,M,T})
122-
Base.unsafe_convert(Ptr{T}, Base.data_pointer_from_objref(m))
123-
end
121+
# See #53
122+
Base.cconvert{T}(::Type{Ptr{T}}, m::SMatrix) = Ref(m)
123+
Base.unsafe_convert{N,M,T,L}(::Type{Ptr{T}}, m::Ref{SMatrix{N,M,T,L}}) =
124+
Ptr{T}(Base.unsafe_convert(Ptr{SMatrix{N,M,T,L}}, m))
124125

125126

126127
macro SMatrix(ex)

src/SVector.jl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,10 @@ end
4949

5050
@inline Tuple(v::SVector) = v.data
5151

52-
@inline function Base.unsafe_convert{N,T}(::Type{Ptr{T}}, v::SVector{N,T})
53-
Base.unsafe_convert(Ptr{T}, Base.data_pointer_from_objref(v))
54-
end
52+
# See #53
53+
Base.cconvert{T}(::Type{Ptr{T}}, v::SVector) = Ref(v)
54+
Base.unsafe_convert{N,T}(::Type{Ptr{T}}, v::Ref{SVector{N,T}}) =
55+
Ptr{T}(Base.unsafe_convert(Ptr{SVector{N,T}}, v))
5556

5657
# Converting a CartesianIndex to an SVector
5758
convert(::Type{SVector}, I::CartesianIndex) = SVector(I.I)

0 commit comments

Comments
 (0)