X-Git-Url: https://git.hcoop.net/bpt/guile.git/blobdiff_plain/b782ed0137e93f3bcfcffdbfe2785e6425ef9e32..af95414f1dcbacf7fd5311a3ee89a799b20fd17b:/libguile/vm.c diff --git a/libguile/vm.c b/libguile/vm.c index cbef0d979..ad41180f1 100644 --- a/libguile/vm.c +++ b/libguile/vm.c @@ -416,8 +416,8 @@ static void vm_error_unbound_fluid (SCM proc, SCM fluid) SCM_NORETURN SCM_NOINLI static void vm_error_not_a_variable (const char *func_name, SCM x) SCM_NORETURN SCM_NOINLINE; static void vm_error_apply_to_non_list (SCM x) SCM_NORETURN SCM_NOINLINE; static void vm_error_kwargs_length_not_even (SCM proc) SCM_NORETURN SCM_NOINLINE; -static void vm_error_kwargs_invalid_keyword (SCM proc) SCM_NORETURN SCM_NOINLINE; -static void vm_error_kwargs_unrecognized_keyword (SCM proc) SCM_NORETURN SCM_NOINLINE; +static void vm_error_kwargs_invalid_keyword (SCM proc, SCM obj) SCM_NORETURN SCM_NOINLINE; +static void vm_error_kwargs_unrecognized_keyword (SCM proc, SCM kw) SCM_NORETURN SCM_NOINLINE; static void vm_error_too_many_args (int nargs) SCM_NORETURN SCM_NOINLINE; static void vm_error_wrong_num_args (SCM proc) SCM_NORETURN SCM_NOINLINE; static void vm_error_wrong_type_apply (SCM proc) SCM_NORETURN SCM_NOINLINE; @@ -486,19 +486,19 @@ vm_error_kwargs_length_not_even (SCM proc) } static void -vm_error_kwargs_invalid_keyword (SCM proc) +vm_error_kwargs_invalid_keyword (SCM proc, SCM obj) { scm_error_scm (sym_keyword_argument_error, proc, scm_from_latin1_string ("Invalid keyword"), - SCM_EOL, SCM_BOOL_F); + SCM_EOL, scm_list_1 (obj)); } static void -vm_error_kwargs_unrecognized_keyword (SCM proc) +vm_error_kwargs_unrecognized_keyword (SCM proc, SCM kw) { scm_error_scm (sym_keyword_argument_error, proc, scm_from_latin1_string ("Unrecognized keyword"), - SCM_EOL, SCM_BOOL_F); + SCM_EOL, scm_list_1 (kw)); } static void @@ -594,6 +594,23 @@ vm_error_bad_wide_string_length (size_t len) static SCM boot_continuation; +static SCM rtl_boot_continuation; +static SCM rtl_apply; +static SCM rtl_values; + +static const scm_t_uint32 rtl_boot_continuation_code[] = { + SCM_PACK_RTL_24 (scm_rtl_op_halt, 0) +}; + +static const scm_t_uint32 rtl_apply_code[] = { + SCM_PACK_RTL_24 (scm_rtl_op_apply, 0) /* proc in r1, args from r2, nargs set */ +}; + +static const scm_t_uint32 rtl_values_code[] = { + SCM_PACK_RTL_24 (scm_rtl_op_return_values, 0) /* vals from r1 */ +}; + + /* * VM @@ -637,18 +654,22 @@ initialize_default_stack_size (void) } #define VM_NAME vm_regular_engine +#define RTL_VM_NAME rtl_vm_regular_engine #define FUNC_NAME "vm-regular-engine" #define VM_ENGINE SCM_VM_REGULAR_ENGINE #include "vm-engine.c" #undef VM_NAME +#undef RTL_VM_NAME #undef FUNC_NAME #undef VM_ENGINE #define VM_NAME vm_debug_engine +#define RTL_VM_NAME rtl_vm_debug_engine #define FUNC_NAME "vm-debug-engine" #define VM_ENGINE SCM_VM_DEBUG_ENGINE #include "vm-engine.c" #undef VM_NAME +#undef RTL_VM_NAME #undef FUNC_NAME #undef VM_ENGINE @@ -1110,6 +1131,10 @@ scm_init_vm (void) #ifndef SCM_MAGIC_SNARFER #include "libguile/vm.x" #endif + + rtl_boot_continuation = scm_i_make_rtl_program (rtl_boot_continuation_code); + rtl_apply = scm_i_make_rtl_program (rtl_apply_code); + rtl_values = scm_i_make_rtl_program (rtl_values_code); } /*