Lines Matching refs:phase

2 (require "../common/phase.rkt"
35 module-cross-phase-persistent?
63 requires ; list of (cons phase list-of-module-path-index)
64 … provides ; phase-level -> sym -> binding or (provided binding bool bool); see [*] below
65 …[access #:mutable] ; phase-level -> sym -> 'provided or 'protected; computed on demand from `provi…
67 min-phase-level ; phase-level
68 max-phase-level ; phase-level
69phase-level-linklet-info-callback ; phase-level namespace -> module-linklet-info-or-#f
71 prepare-instance ; box namespace phase-shift bulk-binding-registry inspector -> any
72 … instantiate-phase ; box namespace phase-shift phase-level bulk-binding-registry inspector -> any
75 cross-phase-persistent?
104 #:min-phase-level [min-phase-level 0]
105 #:max-phase-level [max-phase-level 0]
106 #:instantiate-phase-callback instantiate-phase
109 #:phase-level-linklet-info-callback [phase-level-linklet-info-callback
110 (lambda (phase-level ns insp) #f)]
114 #:cross-phase-persistent? [cross-phase-persistent? primitive?]
125 min-phase-level max-phase-level
126 phase-level-linklet-info-callback
129 instantiate-phase
132 cross-phase-persistent?
142 phase-level-to-state ; phase-level -> #f, 'available, or 'started
143 [made-available? #:mutable] ; no #f in `phase-level-to-state`?
152 (make-small-hasheqv) ; phase-level-to-state
164 (define phase 0) ; always start at 0 when compiling a module
173 [phase phase]
174 [0-phase phase]
183 (small-hash-set! (namespace-phase-to-namespace m-ns) phase m-ns)
184 (define at-phase (make-hasheq))
185 (hash-set! (namespace-module-instances m-ns) phase at-phase)
186 (hash-set! at-phase name (make-module-instance m-ns #f))
198 (namespace->module-instance ns mod-name (namespace-phase ns))))
219 (define states (module-instance-phase-level-to-state prior-mi))
220 (define phase (namespace-phase ns))
221 (define visit? (eq? 'started (small-hash-ref states (add1 phase) #f)))
222 (define run? (eq? 'started (small-hash-ref states phase #f)))
224 (define at-phase (hash-ref (namespace-module-instances ns) phase))
225 (hash-set! at-phase mod-name (make-module-instance m-ns m))
230 (namespace-module-visit! ns (namespace-mpi m-ns) phase))
232 (namespace-module-instantiate! ns (namespace-mpi m-ns) phase))))
235 (when (module-cross-phase-persistent? prior-m)
237 "cannot redeclare cross-phase persistent module"
252 (define (namespace->module-linklet-info ns name phase-level)
255 ((module-phase-level-linklet-info-callback m) phase-level ns (module-inspector m))))
262 (define (namespace->module-instance ns name 0-phase
264 … #:check-available-at-phase-level [check-available-at-phase-level #f]
267 (or (hash-ref (hash-ref (namespace-module-instances ns) 0-phase #hasheq())
278 " phase: ~a")
280 0-phase))))
281 (if (and mi check-available-at-phase-level)
282 (check-availablilty mi check-available-at-phase-level unavailable-callback)
285 (define (namespace-install-module-namespace! ns name 0-phase m existing-m-ns)
290 [phase (namespace-phase existing-m-ns)]
291 [0-phase (namespace-0-phase existing-m-ns)]
292 [phase-to-namespace (make-small-hasheqv)]
293 [phase-level-to-definitions (if (module-cross-phase-persistent? m)
294 … (namespace-phase-level-to-definitions existing-m-ns)
301 [(module-cross-phase-persistent? m)
302 (small-hash-set! (namespace-phase-to-namespace m-ns) 0 m-ns)
303 (small-hash-set! (namespace-phase-level-to-definitions m-ns)
306 (small-hash-set! (namespace-phase-to-namespace m-ns) 1 (namespace->namespace-at-phase m-ns 1))
307 (small-hash-set! (namespace-phase-level-to-definitions m-ns)
313 (small-hash-set! (module-instance-phase-level-to-state mi) 0 'started)]
315 (small-hash-set! (namespace-phase-to-namespace m-ns) 0-phase m-ns)
316 (small-hash-set! (namespace-phase-level-to-definitions m-ns)
319 (small-hash-set! (module-instance-phase-level-to-state mi) 0 'started)
320 (define at-phase (or (hash-ref (namespace-module-instances ns) 0-phase #f)
321 (let ([at-phase (make-hasheq)])
322 (hash-set! (namespace-module-instances ns) 0-phase at-phase)
323 at-phase)))
324 (hash-set! at-phase name mi)]))
326 (define (namespace-create-module-instance! ns name 0-phase m mpi)
333 [phase 0-phase]
334 [0-phase 0-phase]
335 [phase-to-namespace (make-small-hasheqv)]
336 [phase-level-to-definitions (make-small-hasheqv)]
339 (small-hash-set! (namespace-phase-to-namespace m-ns) 0-phase m-ns)
341 (if (module-cross-phase-persistent? m)
343 (let ([at-phase (or (hash-ref (namespace-module-instances ns) 0-phase #f)
344 (let ([at-phase (make-hasheq)])
345 (hash-set! (namespace-module-instances ns) 0-phase at-phase)
346 at-phase))])
347 (hash-set! at-phase name mi)))
350 (define (check-availablilty mi check-available-at-phase-level unavailable-callback)
353 … (<= (module-min-phase-level m) (add1 check-available-at-phase-level) (module-max-phase-level m))
354 …(not (small-hash-ref (module-instance-phase-level-to-state mi) (add1 check-available-at-phase-leve…
358 (define (namespace->module-namespace ns name 0-phase
360 … #:check-available-at-phase-level [check-available-at-phase-level #f]
362 (define mi (namespace->module-instance ns name 0-phase
364 … #:check-available-at-phase-level check-available-at-phase-level
368 (define (namespace-record-module-instance-attached! ns mod-name phase)
369 (define mi (namespace->module-instance ns mod-name phase))
380 ;; Create a module instance as needed, and then run the specified phase;
382 …define (namespace-module-instantiate! ns mpi instance-phase #:run-phase [run-phase (namespace-phas…
393 (define (instantiate! instance-phase run-phase ns)
394 ;; Get or create a namespace for the module+phase combination:
395 (define mi (or (namespace->module-instance ns name instance-phase)
396 (namespace-create-module-instance! ns name instance-phase m mpi)))
397 (run-module-instance! mi ns #:run-phase run-phase
403 ;; If the module is cross-phase persistent, make sure it's instantiated
404 ;; at phase 0 and registered in `ns` as phaseless; otherwise
406 [(module-cross-phase-persistent? m)
409 (instantiate! instance-phase run-phase ns)]))
411 (define (namespace-module-visit! ns mpi instance-phase #:visit-phase [visit-phase (namespace-phase
412 (namespace-module-instantiate! ns mpi instance-phase #:run-phase (add1 visit-phase)))
414 …e (namespace-module-make-available! ns mpi instance-phase #:visit-phase [visit-phase (namespace-ph…
415 …(namespace-module-instantiate! ns mpi instance-phase #:run-phase (add1 visit-phase) #:skip-run? #t…
417 ;; The `instance-phase` corresponds to the phase shift for the module
418 ;; instances. The module may have content at different phase levels,
419 ;; which are all consistently shifted. The `run-phase` is an absolute
420 ;; phase that should be immediately run, unless `skip-run?` is true;
421 ;; to put it another way, phase level `(phase- instance-phase
422 ;; run-phase)` within the instance should be run immediately.
425 (define (run-module-instance! mi ns #:run-phase run-phase
433 ;; Nothing to do if we've run this phase already and made the
436 (define instance-phase (namespace-0-phase m-ns))
437 (define run-phase-level (phase- run-phase instance-phase))
447 … (eq? 'started (small-hash-ref (module-instance-phase-level-to-state mi) run-phase-level #f)))
455 (define phase-shift instance-phase) ; instance phase = phase shift
469 (for/list ([phase+mpis (in-list (module-requires m))])
470 (cons (car phase+mpis)
471 (for/list ([req-mpi (in-list (cdr phase+mpis))])
477 (for ([phase+mpis (in-list (module-instance-shifted-requires mi))])
478 (define req-phase (car phase+mpis))
479 (for ([req-mpi (in-list (cdr phase+mpis))])
480 (namespace-module-instantiate! ns req-mpi (phase+ instance-phase req-phase)
481 #:run-phase run-phase
489 (unless (label-phase? instance-phase)
490 … (for ([phase-level (in-range (module-max-phase-level m) (sub1 (module-min-phase-level m)) -1)])
491 (define phase (phase+ phase-level phase-shift))
494 (eqv? phase run-phase))
495 ;; This is the phase to make sure that we've run
496 … (unless (eq? 'started (small-hash-ref (module-instance-phase-level-to-state mi) phase-level #f))
497 (small-hash-set! (module-instance-phase-level-to-state mi) phase-level 'started)
498 (void (namespace->definitions m-ns phase-level))
499 (define p-ns (namespace->namespace-at-phase m-ns phase))
503 (define go (module-instantiate-phase m))
504 (prep data-box p-ns phase-shift mpi bulk-binding-registry insp)
505 (go data-box p-ns phase-shift phase-level mpi bulk-binding-registry insp))]
507 (not (negative? run-phase))
508 (not (small-hash-ref (module-instance-phase-level-to-state mi) phase-level #f)))
509 ;; This is a phase to merely make available
511 phase
514 (small-hash-set! (module-instance-phase-level-to-state mi) phase-level 'available)])))
520 ;; In case there's no such phase for this module instance, claim 'started
522 (small-hash-set! (module-instance-phase-level-to-state mi) run-phase-level 'started)))))
524 (define (namespace-visit-available-modules! ns [run-phase (namespace-phase ns)])
525 (namespace-run-available-modules! ns (add1 run-phase)))
527 (define (namespace-run-available-modules! ns [run-phase (namespace-phase ns)])
532 (define mis (hash-ref (namespace-available-module-instances ns) run-phase null))
534 (hash-set! (namespace-available-module-instances ns) run-phase null)
536 … (run-module-instance! mi ns #:run-phase run-phase #:skip-run? #f #:otherwise-available? #f))
542 (run-module-instance! mi ns #:run-phase 1 #:skip-run? #f #:otherwise-available? #t))
549 #:phase-shift phase-shift)
557 phase-shift
560 (define d (small-hash-ref (namespace-phase-level-to-definitions m-ns) (module-use-phase mu) #f))
563 (error 'eval (string-append "namespace mismatch: phase level not found;\n"
565 " phase level: ~a\n"
566 " found phase levels: ~a")
568 (module-use-phase mu)
569 (small-hash-keys (namespace-phase-level-to-definitions m-ns)))))
577 (for/list ([phase+mpis (in-list requires)])
578 (cons (car phase+mpis)
579 (for/list ([req-mpi (in-list (cdr phase+mpis))])
586 (for/hasheqv ([(phase at-phase) (in-hash (module-provides m))])
587 (values phase
588 (for/hash ([(sym binding/p) (in-hash at-phase)])