aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/bytecode/debug.h10
-rw-r--r--src/bytecode/main.c12
-rw-r--r--src/bytecode/ops.h5
-rw-r--r--src/bytecode/vm.h25
4 files changed, 45 insertions, 7 deletions
diff --git a/src/bytecode/debug.h b/src/bytecode/debug.h
index c891b77..05f9d8e 100644
--- a/src/bytecode/debug.h
+++ b/src/bytecode/debug.h
@@ -36,10 +36,6 @@ disassemble_instruction(Chunk *chunk, size_t offset) {
36 } 36 }
37 u8 instruction = chunk->code[offset]; 37 u8 instruction = chunk->code[offset];
38 switch (instruction) { 38 switch (instruction) {
39 case OP_RETURN: {
40 printf("OP_RETURN\n");
41 return offset + 1;
42 } break;
43 case OP_CONSTANT: { 39 case OP_CONSTANT: {
44 u8 constant = chunk->code[offset + 1]; 40 u8 constant = chunk->code[offset + 1];
45 printf("%-16s %4d (", "OP_CONSTANT", constant); 41 printf("%-16s %4d (", "OP_CONSTANT", constant);
@@ -47,6 +43,12 @@ disassemble_instruction(Chunk *chunk, size_t offset) {
47 printf(")\n"); 43 printf(")\n");
48 return offset + 2; 44 return offset + 2;
49 } break; 45 } break;
46 case OP_SUM: { printf("OP_SUM\n"); return offset + 1; } break;
47 case OP_SUB: { printf("OP_SUB\n"); return offset + 1; } break;
48 case OP_MUL: { printf("OP_MUL\n"); return offset + 1; } break;
49 case OP_DIV: { printf("OP_DIV\n"); return offset + 1; } break;
50 case OP_MOD: { printf("OP_MOD\n"); return offset + 1; } break;
51 case OP_RETURN: { printf("OP_RETURN\n"); return offset + 1; } break;
50 default: { 52 default: {
51 printf("Unknown OP: %d\n", instruction); 53 printf("Unknown OP: %d\n", instruction);
52 return offset + 1; 54 return offset + 1;
diff --git a/src/bytecode/main.c b/src/bytecode/main.c
index 5081d95..66089c0 100644
--- a/src/bytecode/main.c
+++ b/src/bytecode/main.c
@@ -38,10 +38,16 @@ process_source(const StringView *source) {
38 return; 38 return;
39 } 39 }
40 40
41 // Push some test instructions. 41 size_t const_a = add_constant(vm.chunk, 7);
42 size_t const_idx = add_constant(vm.chunk, 7);
43 add_code(vm.chunk, OP_CONSTANT, 1, 1); 42 add_code(vm.chunk, OP_CONSTANT, 1, 1);
44 add_code(vm.chunk, const_idx, 1, 1); 43 add_code(vm.chunk, const_a, 1, 1);
44 size_t const_b = add_constant(vm.chunk, 2);
45 add_code(vm.chunk, OP_CONSTANT, 1, 2);
46 add_code(vm.chunk, const_b, 1, 2);
47
48 // Arithmetic.
49 add_code(vm.chunk, OP_MOD, 1, 3);
50
45 add_code(vm.chunk, OP_RETURN, 1, 1); 51 add_code(vm.chunk, OP_RETURN, 1, 1);
46 52
47 vm_interpret(vm); 53 vm_interpret(vm);
diff --git a/src/bytecode/ops.h b/src/bytecode/ops.h
index 79092ab..b58631f 100644
--- a/src/bytecode/ops.h
+++ b/src/bytecode/ops.h
@@ -3,6 +3,11 @@
3 3
4typedef enum Ops { 4typedef enum Ops {
5 OP_CONSTANT, 5 OP_CONSTANT,
6 OP_SUM,
7 OP_SUB,
8 OP_MUL,
9 OP_DIV,
10 OP_MOD,
6 OP_RETURN, 11 OP_RETURN,
7} Ops; 12} Ops;
8 13
diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h
index d9b37a3..cc9f846 100644
--- a/src/bytecode/vm.h
+++ b/src/bytecode/vm.h
@@ -68,6 +68,31 @@ vm_interpret(VM vm) {
68 Object obj = vm.chunk->constants[constant]; 68 Object obj = vm.chunk->constants[constant];
69 array_push(vm.stack, obj); 69 array_push(vm.stack, obj);
70 } break; 70 } break;
71 case OP_SUM: {
72 Object a = array_pop(vm.stack);
73 Object b = array_pop(vm.stack);
74 array_push(vm.stack, a + b);
75 } break;
76 case OP_SUB: {
77 Object a = array_pop(vm.stack);
78 Object b = array_pop(vm.stack);
79 array_push(vm.stack, a - b);
80 } break;
81 case OP_MUL: {
82 Object a = array_pop(vm.stack);
83 Object b = array_pop(vm.stack);
84 array_push(vm.stack, a * b);
85 } break;
86 case OP_DIV: {
87 Object a = array_pop(vm.stack);
88 Object b = array_pop(vm.stack);
89 array_push(vm.stack, a / b);
90 } break;
91 case OP_MOD: {
92 Object a = array_pop(vm.stack);
93 Object b = array_pop(vm.stack);
94 array_push(vm.stack, a % b);
95 } break;
71 case OP_RETURN: { 96 case OP_RETURN: {
72 display(array_pop(vm.stack)); 97 display(array_pop(vm.stack));
73 printf("\n"); 98 printf("\n");