summaryrefslogtreecommitdiff
path: root/pit/src/runtime
diff options
context:
space:
mode:
Diffstat (limited to 'pit/src/runtime')
-rw-r--r--pit/src/runtime/compile.c4
-rw-r--r--pit/src/runtime/dump.c21
-rw-r--r--pit/src/runtime/eval.c5
-rw-r--r--pit/src/runtime/macroexpand.c6
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: