expander: improve dependency-cycle reporting

Show the dependency chain when a redeclared module creates a
dependency cycle.
This commit is contained in:
Matthew Flatt 2020-06-29 09:09:30 -06:00
parent cdf7e9c383
commit 0527c9c9e2
2 changed files with 289 additions and 206 deletions

View File

@ -205,7 +205,7 @@
;; Register this module's exports for use in resolving bulk
;; bindings, so that bulk bindings can be shared among other
;; modules when unmarshaling; we don't do this without
;; `with-submodules?` to avoid loeaking submodules being
;; `with-submodules?` to avoid leaking submodules being
;; expanded, but see also `bind-all-provides!`
(register-bulk-provide! (namespace-bulk-binding-registry ns)
mod-name
@ -223,7 +223,9 @@
(define at-phase (hash-ref (namespace-module-instances ns) phase))
(hash-set! at-phase mod-name (make-module-instance m-ns m))
(set-module-instance-shifted-requires! prior-mi #f)
(when visit?
(namespace-module-visit! ns (namespace-mpi m-ns) phase))
(when run?
@ -369,7 +371,8 @@
(define (namespace-module-instantiate! ns mpi instance-phase #:run-phase [run-phase (namespace-phase ns)]
#:skip-run? [skip-run? #f]
#:otherwise-available? [otherwise-available? #t]
#:seen [seen #hasheq()])
#:seen [seen #hasheq()]
#:seen-list [seen-list null])
(unless (module-path-index? mpi)
(error "not a module path index:" mpi))
(define name (module-path-index-resolve mpi #t))
@ -382,7 +385,8 @@
(run-module-instance! mi ns #:run-phase run-phase
#:skip-run? skip-run?
#:otherwise-available? otherwise-available?
#:seen seen))
#:seen seen
#:seen-list seen-list))
;; If the module is cross-phase persistent, make sure it's instantiated
;; at phase 0 and registered in `ns` as phaseless; otherwise
(cond
@ -408,7 +412,8 @@
(define (run-module-instance! mi ns #:run-phase run-phase
#:skip-run? skip-run?
#:otherwise-available? otherwise-available?
#:seen [seen #hasheq()])
#:seen [seen #hasheq()]
#:seen-list [seen-list null])
(performance-region
['eval 'requires]
;; Nothing to do if we've run this phase already and made the
@ -429,7 +434,11 @@
(define bulk-binding-registry (namespace-bulk-binding-registry m-ns))
(when (hash-ref seen mi #f)
(error 'require "import cycle detected during module instantiation"))
(error 'require
(apply string-append
"import cycle detected during module instantiation\n"
" dependency chain:"
(module-instances->indented-module-names mi seen-list))))
;; If we haven't shifted required mpis already, do that
(unless (module-instance-shifted-requires mi)
@ -450,7 +459,8 @@
#:run-phase run-phase
#:skip-run? skip-run?
#:otherwise-available? otherwise-available?
#:seen (hash-set seen mi #t))))
#:seen (hash-set seen mi #t)
#:seen-list (cons mi seen-list))))
;; Run or make available phases of the module body:
(unless (label-phase? instance-phase)
@ -558,3 +568,19 @@
'provided))))))
(set-module-access! m access)
access)
;; ----------------------------------------
(define (module-instances->indented-module-names mi seen-list)
(let ([mi->name (lambda (mi)
(format "\n ~a" (module-path-index-resolve
(namespace-mpi (module-instance-namespace mi)))))])
(cons
(mi->name mi)
(let loop ([seen-list seen-list])
(cond
[(null? seen-list) '()]
[(eq? mi (car seen-list))
(list (mi->name mi))]
[else
(cons (mi->name (car seen-list)) (loop (cdr seen-list)))])))))

View File

@ -14034,38 +14034,38 @@ static const char *startup_source =
"(let-values(((name_0)(1/module-path-index-resolve name-mpi_0)))"
"(let-values(((m-ns_0)"
"(let-values(((the-struct_0)"
"(let-values(((ns134_0) ns_0)"
"((root-expand-ctx135_0) root-expand-ctx_0)"
"((temp136_0) #f))"
"(new-namespace.1 temp136_0 root-expand-ctx135_0 ns134_0))))"
"(let-values(((ns138_0) ns_0)"
"((root-expand-ctx139_0) root-expand-ctx_0)"
"((temp140_0) #f))"
"(new-namespace.1 temp140_0 root-expand-ctx139_0 ns138_0))))"
"(if(1/namespace? the-struct_0)"
"(let-values(((mpi126_0) name-mpi_0)"
"((source-name127_0)(resolved-module-path-root-name name_0))"
"((phase128_0) phase_0)"
"((0-phase129_0) phase_0)"
"((submodule-declarations130_0)"
"(let-values(((mpi130_0) name-mpi_0)"
"((source-name131_0)(resolved-module-path-root-name name_0))"
"((phase132_0) phase_0)"
"((0-phase133_0) phase_0)"
"((submodule-declarations134_0)"
"(if for-submodule?_0"
"(namespace-submodule-declarations ns_0)"
"(make-small-hasheq)))"
"((available-module-instances131_0)(make-hasheqv))"
"((module-instances132_0)(make-hasheqv))"
"((declaration-inspector133_0)(current-code-inspector)))"
"((available-module-instances135_0)(make-hasheqv))"
"((module-instances136_0)(make-hasheqv))"
"((declaration-inspector137_0)(current-code-inspector)))"
"(namespace1.1"
" mpi126_0"
" source-name127_0"
" mpi130_0"
" source-name131_0"
"(namespace-root-expand-ctx the-struct_0)"
" phase128_0"
" 0-phase129_0"
" phase132_0"
" 0-phase133_0"
"(namespace-phase-to-namespace the-struct_0)"
"(namespace-phase-level-to-definitions the-struct_0)"
"(namespace-module-registry$1 the-struct_0)"
"(namespace-bulk-binding-registry the-struct_0)"
" submodule-declarations130_0"
" submodule-declarations134_0"
"(namespace-root-namespace the-struct_0)"
" declaration-inspector133_0"
" declaration-inspector137_0"
"(namespace-inspector the-struct_0)"
" available-module-instances131_0"
" module-instances132_0))"
" available-module-instances135_0"
" module-instances136_0))"
" (raise-argument-error 'struct-copy \"namespace?\" the-struct_0)))))"
"(let-values((()"
"(begin"
@ -14096,10 +14096,10 @@ static const char *startup_source =
"(let-values(((prior-mi_0)"
"(if prior-m_0"
"(if(not(eq? m_0 prior-m_0))"
"(let-values(((ns137_0) ns_0)"
"((mod-name138_0) mod-name_0)"
"((temp139_0)(namespace-phase ns_0)))"
"(namespace->module-instance.1 #f #f void ns137_0 mod-name138_0 temp139_0))"
"(let-values(((ns141_0) ns_0)"
"((mod-name142_0) mod-name_0)"
"((temp143_0)(namespace-phase ns_0)))"
"(namespace->module-instance.1 #f #f void ns141_0 mod-name142_0 temp143_0))"
" #f)"
" #f)))"
"(begin"
@ -14129,30 +14129,32 @@ static const char *startup_source =
"(let-values(((at-phase_0)(hash-ref(namespace-module-instances ns_0) phase_0)))"
"(begin"
"(hash-set! at-phase_0 mod-name_0(make-module-instance m-ns_0 m_0))"
"(set-module-instance-shifted-requires! prior-mi_0 #f)"
"(if visit?_0"
"(let-values()"
"(let-values(((ns140_0) ns_0)"
"((temp141_0)(namespace-mpi m-ns_0))"
"((phase142_0) phase_0))"
"(let-values(((ns144_0) ns_0)"
"((temp145_0)(namespace-mpi m-ns_0))"
"((phase146_0) phase_0))"
"(namespace-module-visit!.1"
" unsafe-undefined"
" ns140_0"
" temp141_0"
" phase142_0)))"
" ns144_0"
" temp145_0"
" phase146_0)))"
"(void))"
"(if run?_0"
"(let-values()"
"(let-values(((ns143_0) ns_0)"
"((temp144_0)(namespace-mpi m-ns_0))"
"((phase145_0) phase_0))"
"(let-values(((ns147_0) ns_0)"
"((temp148_0)(namespace-mpi m-ns_0))"
"((phase149_0) phase_0))"
"(namespace-module-instantiate!.1"
" #t"
" unsafe-undefined"
" '#hasheq()"
" null"
" #f"
" ns143_0"
" temp144_0"
" phase145_0)))"
" ns147_0"
" temp148_0"
" phase149_0)))"
"(void))))))))))"
"(void)))))))))))))"
"(define-values"
@ -14231,32 +14233,32 @@ static const char *startup_source =
"(let-values(((m-ns_0)"
"(let-values(((the-struct_0) ns_0))"
"(if(1/namespace? the-struct_0)"
"(let-values(((mpi146_0)(namespace-mpi existing-m-ns_0))"
"((source-name147_0)(namespace-source-name existing-m-ns_0))"
"((root-expand-ctx148_0)(box(unbox(namespace-root-expand-ctx existing-m-ns_0))))"
"((phase149_0)(namespace-phase existing-m-ns_0))"
"((0-phase150_0)(namespace-0-phase existing-m-ns_0))"
"((phase-to-namespace151_0)(make-small-hasheqv))"
"((phase-level-to-definitions152_0)"
"(let-values(((mpi150_0)(namespace-mpi existing-m-ns_0))"
"((source-name151_0)(namespace-source-name existing-m-ns_0))"
"((root-expand-ctx152_0)(box(unbox(namespace-root-expand-ctx existing-m-ns_0))))"
"((phase153_0)(namespace-phase existing-m-ns_0))"
"((0-phase154_0)(namespace-0-phase existing-m-ns_0))"
"((phase-to-namespace155_0)(make-small-hasheqv))"
"((phase-level-to-definitions156_0)"
"(if(module-cross-phase-persistent? m_0)"
"(namespace-phase-level-to-definitions existing-m-ns_0)"
"(make-small-hasheqv)))"
"((declaration-inspector153_0)(module-inspector m_0))"
"((inspector154_0)(namespace-inspector existing-m-ns_0)))"
"((declaration-inspector157_0)(module-inspector m_0))"
"((inspector158_0)(namespace-inspector existing-m-ns_0)))"
"(namespace1.1"
" mpi146_0"
" source-name147_0"
" root-expand-ctx148_0"
" phase149_0"
" 0-phase150_0"
" phase-to-namespace151_0"
" phase-level-to-definitions152_0"
" mpi150_0"
" source-name151_0"
" root-expand-ctx152_0"
" phase153_0"
" 0-phase154_0"
" phase-to-namespace155_0"
" phase-level-to-definitions156_0"
"(namespace-module-registry$1 the-struct_0)"
"(namespace-bulk-binding-registry the-struct_0)"
"(namespace-submodule-declarations the-struct_0)"
"(namespace-root-namespace the-struct_0)"
" declaration-inspector153_0"
" inspector154_0"
" declaration-inspector157_0"
" inspector158_0"
"(namespace-available-module-instances the-struct_0)"
"(namespace-module-instances the-struct_0)))"
" (raise-argument-error 'struct-copy \"namespace?\" the-struct_0)))))"
@ -14310,33 +14312,33 @@ static const char *startup_source =
"(let-values(((m-ns_0)"
"(let-values(((the-struct_0) ns_0))"
"(if(1/namespace? the-struct_0)"
"(let-values(((mpi155_0) mpi_0)"
"((source-name156_0)"
"(let-values(((mpi159_0) mpi_0)"
"((source-name160_0)"
"(let-values(((or-part_0)(module-source-name m_0)))"
"(if or-part_0"
" or-part_0"
"(resolved-module-path-root-name(1/module-path-index-resolve mpi_0)))))"
"((root-expand-ctx157_0)(box #f))"
"((phase158_0) 0-phase_0)"
"((0-phase159_0) 0-phase_0)"
"((phase-to-namespace160_0)(make-small-hasheqv))"
"((phase-level-to-definitions161_0)(make-small-hasheqv))"
"((declaration-inspector162_0)(module-inspector m_0))"
"((inspector163_0)(make-inspector(module-inspector m_0))))"
"((root-expand-ctx161_0)(box #f))"
"((phase162_0) 0-phase_0)"
"((0-phase163_0) 0-phase_0)"
"((phase-to-namespace164_0)(make-small-hasheqv))"
"((phase-level-to-definitions165_0)(make-small-hasheqv))"
"((declaration-inspector166_0)(module-inspector m_0))"
"((inspector167_0)(make-inspector(module-inspector m_0))))"
"(namespace1.1"
" mpi155_0"
" source-name156_0"
" root-expand-ctx157_0"
" phase158_0"
" 0-phase159_0"
" phase-to-namespace160_0"
" phase-level-to-definitions161_0"
" mpi159_0"
" source-name160_0"
" root-expand-ctx161_0"
" phase162_0"
" 0-phase163_0"
" phase-to-namespace164_0"
" phase-level-to-definitions165_0"
"(namespace-module-registry$1 the-struct_0)"
"(namespace-bulk-binding-registry the-struct_0)"
"(namespace-submodule-declarations the-struct_0)"
"(namespace-root-namespace the-struct_0)"
" declaration-inspector162_0"
" inspector163_0"
" declaration-inspector166_0"
" inspector167_0"
"(namespace-available-module-instances the-struct_0)"
"(namespace-module-instances the-struct_0)))"
" (raise-argument-error 'struct-copy \"namespace?\" the-struct_0)))))"
@ -14389,49 +14391,57 @@ static const char *startup_source =
"(let-values(((unavailable-callback_0) unavailable-callback67_0))"
"(let-values()"
"(let-values(((mi_0)"
"(let-values(((ns164_0) ns_0)"
"((name165_0) name_0)"
"((0-phase166_0) 0-phase_0)"
"((complain-on-failure?167_0) complain-on-failure?_0)"
"((check-available-at-phase-level168_0) check-available-at-phase-level_0)"
"((unavailable-callback169_0) unavailable-callback_0))"
"(let-values(((ns168_0) ns_0)"
"((name169_0) name_0)"
"((0-phase170_0) 0-phase_0)"
"((complain-on-failure?171_0) complain-on-failure?_0)"
"((check-available-at-phase-level172_0) check-available-at-phase-level_0)"
"((unavailable-callback173_0) unavailable-callback_0))"
"(namespace->module-instance.1"
" check-available-at-phase-level168_0"
" complain-on-failure?167_0"
" unavailable-callback169_0"
" ns164_0"
" name165_0"
" 0-phase166_0))))"
" check-available-at-phase-level172_0"
" complain-on-failure?171_0"
" unavailable-callback173_0"
" ns168_0"
" name169_0"
" 0-phase170_0))))"
"(if mi_0(module-instance-namespace mi_0) #f))))))))))))"
"(define-values"
"(namespace-record-module-instance-attached!)"
"(lambda(ns_0 mod-name_0 phase_0)"
"(begin"
"(let-values(((mi_0)"
"(let-values(((ns170_0) ns_0)((mod-name171_0) mod-name_0)((phase172_0) phase_0))"
"(namespace->module-instance.1 #f #f void ns170_0 mod-name171_0 phase172_0))))"
"(let-values(((ns174_0) ns_0)((mod-name175_0) mod-name_0)((phase176_0) phase_0))"
"(namespace->module-instance.1 #f #f void ns174_0 mod-name175_0 phase176_0))))"
"(set-module-instance-attached?! mi_0 #t)))))"
"(define-values"
"(module-force-bulk-binding!)"
"(lambda(m_0 ns_0)(begin((module-force-bulk-binding m_0)(namespace-bulk-binding-registry ns_0)))))"
"(define-values"
"(namespace-module-instantiate!.1)"
"(lambda(otherwise-available?77_0 run-phase75_0 seen78_0 skip-run?76_0 ns83_0 mpi84_0 instance-phase85_0)"
"(lambda(otherwise-available?77_0"
" run-phase75_0"
" seen78_0"
" seen-list79_0"
" skip-run?76_0"
" ns85_0"
" mpi86_0"
" instance-phase87_0)"
"(begin"
" 'namespace-module-instantiate!"
"(let-values(((ns_0) ns83_0))"
"(let-values(((mpi_0) mpi84_0))"
"(let-values(((instance-phase_0) instance-phase85_0))"
"(let-values(((ns_0) ns85_0))"
"(let-values(((mpi_0) mpi86_0))"
"(let-values(((instance-phase_0) instance-phase87_0))"
"(let-values(((run-phase_0)(if(eq? run-phase75_0 unsafe-undefined)(namespace-phase ns_0) run-phase75_0)))"
"(let-values(((skip-run?_0) skip-run?76_0))"
"(let-values(((otherwise-available?_0) otherwise-available?77_0))"
"(let-values(((seen_0) seen78_0))"
"(let-values(((seen-list_0) seen-list79_0))"
"(let-values()"
"(let-values((()"
"(begin"
"(if(1/module-path-index? mpi_0)"
"(void)"
" (let-values () (error \"not a module path index:\" mpi_0)))"
" (let-values () (error \"not a module path index:\" mpi_0)))"
"(values))))"
"(let-values(((name_0)(1/module-path-index-resolve mpi_0 #t)))"
"(let-values(((m_0)(namespace->module ns_0 name_0)))"
@ -14447,17 +14457,17 @@ static const char *startup_source =
" 'instantiate!"
"(let-values(((mi_0)"
"(let-values(((or-part_0)"
"(let-values(((ns179_0) ns_1)"
"((name180_0) name_0)"
"((instance-phase181_0)"
"(let-values(((ns184_0) ns_1)"
"((name185_0) name_0)"
"((instance-phase186_0)"
" instance-phase_1))"
"(namespace->module-instance.1"
" #f"
" #f"
" void"
" ns179_0"
" name180_0"
" instance-phase181_0))))"
" ns184_0"
" name185_0"
" instance-phase186_0))))"
"(if or-part_0"
" or-part_0"
"(namespace-create-module-instance!"
@ -14466,19 +14476,21 @@ static const char *startup_source =
" instance-phase_1"
" m_0"
" mpi_0)))))"
"(let-values(((mi173_0) mi_0)"
"((ns174_0) ns_1)"
"((run-phase175_0) run-phase_1)"
"((skip-run?176_0) skip-run?_0)"
"((otherwise-available?177_0) otherwise-available?_0)"
"((seen178_0) seen_0))"
"(let-values(((mi177_0) mi_0)"
"((ns178_0) ns_1)"
"((run-phase179_0) run-phase_1)"
"((skip-run?180_0) skip-run?_0)"
"((otherwise-available?181_0) otherwise-available?_0)"
"((seen182_0) seen_0)"
"((seen-list183_0) seen-list_0))"
"(run-module-instance!.1"
" otherwise-available?177_0"
" run-phase175_0"
" seen178_0"
" skip-run?176_0"
" mi173_0"
" ns174_0)))))))"
" otherwise-available?181_0"
" run-phase179_0"
" seen182_0"
" seen-list183_0"
" skip-run?180_0"
" mi177_0"
" ns178_0)))))))"
"(if(module-cross-phase-persistent? m_0)"
"(let-values()"
"(instantiate!_0"
@ -14486,65 +14498,68 @@ static const char *startup_source =
" 0"
"(let-values(((or-part_0)(namespace-root-namespace ns_0)))"
"(if or-part_0 or-part_0 ns_0))))"
"(let-values()(instantiate!_0 instance-phase_0 run-phase_0 ns_0)))))))))))))))))))"
"(let-values()(instantiate!_0 instance-phase_0 run-phase_0 ns_0))))))))))))))))))))"
"(define-values"
"(namespace-module-visit!.1)"
"(lambda(visit-phase87_0 ns89_0 mpi90_0 instance-phase91_0)"
"(lambda(visit-phase89_0 ns91_0 mpi92_0 instance-phase93_0)"
"(begin"
" 'namespace-module-visit!"
"(let-values(((ns_0) ns89_0))"
"(let-values(((mpi_0) mpi90_0))"
"(let-values(((instance-phase_0) instance-phase91_0))"
"(let-values(((ns_0) ns91_0))"
"(let-values(((mpi_0) mpi92_0))"
"(let-values(((instance-phase_0) instance-phase93_0))"
"(let-values(((visit-phase_0)"
"(if(eq? visit-phase87_0 unsafe-undefined)(namespace-phase ns_0) visit-phase87_0)))"
"(if(eq? visit-phase89_0 unsafe-undefined)(namespace-phase ns_0) visit-phase89_0)))"
"(let-values()"
"(let-values(((ns182_0) ns_0)"
"((mpi183_0) mpi_0)"
"((instance-phase184_0) instance-phase_0)"
"((temp185_0)(add1 visit-phase_0)))"
"(let-values(((ns187_0) ns_0)"
"((mpi188_0) mpi_0)"
"((instance-phase189_0) instance-phase_0)"
"((temp190_0)(add1 visit-phase_0)))"
"(namespace-module-instantiate!.1"
" #t"
" temp185_0"
" temp190_0"
" '#hasheq()"
" null"
" #f"
" ns182_0"
" mpi183_0"
" instance-phase184_0))))))))))"
" ns187_0"
" mpi188_0"
" instance-phase189_0))))))))))"
"(define-values"
"(namespace-module-make-available!.1)"
"(lambda(visit-phase93_0 ns95_0 mpi96_0 instance-phase97_0)"
"(lambda(visit-phase95_0 ns97_0 mpi98_0 instance-phase99_0)"
"(begin"
" 'namespace-module-make-available!"
"(let-values(((ns_0) ns95_0))"
"(let-values(((mpi_0) mpi96_0))"
"(let-values(((instance-phase_0) instance-phase97_0))"
"(let-values(((ns_0) ns97_0))"
"(let-values(((mpi_0) mpi98_0))"
"(let-values(((instance-phase_0) instance-phase99_0))"
"(let-values(((visit-phase_0)"
"(if(eq? visit-phase93_0 unsafe-undefined)(namespace-phase ns_0) visit-phase93_0)))"
"(if(eq? visit-phase95_0 unsafe-undefined)(namespace-phase ns_0) visit-phase95_0)))"
"(let-values()"
"(let-values(((ns186_0) ns_0)"
"((mpi187_0) mpi_0)"
"((instance-phase188_0) instance-phase_0)"
"((temp189_0)(add1 visit-phase_0))"
"((temp190_0) #t))"
"(let-values(((ns191_0) ns_0)"
"((mpi192_0) mpi_0)"
"((instance-phase193_0) instance-phase_0)"
"((temp194_0)(add1 visit-phase_0))"
"((temp195_0) #t))"
"(namespace-module-instantiate!.1"
" #t"
" temp189_0"
" temp194_0"
" '#hasheq()"
" temp190_0"
" ns186_0"
" mpi187_0"
" instance-phase188_0))))))))))"
" null"
" temp195_0"
" ns191_0"
" mpi192_0"
" instance-phase193_0))))))))))"
"(define-values"
"(run-module-instance!.1)"
"(lambda(otherwise-available?101_0 run-phase99_0 seen102_0 skip-run?100_0 mi107_0 ns108_0)"
"(lambda(otherwise-available?103_0 run-phase101_0 seen104_0 seen-list105_0 skip-run?102_0 mi111_0 ns112_0)"
"(begin"
" 'run-module-instance!"
"(let-values(((mi_0) mi107_0))"
"(let-values(((ns_0) ns108_0))"
"(let-values(((run-phase_0) run-phase99_0))"
"(let-values(((skip-run?_0) skip-run?100_0))"
"(let-values(((otherwise-available?_0) otherwise-available?101_0))"
"(let-values(((seen_0) seen102_0))"
"(let-values(((mi_0) mi111_0))"
"(let-values(((ns_0) ns112_0))"
"(let-values(((run-phase_0) run-phase101_0))"
"(let-values(((skip-run?_0) skip-run?102_0))"
"(let-values(((otherwise-available?_0) otherwise-available?103_0))"
"(let-values(((seen_0) seen104_0))"
"(let-values(((seen-list_0) seen-list105_0))"
"(let-values()"
"(begin"
"(if log-performance?(let-values()(start-performance-region 'eval 'requires))(void))"
@ -14575,7 +14590,7 @@ static const char *startup_source =
"(let-values()"
"(error"
" 'require"
" \"import cycle detected; trying to run module being expanded\")))"
" \"import cycle detected; trying to run module being expanded\")))"
"(values))))"
"(let-values(((mpi_0)(namespace-mpi m-ns_0)))"
"(let-values(((phase-shift_0) instance-phase_0))"
@ -14586,7 +14601,11 @@ static const char *startup_source =
"(let-values()"
"(error"
" 'require"
" \"import cycle detected during module instantiation\"))"
"(apply"
" string-append"
" \"import cycle detected during module instantiation\\n\""
" \" dependency chain:\""
"(module-instances->indented-module-names mi_0 seen-list_0))))"
"(void))"
"(if(module-instance-shifted-requires mi_0)"
"(void)"
@ -14689,7 +14708,8 @@ static const char *startup_source =
"(if(pair? lst_1)"
"(let-values(((phase+mpis_0)"
"(unsafe-car lst_1))"
"((rest_0)(unsafe-cdr lst_1)))"
"((rest_0)"
"(unsafe-cdr lst_1)))"
"(let-values((()"
"(let-values()"
"(let-values((()"
@ -14728,33 +14748,38 @@ static const char *startup_source =
"(let-values()"
"(begin"
"(let-values()"
"(let-values(((ns191_0)"
"(let-values(((ns196_0)"
" ns_0)"
"((req-mpi192_0)"
"((req-mpi197_0)"
" req-mpi_0)"
"((temp193_0)"
"((temp198_0)"
"(phase+"
" instance-phase_0"
" req-phase_0))"
"((run-phase194_0)"
"((run-phase199_0)"
" run-phase_0)"
"((skip-run?195_0)"
"((skip-run?200_0)"
" skip-run?_0)"
"((otherwise-available?196_0)"
"((otherwise-available?201_0)"
" otherwise-available?_0)"
"((temp197_0)"
"((temp202_0)"
"(hash-set"
" seen_0"
" mi_0"
" #t)))"
" #t))"
"((temp203_0)"
"(cons"
" mi_0"
" seen-list_0)))"
"(namespace-module-instantiate!.1"
" otherwise-available?196_0"
" run-phase194_0"
" temp197_0"
" skip-run?195_0"
" ns191_0"
" req-mpi192_0"
" temp193_0)))"
" otherwise-available?201_0"
" run-phase199_0"
" temp202_0"
" temp203_0"
" skip-run?200_0"
" ns196_0"
" req-mpi197_0"
" temp198_0)))"
"(values)))))"
"(values)))))"
"(if(not"
@ -14791,7 +14816,8 @@ static const char *startup_source =
"(begin"
" 'for-loop"
"(if(> pos_0 end_0)"
"(let-values(((phase-level_0) pos_0))"
"(let-values(((phase-level_0)"
" pos_0))"
"(let-values((()"
"(let-values()"
"(let-values((()"
@ -14913,29 +14939,29 @@ static const char *startup_source =
"(module-instance-phase-level-to-state mi_0)"
" run-phase-level_0"
" 'started)))))))))))))))"
"(if log-performance?(let-values()(end-performance-region))(void))))))))))))))"
"(if log-performance?(let-values()(end-performance-region))(void)))))))))))))))"
"(define-values"
"(namespace-visit-available-modules!)"
"(let-values(((namespace-visit-available-modules!_0)"
"(lambda(ns111_0 run-phase110_0)"
"(lambda(ns115_0 run-phase114_0)"
"(begin"
" 'namespace-visit-available-modules!"
"(let-values(((ns_0) ns111_0))"
"(let-values(((ns_0) ns115_0))"
"(let-values(((run-phase_0)"
"(if(eq? run-phase110_0 unsafe-undefined)(namespace-phase ns_0) run-phase110_0)))"
"(if(eq? run-phase114_0 unsafe-undefined)(namespace-phase ns_0) run-phase114_0)))"
"(let-values()(namespace-run-available-modules! ns_0(add1 run-phase_0)))))))))"
"(case-lambda"
"((ns_0)(begin(namespace-visit-available-modules!_0 ns_0 unsafe-undefined)))"
"((ns_0 run-phase110_0)(namespace-visit-available-modules!_0 ns_0 run-phase110_0)))))"
"((ns_0 run-phase114_0)(namespace-visit-available-modules!_0 ns_0 run-phase114_0)))))"
"(define-values"
"(namespace-run-available-modules!)"
"(let-values(((namespace-run-available-modules!_0)"
"(lambda(ns113_0 run-phase112_0)"
"(lambda(ns117_0 run-phase116_0)"
"(begin"
" 'namespace-run-available-modules!"
"(let-values(((ns_0) ns113_0))"
"(let-values(((ns_0) ns117_0))"
"(let-values(((run-phase_0)"
"(if(eq? run-phase112_0 unsafe-undefined)(namespace-phase ns_0) run-phase112_0)))"
"(if(eq? run-phase116_0 unsafe-undefined)(namespace-phase ns_0) run-phase116_0)))"
"(let-values()"
"(registry-call-with-lock"
"(namespace-module-registry$1 ns_0)"
@ -14979,23 +15005,24 @@ static const char *startup_source =
"(let-values()"
"(begin"
"(let-values()"
"(let-values(((mi198_0)"
"(let-values(((mi204_0)"
" mi_0)"
"((ns199_0)"
"((ns205_0)"
" ns_0)"
"((run-phase200_0)"
"((run-phase206_0)"
" run-phase_0)"
"((temp201_0)"
"((temp207_0)"
" #f)"
"((temp202_0)"
"((temp208_0)"
" #f))"
"(run-module-instance!.1"
" temp202_0"
" run-phase200_0"
" temp208_0"
" run-phase206_0"
" '#hasheq()"
" temp201_0"
" mi198_0"
" ns199_0)))"
" null"
" temp207_0"
" mi204_0"
" ns205_0)))"
"(values)))))"
"(values)))))"
"(if(not #f)"
@ -15009,42 +15036,42 @@ static const char *startup_source =
" loop_0)))))))))))"
"(case-lambda"
"((ns_0)(begin(namespace-run-available-modules!_0 ns_0 unsafe-undefined)))"
"((ns_0 run-phase112_0)(namespace-run-available-modules!_0 ns_0 run-phase112_0)))))"
"((ns_0 run-phase116_0)(namespace-run-available-modules!_0 ns_0 run-phase116_0)))))"
"(define-values"
"(namespace-primitive-module-visit!)"
"(lambda(ns_0 name_0)"
"(begin"
"(let-values(((mi_0)(hash-ref(namespace-module-instances ns_0)(1/make-resolved-module-path name_0))))"
"(let-values(((mi203_0) mi_0)((ns204_0) ns_0)((temp205_0) 1)((temp206_0) #f)((temp207_0) #t))"
"(run-module-instance!.1 temp207_0 temp205_0 '#hasheq() temp206_0 mi203_0 ns204_0))))))"
"(let-values(((mi209_0) mi_0)((ns210_0) ns_0)((temp211_0) 1)((temp212_0) #f)((temp213_0) #t))"
"(run-module-instance!.1 temp213_0 temp211_0 '#hasheq() null temp212_0 mi209_0 ns210_0))))))"
"(define-values"
"(namespace-module-use->module+linklet-instances.1)"
"(lambda(phase-shift116_0 shift-from114_0 shift-to115_0 ns120_0 mu121_0)"
"(lambda(phase-shift120_0 shift-from118_0 shift-to119_0 ns124_0 mu125_0)"
"(begin"
" 'namespace-module-use->module+linklet-instances"
"(let-values(((ns_0) ns120_0))"
"(let-values(((mu_0) mu121_0))"
"(let-values(((shift-from_0) shift-from114_0))"
"(let-values(((shift-to_0) shift-to115_0))"
"(let-values(((phase-shift_0) phase-shift116_0))"
"(let-values(((ns_0) ns124_0))"
"(let-values(((mu_0) mu125_0))"
"(let-values(((shift-from_0) shift-from118_0))"
"(let-values(((shift-to_0) shift-to119_0))"
"(let-values(((phase-shift_0) phase-shift120_0))"
"(let-values()"
"(let-values(((mod_0)(module-use-module mu_0)))"
"(let-values(((mi_0)"
"(let-values(((ns208_0) ns_0)"
"((temp209_0)"
"(let-values(((ns214_0) ns_0)"
"((temp215_0)"
"(1/module-path-index-resolve"
"(if shift-from_0"
"(module-path-index-shift mod_0 shift-from_0 shift-to_0)"
" mod_0)))"
"((phase-shift210_0) phase-shift_0)"
"((temp211_0) #t))"
"((phase-shift216_0) phase-shift_0)"
"((temp217_0) #t))"
"(namespace->module-instance.1"
" #f"
" temp211_0"
" temp217_0"
" void"
" ns208_0"
" temp209_0"
" phase-shift210_0))))"
" ns214_0"
" temp215_0"
" phase-shift216_0))))"
"(let-values(((m-ns_0)(module-instance-namespace mi_0)))"
"(let-values(((d_0)"
"(small-hash-ref"
@ -15222,6 +15249,31 @@ static const char *startup_source =
"(hash-iterate-first ht_0))))))"
"(begin(set-module-access! m_0 access_0) access_0)))))"
"(define-values"
"(module-instances->indented-module-names)"
"(lambda(mi_0 seen-list_0)"
"(begin"
"(let-values(((mi->name_0)"
"(lambda(mi_1)"
"(begin"
" 'mi->name"
"(format"
" \"\\n ~a\""
"(1/module-path-index-resolve(namespace-mpi(module-instance-namespace mi_1))))))))"
"(cons"
"(mi->name_0 mi_0)"
"((letrec-values(((loop_0)"
"(lambda(seen-list_1)"
"(begin"
" 'loop"
"(if(null? seen-list_1)"
"(let-values() '())"
"(if(eq? mi_0(car seen-list_1))"
"(let-values()(list(mi->name_0 mi_0)))"
"(let-values()"
"(cons(mi->name_0(car seen-list_1))(loop_0(cdr seen-list_1))))))))))"
" loop_0)"
" seen-list_0))))))"
"(define-values"
"(binding->module-instance)"
"(lambda(b_0 ns_0 phase_0 id_0)"
"(begin"
@ -28232,6 +28284,7 @@ static const char *startup_source =
" #t"
" run-phase248_0"
" '#hasheq()"
" null"
" #f"
" m-ns245_0"
" interned-mpi246_0"
@ -49034,6 +49087,7 @@ static const char *startup_source =
" #t"
" unsafe-undefined"
" '#hasheq()"
" null"
" #f"
" src-namespace35_0"
" mpi36_0"
@ -51891,6 +51945,7 @@ static const char *startup_source =
" temp15_0"
" phase14_0"
" '#hasheq()"
" null"
" #f"
" ns11_0"
" mpi12_0"
@ -51905,6 +51960,7 @@ static const char *startup_source =
" #t"
" phase19_0"
" '#hasheq()"
" null"
" #f"
" ns16_0"
" mpi17_0"
@ -51967,6 +52023,7 @@ static const char *startup_source =
" temp28_0"
" phase27_0"
" '#hasheq()"
" null"
" #f"
" ns24_0"
" mpi25_0"