cs: simplify mutable hash table iteration

Remove some complexity that originally handled `eq?` unreliability on
flonums, which is no longer needed.
This commit is contained in:
Matthew Flatt 2019-12-28 08:57:01 -06:00
parent 2fcdd7c292
commit 8b3fd15803

View File

@ -607,23 +607,16 @@
(lock-release (locked-iterable-hash-lock ht)) (lock-release (locked-iterable-hash-lock ht))
vec] vec]
[else [else
(let ([weak? (locked-iterable-hash-weak? ht)] (let ([new-vec (get-locked-iterable-hash-cells
[new-vec (get-locked-iterable-hash-cells
ht ht
(fxmax (if vec (fxmax (if vec
(fx* 2 (#%vector-length vec)) (fx* 2 (#%vector-length vec))
0) 0)
32))]) 32))])
(let ([len (#%vector-length new-vec)]) (let ([len (#%vector-length new-vec)])
(when (fx= len (hash-count ht)) (when (fx= len (hash-count ht))<
(set-locked-iterable-hash-retry?! ht #f)) (set-locked-iterable-hash-retry?! ht #f)))
(when weak? (let ([vec (cells-merge vec new-vec)])
(let loop ([i 0])
(unless (fx= i len)
(let ([p (#%vector-ref new-vec i)])
(#%vector-set! new-vec i (ephemeron/fl-cons (car p) p)))
(loop (fx+ i 1))))))
(let ([vec (cells-merge vec new-vec weak?)])
(set-locked-iterable-hash-cells! ht vec) (set-locked-iterable-hash-cells! ht vec)
(lock-release (locked-iterable-hash-lock ht)) (lock-release (locked-iterable-hash-lock ht))
vec))]))) vec))])))
@ -633,16 +626,11 @@
[(mutable-hash? ht) (hashtable-cells (mutable-hash-ht ht) n)] [(mutable-hash? ht) (hashtable-cells (mutable-hash-ht ht) n)]
[else (weak-equal-hash-cells ht n)])) [else (weak-equal-hash-cells ht n)]))
(define (locked-iterable-hash-weak? ht)
(cond
[(mutable-hash? ht) (hashtable-weak? (mutable-hash-ht ht))]
[else #t]))
;; Separate calls to `hashtable-cells` may return the ;; Separate calls to `hashtable-cells` may return the
;; cells in a different order, so we have to merge the ;; cells in a different order, so we have to merge the
;; tables. The resulting vector starts with the same ;; tables. The resulting vector starts with the same
;; elements as `vec`. ;; elements as `vec`.
(define (cells-merge vec new-vec weak?) (define (cells-merge vec new-vec)
(cond (cond
[(not vec) [(not vec)
;; Nothing to merge ;; Nothing to merge
@ -652,16 +640,14 @@
(and (fx= len (#%vector-length new-vec)) (and (fx= len (#%vector-length new-vec))
(let loop ([i 0]) (let loop ([i 0])
(or (fx= i len) (or (fx= i len)
(and (if weak? (and (eq? (#%vector-ref vec i) (#%vector-ref new-vec i))
(eq? (cdr (#%vector-ref vec i)) (cdr (#%vector-ref new-vec i)))
(eq? (#%vector-ref vec i) (#%vector-ref new-vec i)))
(loop (fx+ i 1))))))) (loop (fx+ i 1)))))))
new-vec] new-vec]
[else [else
;; General case ;; General case
(let ([new-ht (make-eq-hashtable)]) (let ([new-ht (make-eq-hashtable)])
(vector-for-each (lambda (p) (hashtable-set! new-ht (if weak? (cdr p) p) #t)) new-vec) (vector-for-each (lambda (p) (hashtable-set! new-ht p #t)) new-vec)
(vector-for-each (lambda (p) (hashtable-delete! new-ht (if weak? (cdr p) p))) vec) (vector-for-each (lambda (p) (hashtable-delete! new-ht p)) vec)
(let ([merge-vec (#%make-vector (fx+ (#%vector-length vec) (hashtable-size new-ht)))]) (let ([merge-vec (#%make-vector (fx+ (#%vector-length vec) (hashtable-size new-ht)))])
(let loop ([i (#%vector-length vec)]) (let loop ([i (#%vector-length vec)])
(unless (fx= i 0) (unless (fx= i 0)
@ -673,7 +659,7 @@
(unless (fx= i new-len) (unless (fx= i new-len)
(let ([p (#%vector-ref new-vec i)]) (let ([p (#%vector-ref new-vec i)])
(cond (cond
[(hashtable-contains? new-ht (if weak? (cdr p) p)) [(hashtable-contains? new-ht p)
(#%vector-set! merge-vec j p) (#%vector-set! merge-vec j p)
(loop (fx+ i 1) (fx+ j 1))] (loop (fx+ i 1) (fx+ j 1))]
[else [else
@ -725,13 +711,7 @@
[(= i len) [(= i len)
#f] #f]
[else [else
(let* ([p (let ([p (#%vector-ref vec i)]) (let* ([p (#%vector-ref vec i)]
(if (locked-iterable-hash-weak? ht)
(let ([p (cdr p)])
(if (bwp-object? p)
'(#!bwp . #!bwp)
p))
p))]
[key (car p)]) [key (car p)])
(cond (cond
[(bwp-object? key) [(bwp-object? key)
@ -760,13 +740,7 @@
(let* ([vec (prepare-iterate! ht i)] (let* ([vec (prepare-iterate! ht i)]
[len (#%vector-length vec)] [len (#%vector-length vec)]
[p (if (fx< i len) [p (if (fx< i len)
(let ([p (#%vector-ref vec i)]) (#%vector-ref vec i)
(if (locked-iterable-hash-weak? ht)
(let ([p (cdr p)])
(if (bwp-object? p)
'(#!bwp . #!bwp)
p))
p))
'(#!bwp . #!bwp))] '(#!bwp . #!bwp))]
[key (car p)] [key (car p)]
[v (cdr p)]) [v (cdr p)])
@ -1097,9 +1071,6 @@
(define (weak/fl-cons key d) (define (weak/fl-cons key d)
(weak-cons key d)) (weak-cons key d))
(define (ephemeron/fl-cons key d)
(ephemeron-cons key d))
;; ---------------------------------------- ;; ----------------------------------------
(define (set-hash-hash!) (define (set-hash-hash!)