diff options
Diffstat (limited to 'vm.c')
-rw-r--r-- | vm.c | 65 |
1 files changed, 29 insertions, 36 deletions
@@ -10,59 +10,52 @@ #include "dis.h" -Chunk chunk_new() { - return (Chunk){ - .blen = 0, .bcap = 0, .b = NULL, - .clen = 0, .ccap = 0, .c = NULL, - }; +Chunk chunk_new(State *S) { + return (Chunk){ 0 }; } - -size_t chunk_wbc(Chunk *ch, uint8_t byte) { - if (ch->blen == ch->bcap) { - size_t newsz = (ch->bcap == 0 ? 8 : ch->bcap * 2); - ch->b = RENEW_ARR(ch->b, uint8_t, ch->bcap, newsz); - ch->bcap = newsz; +size_t chunk_wbc(State *S, Chunk *ch, uint8_t byte) { + if (ch->bc.len == ch->bc.cap) { + size_t newsz = (ch->bc.cap == 0 ? 8 : ch->bc.cap * 2); + ch->bc.d = RENEW_ARR(S, ch->bc.d, uint8_t, ch->bc.cap, newsz); + ch->bc.cap = newsz; } - size_t ix = ch->blen; - ch->b[ix] = byte; - ch->blen ++; + size_t ix = ch->bc.len; + ch->bc.d[ix] = byte; + ch->bc.len ++; return ix; } -size_t chunk_wconst(Chunk *ch, Val v) { - if (ch->clen == ch->ccap) { - size_t newsz = (ch->ccap == 0 ? 8 : ch->ccap *2); - ch->c = RENEW_ARR(ch->c, Val, ch->ccap, newsz); - ch->ccap = newsz; +size_t chunk_wconst(State *S, Chunk *ch, Val v) { + if (ch->consts.len == ch->consts.cap) { + size_t newsz = (ch->consts.cap == 0 ? 8 : ch->consts.cap *2); + ch->consts.d = RENEW_ARR(S, ch->consts.d, Val, ch->consts.cap, newsz); + ch->consts.cap = newsz; } - size_t ix = ch->clen; - ch->c[ix] = v; - ch->clen ++; + size_t ix = ch->consts.len; + ch->consts.d[ix] = v; + ch->consts.len ++; return ix; } -Vm vm_new(Chunk *ch) { - Vm vm = (Vm){ - .ch = ch, - .ip = 0, - .sp = 0 - }; +Thread thread_new(State *S) { + Thread th = (Thread){ 0 }; for (int i = 0; i < STACKSIZE; i++) { - vm.stack[i] = VAL_NIL; + th.stack[i] = VAL_NIL; } - return vm; + return th; } -void runvm(Chunk *ch) { +void runvm(State *S) { + Thread *th = S->th; + Chunk *ch = th->ch; disasm_chunk(ch); - Vm vm = vm_new(ch); -#define RBYTE() (vm.ch->b[vm.ip++]) +#define RBYTE() (ch->bc.d[th->ip++]) -#define PUSH(v) vm.stack[vm.sp++] = v; -#define POP() (vm.stack[--vm.sp]) +#define PUSH(v) th->stack[th->sp++] = v; +#define POP() (th->stack[--th->sp]) puts("---"); while (1) { @@ -74,7 +67,7 @@ void runvm(Chunk *ch) { break; case OP_LOADK:; uint8_t cix = RBYTE(); - Val v = vm.ch->c[cix]; + Val v = ch->consts.d[cix]; PUSH(v); // printf(" (pushing "); // print_val(v); |