aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode/vm.h
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-23 15:32:40 +0200
committerBad Diode <bd@badd10de.dev>2021-10-23 15:32:40 +0200
commit13f795f8f8aa302ee36ca3974fb80dba29240240 (patch)
tree4ede9989acd1a4cb54f8232c11d249e5f0187256 /src/bytecode/vm.h
parentbd1480fd2cb80680933b80900c5fb13b5f88ca42 (diff)
downloadbdl-13f795f8f8aa302ee36ca3974fb80dba29240240.tar.gz
bdl-13f795f8f8aa302ee36ca3974fb80dba29240240.zip
Add more types and access macros
Diffstat (limited to 'src/bytecode/vm.h')
-rwxr-xr-xsrc/bytecode/vm.h70
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 {
21void vm_init(VM *vm); 21void vm_init(VM *vm);
22void vm_free(VM *vm); 22void vm_free(VM *vm);
23void vm_reset(VM *vm); 23void vm_reset(VM *vm);
24void vm_interpret(VM vm, Chunk *chunk); 24void vm_interpret(VM *vm, Chunk *chunk);
25 25
26void 26void
27vm_init(VM *vm) { 27vm_init(VM *vm) {
@@ -41,11 +41,11 @@ vm_reset(VM *vm) {
41} 41}
42 42
43void 43void
44vm_interpret(VM vm, Chunk *chunk) { 44vm_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