@@ -369,47 +369,55 @@ This function creates a loop, while switching from 1 to 0 based indices
369
369
"""
370
370
function register_single_loop! (ls:: LoopSet , looprange:: Expr )
371
371
itersym = (looprange. args[1 ]):: Symbol
372
- r = (looprange. args[2 ]):: Expr
373
- @assert r. head === :call
374
- f = first (r. args)
375
- loop:: Loop = if f === :(:)
376
- lower = r. args[2 ]
377
- upper = r. args[3 ]
378
- lii:: Bool = lower isa Integer
379
- liiv:: Int = lii ? (convert (Int, lower)- 1 ) : 0
380
- uii:: Bool = upper isa Integer
381
- if lii & uii # both are integers
382
- Loop (itersym, liiv, convert (Int, upper))
383
- elseif lii # only lower bound is an integer
384
- if upper isa Symbol
385
- Loop (itersym, liiv, upper)
386
- elseif upper isa Expr
387
- Loop (itersym, liiv, add_loop_bound! (ls, itersym, upper, true ))
388
- else
389
- Loop (itersym, liiv, add_loop_bound! (ls, itersym, upper, true ))
372
+ r = looprange. args[2 ]
373
+ if isexpr (r, :call )
374
+ f = first (r. args)
375
+ loop:: Loop = if f === :(:)
376
+ lower = r. args[2 ]
377
+ upper = r. args[3 ]
378
+ lii:: Bool = lower isa Integer
379
+ liiv:: Int = lii ? (convert (Int, lower)- 1 ) : 0
380
+ uii:: Bool = upper isa Integer
381
+ if lii & uii # both are integers
382
+ Loop (itersym, liiv, convert (Int, upper))
383
+ elseif lii # only lower bound is an integer
384
+ if upper isa Symbol
385
+ Loop (itersym, liiv, upper)
386
+ elseif upper isa Expr
387
+ Loop (itersym, liiv, add_loop_bound! (ls, itersym, upper, true ))
388
+ else
389
+ Loop (itersym, liiv, add_loop_bound! (ls, itersym, upper, true ))
390
+ end
391
+ elseif uii # only upper bound is an integer
392
+ uiiv = convert (Int, upper)
393
+ Loop (itersym, add_loop_bound! (ls, itersym, lower, false ), uiiv)
394
+ else # neither are integers
395
+ L = add_loop_bound! (ls, itersym, lower, false )
396
+ U = add_loop_bound! (ls, itersym, upper, true )
397
+ Loop (itersym, L, U)
390
398
end
391
- elseif uii # only upper bound is an integer
392
- uiiv = convert (Int, upper)
393
- Loop (itersym, add_loop_bound! (ls, itersym, lower, false ), uiiv)
394
- else # neither are integers
395
- L = add_loop_bound! (ls, itersym, lower, false )
396
- U = add_loop_bound! (ls, itersym, upper, true )
397
- Loop (itersym, L, U)
398
- end
399
- elseif f === :eachindex
400
- N = gensym (Symbol (:loop , itersym))
401
- pushpreamble! (ls, Expr (:(= ), N, Expr (:call , lv (:maybestaticlength ), r. args[2 ])))
402
- Loop (itersym, 0 , N)
403
- elseif f === :OneTo || f == Expr (:(.), :Base , QuoteNode (:OneTo ))
404
- otN = r. args[2 ]
405
- if otN isa Integer
406
- Loop (itersym, 0 , otN)
407
- else
408
- otN isa Expr && maybestatic! (otN)
399
+ elseif f === :eachindex
409
400
N = gensym (Symbol (:loop , itersym))
410
- pushpreamble! (ls, Expr (:(= ), N, otN ))
401
+ pushpreamble! (ls, Expr (:(= ), N, Expr ( :call , lv ( :maybestaticlength ), r . args[ 2 ]) ))
411
402
Loop (itersym, 0 , N)
403
+ elseif f === :OneTo || f == Expr (:(.), :Base , QuoteNode (:OneTo ))
404
+ otN = r. args[2 ]
405
+ if otN isa Integer
406
+ Loop (itersym, 0 , otN)
407
+ else
408
+ otN isa Expr && maybestatic! (otN)
409
+ N = gensym (Symbol (:loop , itersym))
410
+ pushpreamble! (ls, Expr (:(= ), N, otN))
411
+ Loop (itersym, 0 , N)
412
+ end
413
+ else
414
+ throw (" Unrecognized loop range type: $r ." )
412
415
end
416
+ elseif isa (r, Symbol)
417
+ # Treat similar to `eachindex`
418
+ N = gensym (Symbol (:loop , itersym))
419
+ pushpreamble! (ls, Expr (:(= ), N, Expr (:call , lv (:maybestaticlength ), r)))
420
+ loop = Loop (itersym, 0 , N)
413
421
else
414
422
throw (" Unrecognized loop range type: $r ." )
415
423
end
0 commit comments