From cf34c22380527ac05beb13918082e08436275d57 Mon Sep 17 00:00:00 2001 From: Sam Tobin-Hochstadt Date: Wed, 14 Nov 2018 18:45:54 -0500 Subject: [PATCH] fasl: find shared values in hash tables. (#2371) Also, add test to check sharing of uninterned symbols. --- pkgs/racket-test-core/tests/racket/fasl.rktl | 8 ++++++++ racket/collects/racket/fasl.rkt | 3 +++ 2 files changed, 11 insertions(+) diff --git a/pkgs/racket-test-core/tests/racket/fasl.rktl b/pkgs/racket-test-core/tests/racket/fasl.rktl index 3d85b965d6..5bfc359ee1 100644 --- a/pkgs/racket-test-core/tests/racket/fasl.rktl +++ b/pkgs/racket-test-core/tests/racket/fasl.rktl @@ -54,6 +54,14 @@ (test #t eq? u (car s-exp)) (test #t eq? u (cadr s-exp))) + +(let* ([u (string->uninterned-symbol "unread")]) + (define vs-exp (vector-ref (fasl->s-exp (s-exp->fasl (vector (cons u u)))) 0)) + ;; these are not `eq?` to the original symbol, but are `eq? to each other + (test #t eq? (car vs-exp) (cdr vs-exp)) + (define hs-exp (hash-ref (fasl->s-exp (s-exp->fasl (hasheq 0 (cons u u)))) 0)) + (test #t eq? (car hs-exp) (cdr hs-exp))) + ;; check uses datum-intern-literal: (test #t eq? "hello" (fasl->s-exp (s-exp->fasl "hello"))) (test #t eq? #"hello" (fasl->s-exp (s-exp->fasl #"hello"))) diff --git a/racket/collects/racket/fasl.rkt b/racket/collects/racket/fasl.rkt index c1553d1a9b..b9b67e94bf 100644 --- a/racket/collects/racket/fasl.rkt +++ b/racket/collects/racket/fasl.rkt @@ -122,6 +122,9 @@ [(vector? v) (for ([e (in-vector v)]) (loop e))] + [(hash? v) + (for ([(k v) (in-hash v)]) + (loop k) (loop v))] [(box? v) (loop (unbox v))] [(prefab-struct-key v)