diff options
author | Iain Sandoe <iain@sandoe.co.uk> | 2020-10-06 21:30:17 +0100 |
---|---|---|
committer | Iain Sandoe <iain@sandoe.co.uk> | 2020-10-11 15:32:20 +0100 |
commit | b1b7599ca52f3ba94deea842c80286194d516210 (patch) | |
tree | 97bcce33cbbffbafc2c221e0a2c1401b19c35174 | |
parent | 40330e70770d1c42ca51f6d84b70b04537687bc5 (diff) | |
download | gcc-b1b7599ca52f3ba94deea842c80286194d516210.zip gcc-b1b7599ca52f3ba94deea842c80286194d516210.tar.gz gcc-b1b7599ca52f3ba94deea842c80286194d516210.tar.bz2 |
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.
-rw-r--r-- | gcc/testsuite/objc.dg/torture/forward-1.m | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/gcc/testsuite/objc.dg/torture/forward-1.m b/gcc/testsuite/objc.dg/torture/forward-1.m index b45f1b4..a25012d 100644 --- a/gcc/testsuite/objc.dg/torture/forward-1.m +++ b/gcc/testsuite/objc.dg/torture/forward-1.m @@ -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() { |