summaryrefslogtreecommitdiff
path: root/libguile/vm-i-system.c
diff options
context:
space:
mode:
Diffstat (limited to 'libguile/vm-i-system.c')
-rw-r--r--libguile/vm-i-system.c76
1 files changed, 56 insertions, 20 deletions
diff --git a/libguile/vm-i-system.c b/libguile/vm-i-system.c
index 16899cc59..87d3a533a 100644
--- a/libguile/vm-i-system.c
+++ b/libguile/vm-i-system.c
@@ -285,33 +285,51 @@ VM_DEFINE_INSTRUCTION (variable_ref, "variable-ref", 0, 0, 1)
VM_DEFINE_INSTRUCTION (late_variable_ref, "late-variable-ref", 1, 0, 1)
{
unsigned objnum = FETCH ();
- SCM sym_or_var;
+ SCM what;
CHECK_OBJECT (objnum);
- sym_or_var = OBJECT_REF (objnum);
+ what = OBJECT_REF (objnum);
- if (!SCM_VARIABLEP (sym_or_var))
+ if (!SCM_VARIABLEP (what))
{
SYNC_REGISTER ();
- if (SCM_LIKELY (scm_module_system_booted_p && SCM_NFALSEP (bp->module)))
+ if (SCM_LIKELY (SCM_SYMBOLP (what)))
{
- /* might longjmp */
- sym_or_var = scm_module_lookup (bp->module, sym_or_var);
+ if (SCM_LIKELY (scm_module_system_booted_p
+ && scm_is_true (bp->module)))
+ /* might longjmp */
+ what = scm_module_lookup (bp->module, what);
+ else
+ what = scm_sym2var (what, SCM_BOOL_F, SCM_BOOL_F);
}
else
{
- sym_or_var = scm_sym2var (sym_or_var, SCM_BOOL_F, SCM_BOOL_F);
+ 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 (mod);
+ goto vm_error_no_such_module;
+ }
+ /* might longjmp */
+ what = scm_module_lookup (mod, SCM_CADR (what));
}
- if (!VARIABLE_BOUNDP (sym_or_var))
+ if (!VARIABLE_BOUNDP (what))
{
- err_args = SCM_LIST1 (sym_or_var);
+ err_args = SCM_LIST1 (what);
goto vm_error_unbound;
}
- OBJECT_SET (objnum, sym_or_var);
+ OBJECT_SET (objnum, what);
}
- PUSH (VARIABLE_REF (sym_or_var));
+ PUSH (VARIABLE_REF (what));
NEXT;
}
@@ -349,27 +367,45 @@ VM_DEFINE_INSTRUCTION (variable_set, "variable-set", 0, 1, 0)
VM_DEFINE_INSTRUCTION (late_variable_set, "late-variable-set", 1, 1, 0)
{
unsigned objnum = FETCH ();
- SCM sym_or_var;
+ SCM what;
CHECK_OBJECT (objnum);
- sym_or_var = OBJECT_REF (objnum);
+ what = OBJECT_REF (objnum);
- if (!SCM_VARIABLEP (sym_or_var))
+ if (!SCM_VARIABLEP (what))
{
SYNC_BEFORE_GC ();
- if (SCM_LIKELY (scm_module_system_booted_p && SCM_NFALSEP (bp->module)))
+ if (SCM_LIKELY (SCM_SYMBOLP (what)))
{
- /* might longjmp */
- sym_or_var = scm_module_lookup (bp->module, sym_or_var);
+ if (SCM_LIKELY (scm_module_system_booted_p
+ && scm_is_true (bp->module)))
+ /* might longjmp */
+ what = scm_module_lookup (bp->module, what);
+ else
+ what = scm_sym2var (what, SCM_BOOL_F, SCM_BOOL_F);
}
else
{
- sym_or_var = scm_sym2var (sym_or_var, SCM_BOOL_F, SCM_BOOL_F);
+ 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 (what);
+ goto vm_error_no_such_module;
+ }
+ /* might longjmp */
+ what = scm_module_lookup (mod, SCM_CADR (what));
}
- OBJECT_SET (objnum, sym_or_var);
+ OBJECT_SET (objnum, what);
}
- VARIABLE_SET (sym_or_var, *sp);
+ VARIABLE_SET (what, *sp);
DROP ();
NEXT;
}