diff options
-rw-r--r-- | scheme/racket/geiser/enter.rkt | 112 |
1 files changed, 58 insertions, 54 deletions
diff --git a/scheme/racket/geiser/enter.rkt b/scheme/racket/geiser/enter.rkt index e996527..d7802f5 100644 --- a/scheme/racket/geiser/enter.rkt +++ b/scheme/racket/geiser/enter.rkt @@ -19,6 +19,12 @@ (struct mod (name load-path timestamp depends)) +(define (make-mod name path ts code) + (let ([deps (if code + (apply append (map cdr (module-compiled-imports code))) + null)]) + (mod name (path->string path) ts deps))) + (define loaded (make-hash)) (define (module-loaded? path) @@ -81,62 +87,60 @@ (define ((enter-load/use-compiled orig re?) path name) (when (inhibit-eval) - (raise (make-exn:fail "namespace not found" - (current-continuation-marks)))) + (raise (make-exn:fail "namespace not found" (current-continuation-marks)))) (if name ;; Module load: - (let ([code (get-module-code - path "compiled" - (lambda (e) - (parameterize ([compile-enforce-module-constants #f]) - (compile e))) - (lambda (ext loader?) (load-extension ext) #f) - #:notify (lambda (chosen) (notify re? chosen)))] - [path (normal-case-path - (simplify-path - (path->complete-path path - (or (current-load-relative-directory) - (current-directory)))))]) - ;; Record module timestamp and dependencies: - (let ([m (mod name - (path->string path) - (get-timestamp path) - (if code - (apply append - (map cdr - (module-compiled-imports code))) - null))]) - (add-paths! m (resolve-paths path))) - ;; Evaluate the module: - (parameterize ([current-module-declare-source path]) - (eval code))) + (let* ([code (get-module-code + path "compiled" + (lambda (e) + (parameterize ([compile-enforce-module-constants #f]) + (compile e))) + (lambda (ext loader?) (load-extension ext) #f) + #:notify (lambda (chosen) (notify re? chosen)))] + [dir (or (current-load-relative-directory) (current-directory))] + [path (path->complete-path path dir)] + [path (normal-case-path (simplify-path path))]) + (define-values (ts real-path) (get-timestamp path)) + (add-paths! (make-mod name path ts code) (resolve-paths path)) + (parameterize ([current-module-declare-source path]) (eval code))) ;; Not a module: - (begin - (notify re? path) - (orig path name)))) + (begin (notify re? path) (orig path name)))) + (define (get-timestamp path) - (file-or-directory-modify-seconds path #f (lambda () -inf.0))) - -(define (check-latest mod) - (let ([mpi (module-path-index-join mod #f)] - [done (make-hash)]) - (let loop ([mpi mpi]) - (let* ([rpath (module-path-index-resolve mpi)] - [path (resolved-module-path-name rpath)]) - (when (path? path) - (let ([path (normal-case-path path)]) - (unless (hash-ref done path #f) - (hash-set! done path #t) - (let ([mod (hash-ref loaded path #f)]) - (when mod - (for-each loop (mod-depends mod)) - (let ([ts (get-timestamp path)]) - (when (ts . > . (mod-timestamp mod)) - (let ([orig (current-load/use-compiled)]) - (parameterize ([current-load/use-compiled - (enter-load/use-compiled orig #f)] - [current-module-declare-name rpath]) - ((enter-load/use-compiled orig #t) - path - (mod-name mod))))))))))))))) + (let ([ts (file-or-directory-modify-seconds path #f (lambda () #f))]) + (if ts + (values ts path) + (if (regexp-match? #rx#"[.]rkt$" (path->bytes path)) + (let* ([alt-path (path-replace-suffix path #".ss")] + [ts (file-or-directory-modify-seconds alt-path + #f + (lambda () #f))]) + (if ts + (values ts alt-path) + (values -inf.0 path))) + (values -inf.0 path))))) + +(define (check-latest mod flags) + (define mpi (module-path-index-join mod #f)) + (define done (make-hash)) + (let loop ([mpi mpi]) + (define rpath (module-path-index-resolve mpi)) + (define path (let ([p (resolved-module-path-name rpath)]) + (if (pair? p) (car p) p))) + (when (path? path) + (define npath (normal-case-path path)) + (unless (hash-ref done npath #f) + (hash-set! done npath #t) + (define mod (hash-ref loaded npath #f)) + (when mod + (for-each loop (mod-depends mod)) + (define-values (ts actual-path) (get-timestamp npath)) + (when (ts . > . (mod-timestamp mod)) + (define orig (current-load/use-compiled)) + (parameterize ([current-load/use-compiled + (enter-load/use-compiled orig #f flags)] + [current-module-declare-name rpath] + [current-module-declare-source actual-path]) + ((enter-load/use-compiled orig #t flags) + npath (mod-name mod))))))))) |