diff --git a/ChangeLog b/ChangeLog index 6541bdb0f..09df693ba 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2010-03-12 Richard Frith-Macdonald + + * Source/NSKeyedArchiver.m: + Create _+clsMap lazily so it's there for subclasses even if the + initialiser was not called. + 2010-03-11 12:14-EST Gregory John Casamento * Source/GNUmakefile: Remove reference to synchonization.m. diff --git a/Source/NSKeyedUnarchiver.m b/Source/NSKeyedUnarchiver.m index c12eeab59..1f098b16c 100644 --- a/Source/NSKeyedUnarchiver.m +++ b/Source/NSKeyedUnarchiver.m @@ -345,7 +345,7 @@ static NSMapTable *globalClassMap = 0; - (Class) classForClassName: (NSString*)aString { - return (Class)NSMapGet(_clsMap, (void*)aString); + return _clsMap == 0 ? Nil : (Class)NSMapGet(_clsMap, (void*)aString); } - (BOOL) containsValueForKey: (NSString*)aKey @@ -806,8 +806,6 @@ static NSMapTable *globalClassMap = 0; _objects = [_archive objectForKey: @"$objects"]; _keyMap = [_archive objectForKey: @"$top"]; - _clsMap = NSCreateMapTable(NSObjectMapKeyCallBacks, - NSNonOwnedPointerMapValueCallBacks, 0); #if GS_WITH_GC _objMap = NSAllocateCollectable(sizeof(GSIArray_t), NSScannedOption); #else @@ -831,10 +829,18 @@ static NSMapTable *globalClassMap = 0; { if (aString == nil) { - NSMapRemove(_clsMap, (void*)aString); + if (_clsMap != 0) + { + NSMapRemove(_clsMap, (void*)aString); + } } else { + if (_clsMap == 0) + { + _clsMap = NSCreateMapTable(NSObjectMapKeyCallBacks, + NSNonOwnedPointerMapValueCallBacks, 0); + } NSMapInsert(_clsMap, (void*)aString, (void*)aClass); } }