diff options
| author | LLLL Colonq <llll@colonq> | 2026-09-01 06:26:13 -0400 |
|---|---|---|
| committer | LLLL Colonq <llll@colonq> | 2026-09-01 06:26:13 -0400 |
| commit | ff7407c146b8129c2f1cc7ebe3b5771ad2f5dfdd (patch) | |
| tree | bc70d9773ebc0deb25773d3b5c86ec7ea96eef6d /pit/src/runtime.c | |
| parent | 6ebac820c84b218a45368eeaf1c853ff9c9d638f (diff) | |
pit: Fix evaluator
Diffstat (limited to 'pit/src/runtime.c')
| -rw-r--r-- | pit/src/runtime.c | 44 |
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"); +} |
