mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-24 12:20:20 +02:00
bind all module-level variables lazily
comments in ghil-lookup are pertinent. * module/system/il/compile.scm (make-glil-var): Require that ghil vars have environments. Remove the 'unresolved case -- we'll treat all module-level variables as late bound. * module/system/il/ghil.scm (ghil-lookup): Treat all module level vars as late bound. * module/system/vm/assemble.scm: Instead of vlink and vlate-bound, have vlink-now and vlink-later. (codegen): Add a bunch of crap to get the various cases right. (object-assoc, dump-object!): Handle the new cases, remove the old cases. * src/vm_loader.c (link-now, link-later): Change from link and lazy-bind. Include the module in which the link is to be done, so that callers from other modules get the right behavior. * src/vm_system.c (late-variable-ref, late-variable-set): Instead of a sym, the unbound representation is a module name / symbol pair. * testsuite/run-vm-tests.scm (run-vm-tests): Remove some debugging.
This commit is contained in:
parent
9cc649b880
commit
6297d22907
6 changed files with 72 additions and 86 deletions
|
@ -101,10 +101,8 @@
|
|||
(make-glil-external op depth (ghil-var-index var)))))
|
||||
((module)
|
||||
(let ((env (ghil-var-env var)))
|
||||
(make-glil-module op (and env (ghil-mod-module (ghil-env-mod env)))
|
||||
(make-glil-module op (ghil-mod-module (ghil-env-mod env))
|
||||
(ghil-var-name var))))
|
||||
((unresolved)
|
||||
(make-glil-late-bound op (ghil-var-name var)))
|
||||
(else (error "Unknown kind of variable:" var))))
|
||||
|
||||
(define (codegen ghil)
|
||||
|
|
|
@ -185,11 +185,6 @@
|
|||
;;; Public interface
|
||||
;;;
|
||||
|
||||
(define (module-lookup module sym)
|
||||
(let ((iface (module-import-interface module sym)))
|
||||
(and iface
|
||||
(make-ghil-env (make-ghil-mod iface)))))
|
||||
|
||||
(define (fix-ghil-mod! mod for-sym)
|
||||
;;; So, these warnings happen for all instances of define-module.
|
||||
;;; Rather than fixing the problem, I'm going to suppress the common
|
||||
|
@ -219,13 +214,13 @@
|
|||
(fix-ghil-mod! e sym)
|
||||
(loop e))
|
||||
((assq-ref table sym)) ;; when does this hit?
|
||||
((module-lookup module sym)
|
||||
=> (lambda (found-env)
|
||||
(make-ghil-var found-env sym 'module)))
|
||||
(else
|
||||
;; a free variable that we have not resolved
|
||||
(warn "unresolved variable during compilation:" sym)
|
||||
(let ((var (make-ghil-var #f sym 'unresolved)))
|
||||
;; although we could bind the variable here, in
|
||||
;; practice further toplevel definitions in this
|
||||
;; compilation unit could change how we would resolve
|
||||
;; this binding, so punt and memoize the lookup at
|
||||
;; runtime always.
|
||||
(let ((var (make-ghil-var (make-ghil-env e) sym 'module)))
|
||||
(apush! sym var table)
|
||||
var))))
|
||||
((<ghil-env> mod parent table variables)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue