diff options
Diffstat (limited to 'libguile/vm-engine.c')
-rw-r--r-- | libguile/vm-engine.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c index b373cd017..5d8f65587 100644 --- a/libguile/vm-engine.c +++ b/libguile/vm-engine.c @@ -51,7 +51,6 @@ VM_NAME (struct scm_vm *vp, SCM program, SCM *argv, int nargs) size_t free_vars_count = 0; /* length of FREE_VARS */ SCM *objects = NULL; /* constant objects */ size_t object_count = 0; /* length of OBJECTS */ - SCM *stack_base = vp->stack_base; /* stack base address */ SCM *stack_limit = vp->stack_limit; /* stack limit address */ /* Internal variables */ @@ -108,16 +107,16 @@ VM_NAME (struct scm_vm *vp, SCM program, SCM *argv, int nargs) /* Initial frame */ CACHE_REGISTER (); PUSH ((SCM)fp); /* dynamic link */ - PUSH (0); /* ra */ PUSH (0); /* mvra */ + PUSH ((SCM)ip); /* ra */ CACHE_PROGRAM (); PUSH (program); fp = sp + 1; - INIT_FRAME (); + ip = bp->base; /* MV-call frame, function & arguments */ PUSH ((SCM)fp); /* dynamic link */ - PUSH (0); /* ra */ PUSH (0); /* mvra */ + PUSH (0); /* ra */ PUSH (prog); if (SCM_UNLIKELY (sp + nargs >= stack_limit)) goto vm_error_too_many_args; @@ -171,6 +170,21 @@ VM_NAME (struct scm_vm *vp, SCM program, SCM *argv, int nargs) finish_args = SCM_EOL; goto vm_error; + vm_error_kwargs_length_not_even: + err_msg = scm_from_locale_string ("Bad keyword argument list: odd length"); + finish_args = SCM_EOL; + goto vm_error; + + vm_error_kwargs_invalid_keyword: + err_msg = scm_from_locale_string ("Bad keyword argument list: expected keyword"); + finish_args = SCM_EOL; + goto vm_error; + + vm_error_kwargs_unrecognized_keyword: + err_msg = scm_from_locale_string ("Bad keyword argument list: unrecognized keyword"); + finish_args = SCM_EOL; + goto vm_error; + vm_error_too_many_args: err_msg = scm_from_locale_string ("VM: Too many arguments"); finish_args = scm_list_1 (scm_from_int (nargs)); |