diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bytecode/debug.h | 10 | ||||
-rw-r--r-- | src/bytecode/main.c | 12 | ||||
-rw-r--r-- | src/bytecode/ops.h | 5 | ||||
-rw-r--r-- | src/bytecode/vm.h | 25 |
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 | ||
4 | typedef enum Ops { | 4 | typedef 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"); |