summaryrefslogtreecommitdiff
path: root/libguile/vm-engine.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2013-10-23 10:03:17 +0200
committerAndy Wingo <wingo@pobox.com>2013-10-26 14:38:11 +0200
commite23f9e4423bbbe8521d13e1c9a223612a5e86762 (patch)
tree619fc240400aecbaf7670f11c06a78a79aacf2bb /libguile/vm-engine.c
parentdb071766650d10c67524b3ddb00decfd60c55741 (diff)
downloadguile-e23f9e4423bbbe8521d13e1c9a223612a5e86762.tar.gz
RTL VM: Fix variable lookup before modules boot
* libguile/vm-engine.c (toplevel-box, module-box): Handle the case where the module system isn't booted yet.
Diffstat (limited to 'libguile/vm-engine.c')
-rw-r--r--libguile/vm-engine.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c
index cf359c969..d735914da 100644
--- a/libguile/vm-engine.c
+++ b/libguile/vm-engine.c
@@ -2220,6 +2220,11 @@ RTL_VM_NAME (SCM vm, SCM program, SCM *argv, size_t nargs_)
mod = *((SCM *) mod_loc);
sym = *((SCM *) sym_loc);
+ /* If the toplevel scope was captured before modules were
+ booted, use the root module. */
+ if (scm_is_false (mod))
+ mod = scm_the_root_module ();
+
var = scm_module_lookup (mod, sym);
if (ip[4] & 0x1)
VM_ASSERT (VARIABLE_BOUNDP (var), vm_error_unbound (fp[-1], sym));
@@ -2267,7 +2272,18 @@ RTL_VM_NAME (SCM vm, SCM program, SCM *argv, size_t nargs_)
modname = SCM_PACK ((scm_t_bits) modname_words);
sym = *((SCM *) sym_loc);
- if (scm_is_true (SCM_CAR (modname)))
+ if (!scm_module_system_booted_p)
+ {
+#ifdef VM_ENABLE_PARANOID_ASSERTIONS
+ ASSERT
+ (scm_is_true
+ scm_equal_p (modname,
+ scm_list_2 (SCM_BOOL_T,
+ scm_from_utf8_symbol ("guile"))));
+#endif
+ var = scm_lookup (sym);
+ }
+ else if (scm_is_true (SCM_CAR (modname)))
var = scm_public_lookup (SCM_CDR (modname), sym);
else
var = scm_private_lookup (SCM_CDR (modname), sym);