diff options
author | Tom Willemse | 2022-06-02 22:27:43 -0700 |
---|---|---|
committer | Tom Willemse | 2022-06-02 22:27:43 -0700 |
commit | 57ed9226c06b5fbe016e62857fe9662c51da3dfd (patch) | |
tree | f8bdae71c33f92ba1e105612ee848fcf168d3777 /clox/src/object.c | |
parent | e74cbddb0463e93f5d9742accc20bbed027d0b9b (diff) | |
download | crafting-interpreters-57ed9226c06b5fbe016e62857fe9662c51da3dfd.tar.gz crafting-interpreters-57ed9226c06b5fbe016e62857fe9662c51da3dfd.zip |
Chapter 25.3 & 25.4
Diffstat (limited to 'clox/src/object.c')
-rw-r--r-- | clox/src/object.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/clox/src/object.c b/clox/src/object.c index 8d26d8b..31550ae 100644 --- a/clox/src/object.c +++ b/clox/src/object.c @@ -20,8 +20,15 @@ static Obj *allocateObject(size_t size, ObjType type) { } ObjClosure *newClosure(ObjFunction *function) { + ObjUpvalue **upvalues = ALLOCATE(ObjUpvalue *, function->upvalueCount); + for (int i = 0; i < function->upvalueCount; i++) { + upvalues[i] = NULL; + } + ObjClosure *closure = ALLOCATE_OBJ(ObjClosure, OBJ_CLOSURE); closure->function = function; + closure->upvalues = upvalues; + closure->upvalueCount = function->upvalueCount; return closure; } @@ -81,6 +88,14 @@ ObjString *copyString(const char *chars, int length) { return allocateString(heapChars, length, hash); } +ObjUpvalue *newUpvalue(Value *slot) { + ObjUpvalue *upvalue = ALLOCATE_OBJ(ObjUpvalue, OBJ_UPVALUE); + upvalue->closed = NIL_VAL; + upvalue->location = slot; + upvalue->next = NULL; + return upvalue; +} + static void printFunction(ObjFunction *function) { if (function->name == NULL) { printf("<script>"); @@ -103,5 +118,8 @@ void printObject(Value value) { case OBJ_STRING: printf("%s", AS_CSTRING(value)); break; + case OBJ_UPVALUE: + printf("upvalue"); + break; } } |