summaryrefslogtreecommitdiff
path: root/libguile/intrinsics.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2018-06-27 09:19:36 +0200
committerAndy Wingo <wingo@pobox.com>2018-06-27 09:47:31 +0200
commit6eb473514966c4cbb61bbbf27bde5c9ca5fed850 (patch)
tree1659249e372cfea1c3c276c153305c96d388fe0c /libguile/intrinsics.c
parent0ce9a1f870d8e5d20c4f89bc0e5959fc0aa6fe03 (diff)
downloadguile-6eb473514966c4cbb61bbbf27bde5c9ca5fed850.tar.gz
Add intrinsics for error conditions (wrong num args etc)
* libguile/intrinsics.c (error_wrong_num_args, error_no_values) (error_not_enough_values, error_wrong_number_of_values): New intrinsics. * libguile/intrinsics.h: Add new intrinsics. * libguile/vm-engine.c: Signal errors using the new intrinsics. * libguile/vm.c (vm_error): Remove, now that it's unused. (vm_error_bad_instruction): Abort instead of throwing an exception. If we get a bad instruction, nothing good will ever happen! (compose_continuation): Use wrong-type-arg for unrewindable continuations. (scm_bootstrap_vm): No need to make "vm-run" or "vm-error" symbols.
Diffstat (limited to 'libguile/intrinsics.c')
-rw-r--r--libguile/intrinsics.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/libguile/intrinsics.c b/libguile/intrinsics.c
index 90941341f..73ad2b0ce 100644
--- a/libguile/intrinsics.c
+++ b/libguile/intrinsics.c
@@ -308,6 +308,32 @@ throw_with_value_and_data (SCM val, SCM key_subr_and_message)
throw_ (key, scm_list_4 (subr, message, args, data));
}
+static void error_no_values (void) SCM_NORETURN;
+static void error_not_enough_values (void) SCM_NORETURN;
+static void error_wrong_number_of_values (uint32_t expected) SCM_NORETURN;
+
+static void
+error_no_values (void)
+{
+ scm_misc_error (NULL, "Zero values returned to single-valued continuation",
+ SCM_EOL);
+}
+
+static void
+error_not_enough_values (void)
+{
+ scm_misc_error (NULL, "Too few values returned to continuation", SCM_EOL);
+}
+
+static void
+error_wrong_number_of_values (uint32_t expected)
+{
+ scm_misc_error (NULL,
+ "Wrong number of values returned to continuation (expected ~a)",
+ scm_list_1 (scm_from_uint32 (expected)));
+}
+
+
void
scm_bootstrap_intrinsics (void)
{
@@ -356,6 +382,10 @@ scm_bootstrap_intrinsics (void)
scm_vm_intrinsics.throw_ = throw_;
scm_vm_intrinsics.throw_with_value = throw_with_value;
scm_vm_intrinsics.throw_with_value_and_data = throw_with_value_and_data;
+ scm_vm_intrinsics.error_wrong_num_args = scm_wrong_num_args;
+ scm_vm_intrinsics.error_no_values = error_no_values;
+ scm_vm_intrinsics.error_not_enough_values = error_not_enough_values;
+ scm_vm_intrinsics.error_wrong_number_of_values = error_wrong_number_of_values;
scm_c_register_extension ("libguile-" SCM_EFFECTIVE_VERSION,
"scm_init_intrinsics",