From 84f13229756b5a9253d7013ede8ed3a602ee5376 Mon Sep 17 00:00:00 2001 From: LLLL Colonq Date: Tue, 29 Sep 2026 17:34:12 -0400 Subject: pit: Better double support --- pit/src/runtime/macroexpand.c | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) (limited to 'pit/src/runtime/macroexpand.c') diff --git a/pit/src/runtime/macroexpand.c b/pit/src/runtime/macroexpand.c index 042a972..fa49968 100644 --- a/pit/src/runtime/macroexpand.c +++ b/pit/src/runtime/macroexpand.c @@ -5,13 +5,17 @@ pit_value pit_macroexpand_1(pit_runtime *rt, pit_value top) { i64 expr_stack_reset = rt->expr_stack->next; i64 result_stack_reset = rt->result_stack->next; i64 traversal_reset = rt->traversal->next; - if (pit_vec_push(pit_value)(rt->expr_stack, top) < 0) + if (pit_vec_push(pit_value)(rt->expr_stack, top) < 0) { pit_error(rt, "macro expansion stack overflow"); + goto end; + } while (rt->expr_stack->next > expr_stack_reset) { pit_value cur = PIT_NIL; if (rt->error != PIT_NIL) goto end; - if (pit_vec_pop(pit_value)(rt->expr_stack, &cur) < 0) + if (pit_vec_pop(pit_value)(rt->expr_stack, &cur) < 0) { pit_error(rt, "macro expansion stack underflow"); + goto end; + } if (pit_value_is_cons(rt, cur)) { pit_value fsym = pit_value_cons_car(rt, cur); bool is_symbol = pit_value_is_symbol(rt, fsym); @@ -26,21 +30,27 @@ pit_value pit_macroexpand_1(pit_runtime *rt, pit_value top) { pit_value f = pit_symtab_fget(rt, fsym); pit_value args = pit_value_cons_cdr(rt, cur); pit_value res = pit_vm_apply(rt, f, args); - if (pit_vec_push(pit_value)(rt->expr_stack, res) < 0) + if (pit_vec_push(pit_value)(rt->expr_stack, res) < 0) { pit_error(rt, "macro expansion stack overflow"); + goto end; + } } else { pit_value args = pit_value_cons_cdr(rt, cur); i64 argcount = 0; while (args != PIT_NIL) { pit_value a = pit_value_cons_car(rt, args); - if (pit_vec_push(pit_value)(rt->expr_stack, a) < 0) + if (pit_vec_push(pit_value)(rt->expr_stack, a) < 0) { pit_error(rt, "macro expansion stack overflow"); + goto end; + } args = pit_value_cons_cdr(rt, args); argcount += 1; } if (!is_symbol) { - if (pit_vec_push(pit_value)(rt->expr_stack, fsym) < 0) + if (pit_vec_push(pit_value)(rt->expr_stack, fsym) < 0) { pit_error(rt, "macro expansion stack overflow"); + goto end; + } } pit_traversal_push_application(rt, rt->traversal, argcount, ann); if (is_symbol) { @@ -53,31 +63,42 @@ pit_value pit_macroexpand_1(pit_runtime *rt, pit_value top) { } for (i64 idx = rt->traversal->next - 1; idx >= traversal_reset; --idx) { pit_traversal_entry *ent = pit_vec_get(pit_traversal_entry)(rt->traversal, idx); - if (ent == NULL) pit_error(rt, "macro expansion traversal invalid"); + if (ent == NULL) { + pit_error(rt, "macro expansion traversal invalid"); + goto end; + } if (rt->error != PIT_NIL) goto end; switch (ent->sort) { case PIT_TRAVERSAL_ENTRY_VALUE: - if (pit_vec_push(pit_value)(rt->result_stack, ent->in.value) < 0) + if (pit_vec_push(pit_value)(rt->result_stack, ent->in.value) < 0) { pit_error(rt, "macro expansion stack overflow"); + goto end; + } break; case PIT_TRAVERSAL_ENTRY_APPLICATION: { pit_value f = PIT_NIL; pit_value args = PIT_NIL; pit_value app = PIT_NIL; - if (pit_vec_pop(pit_value)(rt->result_stack, &f) < 0) + if (pit_vec_pop(pit_value)(rt->result_stack, &f) < 0) { pit_error(rt, "macro expansion stack underflow"); + goto end; + } for (i64 i = 0; i < ent->in.application.arity; ++i) { pit_value a = PIT_NIL; - if (pit_vec_pop(pit_value)(rt->result_stack, &a) < 0) + if (pit_vec_pop(pit_value)(rt->result_stack, &a) < 0) { pit_error(rt, "macro expansion stack underflow"); + goto end; + } args = pit_value_cons(rt, a, args); } app = pit_value_cons(rt, f, args); if (ent->in.application.annotation != NULL) { pit_annotation_set(rt, pit_value_as_ref(rt, app), *ent->in.application.annotation); } - if (pit_vec_push(pit_value)(rt->result_stack, app) < 0) + if (pit_vec_push(pit_value)(rt->result_stack, app) < 0) { pit_error(rt, "macroexpansion stack overflow"); + goto end; + } break; } default: -- cgit v1.3.1