aboutsummaryrefslogtreecommitdiffstats
path: root/clox/src/vm.c
diff options
context:
space:
mode:
authorGravatar Tom Willemse2021-07-29 23:56:42 -0700
committerGravatar Tom Willemse2021-07-29 23:56:42 -0700
commit9b60cf334cdb030759c54f700d5c122338c5b3a8 (patch)
treebddf5954a6519de2ccfa71b6d665ae64176000e7 /clox/src/vm.c
parent276debcb35a93fee953116694712b2d609c61c32 (diff)
downloadcrafting-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.c19
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) {