[pushed] testsuite, Objective-C : Update forward-1.m.

Message ID B43D74A0-9EDB-435B-8122-927A8F1F618A@sandoe.co.uk
State New
Headers show
Series
  • [pushed] testsuite, Objective-C : Update forward-1.m.
Related show

Commit Message

Iain Sandoe Oct. 11, 2020, 2:41 p.m.
Hi

Newer versions of the runtime / NSObject don't respond to forward:.
This uses the replacement.

tested across the Darwin range, and on x86_64-linux
pushed to master
thanks
Iain

gcc/testsuite/ChangeLog:

	* objc.dg/torture/forward-1.m: Implement forwarding using the
	native NeXT (NSInvocation) method for Darwin.
---
 gcc/testsuite/objc.dg/torture/forward-1.m | 46 +++++++++++++++++++++--
 1 file changed, 42 insertions(+), 4 deletions(-)

-- 
2.24.1

Patch

diff --git a/gcc/testsuite/objc.dg/torture/forward-1.m b/gcc/testsuite/objc.dg/torture/forward-1.m
index b45f1b444ed..a25012de25c 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()
 {