@@ -571,10 +571,27 @@ (id (*)(id, SEL, id, id, id))objc_msgSend; #endif return imp(self, selector, object1, object2, object3); } + +- (id)performSelector: (SEL)selector + withObject: (id)object1 + withObject: (id)object2 + withObject: (id)object3 + withObject: (id)object4 +{ +#if defined(OF_OBJFW_RUNTIME) + id (*imp)(id, SEL, id, id, id, id) = + (id (*)(id, SEL, id, id, id, id))objc_msg_lookup(self, selector); +#elif defined(OF_APPLE_RUNTIME) + id (*imp)(id, SEL, id, id, id, id) = + (id (*)(id, SEL, id, id, id, id))objc_msgSend; +#endif + + return imp(self, selector, object1, object2, object3, object4); +} - (void)performSelector: (SEL)selector afterDelay: (of_time_interval_t)delay { void *pool = objc_autoreleasePoolPush(); @@ -632,10 +649,31 @@ selector: selector object: object1 object: object2 object: object3 repeats: false]; + + objc_autoreleasePoolPop(pool); +} + +- (void)performSelector: (SEL)selector + withObject: (id)object1 + withObject: (id)object2 + withObject: (id)object3 + withObject: (id)object4 + afterDelay: (of_time_interval_t)delay +{ + void *pool = objc_autoreleasePoolPush(); + + [OFTimer scheduledTimerWithTimeInterval: delay + target: self + selector: selector + object: object1 + object: object2 + object: object3 + object: object4 + repeats: false]; objc_autoreleasePoolPop(pool); } #ifdef OF_HAVE_THREADS @@ -716,10 +754,35 @@ if (waitUntilDone) [timer waitUntilDone]; objc_autoreleasePoolPop(pool); } + +- (void)performSelector: (SEL)selector + onThread: (OFThread *)thread + withObject: (id)object1 + withObject: (id)object2 + withObject: (id)object3 + withObject: (id)object4 + waitUntilDone: (bool)waitUntilDone +{ + void *pool = objc_autoreleasePoolPush(); + OFTimer *timer = [OFTimer timerWithTimeInterval: 0 + target: self + selector: selector + object: object1 + object: object2 + object: object3 + object: object4 + repeats: false]; + [[thread runLoop] addTimer: timer]; + + if (waitUntilDone) + [timer waitUntilDone]; + + objc_autoreleasePoolPop(pool); +} - (void)performSelectorOnMainThread: (SEL)selector waitUntilDone: (bool)waitUntilDone { void *pool = objc_autoreleasePoolPush(); @@ -792,10 +855,34 @@ if (waitUntilDone) [timer waitUntilDone]; objc_autoreleasePoolPop(pool); } + +- (void)performSelectorOnMainThread: (SEL)selector + withObject: (id)object1 + withObject: (id)object2 + withObject: (id)object3 + withObject: (id)object4 + waitUntilDone: (bool)waitUntilDone +{ + void *pool = objc_autoreleasePoolPush(); + OFTimer *timer = [OFTimer timerWithTimeInterval: 0 + target: self + selector: selector + object: object1 + object: object2 + object: object3 + object: object4 + repeats: false]; + [[OFRunLoop mainRunLoop] addTimer: timer]; + + if (waitUntilDone) + [timer waitUntilDone]; + + objc_autoreleasePoolPop(pool); +} - (void)performSelector: (SEL)selector onThread: (OFThread *)thread afterDelay: (of_time_interval_t)delay { @@ -857,10 +944,32 @@ selector: selector object: object1 object: object2 object: object3 repeats: false]]; + + objc_autoreleasePoolPop(pool); +} + +- (void)performSelector: (SEL)selector + onThread: (OFThread *)thread + withObject: (id)object1 + withObject: (id)object2 + withObject: (id)object3 + withObject: (id)object4 + afterDelay: (of_time_interval_t)delay +{ + void *pool = objc_autoreleasePoolPush(); + + [[thread runLoop] addTimer: [OFTimer timerWithTimeInterval: delay + target: self + selector: selector + object: object1 + object: object2 + object: object3 + object: object4 + repeats: false]]; objc_autoreleasePoolPop(pool); } #endif