Index: src/OFObject.m ================================================================== --- src/OFObject.m +++ src/OFObject.m @@ -109,19 +109,18 @@ andSelector: _cmd]; method->method_imp = newimp; return oldimp; #else - Method m; - IMP imp; + Method method = class_getInstanceMethod(self, selector); + IMP imp = class_getMethodImplementation(class, selector); - if ((m = class_getInstanceMethod(self, selector)) == NULL || - (imp = method_getImplementation(m)) == NULL) + if (method == NULL || imp == NULL) @throw [OFInvalidArgumentException newWithClass: self andSelector: _cmd]; - return method_setImplementation(m, imp); + return method_setImplementation(method, imp); #endif } - init { Index: tests/OFAutoreleasePool/OFAutoreleasePool.m ================================================================== --- tests/OFAutoreleasePool/OFAutoreleasePool.m +++ tests/OFAutoreleasePool/OFAutoreleasePool.m @@ -19,10 +19,14 @@ #define ZD "%zd" #else #define ZD "%u" #endif +int inits; +int retains; +int releases; + IMP init; IMP retain; IMP release; @interface TestObject: OFObject @@ -33,10 +37,12 @@ @implementation TestObject - init { id ret; + + inits++; ret = init(self, _cmd); printf("New %s with retain cnt " ZD "\n", [self name], [ret retainCount]); @@ -44,28 +50,34 @@ } - retain { id ret; + + retains++; ret = retain(self, _cmd); printf("Retaining %s to " ZD "\n", [self name], [ret retainCount]); return ret; } - release { + releases++; + printf("Releasing %s to " ZD "\n", [self name], [self retainCount] - 1); return release(self, _cmd); } @end int main() { + inits = retains = releases = 0; + init = [OFObject replaceMethod: @selector(init) withMethodFromClass: [TestObject class]]; retain = [OFObject replaceMethod: @selector(retain) withMethodFromClass: [TestObject class]]; release = [OFObject replaceMethod: @selector(release) @@ -83,10 +95,12 @@ o2 = [[OFObject new] autorelease]; pool2 = [OFAutoreleasePool new]; o3 = [[OFObject new] autorelease]; + [pool1 retain]; + [pool1 release]; [pool1 release]; [o3 free]; - return 0; + return (inits == 12 && retains == 1 && releases == 6 ? 0 : 1); }