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