diff --git a/ChangeLog b/ChangeLog index 53ee335a5..70ac2d27c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,5 @@ 2011-02-11 Richard Frith-Macdonald - * Source/NSUserDefaults.m: * Source/NSArray.m: * Source/NSString.m: * Source/NSPointerArray.m: @@ -8,6 +7,8 @@ Tweaks to try to avoid clang analyser warnings. * Source/NSPropertyList.m: Revert last change. + * Source/NSObject.m: + Rewrite zombie setup code to avoid crashes caused by latest change. 2011-02-11 Stefan Bidigaray diff --git a/Source/NSObject.m b/Source/NSObject.m index 90fbaed59..321e16322 100644 --- a/Source/NSObject.m +++ b/Source/NSObject.m @@ -127,15 +127,22 @@ BOOL NSZombieEnabled = NO; BOOL NSDeallocateZombies = NO; @class NSZombie; -static Class zombieClass; -static NSMapTable *zombieMap; +static NSMapTable *zombieMap = 0; #if !GS_WITH_GC static void GSMakeZombie(NSObject *o) { - Class c = ((id)o)->class_pointer; + static Class zombieClass = Nil; + Class c; - ((id)o)->class_pointer = zombieClass; + if (nil == zombieClass) + { + zombieMap = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks, + NSNonOwnedPointerMapValueCallBacks, 0); + zombieClass = [NSZombie class]; + } + c = object_getClass(o); + object_setClass(o, zombieClass); if (NSDeallocateZombies == NO) { [allocationLock lock]; @@ -961,18 +968,19 @@ objc_create_block_classes_as_subclasses_of(Class super) __attribute__((weak)); GSObjCBehaviorDebug(GSPrivateEnvironmentFlag("GNUSTEP_BEHAVIOR_DEBUG", GSObjCBehaviorDebug(-1))); - // Zombie management stuff. - zombieMap = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks, - NSNonOwnedPointerMapValueCallBacks, 0); - zombieClass = NSClassFromString(@"NSZombie"); + // Zombie management flags. NSZombieEnabled = GSPrivateEnvironmentFlag("NSZombieEnabled", NO); NSDeallocateZombies = GSPrivateEnvironmentFlag("NSDeallocateZombies", NO); + // Set up the autorelease system autorelease_class = [NSAutoreleasePool class]; autorelease_sel = @selector(addObject:); autorelease_imp = [autorelease_class methodForSelector: autorelease_sel]; + + // Make sure the constant string class works. NSConstantStringClass = [NSString constantStringClass]; GSPrivateBuildStrings(); + [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(_becomeMultiThreaded:)