Avoid some unnecessary work.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@26122 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-MacDonald 2008-02-23 17:46:29 +00:00
parent 0c30cbd8c0
commit 425290fda5
2 changed files with 145 additions and 105 deletions

View file

@ -1,3 +1,8 @@
2008-02-23 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSKeyValueObserving.m:
Don't calculate KVO info in cases where there is no observer.
2008-02-22 Richard Frith-Macdonald <rfm@gnu.org> 2008-02-22 Richard Frith-Macdonald <rfm@gnu.org>
* Source/mframe/mframe.head: Change function arguments * Source/mframe/mframe.head: Change function arguments

View file

@ -517,14 +517,16 @@ replacementForClass(Class c)
NSString *mainKey; NSString *mainKey;
NSHashTable dependents; NSHashTable dependents;
while (NSNextMapEnumeratorPair(&enumerator, (void **)(&mainKey), &dependents)) while (NSNextMapEnumeratorPair(&enumerator, (void **)(&mainKey),
&dependents))
{ {
NSHashEnumerator dependentKeyEnum; NSHashEnumerator dependentKeyEnum;
NSString *dependentKey; NSString *dependentKey;
if (!dependents) continue; if (!dependents) continue;
dependentKeyEnum = NSEnumerateHashTable(dependents); dependentKeyEnum = NSEnumerateHashTable(dependents);
while ((dependentKey = NSNextHashEnumeratorItem(&dependentKeyEnum))) while ((dependentKey
= NSNextHashEnumeratorItem(&dependentKeyEnum)))
{ {
if ([dependentKey isEqual: aKey]) if ([dependentKey isEqual: aKey])
{ {
@ -1265,39 +1267,47 @@ replacementForClass(Class c)
- (void) willChangeValueForDependentsOfKey: (NSString *)aKey - (void) willChangeValueForDependentsOfKey: (NSString *)aKey
{ {
NSMapTable keys = NSMapGet(dependentKeyTable, [self class]); NSMapTable keys = NSMapGet(dependentKeyTable, [self class]);
if (keys) if (keys)
{ {
NSHashTable dependents = NSMapGet(keys, aKey); NSHashTable dependents = NSMapGet(keys, aKey);
if (dependents != 0)
{
NSString *dependentKey; NSString *dependentKey;
NSHashEnumerator dependentKeyEnum; NSHashEnumerator dependentKeyEnum;
if (!dependents) return;
dependentKeyEnum = NSEnumerateHashTable(dependents); dependentKeyEnum = NSEnumerateHashTable(dependents);
while ((dependentKey = NSNextHashEnumeratorItem(&dependentKeyEnum))) while ((dependentKey = NSNextHashEnumeratorItem(&dependentKeyEnum)))
{ {
[self willChangeValueForKey:dependentKey]; [self willChangeValueForKey: dependentKey];
} }
NSEndHashTableEnumeration(&dependentKeyEnum); NSEndHashTableEnumeration(&dependentKeyEnum);
} }
}
} }
- (void) didChangeValueForDependentsOfKey: (NSString *)aKey - (void) didChangeValueForDependentsOfKey: (NSString *)aKey
{ {
NSMapTable keys = NSMapGet(dependentKeyTable, [self class]); NSMapTable keys = NSMapGet(dependentKeyTable, [self class]);
if (keys) if (keys)
{ {
NSHashTable dependents = NSMapGet(keys, aKey); NSHashTable dependents = NSMapGet(keys, aKey);
if (dependents != nil)
{
NSString *dependentKey; NSString *dependentKey;
NSHashEnumerator dependentKeyEnum; NSHashEnumerator dependentKeyEnum;
if (!dependents) return;
dependentKeyEnum = NSEnumerateHashTable(dependents); dependentKeyEnum = NSEnumerateHashTable(dependents);
while ((dependentKey = NSNextHashEnumeratorItem(&dependentKeyEnum))) while ((dependentKey = NSNextHashEnumeratorItem(&dependentKeyEnum)))
{ {
[self didChangeValueForKey:dependentKey]; [self didChangeValueForKey: dependentKey];
} }
NSEndHashTableEnumeration(&dependentKeyEnum); NSEndHashTableEnumeration(&dependentKeyEnum);
} }
}
} }
/* FIXME /* FIXME
@ -1307,24 +1317,34 @@ replacementForClass(Class c)
*/ */
- (void) willChangeValueForKey: (NSString*)aKey - (void) willChangeValueForKey: (NSString*)aKey
{ {
id old = [self valueForKey: aKey]; GSKVOInfo *info;
NSDictionary * change;
if (old != nil) info = (GSKVOInfo *)[self observationInfo];
change = [NSMutableDictionary if (info != nil)
dictionaryWithObject: [self valueForKey: aKey] {
forKey: NSKeyValueChangeOldKey]; id old;
else NSDictionary *change;
change = [NSMutableDictionary dictionary]; change = [NSMutableDictionary dictionary];
[(GSKVOInfo *)[self observationInfo] setChange: change forKey: aKey]; old = [self valueForKey: aKey];
if (old != nil)
{
[change setObject: old forKey: NSKeyValueChangeOldKey];
}
[info setChange: change forKey: aKey];
}
[self willChangeValueForDependentsOfKey: aKey]; [self willChangeValueForDependentsOfKey: aKey];
} }
- (void) didChangeValueForKey: (NSString*)aKey - (void) didChangeValueForKey: (NSString*)aKey
{ {
GSKVOInfo *info; GSKVOInfo *info;
NSMutableDictionary *change;
info = (GSKVOInfo *)[self observationInfo]; info = (GSKVOInfo *)[self observationInfo];
if (info != nil)
{
NSMutableDictionary *change;
change = (NSMutableDictionary *)[info changeForKey: aKey]; change = (NSMutableDictionary *)[info changeForKey: aKey];
[change setValue: [self valueForKey: aKey] [change setValue: [self valueForKey: aKey]
forKey: NSKeyValueChangeNewKey]; forKey: NSKeyValueChangeNewKey];
@ -1332,7 +1352,8 @@ replacementForClass(Class c)
forKey: NSKeyValueChangeKindKey]; forKey: NSKeyValueChangeKindKey];
[info notifyForKey: aKey ofChange: change]; [info notifyForKey: aKey ofChange: change];
[info setChange:nil forKey: aKey]; [info setChange: nil forKey: aKey];
}
[self didChangeValueForDependentsOfKey: aKey]; [self didChangeValueForDependentsOfKey: aKey];
} }
@ -1341,10 +1362,13 @@ replacementForClass(Class c)
forKey: (NSString*)aKey forKey: (NSString*)aKey
{ {
GSKVOInfo *info; GSKVOInfo *info;
info = [self observationInfo];
if (info != nil)
{
NSMutableDictionary *change; NSMutableDictionary *change;
NSMutableArray *array; NSMutableArray *array;
info = [self observationInfo];
change = (NSMutableDictionary *)[info changeForKey: aKey]; change = (NSMutableDictionary *)[info changeForKey: aKey];
array = [self valueForKey: aKey]; array = [self valueForKey: aKey];
@ -1361,6 +1385,7 @@ replacementForClass(Class c)
[info notifyForKey: aKey ofChange: change]; [info notifyForKey: aKey ofChange: change];
[info setChange:nil forKey: aKey]; [info setChange:nil forKey: aKey];
}
[self didChangeValueForDependentsOfKey: aKey]; [self didChangeValueForDependentsOfKey: aKey];
} }
@ -1369,10 +1394,12 @@ replacementForClass(Class c)
forKey: (NSString*)aKey forKey: (NSString*)aKey
{ {
GSKVOInfo *info; GSKVOInfo *info;
info = [self observationInfo];
{
NSDictionary *change; NSDictionary *change;
NSMutableArray *array; NSMutableArray *array;
info = [self observationInfo];
change = [NSMutableDictionary dictionary]; change = [NSMutableDictionary dictionary];
array = [self valueForKey: aKey]; array = [self valueForKey: aKey];
@ -1384,6 +1411,7 @@ replacementForClass(Class c)
} }
[info setChange: change forKey: aKey]; [info setChange: change forKey: aKey];
}
[self willChangeValueForDependentsOfKey: aKey]; [self willChangeValueForDependentsOfKey: aKey];
} }
@ -1392,15 +1420,19 @@ replacementForClass(Class c)
usingObjects: (NSSet*)objects usingObjects: (NSSet*)objects
{ {
GSKVOInfo *info; GSKVOInfo *info;
info = [self observationInfo];
if (info != nil)
{
NSDictionary *change; NSDictionary *change;
NSMutableSet *set; NSMutableSet *set;
info = [self observationInfo];
change = [NSMutableDictionary dictionary]; change = [NSMutableDictionary dictionary];
set = [self valueForKey: aKey]; set = [self valueForKey: aKey];
[change setValue: [set mutableCopy] forKey: @"oldSet"]; [change setValue: [set mutableCopy] forKey: @"oldSet"];
[info setChange: change forKey: aKey]; [info setChange: change forKey: aKey];
}
[self willChangeValueForDependentsOfKey: aKey]; [self willChangeValueForDependentsOfKey: aKey];
} }
@ -1409,17 +1441,18 @@ replacementForClass(Class c)
usingObjects: (NSSet*)objects usingObjects: (NSSet*)objects
{ {
GSKVOInfo *info; GSKVOInfo *info;
info = (GSKVOInfo *)[self observationInfo];
if (info != nil)
{
NSMutableDictionary *change; NSMutableDictionary *change;
NSMutableSet *oldSet; NSMutableSet *oldSet;
NSMutableSet *set; NSMutableSet *set;
info = (GSKVOInfo *)[self observationInfo];
change = (NSMutableDictionary *)[info changeForKey: aKey]; change = (NSMutableDictionary *)[info changeForKey: aKey];
oldSet = [change valueForKey: @"oldSet"]; oldSet = [change valueForKey: @"oldSet"];
set = [self valueForKey: aKey]; set = [self valueForKey: aKey];
[change setValue: nil forKey: @"oldSet"]; [change setValue: nil forKey: @"oldSet"];
if (mutationKind == NSKeyValueUnionSetMutation) if (mutationKind == NSKeyValueUnionSetMutation)
{ {
set = [set mutableCopy]; set = [set mutableCopy];
@ -1445,13 +1478,15 @@ replacementForClass(Class c)
[old minusSet: set]; [old minusSet: set];
new = [set mutableCopy]; new = [set mutableCopy];
[new minusSet: oldSet]; [new minusSet: oldSet];
[change setValue: [NSNumber numberWithInt: NSKeyValueChangeReplacement] [change setValue:
[NSNumber numberWithInt: NSKeyValueChangeReplacement]
forKey: NSKeyValueChangeKindKey]; forKey: NSKeyValueChangeKindKey];
[change setValue: old forKey: NSKeyValueChangeOldKey]; [change setValue: old forKey: NSKeyValueChangeOldKey];
[change setValue: new forKey: NSKeyValueChangeNewKey]; [change setValue: new forKey: NSKeyValueChangeNewKey];
} }
[info notifyForKey: aKey ofChange: change]; [info notifyForKey: aKey ofChange: change];
[info setChange:nil forKey: aKey]; [info setChange:nil forKey: aKey];
}
[self didChangeValueForDependentsOfKey: aKey]; [self didChangeValueForDependentsOfKey: aKey];
} }