X-Git-Url: http://git.subgeniuskitty.com/vvhitespace/.git/blobdiff_plain/6e942bd8524e9393f61a0358a0282b2641f9d3d7..519b6ab41c6a7c2abd44c9dcffb2a9b63c762442:/vv_interpreter.c diff --git a/vv_interpreter.c b/vv_interpreter.c index 8d4db24..aa88505 100644 --- a/vv_interpreter.c +++ b/vv_interpreter.c @@ -236,8 +236,11 @@ process_imp_flowcontrol(uint8_t * code, size_t * pc, int32_t ** sp, uint32_t * l break; case '\t': /* Call a subroutine. */ - *((*rsp)++) = *pc; - *pc = labels[parse_label(code, pc)]; + { + size_t temp_pc = labels[parse_label(code, pc)]; + *((*rsp)++) = *pc; + *pc = temp_pc; + } break; case '\n': /* Jump unconditionally to a label. */ @@ -254,10 +257,12 @@ process_imp_flowcontrol(uint8_t * code, size_t * pc, int32_t ** sp, uint32_t * l switch (next_code_byte(code,pc)) { case ' ': /* Jump to a label if TOS == 0 */ + /* TODO: Does WS pop or peek the TOS? */ if (stack_peek(sp,0) == 0) *pc = labels[parse_label(code, pc)]; break; case '\t': /* Jump to a label if TOS < 0. */ + /* TODO: Does WS pop or peek the TOS? */ if (stack_peek(sp,0) < 0) *pc = labels[parse_label(code, pc)]; break; case '\n': @@ -280,9 +285,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; } }