X-Git-Url: http://git.subgeniuskitty.com/vvhitespace/.git/blobdiff_plain/9686c90139fc19b70f42283b1504ab9d5be7932c..e5b4dad90ea7fbc4cbe1be5ac7f5c7b77b433b29:/vv_interpreter.c diff --git a/vv_interpreter.c b/vv_interpreter.c index 39210f1..8fac7c2 100644 --- a/vv_interpreter.c +++ b/vv_interpreter.c @@ -49,7 +49,6 @@ stdin_empty(void) void ws_die(size_t * pc, char * msg) { - printf("\n"); printf("SIM_ERROR @ PC %lu: %s\n", *pc, msg); fflush(stdout); exit(EXIT_FAILURE); @@ -223,7 +222,6 @@ process_imp_flowcontrol(uint8_t * code, size_t * pc, int32_t ** sp, uint32_t * l switch (next_code_byte(code,pc)) { case '\n': /* Technically another LF is required but we ignore it. */ - printf("\n"); fflush(stdout); exit(EXIT_SUCCESS); case ' ': @@ -282,9 +280,21 @@ void process_imp_heap(uint8_t * code, size_t * pc, int32_t ** sp, int32_t ** hp) { switch (next_code_byte(code,pc)) { - case ' ' : /* Store to heap */ *(*hp + *((*sp)-1)) = **sp; *sp -= 2; break; - case '\t': /* Retrieve from heap */ **sp = *(*hp + **sp); break; - default : ws_die(pc, "malformed heap IMP"); break; + case ' ' : + /* Store to heap */ + { + int32_t value = stack_pop(sp); + int32_t addr = stack_pop(sp); + *(*hp + addr) = value; + } + break; + case '\t': + /* Retrieve from heap */ + stack_push(sp, *(*hp + stack_pop(sp))); + break; + default: + ws_die(pc, "malformed heap IMP"); + break; } }