summaryrefslogtreecommitdiff
path: root/pit/src/runtime/macroexpand.c
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2026-09-29 17:34:12 -0400
committerLLLL Colonq <llll@colonq>2026-09-29 17:34:12 -0400
commit84f13229756b5a9253d7013ede8ed3a602ee5376 (patch)
tree618c88ed27e9e528a6eeb52935baa1d55be0ee5d /pit/src/runtime/macroexpand.c
parent17df4b1ff7f4cbcf3b3218fea68f65d3cb60c984 (diff)
pit: Better double support
Diffstat (limited to 'pit/src/runtime/macroexpand.c')
-rw-r--r--pit/src/runtime/macroexpand.c41
1 files changed, 31 insertions, 10 deletions
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: