From 45456733aa634ffe68d538a509692f331c5803c2 Mon Sep 17 00:00:00 2001 From: Bob Nystrom Date: Mon, 30 Dec 2013 07:30:50 -0800 Subject: [PATCH] Fix a few GC bugs. Adding a to a symbol table can trigger a GC, so we need to make sure we don't do that while sitting on an unpinned object. --- src/wren_compiler.c | 6 ++---- src/wren_core.c | 8 +++++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/wren_compiler.c b/src/wren_compiler.c index 47bbeb6f..26000e62 100644 --- a/src/wren_compiler.c +++ b/src/wren_compiler.c @@ -324,10 +324,8 @@ static void writeBuffer(WrenVM* vm, Buffer* buffer, uint8_t byte) static void freeBuffer(WrenVM* vm, Buffer* buffer) { - wrenReallocate(vm, buffer->bytes, buffer->capacity, 0); - buffer->bytes = NULL; - buffer->capacity = 0; - buffer->length = 0; + wrenReallocate(vm, buffer->bytes, 0, 0); + initBuffer(vm, buffer); } // Initializes [compiler]. diff --git a/src/wren_core.c b/src/wren_core.c index 5c073407..9962a81c 100644 --- a/src/wren_core.c +++ b/src/wren_core.c @@ -476,8 +476,10 @@ DEF_NATIVE(os_clock) static ObjClass* defineClass(WrenVM* vm, const char* name) { - ObjClass* classObj = wrenNewClass(vm, vm->objectClass, 0); + // Add the symbol first since it can trigger a GC. int symbol = addSymbol(vm, &vm->globalSymbols, name, strlen(name)); + + ObjClass* classObj = wrenNewClass(vm, vm->objectClass, 0); vm->globals[symbol] = OBJ_VAL(classObj); return classObj; } @@ -486,9 +488,9 @@ void wrenInitializeCore(WrenVM* vm) { // Define the root Object class. This has to be done a little specially // because it has no superclass and an unusual metaclass (Class). - vm->objectClass = wrenNewSingleClass(vm, 0); int objectSymbol = addSymbol(vm, &vm->globalSymbols, "Object", strlen("Object")); + vm->objectClass = wrenNewSingleClass(vm, 0); vm->globals[objectSymbol] = OBJ_VAL(vm->objectClass); NATIVE(vm->objectClass, "== ", object_eqeq); @@ -499,9 +501,9 @@ void wrenInitializeCore(WrenVM* vm) // Now we can define Class, which is a subclass of Object, but Object's // metaclass. - vm->classClass = wrenNewSingleClass(vm, 0); int classSymbol = addSymbol(vm, &vm->globalSymbols, "Class", strlen("Class")); + vm->classClass = wrenNewSingleClass(vm, 0); vm->globals[classSymbol] = OBJ_VAL(vm->classClass); // Now that Object and Class are defined, we can wire them up to each other.