diff --git a/module/system/il/compile.scm b/module/system/il/compile.scm index f0e636bcf..51b914b6a 100644 --- a/module/system/il/compile.scm +++ b/module/system/il/compile.scm @@ -100,8 +100,9 @@ ((eq? e (ghil-var-env var)) (make-glil-external op depth (ghil-var-index var))))) ((module) - (make-glil-module op (ghil-mod-module (ghil-env-mod (ghil-var-env var))) - (ghil-var-name var))) + (let ((env (ghil-var-env var))) + (make-glil-module op (and env (ghil-mod-module (ghil-env-mod env))) + (ghil-var-name var)))) (else (error "Unknown kind of variable:" var)))) (define (codegen ghil) diff --git a/module/system/il/ghil.scm b/module/system/il/ghil.scm index c3f3f82ca..0def60ad0 100644 --- a/module/system/il/ghil.scm +++ b/module/system/il/ghil.scm @@ -212,7 +212,7 @@ (define (ghil-define mod sym) (or (assq-ref (ghil-mod-table mod) sym) - (let ((var (make-ghil-var mod sym 'module))) + (let ((var (make-ghil-var (make-ghil-env mod) sym 'module))) (apush! sym var (ghil-mod-table mod)) var))) diff --git a/module/system/vm/assemble.scm b/module/system/vm/assemble.scm index 19e633b82..33274e780 100644 --- a/module/system/vm/assemble.scm +++ b/module/system/vm/assemble.scm @@ -257,8 +257,9 @@ ;; dump bytecode (push-code! `(load-program ,bytes))) (( module name) - ;; FIXME: dump module - (push-code! `(link ,(symbol->string name)))) + (dump! (and=> module module-name)) + (dump! name) + (push-code! '(link))) (( module name) ;; FIXME: dump module (push-code! `(define ,(symbol->string name)))) diff --git a/src/vm_loader.c b/src/vm_loader.c index f90100272..e658381dc 100644 --- a/src/vm_loader.c +++ b/src/vm_loader.c @@ -178,16 +178,23 @@ VM_DEFINE_LOADER (load_program, "load-program") NEXT; } -VM_DEFINE_LOADER (link, "link") +VM_DEFINE_INSTRUCTION (link, "link", 0, 2, 1) { - SCM sym; - size_t len; - - FETCH_LENGTH (len); - sym = scm_from_locale_symboln ((char *)ip, len); - ip += len; - - PUSH (scm_lookup (sym)); + SCM modname, mod, sym; + POP (sym); + POP (modname); + if (SCM_NFALSEP (modname)) + { + mod = scm_c_module_lookup (scm_resolve_module (modname), + "%module-public-interface"); + if (SCM_FALSEP (mod)) + SCM_MISC_ERROR ("Could not load module", SCM_LIST1 (modname)); + + PUSH (scm_module_lookup (SCM_VARIABLE_REF (mod), sym)); + } + else + PUSH (scm_lookup (sym)); + NEXT; }