summaryrefslogtreecommitdiff
path: root/libguile/vm-i-loader.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2008-09-30 00:31:17 +0200
committerAndy Wingo <wingo@pobox.com>2008-09-30 00:31:17 +0200
commitfd3585753a34fde835cd9b660fe7322e9543721b (patch)
tree0b9f0c7bd59802f48ee920b2ff34be01b1443f06 /libguile/vm-i-loader.c
parenta1122f8cba23ee17f0b4ae0c4cabd42f176a84dc (diff)
downloadguile-fd3585753a34fde835cd9b660fe7322e9543721b.tar.gz
compile @ and @@
* libguile/vm-engine.c (vm_run): Add new error case for resolving @ or @@ references, but there is no such module. Possible if module-public-interface returns #f. * libguile/vm-i-loader.c (link-now): Allow the stack arg to be a sym, as before, or a list, indicating an absolute reference. Could be two separate instructions, but I'm lazy. * libguile/vm-i-system.c (late-variable-ref, late-variable-set): As in link-now, allow the lazy reference to be a list, for @ and @@. * module/language/scheme/translate.scm (custom-transformer-table): Compile @ and @@, and set! forms for both of them. This will ease the non-hygienic pain for exported macros. * module/system/il/compile.scm (make-glil-var): Translate public and private module variable references into glil-module variables. * module/system/il/ghil.scm (ghil-var-at-module!): New function, resolves a variable for @ or @@. * module/system/il/glil.scm (<glil-module>): Revival of <glil-module>, this time with the semantics that it really links to a particular module. * module/system/vm/assemble.scm (<vlink-now>, <vlink-later>): Redefine as taking a "key" as the argument, which may be a sym or a list; see the notes on link-now for more details. (codegen): Compile <glil-module> appropriately. Some duplication here, probably could use some cleanup later.
Diffstat (limited to 'libguile/vm-i-loader.c')
-rw-r--r--libguile/vm-i-loader.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/libguile/vm-i-loader.c b/libguile/vm-i-loader.c
index 34d1cec92..72436f0d5 100644
--- a/libguile/vm-i-loader.c
+++ b/libguile/vm-i-loader.c
@@ -165,10 +165,32 @@ VM_DEFINE_LOADER (load_program, "load-program")
VM_DEFINE_INSTRUCTION (link_now, "link-now", 0, 1, 1)
{
- SCM sym;
- POP (sym);
+ SCM what;
+ POP (what);
SYNC_REGISTER ();
- PUSH (scm_lookup (sym)); /* might longjmp */
+ if (SCM_LIKELY (SCM_SYMBOLP (what)))
+ {
+ PUSH (scm_lookup (what)); /* might longjmp */
+ }
+ else
+ {
+ SCM mod;
+ /* compilation of @ or @@
+ `what' is a three-element list: (MODNAME SYM INTERFACE?)
+ INTERFACE? is #t if we compiled @ or #f if we compiled @@
+ */
+ mod = scm_resolve_module (SCM_CAR (what));
+ if (scm_is_true (SCM_CADDR (what)))
+ mod = scm_module_public_interface (mod);
+ if (SCM_FALSEP (mod))
+ {
+ err_args = SCM_LIST1 (SCM_CAR (what));
+ goto vm_error_no_such_module;
+ }
+ /* might longjmp */
+ PUSH (scm_module_lookup (mod, SCM_CADR (what)));
+ }
+
NEXT;
}