@@ -123,6 +123,14 @@ macro _noinline_meta()
123
123
end
124
124
125
125
# # Bounds checking ##
126
+ @generated function trailingsize {T,N,n} (A:: AbstractArray{T,N} , :: Type{Val{n}} )
127
+ ex = :(size (A, $ n))
128
+ for m = n+ 1 : N
129
+ ex = :($ ex * size (A, $ m))
130
+ end
131
+ Expr (:block , Expr (:meta , :inline ), ex)
132
+ end
133
+
126
134
_checkbounds (sz, i:: Integer ) = 1 <= i <= sz
127
135
_checkbounds (sz, i:: Real ) = 1 <= to_index (i) <= sz
128
136
_checkbounds (sz, I:: AbstractVector{Bool} ) = length (I) == sz
@@ -149,17 +157,14 @@ function checkbounds(A::AbstractMatrix, I::Union(Real,AbstractArray,Colon), J::U
149
157
end
150
158
function checkbounds (A:: AbstractArray , I:: Union(Real,AbstractArray,Colon) , J:: Union(Real,AbstractArray,Colon) )
151
159
@_inline_meta
152
- (_checkbounds (size (A,1 ), I) && _checkbounds (trailingsize (A,2 ), J)) || throw_boundserror (A, (I, J))
160
+ (_checkbounds (size (A,1 ), I) && _checkbounds (trailingsize (A,Val{ 2 } ), J)) || throw_boundserror (A, (I, J))
153
161
end
154
- function checkbounds (A:: AbstractArray , I:: Union(Real,AbstractArray,Colon) ...)
155
- @_inline_meta
156
- n = length (I)
157
- if n > 0
158
- for dim = 1 : (n- 1 )
159
- _checkbounds (size (A,dim), I[dim]) || throw_boundserror (A, I)
160
- end
161
- _checkbounds (trailingsize (A,n), I[n]) || throw_boundserror (A, I)
162
- end
162
+ @generated function checkbounds (A:: AbstractArray , I:: Union(Real,AbstractArray,Colon) ...)
163
+ meta = Expr (:meta , :inline )
164
+ N = length (I)
165
+ args = Expr[:(_checkbounds (size (A,$ dim), I[$ dim]) || throw_boundserror (A, I)) for dim in 1 : N- 1 ]
166
+ push! (args, :(_checkbounds (trailingsize (A,Val{$ N}), I[$ N]) || throw_boundserror (A, I)))
167
+ Expr (:block , meta, args... )
163
168
end
164
169
165
170
# # Bounds-checking without errors ##
0 commit comments