handle attaches of embedded modules
svn: r12225
This commit is contained in:
parent
10f794defd
commit
b8f6e1a91a
|
@ -546,7 +546,7 @@
|
||||||
(let ([extensions (filter (lambda (m) (extension? (mod-code m))) code-l)])
|
(let ([extensions (filter (lambda (m) (extension? (mod-code m))) code-l)])
|
||||||
`(module #%resolver '#%kernel
|
`(module #%resolver '#%kernel
|
||||||
(let-values ([(orig) (current-module-name-resolver)]
|
(let-values ([(orig) (current-module-name-resolver)]
|
||||||
[(reg) (namespace-module-registry (current-namespace))]
|
[(regs) (make-hasheq)]
|
||||||
[(mapping-table) (quote
|
[(mapping-table) (quote
|
||||||
,(map
|
,(map
|
||||||
(lambda (m)
|
(lambda (m)
|
||||||
|
@ -569,10 +569,37 @@
|
||||||
(mod-full-name m))]
|
(mod-full-name m))]
|
||||||
[else #f])))
|
[else #f])))
|
||||||
code-l)))])
|
code-l)))])
|
||||||
|
(hash-set! regs
|
||||||
|
(namespace-module-registry (current-namespace))
|
||||||
|
(vector mapping-table library-table))
|
||||||
(letrec-values ([(embedded-resolver)
|
(letrec-values ([(embedded-resolver)
|
||||||
(case-lambda
|
(case-lambda
|
||||||
[(name)
|
[(name)
|
||||||
;; a notification
|
;; a notification; if the name matches one of our special names,
|
||||||
|
;; assume that it's from a namespace that has the declaration
|
||||||
|
;; [it would be better if the noritifer told us the source]
|
||||||
|
(let-values ([(name) (if name (resolved-module-path-name name) #f)])
|
||||||
|
(let-values ([(a) (assq name mapping-table)])
|
||||||
|
(if a
|
||||||
|
(let-values ([(vec) (hash-ref regs (namespace-module-registry (current-namespace))
|
||||||
|
(lambda ()
|
||||||
|
(let-values ([(vec) (vector null null)])
|
||||||
|
(hash-set! regs (namespace-module-registry (current-namespace)) vec)
|
||||||
|
vec)))])
|
||||||
|
;; add mapping:
|
||||||
|
(vector-set! vec 0 (cons a (vector-ref vec 0)))
|
||||||
|
;; add library mappings:
|
||||||
|
(vector-set! vec 1 (append
|
||||||
|
(letrec-values ([(loop)
|
||||||
|
(lambda (l)
|
||||||
|
(if (null? l)
|
||||||
|
null
|
||||||
|
(if (eq? (cdar l) name)
|
||||||
|
(cons (car l) (loop (cdr l)))
|
||||||
|
(loop (cdr l)))))])
|
||||||
|
(loop library-table))
|
||||||
|
(vector-ref vec 1))))
|
||||||
|
(void))))
|
||||||
(orig name)]
|
(orig name)]
|
||||||
[(name rel-to stx)
|
[(name rel-to stx)
|
||||||
(embedded-resolver name rel-to stx #t)]
|
(embedded-resolver name rel-to stx #t)]
|
||||||
|
@ -580,9 +607,12 @@
|
||||||
(if (not (module-path? name))
|
(if (not (module-path? name))
|
||||||
;; Bad input
|
;; Bad input
|
||||||
(orig name rel-to stx load?)
|
(orig name rel-to stx load?)
|
||||||
(if (not (eq? reg (namespace-module-registry (current-namespace))))
|
(let-values ([(table-vec) (hash-ref regs (namespace-module-registry (current-namespace)) #f)])
|
||||||
;; Wrong registry
|
(if (not table-vec)
|
||||||
|
;; No mappings in this registry
|
||||||
(orig name rel-to stx load?)
|
(orig name rel-to stx load?)
|
||||||
|
(let-values ([(mapping-table) (vector-ref table-vec 0)]
|
||||||
|
[(library-table) (vector-ref table-vec 1)])
|
||||||
;; Have a relative mapping?
|
;; Have a relative mapping?
|
||||||
(let-values ([(a) (if rel-to
|
(let-values ([(a) (if rel-to
|
||||||
(assq (resolved-module-path-name rel-to) mapping-table)
|
(assq (resolved-module-path-name rel-to) mapping-table)
|
||||||
|
@ -626,7 +656,9 @@
|
||||||
(cadr name))])
|
(cadr name))])
|
||||||
(letrec-values ([(split)
|
(letrec-values ([(split)
|
||||||
(lambda (s rx suffix?)
|
(lambda (s rx suffix?)
|
||||||
(let-values ([(m) (regexp-match-positions rx s)])
|
(let-values ([(m) (regexp-match-positions
|
||||||
|
rx
|
||||||
|
s)])
|
||||||
(if m
|
(if m
|
||||||
(cons (substring s 0 (caar m))
|
(cons (substring s 0 (caar m))
|
||||||
(split (substring s (cdar m))
|
(split (substring s (cdar m))
|
||||||
|
@ -639,7 +671,9 @@
|
||||||
s)))))]
|
s)))))]
|
||||||
[(last-of)
|
[(last-of)
|
||||||
(lambda (l)
|
(lambda (l)
|
||||||
(if (null? (cdr l)) (car l) (last-of (cdr l))))]
|
(if (null? (cdr l))
|
||||||
|
(car l)
|
||||||
|
(last-of (cdr l))))]
|
||||||
[(not-last)
|
[(not-last)
|
||||||
(lambda (l)
|
(lambda (l)
|
||||||
(if (null? (cdr l))
|
(if (null? (cdr l))
|
||||||
|
@ -653,8 +687,9 @@
|
||||||
(last-of parts))
|
(last-of parts))
|
||||||
(cons
|
(cons
|
||||||
(cons (car parts)
|
(cons (car parts)
|
||||||
(cons (string-append (car vparts) ".plt")
|
(cons (string-append (car vparts)
|
||||||
;; FIXME: finish parsing version:
|
".plt")
|
||||||
|
;; FIXME: finish version parse:
|
||||||
(cdddr parts)))
|
(cdddr parts)))
|
||||||
(not-last (cddr parts)))))))))
|
(not-last (cddr parts)))))))))
|
||||||
;; already in long form:
|
;; already in long form:
|
||||||
|
@ -695,7 +730,7 @@
|
||||||
;; Have it:
|
;; Have it:
|
||||||
(make-resolved-module-path (cdr a3))
|
(make-resolved-module-path (cdr a3))
|
||||||
;; Let default handler try:
|
;; Let default handler try:
|
||||||
(orig name rel-to stx load?))))))))])])
|
(orig name rel-to stx load?))))))))))])])
|
||||||
(current-module-name-resolver embedded-resolver))))))
|
(current-module-name-resolver embedded-resolver))))))
|
||||||
|
|
||||||
;; Write a module bundle that can be loaded with 'load' (do not embed it
|
;; Write a module bundle that can be loaded with 'load' (do not embed it
|
||||||
|
|
Loading…
Reference in New Issue
Block a user