
- Range checking was inconsistent between the sequence and macro forms - The macro form could crash due to unsafe vector refs Fixes involved refactoring the range checks so they are shared between both versions, and changing the contract slightly so start and stop are checked before the sequence runs. This allows unsafe vector refs and earlier error notifications at the cost making some valid programs (e.g. those using some condition to stop a comprehension hitting an invalid index) now be invalid. Only crazy people would rely on the old behaviour, so it isn't a problem in practice.
29 lines
807 B
Racket
29 lines
807 B
Racket
#lang scheme/base
|
|
|
|
(require '#%flfxnum
|
|
"private/vector-wraps.rkt"
|
|
"unsafe/ops.rkt"
|
|
(for-syntax racket/base))
|
|
|
|
(provide fx->fl fl->fx
|
|
fxabs
|
|
fx+ fx- fx*
|
|
fxquotient fxremainder fxmodulo
|
|
fxand fxior fxxor
|
|
fxnot fxrshift fxlshift
|
|
fx>= fx> fx= fx< fx<=
|
|
fxmin fxmax
|
|
fxvector? fxvector make-fxvector
|
|
shared-fxvector make-shared-fxvector
|
|
fxvector-length fxvector-ref fxvector-set!
|
|
fxvector-copy
|
|
in-fxvector for/fxvector for*/fxvector)
|
|
|
|
(define-vector-wraps "fxvector"
|
|
fxvector? fxvector-length fxvector-ref fxvector-set! make-fxvector
|
|
unsafe-fxvector-ref unsafe-fxvector-set! unsafe-fxvector-length
|
|
in-fxvector*
|
|
in-fxvector
|
|
for/fxvector
|
|
for*/fxvector
|
|
fxvector-copy) |