Only canonicalize non (symbol/fixnum/struct-type)s, since these are already unique
This commit is contained in:
parent
b1c773ddd4
commit
1724860be2
|
@ -8,16 +8,23 @@
|
|||
(define sentinel (cons #f #f))
|
||||
|
||||
(define (canonicalize val)
|
||||
(define b (hash-ref canonical-values
|
||||
val
|
||||
(lambda ()
|
||||
(define new-b (make-weak-box val))
|
||||
(hash-set! canonical-values val new-b)
|
||||
#f)))
|
||||
(if (not b)
|
||||
(canonicalize val)
|
||||
(let ((v (weak-box-value b sentinel)))
|
||||
(if (eq? v sentinel) (canonicalize val) v))))
|
||||
(cond
|
||||
[(or (struct-type? val)
|
||||
(symbol? val)
|
||||
(fixnum? val))
|
||||
;; These values already have unique representations.
|
||||
val]
|
||||
[else
|
||||
(define b (hash-ref canonical-values
|
||||
val
|
||||
(lambda ()
|
||||
(define new-b (make-weak-box val))
|
||||
(hash-set! canonical-values val new-b)
|
||||
#f)))
|
||||
(if (not b)
|
||||
(canonicalize val)
|
||||
(let ((v (weak-box-value b sentinel)))
|
||||
(if (eq? v sentinel) (canonicalize val) v)))]))
|
||||
|
||||
(module+ test
|
||||
(require rackunit)
|
||||
|
|
Loading…
Reference in New Issue