You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.3 KiB
Objective-C
72 lines
1.3 KiB
Objective-C
#include "Test.h"
|
|
#include "../objc/hooks.h"
|
|
|
|
@interface Forward : Test
|
|
- (id)forwardingTargetForSelector: (SEL)sel;
|
|
@end
|
|
|
|
id target;
|
|
|
|
@implementation Forward
|
|
- (id)forwardingTargetForSelector: (SEL)sel
|
|
{
|
|
return target;
|
|
}
|
|
@end
|
|
|
|
@interface Forward2 : Test
|
|
@end
|
|
|
|
@interface ForwardingTarget : Test
|
|
@end
|
|
|
|
BOOL forwardingTargetCalled;
|
|
|
|
@implementation ForwardingTarget
|
|
- (void)foo: (int)x
|
|
{
|
|
assert(x == 42);
|
|
forwardingTargetCalled = YES;
|
|
}
|
|
@end
|
|
@implementation Forward2
|
|
- (void)forward: (int)x
|
|
{
|
|
[target foo: x];
|
|
}
|
|
@end
|
|
|
|
static id proxy_lookup(id receiver, SEL selector)
|
|
{
|
|
if (class_respondsToSelector(object_getClass(receiver), @selector(forwardingTargetForSelector:)))
|
|
{
|
|
return [receiver forwardingTargetForSelector: selector];
|
|
}
|
|
return nil;
|
|
}
|
|
|
|
static IMP forward(id receiver, SEL selector)
|
|
{
|
|
if (class_respondsToSelector(object_getClass(receiver), @selector(forward:)))
|
|
{
|
|
return class_getMethodImplementation(object_getClass(receiver), @selector(forward:));
|
|
}
|
|
assert(0);
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
objc_proxy_lookup = proxy_lookup;
|
|
__objc_msg_forward2 = forward;
|
|
target = [ForwardingTarget new];
|
|
id proxy = [Forward new];
|
|
[proxy foo: 42];
|
|
[proxy dealloc];
|
|
assert(forwardingTargetCalled == YES);
|
|
forwardingTargetCalled = NO;
|
|
proxy = [Forward2 new];
|
|
[proxy foo: 42];
|
|
[proxy dealloc];
|
|
assert(forwardingTargetCalled == YES);
|
|
}
|