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:
Iain Sandoe 2020-10-06 21:30:17 +01:00
parent 40330e7077
commit b1b7599ca5

View File

@ -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()
{