diff options
author | 2021-07-29 23:56:42 -0700 | |
---|---|---|
committer | 2021-07-29 23:56:42 -0700 | |
commit | 9b60cf334cdb030759c54f700d5c122338c5b3a8 (patch) | |
tree | bddf5954a6519de2ccfa71b6d665ae64176000e7 /clox/src/vm.c | |
parent | 276debcb35a93fee953116694712b2d609c61c32 (diff) | |
download | crafting-interpreters-9b60cf334cdb030759c54f700d5c122338c5b3a8.tar.gz crafting-interpreters-9b60cf334cdb030759c54f700d5c122338c5b3a8.zip |
Chapter 15.3.1
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) { |