From 3b136ffdebf135cc0d285573edd7bdfefb99bb00 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Fri, 22 Oct 2021 12:37:37 +0200 Subject: Add unary arithmetic operations for numbers --- src/bytecode/debug.h | 10 ++++++---- src/bytecode/main.c | 12 +++++++++--- src/bytecode/ops.h | 5 +++++ 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) { } u8 instruction = chunk->code[offset]; switch (instruction) { - case OP_RETURN: { - printf("OP_RETURN\n"); - return offset + 1; - } break; case OP_CONSTANT: { u8 constant = chunk->code[offset + 1]; printf("%-16s %4d (", "OP_CONSTANT", constant); @@ -47,6 +43,12 @@ disassemble_instruction(Chunk *chunk, size_t offset) { printf(")\n"); return offset + 2; } break; + case OP_SUM: { printf("OP_SUM\n"); return offset + 1; } break; + case OP_SUB: { printf("OP_SUB\n"); return offset + 1; } break; + case OP_MUL: { printf("OP_MUL\n"); return offset + 1; } break; + case OP_DIV: { printf("OP_DIV\n"); return offset + 1; } break; + case OP_MOD: { printf("OP_MOD\n"); return offset + 1; } break; + case OP_RETURN: { printf("OP_RETURN\n"); return offset + 1; } break; default: { printf("Unknown OP: %d\n", instruction); 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) { return; } - // Push some test instructions. - size_t const_idx = add_constant(vm.chunk, 7); + size_t const_a = add_constant(vm.chunk, 7); add_code(vm.chunk, OP_CONSTANT, 1, 1); - add_code(vm.chunk, const_idx, 1, 1); + add_code(vm.chunk, const_a, 1, 1); + size_t const_b = add_constant(vm.chunk, 2); + add_code(vm.chunk, OP_CONSTANT, 1, 2); + add_code(vm.chunk, const_b, 1, 2); + + // Arithmetic. + add_code(vm.chunk, OP_MOD, 1, 3); + add_code(vm.chunk, OP_RETURN, 1, 1); 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 @@ typedef enum Ops { OP_CONSTANT, + OP_SUM, + OP_SUB, + OP_MUL, + OP_DIV, + OP_MOD, OP_RETURN, } Ops; 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) { 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); + } break; + case OP_SUB: { + Object a = array_pop(vm.stack); + Object b = array_pop(vm.stack); + array_push(vm.stack, a - b); + } break; + case OP_MUL: { + Object a = array_pop(vm.stack); + Object b = array_pop(vm.stack); + array_push(vm.stack, a * b); + } break; + case OP_DIV: { + Object a = array_pop(vm.stack); + Object b = array_pop(vm.stack); + array_push(vm.stack, a / b); + } break; + case OP_MOD: { + Object a = array_pop(vm.stack); + Object b = array_pop(vm.stack); + array_push(vm.stack, a % b); + } break; case OP_RETURN: { display(array_pop(vm.stack)); printf("\n"); -- cgit v1.2.1