From b750ece08bb88c302c27bef5312df4f7751fec04 Mon Sep 17 00:00:00 2001 From: Bob Nystrom Date: Wed, 1 Jan 2014 13:31:19 -0800 Subject: [PATCH] Move object freeing over to wren_value. That's where allocation is, so it makes sense. --- src/wren_value.c | 40 ++++++++++++++++++++++++++++++++++++++++ src/wren_value.h | 3 +++ src/wren_vm.c | 41 +---------------------------------------- 3 files changed, 44 insertions(+), 40 deletions(-) diff --git a/src/wren_value.c b/src/wren_value.c index 387b8216..8e290a32 100644 --- a/src/wren_value.c +++ b/src/wren_value.c @@ -302,6 +302,46 @@ Upvalue* wrenNewUpvalue(WrenVM* vm, Value* value) return upvalue; } + +void wrenFreeObj(WrenVM* vm, Obj* obj) +{ +#if WREN_TRACE_MEMORY + printf("free "); + wrenPrintValue(OBJ_VAL(obj)); + printf(" @ %p\n", obj); +#endif + + switch (obj->type) + { + case OBJ_FN: + { + ObjFn* fn = (ObjFn*)obj; + wrenReallocate(vm, fn->constants, 0, 0); + wrenReallocate(vm, fn->bytecode, 0, 0); + wrenReallocate(vm, fn->debug->name, 0, 0); + wrenReallocate(vm, fn->debug->sourceLines, 0, 0); + wrenReallocate(vm, fn->debug, 0, 0); + break; + } + + case OBJ_LIST: + wrenReallocate(vm, ((ObjList*)obj)->elements, 0, 0); + break; + + case OBJ_STRING: + wrenReallocate(vm, ((ObjString*)obj)->value, 0, 0); + break; + + case OBJ_CLASS: + case OBJ_CLOSURE: + case OBJ_INSTANCE: + case OBJ_UPVALUE: + break; + } + + wrenReallocate(vm, obj, 0, 0); +} + static ObjClass* getObjectClass(WrenVM* vm, Obj* obj) { switch (obj->type) diff --git a/src/wren_value.h b/src/wren_value.h index 5c0ded63..fdc6f510 100644 --- a/src/wren_value.h +++ b/src/wren_value.h @@ -527,6 +527,9 @@ Value wrenNewString(WrenVM* vm, const char* text, size_t length); // Creates a new open upvalue pointing to [value] on the stack. Upvalue* wrenNewUpvalue(WrenVM* vm, Value* value); +// Releases all memory owned by [obj], including [obj] itself. +void wrenFreeObj(WrenVM* vm, Obj* obj); + // Returns the class of [value]. ObjClass* wrenGetClass(WrenVM* vm, Value value); diff --git a/src/wren_vm.c b/src/wren_vm.c index 82128de3..24c07060 100644 --- a/src/wren_vm.c +++ b/src/wren_vm.c @@ -293,45 +293,6 @@ void wrenSetCompiler(WrenVM* vm, Compiler* compiler) vm->compiler = compiler; } -static void freeObj(WrenVM* vm, Obj* obj) -{ -#if WREN_TRACE_MEMORY - printf("free "); - wrenPrintValue(OBJ_VAL(obj)); - printf(" @ %p\n", obj); -#endif - - switch (obj->type) - { - case OBJ_FN: - { - ObjFn* fn = (ObjFn*)obj; - wrenReallocate(vm, fn->constants, 0, 0); - wrenReallocate(vm, fn->bytecode, 0, 0); - wrenReallocate(vm, fn->debug->name, 0, 0); - wrenReallocate(vm, fn->debug->sourceLines, 0, 0); - wrenReallocate(vm, fn->debug, 0, 0); - break; - } - - case OBJ_LIST: - wrenReallocate(vm, ((ObjList*)obj)->elements, 0, 0); - break; - - case OBJ_STRING: - wrenReallocate(vm, ((ObjString*)obj)->value, 0, 0); - break; - - case OBJ_CLASS: - case OBJ_CLOSURE: - case OBJ_INSTANCE: - case OBJ_UPVALUE: - break; - } - - wrenReallocate(vm, obj, 0, 0); -} - static void collectGarbage(WrenVM* vm) { // Mark all reachable objects. @@ -377,7 +338,7 @@ static void collectGarbage(WrenVM* vm) // This object wasn't reached, so remove it from the list and free it. Obj* unreached = *obj; *obj = unreached->next; - freeObj(vm, unreached); + wrenFreeObj(vm, unreached); } else {