aboutsummaryrefslogtreecommitdiffstats
path: root/clox
diff options
context:
space:
mode:
authorGravatar Tom Willemse2021-07-29 23:38:20 -0700
committerGravatar Tom Willemse2021-07-29 23:38:20 -0700
commit2adc0cc33a44fde4a3de3409f03f03265dab0c1f (patch)
treef271a668c0e2debf3967a60e00f77e8dec5c9f5b /clox
parent73dfe7efa53b5ed58b9e1e94dceec14ec19d6308 (diff)
downloadcrafting-interpreters-2adc0cc33a44fde4a3de3409f03f03265dab0c1f.tar.gz
crafting-interpreters-2adc0cc33a44fde4a3de3409f03f03265dab0c1f.zip
Chapter 15.3
Diffstat (limited to 'clox')
-rw-r--r--clox/src/chunk.h13
-rw-r--r--clox/src/debug.c13
-rw-r--r--clox/src/main.c1
-rw-r--r--clox/src/vm.c11
4 files changed, 20 insertions, 18 deletions
diff --git a/clox/src/chunk.h b/clox/src/chunk.h
index 466898b..dcab3df 100644
--- a/clox/src/chunk.h
+++ b/clox/src/chunk.h
@@ -6,20 +6,21 @@
typedef enum {
OP_CONSTANT,
+ OP_NEGATE,
OP_RETURN,
} OpCode;
typedef struct {
int count;
int capacity;
- uint8_t* code;
- int* lines;
+ uint8_t *code;
+ int *lines;
ValueArray constants;
} Chunk;
-void initChunk(Chunk* chunk);
-void freeChunk(Chunk* chunk);
-void writeChunk(Chunk* chunk, uint8_t byte, int line);
-int addConstant(Chunk* chunk, Value value);
+void initChunk(Chunk *chunk);
+void freeChunk(Chunk *chunk);
+void writeChunk(Chunk *chunk, uint8_t byte, int line);
+int addConstant(Chunk *chunk, Value value);
#endif
diff --git a/clox/src/debug.c b/clox/src/debug.c
index 68fdbc5..91fe139 100644
--- a/clox/src/debug.c
+++ b/clox/src/debug.c
@@ -3,7 +3,7 @@
#include "debug.h"
#include "value.h"
-void disassembleChunk(Chunk* chunk, const char* name) {
+void disassembleChunk(Chunk *chunk, const char *name) {
printf("== %s ==\n", name);
for (int offset = 0; offset < chunk->count;) {
@@ -11,7 +11,7 @@ void disassembleChunk(Chunk* chunk, const char* name) {
}
}
-static int constantInstruction(const char* name, Chunk* chunk, int offset) {
+static int constantInstruction(const char *name, Chunk *chunk, int offset) {
uint8_t constant = chunk->code[offset + 1];
printf("%-16s %4d '", name, constant);
printValue(chunk->constants.values[constant]);
@@ -19,15 +19,14 @@ static int constantInstruction(const char* name, Chunk* chunk, int offset) {
return offset + 2;
}
-static int simpleInstruction(const char* name, int offset) {
+static int simpleInstruction(const char *name, int offset) {
printf("%s\n", name);
return offset + 1;
}
-int disassembleInstruction(Chunk* chunk, int offset) {
+int disassembleInstruction(Chunk *chunk, int offset) {
printf("%04d ", offset);
- if (offset > 0 &&
- chunk->lines[offset] == chunk->lines[offset - 1]) {
+ if (offset > 0 && chunk->lines[offset] == chunk->lines[offset - 1]) {
printf(" | ");
} else {
printf("%4d ", chunk->lines[offset]);
@@ -37,6 +36,8 @@ int disassembleInstruction(Chunk* chunk, int offset) {
switch (instruction) {
case OP_CONSTANT:
return constantInstruction("OP_CONSTANT", chunk, offset);
+ case OP_NEGATE:
+ return simpleInstruction("OP_NEGATE", offset);
case OP_RETURN:
return simpleInstruction("OP_RETURN", offset);
default:
diff --git a/clox/src/main.c b/clox/src/main.c
index 0f810ba..d2cb6bd 100644
--- a/clox/src/main.c
+++ b/clox/src/main.c
@@ -12,6 +12,7 @@ int main(int argc, const char *argv[]) {
int constant = addConstant(&chunk, 1.2);
writeChunk(&chunk, OP_CONSTANT, 123);
writeChunk(&chunk, constant, 123);
+ writeChunk(&chunk, OP_NEGATE, 123);
writeChunk(&chunk, OP_RETURN, 123);
diff --git a/clox/src/vm.c b/clox/src/vm.c
index ffd207d..e05a0c8 100644
--- a/clox/src/vm.c
+++ b/clox/src/vm.c
@@ -6,13 +6,9 @@
VM vm;
-static void resetStack() {
- vm.stackTop = vm.stack;
-}
+static void resetStack() { vm.stackTop = vm.stack; }
-void initVM() {
- resetStack();
-}
+void initVM() { resetStack(); }
void freeVM() {}
@@ -49,6 +45,9 @@ static InterpretResult run() {
push(constant);
break;
}
+ case OP_NEGATE:
+ push(-pop());
+ break;
case OP_RETURN: {
printValue(pop());
printf("\n");