((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)
(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)))
;; dump bytecode
(push-code! `(load-program ,bytes)))
((<vlink> module name)
- ;; FIXME: dump module
- (push-code! `(link ,(symbol->string name))))
+ (dump! (and=> module module-name))
+ (dump! name)
+ (push-code! '(link)))
((<vdefine> module name)
;; FIXME: dump module
(push-code! `(define ,(symbol->string name))))
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;
}