diff options
Diffstat (limited to 'pit/src/runtime')
| -rw-r--r-- | pit/src/runtime/compile.c | 4 | ||||
| -rw-r--r-- | pit/src/runtime/dump.c | 21 | ||||
| -rw-r--r-- | pit/src/runtime/eval.c | 5 | ||||
| -rw-r--r-- | pit/src/runtime/macroexpand.c | 6 |
4 files changed, 31 insertions, 5 deletions
diff --git a/pit/src/runtime/compile.c b/pit/src/runtime/compile.c index e7a4ab8..7cfc091 100644 --- a/pit/src/runtime/compile.c +++ b/pit/src/runtime/compile.c @@ -180,6 +180,8 @@ static void compile_interpret_traversal_entry(pit_runtime *rt, pit_traversal_ent } } +#include <stdio.h> + pit_value pit_compile(pit_runtime *rt, pit_value top) { /* compilation proceeds in a somewhat unintuitive manner */ /* typically, we would simply recursively traverse the tree, accumulating the output code */ @@ -290,6 +292,7 @@ end: { if (rt->compilation_stack->next > compilation_stack_reset) { /* if the compilation stack is not empty, the top is our compiled code! */ pit_compilation_entry ent; + ent.in.value = PIT_NIL; pit_vec_pop(pit_compilation_entry)(rt->compilation_stack, &ent); ret = ent.in.value; } @@ -299,6 +302,7 @@ end: { } rt->compilation_stack->next = compilation_stack_reset; rt->traversal->next = traversal_reset; + pit_fprintf(rt, stderr, "here: %v\n", ret, ret); return ret; } } diff --git a/pit/src/runtime/dump.c b/pit/src/runtime/dump.c index 9627a36..4d67bb6 100644 --- a/pit/src/runtime/dump.c +++ b/pit/src/runtime/dump.c @@ -183,3 +183,24 @@ i64 pit_dump(pit_runtime *rt, char *buf, i64 len, pit_value v, bool readable) { pit_dump_with_callback(rt, v, readable, pit_dump_to_buf_callback, &cl); return cl.off; } + +i64 pit_dump_printf_callback(va_list ap, char *buf, size_t len, void *data) { + pit_runtime *rt = (pit_runtime *) data; + pit_value arg = va_arg(ap, pit_value); + return pit_dump(rt, buf, (i64) len, arg, false); +} +i64 pit_vsnprintf(pit_runtime *rt, char *buf, i64 len, char *format, va_list ap) { + if (len == 0) return 0; + pit_printf_handler h[1]; + h[0].specifier = 'v'; h[0].callback = pit_dump_printf_callback; + i64 ret = pit_vsnprintf_helper(buf, (size_t) (len - 1), format, ap, h, 1, rt); + buf[ret] = 0; + return ret; +} +i64 pit_snprintf(pit_runtime *rt, char *buf, i64 len, char *format, ...) { + va_list ap; + va_start(ap, format); + i64 ret = pit_vsnprintf(rt, buf, len, format, ap); + va_end(ap); + return ret; +} diff --git a/pit/src/runtime/eval.c b/pit/src/runtime/eval.c index a2b9e79..5966fdb 100644 --- a/pit/src/runtime/eval.c +++ b/pit/src/runtime/eval.c @@ -128,9 +128,10 @@ bool pit_vm_run_one(pit_runtime *rt) { // fprintf(stderr, "frame: "); pit_dump_to_file(rt, stderr, e->code, false); fprintf(stderr, "\n"); // } pit_value ins = pit_value_cons_car(rt, ent->code); - // fprintf(stderr, "ins: "); pit_dump_to_file(rt, stderr, ins, false); fprintf(stderr, "\n"); + fprintf(stderr, "ins: "); pit_dump_to_file(rt, stderr, ins, false); fprintf(stderr, "\n"); + fprintf(stderr, "code: "); pit_dump_to_file(rt, stderr, ent->code, false); fprintf(stderr, "\n"); // fprintf(stderr, "foo: "); pit_dump_to_file(rt, stderr, pit_symtab_get_function_cell(rt, pit_symtab_intern_cstr(rt, "foo")), false); fprintf(stderr, "\n"); - if (ins == PIT_NIL) { pit_error(rt, "malformed vm instruction"); return false; } + if (ins == PIT_NIL) { pit_error(rt, "malformed vm instruction: %v %v", ins); return false; } ent->code = pit_value_cons_cdr(rt, ent->code); pit_value op = pit_value_cons_car(rt, ins); if (pit_symtab_symbol_name_match_cstr(rt, op, "literal")) { diff --git a/pit/src/runtime/macroexpand.c b/pit/src/runtime/macroexpand.c index fdc1f14..9a557dd 100644 --- a/pit/src/runtime/macroexpand.c +++ b/pit/src/runtime/macroexpand.c @@ -7,7 +7,7 @@ pit_value pit_macroexpand_1(pit_runtime *rt, pit_value top) { if (pit_vec_push(pit_value)(rt->expr_stack, top) < 0) pit_error(rt, "macro expansion stack overflow"); while (rt->expr_stack->next > expr_stack_reset) { - pit_value cur; + pit_value cur = PIT_NIL; if (rt->error != PIT_NIL) goto end; if (pit_vec_pop(pit_value)(rt->expr_stack, &cur) < 0) pit_error(rt, "macro expansion stack underflow"); @@ -66,7 +66,7 @@ pit_value pit_macroexpand_1(pit_runtime *rt, pit_value top) { if (pit_vec_pop(pit_value)(rt->result_stack, &f) < 0) pit_error(rt, "macro expansion stack underflow"); for (i64 i = 0; i < ent->in.application.arity; ++i) { - pit_value a; + pit_value a = PIT_NIL; if (pit_vec_pop(pit_value)(rt->result_stack, &a) < 0) pit_error(rt, "macro expansion stack underflow"); args = pit_value_cons(rt, a, args); @@ -76,7 +76,7 @@ pit_value pit_macroexpand_1(pit_runtime *rt, pit_value top) { 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) - pit_error(rt, "macro expansion stack overflow"); + pit_error(rt, "macroexpansion stack overflow"); break; } default: |
