summaryrefslogtreecommitdiff
path: root/pit/src/runtime.c
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2026-09-01 06:26:13 -0400
committerLLLL Colonq <llll@colonq>2026-09-01 06:26:13 -0400
commitff7407c146b8129c2f1cc7ebe3b5771ad2f5dfdd (patch)
treebc70d9773ebc0deb25773d3b5c86ec7ea96eef6d /pit/src/runtime.c
parent6ebac820c84b218a45368eeaf1c853ff9c9d638f (diff)
pit: Fix evaluator
Diffstat (limited to 'pit/src/runtime.c')
-rw-r--r--pit/src/runtime.c44
1 files changed, 42 insertions, 2 deletions
diff --git a/pit/src/runtime.c b/pit/src/runtime.c
index de0b2a2..633bff5 100644
--- a/pit/src/runtime.c
+++ b/pit/src/runtime.c
@@ -41,6 +41,7 @@ pit_runtime *pit_runtime_new(u8 *buf, i64 len) {
ret->symtab = pit_vec_new(pit_symtab_entry)(pit_arena_alloc_back(a, symtab_size), symtab_size);
ret->expr_stack = pit_vec_new(pit_value)(pit_arena_alloc_back(a, stack_size), stack_size);
ret->result_stack = pit_vec_new(pit_value)(pit_arena_alloc_back(a, stack_size), stack_size);
+ ret->compilation_stack = pit_vec_new(pit_compilation_entry)(pit_arena_alloc_back(a, stack_size), stack_size);
ret->traversal = pit_vec_new(pit_traversal_entry)(pit_arena_alloc_back(a, stack_size), stack_size);
ret->callstack = pit_vec_new(pit_callstack_entry)(pit_arena_alloc_back(a, stack_size), stack_size);
ret->saved_bindings = pit_vec_new(pit_value)(pit_arena_alloc_back(a, stack_size), stack_size);
@@ -54,6 +55,7 @@ pit_runtime *pit_runtime_new(u8 *buf, i64 len) {
pit_value truth = pit_symtab_intern_cstr(ret, "t");
pit_symtab_set(ret, truth, truth);
pit_compile_install_special_forms(ret);
+ ret->msg_out_of_memory = pit_value_bytes_new_cstr(ret, "out of memory!");
pit_runtime_freeze(ret);
return ret;
}
@@ -80,9 +82,9 @@ void pit_error(pit_runtime *rt, char *format, ...) {
va_start(vargs, format);
pit_libc_string_vsnprintf(buf, sizeof(buf), format, vargs);
va_end(vargs);
- rt->error = PIT_T; /* we set the error now to prevent infinite recursion */
+ rt->error = rt->msg_out_of_memory; /* we set the error now to prevent infinite recursion */
rt->error = pit_value_bytes_new_cstr(rt, buf); /* in case this errs also */
- if (rt->error == PIT_NIL) rt->error = PIT_T;
+ if (rt->error == PIT_NIL) rt->error = rt->msg_out_of_memory;
rt->error_line = rt->source_line;
rt->error_column = rt->source_column;
}
@@ -96,6 +98,32 @@ pit_annotation *pit_annotation_get(struct pit_runtime *rt, pit_ref ref) {
return pit_hashtable_lookup(pit_ref, pit_annotation)(rt->annotations, ref);
}
+void pit_compilation_push_value(struct pit_runtime *rt, pit_vec(pit_compilation_entry) *s, pit_value x) {
+ pit_compilation_entry ent;
+ ent.sort = PIT_COMPILATION_ENTRY_VALUE;
+ ent.in.value = x;
+ if (pit_vec_push(pit_compilation_entry)(s, ent) < 0)
+ pit_error(rt, "compilation stack overflow");
+}
+void pit_compilation_push_drop(struct pit_runtime *rt, pit_vec(pit_compilation_entry) *s) {
+ pit_compilation_entry ent;
+ ent.sort = PIT_COMPILATION_ENTRY_DROP;
+ if (pit_vec_push(pit_compilation_entry)(s, ent) < 0)
+ pit_error(rt, "compilation stack overflow");
+}
+void pit_compilation_push_begin_code(struct pit_runtime *rt, pit_vec(pit_compilation_entry) *s) {
+ pit_compilation_entry ent;
+ ent.sort = PIT_COMPILATION_ENTRY_BEGIN_CODE;
+ if (pit_vec_push(pit_compilation_entry)(s, ent) < 0)
+ pit_error(rt, "compilation stack overflow");
+}
+void pit_compilation_push_end_code(struct pit_runtime *rt, pit_vec(pit_compilation_entry) *s) {
+ pit_compilation_entry ent;
+ ent.sort = PIT_COMPILATION_ENTRY_END_CODE;
+ if (pit_vec_push(pit_compilation_entry)(s, ent) < 0)
+ pit_error(rt, "compilation stack overflow");
+}
+
void pit_traversal_push_value(struct pit_runtime *rt, pit_vec(pit_traversal_entry) *s, pit_value x) {
pit_traversal_entry ent;
ent.sort = PIT_TRAVERSAL_ENTRY_VALUE;
@@ -118,3 +146,15 @@ void pit_traversal_push_application(struct pit_runtime *rt, pit_vec(pit_traversa
if (pit_vec_push(pit_traversal_entry)(s, ent) < 0)
pit_error(rt, "traversal overflow");
}
+void pit_traversal_push_begin_code(struct pit_runtime *rt, pit_vec(pit_traversal_entry) *s) {
+ pit_traversal_entry ent;
+ ent.sort = PIT_TRAVERSAL_ENTRY_BEGIN_CODE;
+ if (pit_vec_push(pit_traversal_entry)(s, ent) < 0)
+ pit_error(rt, "traversal overflow");
+}
+void pit_traversal_push_end_code(struct pit_runtime *rt, pit_vec(pit_traversal_entry) *s) {
+ pit_traversal_entry ent;
+ ent.sort = PIT_TRAVERSAL_ENTRY_END_CODE;
+ if (pit_vec_push(pit_traversal_entry)(s, ent) < 0)
+ pit_error(rt, "traversal overflow");
+}