aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Tom Willemse2021-09-06 02:24:56 -0700
committerGravatar Tom Willemse2021-09-06 02:24:56 -0700
commitba52787271b246255b8788942cdb74560f840bfe (patch)
tree85febc8cd97beb7fc498bc16e01bb496c3941b20
parentc10cbcdf99824bf81fb0874deb258d5c8c7cb22d (diff)
downloadcrafting-interpreters-ba52787271b246255b8788942cdb74560f840bfe.tar.gz
crafting-interpreters-ba52787271b246255b8788942cdb74560f840bfe.zip
Chapter 19.1 - 19.2
-rw-r--r--clox/src/CMakeLists.txt1
-rw-r--r--clox/src/object.h32
-rw-r--r--clox/src/value.h8
3 files changed, 41 insertions, 0 deletions
diff --git a/clox/src/CMakeLists.txt b/clox/src/CMakeLists.txt
index af21222..e46b989 100644
--- a/clox/src/CMakeLists.txt
+++ b/clox/src/CMakeLists.txt
@@ -14,6 +14,7 @@ add_executable(Lox
compiler.c
scanner.h
scanner.c
+ object.h
main.c)
install(TARGETS Lox)
diff --git a/clox/src/object.h b/clox/src/object.h
new file mode 100644
index 0000000..7ab8f3a
--- /dev/null
+++ b/clox/src/object.h
@@ -0,0 +1,32 @@
+#ifndef OBJECT_H
+#define OBJECT_H
+
+#include "common.h"
+#include "value.h"
+
+#define OBJ_TYPE(value) (AS_OBJ(value)->type)
+
+#define IS_STRING(value) isObjType(value, OBJ_STRING)
+
+#define AS_STRING(value) ((ObjString *)AS_OBJ(value))
+#define AS_CSTRING(value) (((ObjString *)AS_OBJ(value))->chars)
+
+typedef enum {
+ OBJ_STRING,
+} ObjType;
+
+struct Obj {
+ ObjType type;
+};
+
+struct ObjString {
+ Obj obj;
+ int length;
+ char *chars;
+};
+
+static inline bool isObjType(Value value, ObjType type) {
+ return IS_OBJ(value) && AS_OBJ(value)->type == type;
+}
+
+#endif
diff --git a/clox/src/value.h b/clox/src/value.h
index 96df347..6896bea 100644
--- a/clox/src/value.h
+++ b/clox/src/value.h
@@ -3,10 +3,14 @@
#include "common.h"
+typedef struct Obj Obj;
+typedef struct ObjString ObjString;
+
typedef enum {
VAL_BOOL,
VAL_NIL,
VAL_NUMBER,
+ VAL_OBJ,
} ValueType;
typedef struct {
@@ -14,19 +18,23 @@ typedef struct {
union {
bool boolean;
double number;
+ Obj *obj;
} as;
} Value;
#define IS_BOOL(value) ((value).type == VAL_BOOL)
#define IS_NIL(value) ((value).type == VAL_NIL)
#define IS_NUMBER(value) ((value).type == VAL_NUMBER)
+#define IS_OBJ(value) ((value).type == VAL_OBJ)
+#define AS_OBJ(value) ((value).as.obj)
#define AS_BOOL(value) ((value).as.boolean)
#define AS_NUMBER(value) ((value).as.number)
#define BOOL_VAL(value) ((Value){VAL_BOOL, {.boolean = value}})
#define NIL_VAL ((Value){VAL_NIL, {.number = 0}})
#define NUMBER_VAL(value) ((Value){VAL_NUMBER, {.number = value}})
+#define OBJ_VAL(value) ((Value){VAL_OBJ, {.obj = (Obj *)object}})
typedef struct {
int capacity;