From 13f795f8f8aa302ee36ca3974fb80dba29240240 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sat, 23 Oct 2021 15:32:40 +0200 Subject: Add more types and access macros --- src/bytecode/vm.h | 70 +++++++++++++++++++++++++++---------------------------- 1 file changed, 35 insertions(+), 35 deletions(-) (limited to 'src/bytecode/vm.h') diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index 3a9b5af..581f093 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h @@ -21,7 +21,7 @@ typedef struct VM { void vm_init(VM *vm); void vm_free(VM *vm); void vm_reset(VM *vm); -void vm_interpret(VM vm, Chunk *chunk); +void vm_interpret(VM *vm, Chunk *chunk); void vm_init(VM *vm) { @@ -41,11 +41,11 @@ vm_reset(VM *vm) { } void -vm_interpret(VM vm, Chunk *chunk) { - vm.chunk = chunk; - vm.pc = vm.chunk->code; +vm_interpret(VM *vm, Chunk *chunk) { + vm->chunk = chunk; + vm->pc = vm->chunk->code; - if (vm.chunk->code == NULL || array_size(vm.chunk->code) == 0) { + if (vm->chunk->code == NULL || array_size(vm->chunk->code) == 0) { error_push((Error){ .type = ERR_TYPE_RUNTIME, .value = ERR_EMPTY_CHUNK, @@ -53,53 +53,53 @@ vm_interpret(VM vm, Chunk *chunk) { return; } - u8 *last = vm.chunk->code + array_size(vm.chunk->code); - while (vm.pc < last) { + u8 *last = vm->chunk->code + array_size(vm->chunk->code); + while (vm->pc < last) { #ifdef DEBUG_TRACE_EXECUTION printf("stack: [ "); - for (size_t i = 0; i < array_size(vm.stack); i++) { - display(vm.stack[i]); - if (i < array_size(vm.stack) - 1) { + for (size_t i = 0; i < array_size(vm->stack); i++) { + display(vm->stack[i]); + if (i < array_size(vm->stack) - 1) { printf(" | "); } } printf(" ]\nop: "); - disassemble_instruction(vm.chunk, (vm.pc - vm.chunk->code)); + disassemble_instruction(vm->chunk, (vm->pc - vm->chunk->code)); #endif - u8 instruction = *vm.pc++; + u8 instruction = *vm->pc++; switch (instruction) { case OP_CONSTANT: { - u8 constant = *vm.pc++; - Object obj = vm.chunk->constants[constant]; - array_push(vm.stack, obj); + u8 constant = *vm->pc++; + Object obj = vm->chunk->constants[constant]; + array_push(vm->stack, obj); } break; case OP_SUM: { - Object a = array_pop(vm.stack); - Object b = array_pop(vm.stack); - array_push(vm.stack, a + b); + ssize_t a = AS_FIXNUM(array_pop(vm->stack)); + ssize_t b = AS_FIXNUM(array_pop(vm->stack)); + array_push(vm->stack, FIXNUM_VAL(a + b)); } break; case OP_SUB: { - Object a = array_pop(vm.stack); - Object b = array_pop(vm.stack); - array_push(vm.stack, b - a); + ssize_t a = AS_FIXNUM(array_pop(vm->stack)); + ssize_t b = AS_FIXNUM(array_pop(vm->stack)); + array_push(vm->stack, FIXNUM_VAL(b - a)); } break; case OP_MUL: { - Object a = array_pop(vm.stack); - Object b = array_pop(vm.stack); - array_push(vm.stack, a * b); + ssize_t a = AS_FIXNUM(array_pop(vm->stack)); + ssize_t b = AS_FIXNUM(array_pop(vm->stack)); + array_push(vm->stack, FIXNUM_VAL(a * b)); } break; case OP_DIV: { - Object a = array_pop(vm.stack); - Object b = array_pop(vm.stack); - array_push(vm.stack, b / a); + ssize_t a = AS_FIXNUM(array_pop(vm->stack)); + ssize_t b = AS_FIXNUM(array_pop(vm->stack)); + array_push(vm->stack, FIXNUM_VAL(b / a)); } break; case OP_MOD: { - Object a = array_pop(vm.stack); - Object b = array_pop(vm.stack); - array_push(vm.stack, a % b); + ssize_t a = AS_FIXNUM(array_pop(vm->stack)); + ssize_t b = AS_FIXNUM(array_pop(vm->stack)); + array_push(vm->stack, FIXNUM_VAL(a % b)); } break; case OP_RETURN: { - display(array_pop(vm.stack)); + display(array_pop(vm->stack)); printf("\n"); return; } break; @@ -107,8 +107,8 @@ vm_interpret(VM vm, Chunk *chunk) { error_push((Error){ .type = ERR_TYPE_RUNTIME, .value = ERR_NOT_IMPLEMENTED, - .line = vm.chunk->lines[(vm.pc - vm.chunk->code) - 1].line, - .col = vm.chunk->lines[(vm.pc - vm.chunk->code) - 1].col, + .line = vm->chunk->lines[(vm->pc - vm->chunk->code) - 1].line, + .col = vm->chunk->lines[(vm->pc - vm->chunk->code) - 1].col, }); return; } break; @@ -118,8 +118,8 @@ vm_interpret(VM vm, Chunk *chunk) { error_push((Error){ .type = ERR_TYPE_RUNTIME, .value = ERR_PC_OOB, - .line = vm.chunk->lines[0].line, - .col = vm.chunk->lines[0].col, + .line = vm->chunk->lines[0].line, + .col = vm->chunk->lines[0].col, }); } -- cgit v1.2.1