summaryrefslogtreecommitdiff
path: root/pit/src/native.c
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2026-10-21 02:43:23 -0400
committerLLLL Colonq <llll@colonq>2026-10-21 02:43:23 -0400
commit62ab8e0b42a57bd794941f030b4c3140d6f7c744 (patch)
treed4d26aca670f67a290399e83ca5e7253a5b9c395 /pit/src/native.c
parentfe4c9bd487cb9ae59d86dc7680855c5797ae04e3 (diff)
Bake Lisp into builds, fix bug in error propagation
Diffstat (limited to 'pit/src/native.c')
-rw-r--r--pit/src/native.c40
1 files changed, 10 insertions, 30 deletions
diff --git a/pit/src/native.c b/pit/src/native.c
index 8ef886d..7d61a50 100644
--- a/pit/src/native.c
+++ b/pit/src/native.c
@@ -39,9 +39,10 @@ i64 pit_fprintf(pit_runtime *rt, void *vf, char *format, ...) {
va_list ap;
va_start(ap, format);
char buf[8192];
- pit_printf_handler h[1];
+ pit_printf_handler h[2];
h[0].specifier = 'v'; h[0].callback = pit_dump_printf_callback;
- int ret = pit_vsnprintf_helper(buf, sizeof(buf) - 1, format, ap, h, 1, rt);
+ h[1].specifier = 'V'; h[1].callback = pit_dump_readable_printf_callback;
+ int ret = pit_vsnprintf_helper(buf, sizeof(buf) - 1, format, ap, h, 2, rt);
buf[ret] = 0;
va_end(ap);
fputs(buf, f);
@@ -101,27 +102,6 @@ pit_value pit_value_bytes_new_file(pit_runtime *rt, char *path) {
return ret;
}
-/* check invariants - these should always hold between top-level evaluations! */
-static void check_invariants(pit_runtime *rt) {
- if (rt->saved_bindings->next != 0) {
- pit_error(rt, "leaked saved_bindings memory! %ld", rt->saved_bindings->next);
- }
- if (rt->expr_stack->next != 0) {
- pit_error(rt, "leaked expr_stack memory! %ld", rt->expr_stack->next);
- }
- if (rt->result_stack->next != 0) {
- pit_error(rt, "leaked result_stack memory! %ld", rt->result_stack->next);
- }
- if (rt->compilation_stack->next != 0) {
- pit_error(rt, "leaked compilation_stack memory! %ld", rt->compilation_stack->next);
- }
- if (rt->traversal->next != 0) {
- pit_error(rt, "leaked traversal memory! %ld", rt->traversal->next);
- }
- if (rt->callstack->next != 0) {
- pit_error(rt, "leaked callstack memory! %ld", rt->result_stack->next);
- }
-}
pit_value pit_load_file(pit_runtime *rt, char *path) {
pit_lexer lex;
pit_parser parse;
@@ -135,13 +115,13 @@ pit_value pit_load_file(pit_runtime *rt, char *path) {
}
pit_parser_from_lexer(&parse, &lex);
while (p = pit_parse(rt, &parse, &eof), !eof) {
- check_invariants(rt); if (pit_runtime_print_error(rt)) return PIT_NIL;
+ pit_check_invariants(rt); if (pit_runtime_print_error(rt)) return PIT_NIL;
compiled = pit_compile(rt, p);
- check_invariants(rt); if (pit_runtime_print_error(rt)) return PIT_NIL;
+ pit_check_invariants(rt); if (pit_runtime_print_error(rt)) return PIT_NIL;
ret = pit_vm_eval(rt, compiled);
- check_invariants(rt); if (pit_runtime_print_error(rt)) return PIT_NIL;
+ pit_check_invariants(rt); if (pit_runtime_print_error(rt)) return PIT_NIL;
}
- check_invariants(rt); if (pit_runtime_print_error(rt)) return PIT_NIL;
+ pit_check_invariants(rt); if (pit_runtime_print_error(rt)) return PIT_NIL;
return ret;
}
@@ -149,7 +129,7 @@ void pit_repl(pit_runtime *rt) {
size_t bufcap = 8;
char *buf = malloc(bufcap);
i64 len = 0;
- check_invariants(rt); if (pit_runtime_print_error(rt)) exit(1);
+ pit_check_invariants(rt); if (pit_runtime_print_error(rt)) exit(1);
setbuf(stdout, NULL);
printf("> ");
while ((buf[len++] = (char) getchar()) != EOF) {
@@ -180,9 +160,9 @@ void pit_repl(pit_runtime *rt) {
pit_lex_bytes(&lex, buf, len);
pit_parser_from_lexer(&parse, &lex);
while (p = pit_parse(rt, &parse, &eof), !eof) {
- check_invariants(rt);
+ pit_check_invariants(rt);
res = pit_vm_eval(rt, pit_compile(rt, pit_macroexpand(rt, p)));
- check_invariants(rt);
+ pit_check_invariants(rt);
}
if (pit_runtime_print_error(rt)) {
rt->error = PIT_NIL;