mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-25 03:44:04 +08:00
testsuite, Objective-C : Update forward-1.m.
Newer versions of the runtime / NSObject don't respond to forward:. This uses the replacement. gcc/testsuite/ChangeLog: * objc.dg/torture/forward-1.m: Implement forwarding using the native NeXT (NSInvocation) method for Darwin.
This commit is contained in:
parent
40330e7077
commit
b1b7599ca5
@ -1,32 +1,53 @@
|
||||
/* { dg-do run } */
|
||||
/* See if -forward:: is able to work. */
|
||||
/* { dg-skip-if "Needs OBJC2 Implementation" { *-*-darwin8* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
|
||||
|
||||
/* { dg-additional-options "-Wl,-framework,Foundation" { target *-*-darwin* } } */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/* Versions of the runtime after 10.13 no longer support the original
|
||||
'forward:' mechanism, so we make a stripped down representation of
|
||||
NSInvocation and need to link with -framework Foundation. */
|
||||
#if __NEXT_RUNTIME__
|
||||
@class NSInvocation, NSMethodSignature;
|
||||
# include "../../objc-obj-c++-shared/F-NSObject.h"
|
||||
@interface NSInvocation : NSObject
|
||||
+ (NSInvocation *)invocationWithMethodSignature:(NSMethodSignature *)sig;
|
||||
@property SEL selector;
|
||||
- (void)invoke;
|
||||
- (void)invokeWithTarget:(id)target;
|
||||
@end
|
||||
# define OBJECT NSObject
|
||||
#else
|
||||
#include "../../objc-obj-c++-shared/TestsuiteObject.m"
|
||||
#define OBJECT TestsuiteObject
|
||||
#endif
|
||||
|
||||
#define VALUETOUSE 1234567890
|
||||
|
||||
id forwarder, receiver;
|
||||
|
||||
@interface Forwarder: TestsuiteObject
|
||||
@interface Forwarder : OBJECT
|
||||
{
|
||||
id receiver;
|
||||
}
|
||||
|
||||
-initWithReceiver:theReceiver;
|
||||
#if __NEXT_RUNTIME__
|
||||
- (void)forwardInvocation:(NSInvocation *)anInvocation;
|
||||
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;
|
||||
#endif
|
||||
|
||||
@end
|
||||
|
||||
@interface Receiver:TestsuiteObject
|
||||
@interface Receiver : OBJECT
|
||||
{
|
||||
int foo;
|
||||
}
|
||||
-display;
|
||||
-initWithFoo:(int)theFoo;
|
||||
@end
|
||||
|
||||
@implementation Receiver
|
||||
|
||||
-initWithFoo: (int)theFoo
|
||||
@ -56,7 +77,22 @@ id forwarder, receiver;
|
||||
receiver = theReceiver;
|
||||
return self;
|
||||
}
|
||||
-(void *) forward: (SEL)theSel: (void *)theArgFrame
|
||||
|
||||
#if __NEXT_RUNTIME__
|
||||
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSel
|
||||
{
|
||||
return [receiver methodSignatureForSelector:aSel];
|
||||
}
|
||||
- (void)forwardInvocation:(NSInvocation *)anInvocation
|
||||
{
|
||||
if ([receiver respondsToSelector:[anInvocation selector]]) {
|
||||
[anInvocation invokeWithTarget:receiver];
|
||||
}
|
||||
else {
|
||||
}
|
||||
}
|
||||
#else
|
||||
-(void *) forward:(SEL)theSel : (void *)theArgFrame
|
||||
{
|
||||
/* If we have a reciever try to perform on that object */
|
||||
if (receiver)
|
||||
@ -75,6 +111,8 @@ id forwarder, receiver;
|
||||
printf ("Unrecognized selector\n");
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
@end
|
||||
int main()
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user