diff options
author | 2021-09-06 02:03:31 -0700 | |
---|---|---|
committer | 2021-09-06 02:03:31 -0700 | |
commit | c10cbcdf99824bf81fb0874deb258d5c8c7cb22d (patch) | |
tree | 2872be7d0038f7b0f5a88a2e34875fd856e0101a /clox/src/vm.c | |
parent | 6508cfd8fe55e03a587b2f72d3ffc901d7ada049 (diff) | |
download | crafting-interpreters-c10cbcdf99824bf81fb0874deb258d5c8c7cb22d.tar.gz crafting-interpreters-c10cbcdf99824bf81fb0874deb258d5c8c7cb22d.zip |
Chapter 18
Diffstat (limited to 'clox/src/vm.c')
-rw-r--r-- | clox/src/vm.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/clox/src/vm.c b/clox/src/vm.c index 381c8c0..df9f490 100644 --- a/clox/src/vm.c +++ b/clox/src/vm.c @@ -39,6 +39,10 @@ Value pop() { static Value peek(int distance) { return vm.stackTop[-1 - distance]; } +static bool isFalsey(Value value) { + return IS_NIL(value) || (IS_BOOL(value) && !AS_BOOL(value)); +} + static InterpretResult run() { #define READ_BYTE() (*vm.ip++) #define READ_CONSTANT() (vm.chunk->constants.values[READ_BYTE()]) @@ -71,6 +75,27 @@ static InterpretResult run() { push(constant); break; } + case OP_NIL: + push(NIL_VAL); + break; + case OP_TRUE: + push(BOOL_VAL(true)); + break; + case OP_FALSE: + push(BOOL_VAL(false)); + break; + case OP_EQUAL: { + Value b = pop(); + Value a = pop(); + push(BOOL_VAL(valuesEqual(a, b))); + break; + } + case OP_GREATER: + BINARY_OP(BOOL_VAL, >); + break; + case OP_LESS: + BINARY_OP(BOOL_VAL, <); + break; case OP_ADD: BINARY_OP(NUMBER_VAL, +); break; @@ -83,6 +108,9 @@ static InterpretResult run() { case OP_DIVIDE: BINARY_OP(NUMBER_VAL, /); break; + case OP_NOT: + push(BOOL_VAL(isFalsey(pop()))); + break; case OP_NEGATE: if (!IS_NUMBER(peek(0))) { runtimeError("Operand must be a number."); |