diff options
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; } } |