From 91f8d8a72ffaa5e5e6a77683318f44b1ae07aaa2 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 19 May 2020 15:36:34 -0600 Subject: [PATCH] expander: fix intering of some module path indexes for ".zo" Two "self" module path indexes are treated the same on load when they have the same resolved module name. Fix the serialization intern table to take that into account and avoid some GC-based non-deterministism. Related to #3165 --- .../expander/common/module-path-intern.rkt | 15 +++++++--- racket/src/racket/src/startup.inc | 28 +++++++++++++++---- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/racket/src/expander/common/module-path-intern.rkt b/racket/src/expander/common/module-path-intern.rkt index d8e3cedb02..1cf6926783 100644 --- a/racket/src/expander/common/module-path-intern.rkt +++ b/racket/src/expander/common/module-path-intern.rkt @@ -6,18 +6,25 @@ intern-module-path-index!) (struct mpi-intern-table (normal ; name[not #f] -[`equal?`-based]-> base -[`eq?`-based]-> module path index - fast)) ; superset, but `eq?`-keyed for fast already-interned checks + fast ; superset, but `eq?`-keyed for fast already-interned checks + self)) ; name -[`equal?`-based]-> module path index (define (make-module-path-index-intern-table) - (mpi-intern-table (make-hash) (make-hasheq))) + (mpi-intern-table (make-hash) (make-hasheq) (make-hash))) (define (intern-module-path-index! t mpi) (or (hash-ref (mpi-intern-table-fast t) mpi #f) (let-values ([(name base) (module-path-index-split mpi)]) (cond [(not name) - (hash-set! (mpi-intern-table-fast t) mpi mpi) - mpi] + ;; "self" MPIs are equivalent when they have the same resolution + (define r (or (module-path-index-resolved mpi) + 'self)) + (or (hash-ref (mpi-intern-table-self t) r #f) + (begin + (hash-set! (mpi-intern-table-self t) r mpi) + (hash-set! (mpi-intern-table-fast t) mpi mpi) + mpi))] [else (define interned-base (and base (intern-module-path-index! t base))) diff --git a/racket/src/racket/src/startup.inc b/racket/src/racket/src/startup.inc index bfb8721bd6..7c609549ee 100644 --- a/racket/src/racket/src/startup.inc +++ b/racket/src/racket/src/startup.inc @@ -20473,20 +20473,25 @@ static const char *startup_source = "(read-fasl-bytes)" "(lambda(i_0)(begin(let-values(((len_0)(read-fasl-integer i_0)))(read-bytes/exactly len_0 i_0)))))" "(define-values" -"(struct:mpi-intern-table mpi-intern-table1.1 mpi-intern-table? mpi-intern-table-normal mpi-intern-table-fast)" +"(struct:mpi-intern-table" +" mpi-intern-table1.1" +" mpi-intern-table?" +" mpi-intern-table-normal" +" mpi-intern-table-fast" +" mpi-intern-table-self)" "(let-values(((struct:_0 make-_0 ?_0 -ref_0 -set!_0)" "(let-values()" "(let-values()" "(make-struct-type" " 'mpi-intern-table" " #f" -" 2" +" 3" " 0" " #f" " null" "(current-inspector)" " #f" -" '(0 1)" +" '(0 1 2)" " #f" " 'mpi-intern-table)))))" "(values" @@ -20494,10 +20499,11 @@ static const char *startup_source = " make-_0" " ?_0" "(make-struct-field-accessor -ref_0 0 'normal)" -"(make-struct-field-accessor -ref_0 1 'fast))))" +"(make-struct-field-accessor -ref_0 1 'fast)" +"(make-struct-field-accessor -ref_0 2 'self))))" "(define-values" "(make-module-path-index-intern-table)" -"(lambda()(begin(mpi-intern-table1.1(make-hash)(make-hasheq)))))" +"(lambda()(begin(mpi-intern-table1.1(make-hash)(make-hasheq)(make-hash)))))" "(define-values" "(intern-module-path-index!)" "(lambda(t_0 mpi_0)" @@ -20507,7 +20513,17 @@ static const char *startup_source = " or-part_0" "(let-values(((name_0 base_0)(1/module-path-index-split mpi_0)))" "(if(not name_0)" -"(let-values()(begin(hash-set!(mpi-intern-table-fast t_0) mpi_0 mpi_0) mpi_0))" +"(let-values()" +"(let-values(((r_0)" +"(let-values(((or-part_1)(module-path-index-resolved mpi_0)))" +"(if or-part_1 or-part_1 'self))))" +"(let-values(((or-part_1)(hash-ref(mpi-intern-table-self t_0) r_0 #f)))" +"(if or-part_1" +" or-part_1" +"(begin" +"(hash-set!(mpi-intern-table-self t_0) r_0 mpi_0)" +"(hash-set!(mpi-intern-table-fast t_0) mpi_0 mpi_0)" +" mpi_0)))))" "(let-values()" "(let-values(((interned-base_0)(if base_0(intern-module-path-index! t_0 base_0) #f)))" "(let-values(((at-name_0)"