diff options
Diffstat (limited to 'src/bytecode/vm.h')
-rwxr-xr-x | src/bytecode/vm.h | 70 |
1 files changed, 35 insertions, 35 deletions
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 { | |||
21 | void vm_init(VM *vm); | 21 | void vm_init(VM *vm); |
22 | void vm_free(VM *vm); | 22 | void vm_free(VM *vm); |
23 | void vm_reset(VM *vm); | 23 | void vm_reset(VM *vm); |
24 | void vm_interpret(VM vm, Chunk *chunk); | 24 | void vm_interpret(VM *vm, Chunk *chunk); |
25 | 25 | ||
26 | void | 26 | void |
27 | vm_init(VM *vm) { | 27 | vm_init(VM *vm) { |
@@ -41,11 +41,11 @@ vm_reset(VM *vm) { | |||
41 | } | 41 | } |
42 | 42 | ||
43 | void | 43 | void |
44 | vm_interpret(VM vm, Chunk *chunk) { | 44 | vm_interpret(VM *vm, Chunk *chunk) { |
45 | vm.chunk = chunk; | 45 | vm->chunk = chunk; |
46 | vm.pc = vm.chunk->code; | 46 | vm->pc = vm->chunk->code; |
47 | 47 | ||
48 | if (vm.chunk->code == NULL || array_size(vm.chunk->code) == 0) { | 48 | if (vm->chunk->code == NULL || array_size(vm->chunk->code) == 0) { |
49 | error_push((Error){ | 49 | error_push((Error){ |
50 | .type = ERR_TYPE_RUNTIME, | 50 | .type = ERR_TYPE_RUNTIME, |
51 | .value = ERR_EMPTY_CHUNK, | 51 | .value = ERR_EMPTY_CHUNK, |
@@ -53,53 +53,53 @@ vm_interpret(VM vm, Chunk *chunk) { | |||
53 | return; | 53 | return; |
54 | } | 54 | } |
55 | 55 | ||
56 | u8 *last = vm.chunk->code + array_size(vm.chunk->code); | 56 | u8 *last = vm->chunk->code + array_size(vm->chunk->code); |
57 | while (vm.pc < last) { | 57 | while (vm->pc < last) { |
58 | #ifdef DEBUG_TRACE_EXECUTION | 58 | #ifdef DEBUG_TRACE_EXECUTION |
59 | printf("stack: [ "); | 59 | printf("stack: [ "); |
60 | for (size_t i = 0; i < array_size(vm.stack); i++) { | 60 | for (size_t i = 0; i < array_size(vm->stack); i++) { |
61 | display(vm.stack[i]); | 61 | display(vm->stack[i]); |
62 | if (i < array_size(vm.stack) - 1) { | 62 | if (i < array_size(vm->stack) - 1) { |
63 | printf(" | "); | 63 | printf(" | "); |
64 | } | 64 | } |
65 | } | 65 | } |
66 | printf(" ]\nop: "); | 66 | printf(" ]\nop: "); |
67 | disassemble_instruction(vm.chunk, (vm.pc - vm.chunk->code)); | 67 | disassemble_instruction(vm->chunk, (vm->pc - vm->chunk->code)); |
68 | #endif | 68 | #endif |
69 | u8 instruction = *vm.pc++; | 69 | u8 instruction = *vm->pc++; |
70 | switch (instruction) { | 70 | switch (instruction) { |
71 | case OP_CONSTANT: { | 71 | case OP_CONSTANT: { |
72 | u8 constant = *vm.pc++; | 72 | u8 constant = *vm->pc++; |
73 | Object obj = vm.chunk->constants[constant]; | 73 | Object obj = vm->chunk->constants[constant]; |
74 | array_push(vm.stack, obj); | 74 | array_push(vm->stack, obj); |
75 | } break; | 75 | } break; |
76 | case OP_SUM: { | 76 | case OP_SUM: { |
77 | Object a = array_pop(vm.stack); | 77 | ssize_t a = AS_FIXNUM(array_pop(vm->stack)); |
78 | Object b = array_pop(vm.stack); | 78 | ssize_t b = AS_FIXNUM(array_pop(vm->stack)); |
79 | array_push(vm.stack, a + b); | 79 | array_push(vm->stack, FIXNUM_VAL(a + b)); |
80 | } break; | 80 | } break; |
81 | case OP_SUB: { | 81 | case OP_SUB: { |
82 | Object a = array_pop(vm.stack); | 82 | ssize_t a = AS_FIXNUM(array_pop(vm->stack)); |
83 | Object b = array_pop(vm.stack); | 83 | ssize_t b = AS_FIXNUM(array_pop(vm->stack)); |
84 | array_push(vm.stack, b - a); | 84 | array_push(vm->stack, FIXNUM_VAL(b - a)); |
85 | } break; | 85 | } break; |
86 | case OP_MUL: { | 86 | case OP_MUL: { |
87 | Object a = array_pop(vm.stack); | 87 | ssize_t a = AS_FIXNUM(array_pop(vm->stack)); |
88 | Object b = array_pop(vm.stack); | 88 | ssize_t b = AS_FIXNUM(array_pop(vm->stack)); |
89 | array_push(vm.stack, a * b); | 89 | array_push(vm->stack, FIXNUM_VAL(a * b)); |
90 | } break; | 90 | } break; |
91 | case OP_DIV: { | 91 | case OP_DIV: { |
92 | Object a = array_pop(vm.stack); | 92 | ssize_t a = AS_FIXNUM(array_pop(vm->stack)); |
93 | Object b = array_pop(vm.stack); | 93 | ssize_t b = AS_FIXNUM(array_pop(vm->stack)); |
94 | array_push(vm.stack, b / a); | 94 | array_push(vm->stack, FIXNUM_VAL(b / a)); |
95 | } break; | 95 | } break; |
96 | case OP_MOD: { | 96 | case OP_MOD: { |
97 | Object a = array_pop(vm.stack); | 97 | ssize_t a = AS_FIXNUM(array_pop(vm->stack)); |
98 | Object b = array_pop(vm.stack); | 98 | ssize_t b = AS_FIXNUM(array_pop(vm->stack)); |
99 | array_push(vm.stack, a % b); | 99 | array_push(vm->stack, FIXNUM_VAL(a % b)); |
100 | } break; | 100 | } break; |
101 | case OP_RETURN: { | 101 | case OP_RETURN: { |
102 | display(array_pop(vm.stack)); | 102 | display(array_pop(vm->stack)); |
103 | printf("\n"); | 103 | printf("\n"); |
104 | return; | 104 | return; |
105 | } break; | 105 | } break; |
@@ -107,8 +107,8 @@ vm_interpret(VM vm, Chunk *chunk) { | |||
107 | error_push((Error){ | 107 | error_push((Error){ |
108 | .type = ERR_TYPE_RUNTIME, | 108 | .type = ERR_TYPE_RUNTIME, |
109 | .value = ERR_NOT_IMPLEMENTED, | 109 | .value = ERR_NOT_IMPLEMENTED, |
110 | .line = vm.chunk->lines[(vm.pc - vm.chunk->code) - 1].line, | 110 | .line = vm->chunk->lines[(vm->pc - vm->chunk->code) - 1].line, |
111 | .col = vm.chunk->lines[(vm.pc - vm.chunk->code) - 1].col, | 111 | .col = vm->chunk->lines[(vm->pc - vm->chunk->code) - 1].col, |
112 | }); | 112 | }); |
113 | return; | 113 | return; |
114 | } break; | 114 | } break; |
@@ -118,8 +118,8 @@ vm_interpret(VM vm, Chunk *chunk) { | |||
118 | error_push((Error){ | 118 | error_push((Error){ |
119 | .type = ERR_TYPE_RUNTIME, | 119 | .type = ERR_TYPE_RUNTIME, |
120 | .value = ERR_PC_OOB, | 120 | .value = ERR_PC_OOB, |
121 | .line = vm.chunk->lines[0].line, | 121 | .line = vm->chunk->lines[0].line, |
122 | .col = vm.chunk->lines[0].col, | 122 | .col = vm->chunk->lines[0].col, |
123 | }); | 123 | }); |
124 | } | 124 | } |
125 | 125 | ||