Skip to content

Commit b64479f

Browse files
committed
Remove error checks from compact array implementations
Saves performance, doesn’t really affect safety since those are purely internal procedures
1 parent 7ebe451 commit b64479f

File tree

2 files changed

+34
-71
lines changed

2 files changed

+34
-71
lines changed
Lines changed: 24 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,68 @@
11
(define (make-compact-array size)
2-
(cond ((< size #xFF)
3-
(let ((bv (make-bytevector (+ size 2) #xFF)))
2+
(cond ((fx<? size #xFF)
3+
(let ((bv (make-bytevector (fx+ size 2) #xFF)))
44
(bytevector-u8-set! bv 0 1)
55
(bytevector-u8-set! bv 1 size)
66
bv))
7-
((< size #xFFFF)
8-
(let ((bv (make-bytevector (* 2 (+ size 2)) #xFF)))
7+
((fx<? size #xFFFF)
8+
(let ((bv (make-bytevector (fxarithmetic-shift-left (fx+ size 2) 1) #xFF)))
99
(bytevector-u8-set! bv 0 2)
1010
(bytevector-u16-native-set! bv 2 size)
1111
bv))
12-
((< size #xFFFFFFFF)
13-
(let ((bv (make-bytevector (* 4 (+ size 2)) #xFF)))
12+
((fx<? size #xFFFFFFFF)
13+
(let ((bv (make-bytevector (fxarithmetic-shift-left (fx+ size 2) 2) #xFF)))
1414
(bytevector-u8-set! bv 0 4)
1515
(bytevector-u32-native-set! bv 4 size)
1616
bv))
1717
(else
18-
(let ((bv (make-bytevector (* 8 (+ size 2)) #xFF)))
18+
(let ((bv (make-bytevector (fxarithmetic-shift-left (fx+ size 2) 3) #xFF)))
1919
(bytevector-u8-set! bv 0 8)
2020
(bytevector-u64-native-set! bv 8 size)
2121
bv))))
2222

2323
(define (compact-array-ref sa idx)
2424
(define (max-to x n) (if (eqv? x n) #f x))
25-
(assert (bytevector? sa))
2625
(case (bytevector-u8-ref sa 0)
27-
((1) (max-to (bytevector-u8-ref sa (+ idx 2)) #xFF))
28-
((2) (max-to (bytevector-u16-native-ref sa (* (+ idx 2) 2)) #xFFFF))
29-
((4) (max-to (bytevector-u32-native-ref sa (* (+ idx 2) 4)) #xFFFFFFFF))
30-
((8) (max-to (bytevector-u64-native-ref sa (* (+ idx 2) 8)) #xFFFFFFFFFFFFFFFF))
31-
(else (assertion-violation 'compact-array-ref "not a compact array" sa))))
26+
((1) (max-to (bytevector-u8-ref sa (fx+ idx 2)) #xFF))
27+
((2) (max-to (bytevector-u16-native-ref sa (fxarithmetic-shift-left (fx+ idx 2) 1)) #xFFFF))
28+
((4) (max-to (bytevector-u32-native-ref sa (fxarithmetic-shift-left (fx+ idx 2) 2)) #xFFFFFFFF))
29+
((8) (max-to (bytevector-u64-native-ref sa (fxarithmetic-shift-left (fx+ idx 2) 3)) #xFFFFFFFFFFFFFFFF))))
3230

3331
(define (compact-array-set? sa idx)
3432
(not (not (compact-array-ref sa idx))))
3533

3634
(define (compact-array-set! sa idx val)
37-
(define (check-size n)
38-
(if (>= val n) (assertion-violation 'compact-array-set! "can't store value in compact array, try upgrading it")))
39-
(assert (bytevector? sa))
4035
(case (bytevector-u8-ref sa 0)
41-
((1) (check-size #xFF) (bytevector-u8-set! sa (+ idx 2) val))
42-
((2) (check-size #xFFFF) (bytevector-u16-native-set! sa (* (+ idx 2) 2) val))
43-
((4) (check-size #xFFFFFFFF) (bytevector-u32-native-set! sa (* (+ idx 2) 4) val))
44-
((8) (check-size #xFFFFFFFFFFFFFFFF) (bytevector-u64-native-set! sa (* (+ idx 2) 8) val))
45-
(else (assertion-violation 'compact-array-set! "not a compact array" sa))))
36+
((1) (bytevector-u8-set! sa (fx+ idx 2) val))
37+
((2) (bytevector-u16-native-set! sa (fxarithmetic-shift-left (fx+ idx 2) 1) val))
38+
((4) (bytevector-u32-native-set! sa (fxarithmetic-shift-left (fx+ idx 2) 2) val))
39+
((8) (fxarithmetic-shift-left (fx+ idx 2) 3))))
4640

4741
(define (compact-array-delete! sa idx)
48-
(assert (bytevector? sa))
4942
(case (bytevector-u8-ref sa 0)
50-
((1) (bytevector-u8-set! sa (+ idx 2) #xFF))
51-
((2) (bytevector-u16-native-set! sa (* (+ idx 2) 2) #xFFFF))
52-
((4) (bytevector-u32-native-set! sa (* (+ idx 2) 4) #xFFFFFFFF))
53-
((8) (bytevector-u64-native-set! sa (* (+ idx 2) 8) #xFFFFFFFFFFFFFFFF))
54-
(else (assertion-violation 'compact-array-delete! "not a compact array" sa))))
43+
((1) (bytevector-u8-set! sa (fx+ idx 2) #xFF))
44+
((2) (bytevector-u16-native-set! sa (fxarithmetic-shift-left (fx+ idx 2) 1) #xFFFF))
45+
((4) (bytevector-u32-native-set! sa (fxarithmetic-shift-left (fx+ idx 2) 2) #xFFFFFFFF))
46+
((8) (bytevector-u64-native-set! sa (fxarithmetic-shift-left (fx+ idx 2) 3) #xFFFFFFFFFFFFFFFF))))
5547

5648
(define (compact-array-clear! sa)
57-
(assert (bytevector? sa))
5849
(let ((elt-size (bytevector-u8-ref sa 0)))
5950
(bytevector-fill! sa #xFF)
6051
(bytevector-u8-set! sa 0 elt-size)
6152
(case elt-size
62-
((1) (bytevector-u8-set! sa 1 (- 2 (bytevector-length sa))))
53+
((1) (bytevector-u8-set! sa 1 (fx- (bytevector-length sa) 2)))
6354
((2) (bytevector-u16-native-set! sa 2
64-
(- 2 (div (bytevector-length sa) 2))))
55+
(fx- (fxarithmetic-shift-right (bytevector-length sa) 1) 2)))
6556
((4) (bytevector-u32-native-set! sa 4
66-
(- 2 (div (bytevector-length sa) 4))))
57+
(fx- (fxarithmetic-shift-right (bytevector-length sa) 2) 2)))
6758
((8) (bytevector-u32-native-set! sa 8
68-
(- 2 (div (bytevector-length sa) 8)))))))
59+
(fx- (fxarithmetic-shift-right (bytevector-length sa) 3) 2))))))
6960

7061
(define (compact-array-copy sa) (bytevector-copy sa))
7162

7263
(define (compact-array-length sa)
73-
(assert (bytevector? sa))
7464
(case (bytevector-u8-ref sa 0)
7565
((1) (bytevector-u8-ref sa 1))
7666
((2) (bytevector-u16-native-ref sa 2))
7767
((4) (bytevector-u32-native-ref sa 4))
78-
((8) (bytevector-u64-native-ref sa 8))
79-
(else (assertion-violation 'compact-array-ref "not a compact array" sa))))
68+
((8) (bytevector-u64-native-ref sa 8))))

srfi/250/internal/srfi-compact-arrays.scm

Lines changed: 10 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,38 +5,24 @@
55
(else (make-u64vector size #xFFFFFFFFFFFFFFFF))))
66

77
(define (compact-array-ref sa idx)
8-
(define (max-to n) (lambda (x) (if (= x n) #f x)))
8+
(define (max-to n) (lambda (x) (if (eqv? x n) #f x)))
99
(cond ((and (bytevector? sa) (bytevector-u8-ref sa idx))
1010
=> (max-to #xFF))
1111
((and (u16vector? sa) (u16vector-ref sa idx))
1212
=> (max-to #xFFFF))
1313
((and (u32vector? sa) (u32vector-ref sa idx))
1414
=> (max-to #xFFFFFFFF))
1515
((and (u64vector? sa) (u64vector-ref sa idx))
16-
=> (max-to #xFFFFFFFFFFFFFFFF))
17-
(else (assertion-violation 'compact-array-ref
18-
"not a compact array"
19-
sa))))
16+
=> (max-to #xFFFFFFFFFFFFFFFF))))
2017

2118
(define (compact-array-set? sa idx)
2219
(not (not (compact-array-ref sa idx))))
2320

2421
(define (compact-array-set! sa idx val)
25-
(define (set-with-max setter max)
26-
(if (>= val max)
27-
(assertion-violation 'compact-array-set!
28-
"can't store value in compact array, try upgrading it"
29-
val)
30-
(setter sa idx val)))
31-
(cond ((bytevector? sa)
32-
(set-with-max bytevector-u8-set! #xFF))
33-
((u16vector? sa)
34-
(set-with-max u16vector-set! #xFFFF))
35-
((u32vector? sa)
36-
(set-with-max u32vector-set! #xFFFFFFFF))
37-
((u64vector? sa)
38-
(set-with-max u64vector-set! #xFFFFFFFFFFFFFFFF))
39-
(else (error "not a compact array" sa))))
22+
(cond ((bytevector? sa) (bytevector-u8-set! sa idx val))
23+
((u16vector? sa) (u16vector-set! sa idx val))
24+
((u32vector? sa) (u32vector-set! sa idx val))
25+
((u64vector? sa) (u64vector-set! sa idx val))))
4026

4127
(define (compact-array-delete! sa idx)
4228
(cond ((bytevector? sa)
@@ -46,10 +32,7 @@
4632
((u32vector? sa)
4733
(u32vector-set! sa idx #xFFFFFFFF))
4834
((u64vector? sa)
49-
(u64vector-set! sa idx #xFFFFFFFFFFFFFFFF))
50-
(else (assertion-violation 'compact-array-delete!
51-
"not a compact array"
52-
sa))))
35+
(u64vector-set! sa idx #xFFFFFFFFFFFFFFFF))))
5336

5437
(define (compact-array-clear! sa)
5538
(define len (compact-array-length sa))
@@ -72,10 +55,7 @@
7255
(let loop ((idx 0))
7356
(when (< idx len)
7457
(u64vector-set! sa idx #xFFFFFFFFFFFFFFFF)
75-
(loop (+ idx 1)))))
76-
(else (assertion-violation 'compact-array-length
77-
"not a compact array"
78-
sa))))
58+
(loop (+ idx 1)))))))
7959

8060
(define (compact-array-copy sa)
8161
(define len (compact-array-length sa))
@@ -94,10 +74,7 @@
9474
(let ((out (make-u64vector len)))
9575
(let loop ((idx 0))
9676
(when (< idx len)
97-
(u64vector-set! out idx (u64vector-ref sa idx))))))
98-
(else (assertion-violation 'compact-array-copy
99-
"not a compact array"
100-
sa))))
77+
(u64vector-set! out idx (u64vector-ref sa idx))))))))
10178

10279
(define (compact-array-length sa)
10380
(cond ((bytevector? sa)
@@ -107,7 +84,4 @@
10784
((u32vector? sa)
10885
(u32vector-length sa))
10986
((u64vector? sa)
110-
(u64vector-length sa))
111-
(else (assertion-violation 'compact-array-length
112-
"not a compact array"
113-
sa))))
87+
(u64vector-length sa))))

0 commit comments

Comments
 (0)