Skip to content

Commit 828efcb

Browse files
committed
Revert "Revert "in unsafe_ref, special case Any to fix #2458""
This reverts commit ede8b47.
1 parent 97cf261 commit 828efcb

File tree

2 files changed

+9
-5
lines changed

2 files changed

+9
-5
lines changed

base/pointer.jl

+8-2
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,27 @@ convert(::Type{Ptr{Uint8}}, s::ByteString) = convert(Ptr{Uint8}, s.data)
2020

2121
pointer{T}(::Type{T}, x::Uint) = convert(Ptr{T}, x)
2222
pointer{T}(::Type{T}, x::Ptr) = convert(Ptr{T}, x)
23+
pointer(::Type{Any}, x::Uint) = convert(Ptr{Ptr{Any}}, x)
24+
pointer(::Type{Any}, x::Ptr) = convert(Ptr{Ptr{Any}}, x)
2325
# note: these definitions don't mean any AbstractArray is convertible to
2426
# pointer. they just map the array element type to the pointer type for
2527
# convenience in cases that work.
2628
pointer{T}(x::AbstractArray{T}) = convert(Ptr{T},x)
29+
pointer(x::AbstractArray{Any}) = convert(Ptr{Ptr{Any}},x)
2730
pointer{T}(x::AbstractArray{T}, i::Int) = convert(Ptr{T},x) + (i-1)*sizeof(T)
31+
pointer{T}(x::AbstractArray{Any}, i::Int) = convert(Ptr{Ptr{Any}},x) + (i-1)*sizeof(T)
2832

2933
# unsafe pointer to array conversions
3034
pointer_to_array(p, dims) = pointer_to_array(p, dims, false)
3135
function pointer_to_array{T,N}(p::Ptr{T}, dims::NTuple{N,Int}, own::Bool)
3236
ccall(:jl_ptr_to_array, Array{T,N}, (Any, Ptr{T}, Any, Int32),
3337
Array{T,N}, p, dims, own)
3438
end
35-
unsafe_ref(p::Ptr,i::Integer) = pointerref(p, int(i))
39+
unsafe_ref(p::Ptr, i::Integer) = pointerref(p, int(i))
40+
unsafe_ref(p::Ptr{Ptr{Any}}, i::Integer) = pointerref(pointerref(p, int(i)), 1)
3641
unsafe_ref(p::Ptr) = unsafe_ref(p, 1)
37-
unsafe_assign(p::Ptr{Any}, x::ANY, i::Integer) = pointerset(p, x, int(i))
42+
unsafe_assign(p::Ptr{Any}, x, i::Integer) = error("cannot unsafe_assign to contents of type Any")
43+
unsafe_assign(p::Ptr{Ptr{Any}}, x::ANY, i::Integer) = pointerset(convert(Ptr{Any},p), x, int(i))
3844
unsafe_assign{T}(p::Ptr{T}, x, i::Integer) = pointerset(p, convert(T, x), int(i))
3945
unsafe_assign{T}(p::Ptr{T}, x) = unsafe_assign(p, convert(T,x), 1)
4046

src/intrinsics.cpp

+1-3
Original file line numberDiff line numberDiff line change
@@ -406,9 +406,7 @@ static Value *emit_pointerref(jl_value_t *e, jl_value_t *i, jl_codectx_t *ctx)
406406
Value *im1 = builder.CreateSub(idx, ConstantInt::get(T_size, 1));
407407
if (!jl_is_bitstype(ety)) {
408408
if (ety == (jl_value_t*)jl_any_type)
409-
return builder.CreateLoad(builder.CreateGEP(
410-
builder.CreateBitCast(thePtr, jl_ppvalue_llvmt),
411-
im1));
409+
return builder.CreateGEP(builder.CreateBitCast(thePtr, jl_pvalue_llvmt), im1);
412410
if (!jl_is_structtype(ety) || jl_is_array_type(ety) || !jl_is_leaf_type(ety))
413411
jl_error("pointerref: invalid pointer type");
414412
uint64_t size = ((jl_datatype_t*)ety)->size;

0 commit comments

Comments
 (0)