blob: 258a9164999f6e42dcc9ead9df79e451aaf7e281 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
/* See if -forward::/-performv:: is able to work. */
#include <stdio.h>
#include <stdlib.h>
#import "../../objc-obj-c++-shared/Object1.h"
#import "../../objc-obj-c++-shared/next-mapping.h"
#include <objc/objc-api.h>
#define VALUETOUSE 1234567890
id forwarder, receiver;
@interface Forwarder: Object
{
id receiver;
}
-initWithReceiver:theReceiver;
@end
@interface Receiver:Object
{
int foo;
}
-display;
-initWithFoo:(int)theFoo;
@end
@implementation Receiver
-initWithFoo: (int)theFoo
{
foo = theFoo;
return self;
}
-display
{
/* Check to see if we are really the reciever. */
if (self != receiver)
abort ();
/* And the value of foo is set correctly. */
if (foo != VALUETOUSE)
abort ();
return self;
}
@end
@implementation Forwarder
-initWithReceiver: theReceiver
{
[super init];
receiver = theReceiver;
return self;
}
#ifdef __NEXT_RUNTIME__
- forward: (SEL)theSel: (marg_list)theArgFrame
#else
-(retval_t) forward: (SEL)theSel: (arglist_t)theArgFrame
#endif
{
/* If we have a reciever try to perform on that object */
if (receiver)
return [receiver performv: theSel: theArgFrame];
return [self doesNotRecognize:theSel];
}
@end
int main()
{
/* Init the reciever. */
receiver = [[Receiver alloc] initWithFoo: VALUETOUSE];
/* Init the fowarder. */
forwarder = [[Forwarder alloc] initWithReceiver: receiver];
/* Call display on the forwarder which in turns calls display on
the reciever. */
[forwarder display];
exit(0);
}
|