@@ -21,13 +21,14 @@ #import "OFDictionary.h" #import "OFDictionary_hashtable.h" #import "OFArray.h" #import "OFString.h" #import "OFXMLElement.h" -#import "OFAutoreleasePool.h" #import "OFNotImplementedException.h" + +#import "autorelease.h" static struct { Class isa; } placeholder; @@ -282,11 +283,11 @@ } - (BOOL)isEqual: (id)object { OFDictionary *otherDictionary; - OFAutoreleasePool *pool; + void *pool; OFEnumerator *enumerator; id key; if (![object isKindOfClass: [OFDictionary class]]) return NO; @@ -294,83 +295,81 @@ otherDictionary = object; if ([otherDictionary count] != [self count]) return NO; - pool = [[OFAutoreleasePool alloc] init]; + pool = objc_autoreleasePoolPush(); enumerator = [self keyEnumerator]; while ((key = [enumerator nextObject]) != nil) { id object = [otherDictionary objectForKey: key]; if (object == nil || ![object isEqual: [self objectForKey: key]]) { - [pool release]; + objc_autoreleasePoolPop(pool); return NO; } } - [pool release]; + objc_autoreleasePoolPop(pool); return YES; } - (BOOL)containsObject: (id)object { - OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; + void *pool = objc_autoreleasePoolPush(); OFEnumerator *enumerator = [self objectEnumerator]; id currentObject; while ((currentObject = [enumerator nextObject]) != nil) { if ([currentObject isEqual: object]) { - [pool release]; + objc_autoreleasePoolPop(pool); return YES; } } - [pool release]; + objc_autoreleasePoolPop(pool); return NO; } - (BOOL)containsObjectIdenticalTo: (id)object { - OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; + void *pool = objc_autoreleasePoolPush(); OFEnumerator *enumerator = [self objectEnumerator]; id currentObject; while ((currentObject = [enumerator nextObject]) != nil) { if (currentObject == object) { - [pool release]; + objc_autoreleasePoolPop(pool); return YES; } } - [pool release]; + objc_autoreleasePoolPop(pool); return NO; } - (OFArray*)allKeys { - OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; + void *pool = objc_autoreleasePoolPush(); id *keys = [self allocMemoryWithSize: sizeof(id) count: [self count]]; OFArray *ret; OFEnumerator *enumerator; id key; size_t i = 0; - pool = [[OFAutoreleasePool alloc] init]; enumerator = [self keyEnumerator]; - while ((key = [enumerator nextObject]) != nil) keys[i++] = key; assert(i == [self count]); - [pool release]; + objc_autoreleasePoolPop(pool); @try { ret = [OFArray arrayWithObjects: keys count: [self count]]; } @finally { @@ -380,27 +379,25 @@ return ret; } - (OFArray*)allObjects { - OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; + void *pool = objc_autoreleasePoolPush(); id *objects = [self allocMemoryWithSize: sizeof(id) count: [self count]]; OFArray *ret; OFEnumerator *enumerator; id object; size_t i = 0; - pool = [[OFAutoreleasePool alloc] init]; enumerator = [self objectEnumerator]; - while ((object = [enumerator nextObject]) != nil) objects[i++] = object; assert(i == [self count]); - [pool release]; + objc_autoreleasePoolPop(pool); @try { ret = [OFArray arrayWithObjects: objects count: [self count]]; } @finally { @@ -479,70 +476,69 @@ } #endif - (uint32_t)hash { - OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; + void *pool = objc_autoreleasePoolPush(); OFEnumerator *enumerator = [self keyEnumerator]; id key; uint32_t hash = 0; while ((key = [enumerator nextObject]) != nil) { hash += [key hash]; hash += [[self objectForKey: key] hash]; } - [pool release]; + objc_autoreleasePoolPop(pool); return hash; } - (OFString*)description { OFMutableString *ret; - OFAutoreleasePool *pool, *pool2; + void *pool; OFEnumerator *keyEnumerator, *objectEnumerator; id key, object; size_t i, count = [self count]; if (count == 0) return @"{}"; ret = [OFMutableString stringWithString: @"{\n"]; - pool = [[OFAutoreleasePool alloc] init]; + pool = objc_autoreleasePoolPush(); keyEnumerator = [self keyEnumerator]; objectEnumerator = [self objectEnumerator]; i = 0; - pool2 = [[OFAutoreleasePool alloc] init]; - while ((key = [keyEnumerator nextObject]) != nil && (object = [objectEnumerator nextObject]) != nil) { + void *pool2 = objc_autoreleasePoolPush(); + [ret appendString: [key description]]; [ret appendString: @" = "]; [ret appendString: [object description]]; if (++i < count) [ret appendString: @";\n"]; - [pool2 releaseObjects]; + objc_autoreleasePoolPop(pool2); } [ret replaceOccurrencesOfString: @"\n" withString: @"\n\t"]; [ret appendString: @";\n}"]; [ret makeImmutable]; - [pool release]; + objc_autoreleasePoolPop(pool); return ret; } - (OFXMLElement*)XMLElementBySerializing { - OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; - OFAutoreleasePool *pool2; + void *pool = objc_autoreleasePoolPush(); OFXMLElement *element; OFEnumerator *keyEnumerator, *objectEnumerator; id key, object; if ([self isKindOfClass: [OFMutableDictionary class]]) @@ -552,14 +548,13 @@ element = [OFXMLElement elementWithName: @"OFDictionary" namespace: OF_SERIALIZATION_NS]; keyEnumerator = [self keyEnumerator]; objectEnumerator = [self objectEnumerator]; - pool2 = [[OFAutoreleasePool alloc] init]; - while ((key = [keyEnumerator nextObject]) != nil && (object = [objectEnumerator nextObject]) != nil) { + void *pool2 = objc_autoreleasePoolPush(); OFXMLElement *keyElement, *objectElement; keyElement = [OFXMLElement elementWithName: @"key" namespace: OF_SERIALIZATION_NS]; @@ -571,47 +566,47 @@ [objectElement addChild: [object XMLElementBySerializing]]; [element addChild: keyElement]; [element addChild: objectElement]; - [pool2 releaseObjects]; + objc_autoreleasePoolPop(pool2); } [element retain]; - [pool release]; - [element autorelease]; + + objc_autoreleasePoolPop(pool); - return element; + return [element autorelease]; } - (OFString*)JSONRepresentation { OFMutableString *JSON = [OFMutableString stringWithString: @"{"]; - OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init], *pool2; + void *pool = objc_autoreleasePoolPush(); OFEnumerator *keyEnumerator = [self keyEnumerator]; OFEnumerator *objectEnumerator = [self objectEnumerator]; size_t i = 0, count = [self count]; OFString *key; OFString *object; - pool2 = [[OFAutoreleasePool alloc] init]; - while ((key = [keyEnumerator nextObject]) != nil && (object = [objectEnumerator nextObject]) != nil) { + void *pool2 = objc_autoreleasePoolPush(); + [JSON appendString: [key JSONRepresentation]]; [JSON appendString: @":"]; [JSON appendString: [object JSONRepresentation]]; if (++i < count) [JSON appendString: @","]; - [pool2 releaseObjects]; + objc_autoreleasePoolPop(pool2); } - [pool release]; - [JSON appendString: @"}"]; [JSON makeImmutable]; + + objc_autoreleasePoolPop(pool); return JSON; } @end