From c10cbcdf99824bf81fb0874deb258d5c8c7cb22d Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Mon, 6 Sep 2021 02:03:31 -0700 Subject: Chapter 18 --- clox/src/vm.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'clox/src/vm.c') 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."); -- cgit v1.2.3-54-g00ecf