diff options
Diffstat (limited to 'clox/src/vm.c')
-rw-r--r-- | clox/src/vm.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/clox/src/vm.c b/clox/src/vm.c index e05a0c8..a775acb 100644 --- a/clox/src/vm.c +++ b/clox/src/vm.c @@ -25,6 +25,12 @@ Value pop() { static InterpretResult run() { #define READ_BYTE() (*vm.ip++) #define READ_CONSTANT() (vm.chunk->constants.values[READ_BYTE()]) +#define BINARY_OP(op) \ + do { \ + double b = pop(); \ + double a = pop(); \ + push(a op b); \ + } while (false) for (;;) { #ifdef DEBUG_TRACE_EXECUTION @@ -45,6 +51,18 @@ static InterpretResult run() { push(constant); break; } + case OP_ADD: + BINARY_OP(+); + break; + case OP_SUBTRACT: + BINARY_OP(-); + break; + case OP_MULTIPLY: + BINARY_OP(*); + break; + case OP_DIVIDE: + BINARY_OP(/); + break; case OP_NEGATE: push(-pop()); break; @@ -58,6 +76,7 @@ static InterpretResult run() { #undef READ_BYTE #undef READ_CONSTANT +#undef BINARY_OP } InterpretResult interpret(Chunk *chunk) { |