From 433832b5c806b31981f4387a9250e103e94e188f Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Wed, 3 Jun 2015 22:06:31 -0400 Subject: [PATCH] Added Cyc_rt_raise2() --- runtime.c | 24 +++++++++++++++--------- runtime.h | 1 + 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/runtime.c b/runtime.c index a6f1ecf8..8d22def8 100644 --- a/runtime.c +++ b/runtime.c @@ -189,6 +189,17 @@ void Cyc_rt_raise(object err) { fprintf(stderr, "Internal error in Cyc_rt_raise\n"); exit(1); } +void Cyc_rt_raise2(const char *msg, object err) { + make_string(s, err); + make_cons(c3, err, nil); + make_cons(c2, &s, &c3); + make_cons(c1, boolean_f, &c2); + make_cons(c0, &c1, nil); + apply(nil, Cyc_current_exception_handler(), &c0); + // Should never get here + fprintf(stderr, "Internal error in Cyc_rt_raise2\n"); + exit(1); +} void Cyc_rt_raise_msg(const char *err) { make_string(s, err); Cyc_rt_raise(&s); @@ -1197,9 +1208,7 @@ object apply(object cont, object func, object args){ //Cyc_display(args); //printf("\n"); if (!is_object_type(func)) { - printf("Call of non-procedure: "); - Cyc_display(func); - exit(1); + Cyc_rt_raise2("Call of non-procedure: ", func); } switch(type_of(func)) { @@ -1219,18 +1228,15 @@ object apply(object cont, object func, object args){ case cons_tag: { - make_cons(c, cadr(func), args); - // TODO: would be better to compare directly against symbol here, // but need a way of looking up this symbol ahead of time. // maybe a libinit() or such is required. if (strncmp(((symbol)car(func))->pname, "primitive", 10) == 0) { + make_cons(c, cadr(func), args); ((closure)__glo_eval)->fn(3, __glo_eval, cont, &c, nil); } else { - printf("Unable to evaluate: "); - Cyc_display(&c); - printf("\n"); - exit(1); + make_cons(c, func, args); + Cyc_rt_raise2("Unable to evaluate: ", &c); } } diff --git a/runtime.h b/runtime.h index 84cb21be..87d9535c 100644 --- a/runtime.h +++ b/runtime.h @@ -341,6 +341,7 @@ extern object Cyc_exception_handler_stack; object Cyc_default_exception_handler(int argc, closure _, object err); object Cyc_current_exception_handler(); void Cyc_rt_raise(object err); +void Cyc_rt_raise2(const char *msg, object err); void Cyc_rt_raise_msg(const char *err); /* END exception handler */