|
1 | 1 | # This file is a part of Julia. License is MIT: https://julialang.org/license |
2 | 2 |
|
3 | | -using Core: CodeInfo, SimpleVector, donotdelete, compilerbarrier, memoryrefnew, memoryrefget, memoryrefset! |
| 3 | +using Core: CodeInfo, SimpleVector, donotdelete, compilerbarrier, memoryref, memoryrefnew, memoryrefget, memoryrefset! |
4 | 4 |
|
5 | 5 | const Callable = Union{Function,Type} |
6 | 6 |
|
@@ -377,13 +377,26 @@ macro _nospecializeinfer_meta() |
377 | 377 | return Expr(:meta, :nospecializeinfer) |
378 | 378 | end |
379 | 379 |
|
| 380 | +function _checkbounds_array(::Type{Bool}, A::Union{Array, GenericMemory}, i::Int) |
| 381 | + @inline |
| 382 | + ult_int(bitcast(UInt, sub_int(i, 1)), bitcast(UInt, length(A))) |
| 383 | +end |
| 384 | +function _checkbounds_array(A::Union{Array, GenericMemory}, i::Int) |
| 385 | + @inline |
| 386 | + _checkbounds_array(Bool, A, i) || throw_boundserror(A, (i,)) |
| 387 | +end |
| 388 | + |
380 | 389 | default_access_order(a::GenericMemory{:not_atomic}) = :not_atomic |
381 | 390 | default_access_order(a::GenericMemory{:atomic}) = :monotonic |
382 | 391 | default_access_order(a::GenericMemoryRef{:not_atomic}) = :not_atomic |
383 | 392 | default_access_order(a::GenericMemoryRef{:atomic}) = :monotonic |
384 | 393 |
|
385 | | -getindex(A::GenericMemory, i::Int) = (@_noub_if_noinbounds_meta; |
386 | | - memoryrefget(memoryrefnew(memoryrefnew(A), i, @_boundscheck), default_access_order(A), false)) |
| 394 | +function getindex(A::GenericMemory, i::Int) |
| 395 | + @_noub_if_noinbounds_meta |
| 396 | + (@_boundscheck) && _checkbounds_array(A, i) |
| 397 | + memoryrefget(memoryrefnew(memoryrefnew(A), i, false), default_access_order(A), false) |
| 398 | +end |
| 399 | + |
387 | 400 | getindex(A::GenericMemoryRef) = memoryrefget(A, default_access_order(A), @_boundscheck) |
388 | 401 |
|
389 | 402 | """ |
@@ -949,13 +962,13 @@ end |
949 | 962 | # linear indexing |
950 | 963 | function getindex(A::Array, i::Int) |
951 | 964 | @_noub_if_noinbounds_meta |
952 | | - @boundscheck ult_int(bitcast(UInt, sub_int(i, 1)), bitcast(UInt, length(A))) || throw_boundserror(A, (i,)) |
| 965 | + @boundscheck _checkbounds_array(A, i) |
953 | 966 | memoryrefget(memoryrefnew(getfield(A, :ref), i, false), :not_atomic, false) |
954 | 967 | end |
955 | 968 | # simple Array{Any} operations needed for bootstrap |
956 | 969 | function setindex!(A::Array{Any}, @nospecialize(x), i::Int) |
957 | 970 | @_noub_if_noinbounds_meta |
958 | | - @boundscheck ult_int(bitcast(UInt, sub_int(i, 1)), bitcast(UInt, length(A))) || throw_boundserror(A, (i,)) |
| 971 | + @boundscheck _checkbounds_array(A, i) |
959 | 972 | memoryrefset!(memoryrefnew(getfield(A, :ref), i, false), x, :not_atomic, false) |
960 | 973 | return A |
961 | 974 | end |
|
0 commit comments