Skip to content

Commit 15bb88a

Browse files
Make unsafe_load-based transmute GC-protected
Fixes #29.
1 parent 75f142f commit 15bb88a

File tree

3 files changed

+5
-5
lines changed

3 files changed

+5
-5
lines changed

src/arm/aesni_common.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ const LITTLE_ENDIAN::Bool = ENDIAN_BOM ≡ 0x04030201
1616

1717
abstract type ArmVec128 end
1818
@inline Base.convert(::Type{T}, x::ArmVec128) where {T<:Union{ArmVec128, UInt128}} =
19-
unsafe_load(Ptr{T}(pointer_from_objref(Ref(x))))
19+
GC.@preserve x unsafe_load(Ptr{T}(pointer_from_objref(Ref(x))))
2020
@inline Base.convert(::Type{T}, x::UInt128) where {T<:ArmVec128} =
21-
unsafe_load(Ptr{T}(pointer_from_objref(Ref(x))))
21+
GC.@preserve x unsafe_load(Ptr{T}(pointer_from_objref(Ref(x))))
2222
@inline Base.UInt128(x::ArmVec128) = convert(UInt128, x)
2323
@inline (::Type{T})(x::Union{ArmVec128, UInt128}) where {T<:ArmVec128} = convert(T, x)
2424
@inline Base.convert(::Type{T}, x::Union{Signed, Unsigned}) where {T<:ArmVec128} =

src/common.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ abstract type R123Generator2x{T} <: AbstractR123{T} end
1515
"RNG that generates four numbers at a time."
1616
abstract type R123Generator4x{T} <: AbstractR123{T} end
1717

18-
_value(r::AbstractR123{T}, i = 1, ::Type{T2} = T) where {T, T2} = unsafe_load(Ptr{T2}(pointer_from_objref(r)), i)
18+
_value(r::AbstractR123{T}, i = 1, ::Type{T2} = T) where {T, T2} = GC.@preserve r unsafe_load(Ptr{T2}(pointer_from_objref(r)), i)
1919

2020
"Set the counter of a Random123 RNG."
2121
@inline function set_counter!(r::R123Generator1x{T}, ctr::Integer) where T <: UInt128

src/x86/aesni_common.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ const __m128i_lvec = NTuple{2, VecElement{UInt64}}
88
struct __m128i
99
data::__m128i_lvec
1010
end
11-
Base.convert(::Type{__m128i}, x::UInt128) = unsafe_load(Ptr{__m128i}(pointer_from_objref(Ref(x))))
12-
Base.convert(::Type{UInt128}, x::__m128i) = unsafe_load(Ptr{UInt128}(pointer_from_objref(Ref(x))))
11+
Base.convert(::Type{__m128i}, x::UInt128) = GC.@preserve x unsafe_load(Ptr{__m128i}(pointer_from_objref(Ref(x))))
12+
Base.convert(::Type{UInt128}, x::__m128i) = GC.@preserve x unsafe_load(Ptr{UInt128}(pointer_from_objref(Ref(x))))
1313
Base.UInt128(x::__m128i) = convert(UInt128, x)
1414
__m128i(x::UInt128) = convert(__m128i, x)
1515
Base.convert(::Type{__m128i}, x::Union{Signed, Unsigned}) = convert(__m128i, UInt128(x))

0 commit comments

Comments
 (0)