Commit a5ad8c30 by Iain Sandoe

NeXT runtime compatibility changes.

gcc/testsuite:

	* objc.dg/torture/forward-1.m: Restore for m32 NeXT.
	* objc.dg/demangle-1.m: Remove NeXT ifdef around +initialize 
	declaration and implementation.
	* objc.dg/property/dotsyntax-3.m: XFAIL NeXT m64 run.
	* obj-c++.dg/property/at-property-13.mm: Likewise.
	* obj-c++.dg/property/fsf-property-method-access.mm: Likewise.
	* obj-c++.dg/property/property-1.mm: Likewise.
	* obj-c++.dg/property/at-property-7.mm: Likewise.
	* obj-c++.dg/property/at-property-9.mm: Likewise.
	* obj-c++.dg/property/dotsyntax-2.mm: Likewise.
	* obj-c++.dg/property/at-property-10.mm: Likewise.
	* obj-c++.dg/property/synthesize-2.mm: Likewise.
	* obj-c++.dg/property/at-property-12.mm: Likewise.
	* obj-c++.dg/property/fsf-property-basic.mm: Likewise.
	* obj-c++.dg/property/fsf-property-named-ivar.mm: Likewise.
	* obj-c++.dg/property/at-property-6.mm: Likewise.
	* obj-c++.dg/property/at-property-8.mm: Likewise.
	* obj-c++.dg/property/dotsyntax-1.mm: Likewise.
	* obj-c++.dg/property/dotsyntax-3.mm: Likewise.
	* obj-c++.dg/property/at-property-11.mm: Likewise.
	* obj-c++.dg/template-8.mm: Likewise.
	* obj-c++.dg/encode-3.mm: Use abort (), cast char types.
	* obj-c++.dg/demangle-2.mm: Add +initialize:, XFAIL NeXT m64.
	* obj-c++.dg/property/at-property-2.mm: Comment out a case that ICEs and
	put a FIXME for this.
	* obj-c++.dg/property/property-2.mm: Remove.
	* obj-c++.dg/property/property-3.mm: Remove.

From-SVN: r166352
parent 0f59b812
2010-11-05 Iain Sandoe <iains@gcc.gnu.org>
* objc.dg/torture/forward-1.m: Restore for m32 NeXT.
* objc.dg/demangle-1.m: Remove NeXT ifdef around +initialize
declaration and implementation.
* objc.dg/property/dotsyntax-3.m: XFAIL NeXT m64 run.
* obj-c++.dg/property/at-property-13.mm: Likewise.
* obj-c++.dg/property/fsf-property-method-access.mm: Likewise.
* obj-c++.dg/property/property-1.mm: Likewise.
* obj-c++.dg/property/at-property-7.mm: Likewise.
* obj-c++.dg/property/at-property-9.mm: Likewise.
* obj-c++.dg/property/dotsyntax-2.mm: Likewise.
* obj-c++.dg/property/at-property-10.mm: Likewise.
* obj-c++.dg/property/synthesize-2.mm: Likewise.
* obj-c++.dg/property/at-property-12.mm: Likewise.
* obj-c++.dg/property/fsf-property-basic.mm: Likewise.
* obj-c++.dg/property/fsf-property-named-ivar.mm: Likewise.
* obj-c++.dg/property/at-property-6.mm: Likewise.
* obj-c++.dg/property/at-property-8.mm: Likewise.
* obj-c++.dg/property/dotsyntax-1.mm: Likewise.
* obj-c++.dg/property/dotsyntax-3.mm: Likewise.
* obj-c++.dg/property/at-property-11.mm: Likewise.
* obj-c++.dg/template-8.mm: Likewise.
* obj-c++.dg/encode-3.mm: Use abort (), cast char types.
* obj-c++.dg/demangle-2.mm: Add +initialize:, XFAIL NeXT m64.
* obj-c++.dg/property/at-property-2.mm: Comment out a case that ICEs and
put a FIXME for this.
* obj-c++.dg/property/property-2.mm: Remove.
* obj-c++.dg/property/property-3.mm: Remove.
2010-11-05 Jakub Jelinek <jakub@redhat.com> 2010-11-05 Jakub Jelinek <jakub@redhat.com>
PR debug/46307 PR debug/46307
...@@ -76,10 +106,9 @@ ...@@ -76,10 +106,9 @@
* objc.dg/encode-7-next.m: Use next-mapping.h, ignore deprecation * objc.dg/encode-7-next.m: Use next-mapping.h, ignore deprecation
warnings. warnings.
* objc.dg/encode-7-next-64bit.m: Use next-mapping.h, ignore * objc.dg/encode-7-next-64bit.m: Use next-mapping.h, ignore
deprecation warnings. Use Object1 implemenation. deprecation warnings. Use Object1 implementation.
* objc.dg/demangle-1.m: Provide +initialize. XFAIL m64 NeXT run. * objc.dg/demangle-1.m: Provide +initialize. XFAIL m64 NeXT run.
* objc/execute/forward-1.m: Move to objc.dg/torture and reduce scope * objc/execute/forward-1.m: Remove.
to m32 NeXT.
* objc/execute/forward-1.x: Remove. * objc/execute/forward-1.x: Remove.
2010-11-04 Jason Merrill <jason@redhat.com> 2010-11-04 Jason Merrill <jason@redhat.com>
......
/* Test demangling an Objective-C method. */ /* Test demangling an Objective-C method. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include <cstring> #include <cstring>
#include <cstdlib> #include <cstdlib>
...@@ -13,6 +14,7 @@ ...@@ -13,6 +14,7 @@
+ (int) testFunction1; + (int) testFunction1;
+ (int) test_function2; + (int) test_function2;
+ (int) __testFunction3: (int)unused andArgument: (char)unused2; + (int) __testFunction3: (int)unused andArgument: (char)unused2;
+ (id) initialize;
@end @end
@implementation DemangleTest @implementation DemangleTest
...@@ -31,6 +33,7 @@ ...@@ -31,6 +33,7 @@
std::cout << __PRETTY_FUNCTION__ << "\n"; std::cout << __PRETTY_FUNCTION__ << "\n";
return std::strcmp (__PRETTY_FUNCTION__, "+[DemangleTest __testFunction3:andArgument:]"); return std::strcmp (__PRETTY_FUNCTION__, "+[DemangleTest __testFunction3:andArgument:]");
} }
+ (id) initialize { return self; }
@end @end
int main () int main ()
......
/* { dg-do run } */ /* { dg-do run } */
extern "C" { extern "C" {
extern void _exit(int); extern void abort (void);
extern int strcmp(const char *, const char *); extern int strcmp (const char *, const char *);
} }
template <class T> template <class T>
...@@ -36,16 +36,16 @@ int main(void) { ...@@ -36,16 +36,16 @@ int main(void) {
const char *encode = @encode(long); const char *encode = @encode(long);
if (strcmp (encode, L)) if (strcmp (encode, L))
_exit(-(__LINE__)); abort ();
if (strcmp (enc, "{Vec<float>=ff" L "q}")) if (strcmp (enc, (const char *)"{Vec<float>=ff" L "q}"))
_exit(-(__LINE__)); abort ();
if (strcmp (enc2, "{Vec<double>=dd" L "q}")) if (strcmp (enc2, (const char *)"{Vec<double>=dd" L "q}"))
_exit(-(__LINE__)); abort ();
if (strcmp (enc3, "{?=f[10d]i" L "q{Vec<const signed char>=rcrc" L "q}}")) if (strcmp (enc3, (const char *)"{?=f[10d]i" L "q{Vec<const signed char>=rcrc" L "q}}"))
_exit(-(__LINE__)); abort ();
return 0; return 0;
} }
/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, October 2010. */ /* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, October 2010. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
/* Test the property syntax in a number of expressions. */ /* Test the property syntax in a number of expressions. */
......
/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, October 2010. */ /* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, October 2010. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
/* Test that properties are found even if implemented in superclasses. */ /* Test that properties are found even if implemented in superclasses. */
......
/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, October 2010. */ /* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, October 2010. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
/* Test atomic, assign synthesized methods. */ /* Test atomic, assign synthesized methods. */
......
/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, October 2010. */ /* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, October 2010. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
/* Test retain and copy synthesized methods. */ /* Test retain and copy synthesized methods. */
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
} }
@property int name __attribute__((deprecated)); @property int name __attribute__((deprecated));
@property int table __attribute__((xxx)); /* { dg-warning ".xxx. attribute directive ignored" } */ @property int table __attribute__((xxx)); /* { dg-warning ".xxx. attribute directive ignored" } */
@property void function (void); /* { dg-error "can.t make .function. into a method" } */ /* FIXME: the test below should not ICE.
@property typedef int j; /* { dg-error "invalid type for property" } */ @property void function (void); { dg-error "can.t make .function. into a method" } */
@property typedef int j; /* { dg-error "invalid type for property" } */
@end @end
/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, October 2010. */ /* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, October 2010. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
/* Test the property syntax with non-synthesized setter/getter /* Test the property syntax with non-synthesized setter/getter
and with standard names. */ and with standard names. */
......
/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, October 2010. */ /* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, October 2010. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
/* Test the property syntax with non-synthesized setter/getter /* Test the property syntax with non-synthesized setter/getter
and with a non-standard name for the getter. */ and with a non-standard name for the getter. */
......
/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, October 2010. */ /* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, October 2010. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
/* Test the property syntax with non-synthesized setter/getter /* Test the property syntax with non-synthesized setter/getter
and with a non-standard name for the setter. */ and with a non-standard name for the setter. */
......
/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, October 2010. */ /* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, October 2010. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
/* Test the property syntax with synthesized setter/getter /* Test the property syntax with synthesized setter/getter
and with a non-standard name for the getter and setter. */ and with a non-standard name for the getter and setter. */
......
/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, November 2010. */ /* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, November 2010. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
/* Test the 'dot syntax' without a declarated property. */ /* Test the 'dot syntax' without a declarated property. */
......
/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, November 2010. */ /* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, November 2010. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
/* Test the 'dot syntax' without a declarated property. This tests the case where /* Test the 'dot syntax' without a declarated property. This tests the case where
only the setter (or only the getter) exists. */ only the setter (or only the getter) exists. */
......
/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, November 2010. */ /* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, November 2010. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
/* Test the 'dot syntax' without a declarated property. This tests the case where /* Test the 'dot syntax' without a declarated property. This tests the case where
the object is a Class. */ the object is a Class. */
......
/* Basic test, auto-generated getter/setter based on property name. */ /* Basic test, auto-generated getter/setter based on property name. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
......
/* test access in methods, auto-generated getter/setter based on property name. */ /* test access in methods, auto-generated getter/setter based on property name. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
......
/* Basic test, auto-generated getter/setter based on named ivar */ /* Basic test, auto-generated getter/setter based on named ivar */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
......
/* This program tests use of property provided setter/getter functions. */ /* This program tests use of property provided setter/getter functions. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
/* { dg-additional-sources "../../objc-obj-c++-shared/Object1.mm" } */ /* { dg-additional-sources "../../objc-obj-c++-shared/Object1.mm" } */
#import "../../objc-obj-c++-shared/Object1.h" #import "../../objc-obj-c++-shared/Object1.h"
......
/* { dg-do run { target *-*-darwin* } } */
/* { dg-skip-if "" { *-*-* } { "-fgnu-runtime" } { "" } } */
/* We can't do this yet on m64, since we have not got the NSConstantString implementation
built-in to the compiler, and therefore we get missing implementation warnings. */
/* { dg-require-effective-target ilp32 } */
/* Force ABI = 0 in the NeXT headers, also suppress deprecation warnings. */
/* { dg-options "-framework Foundation -fobjc-exceptions -mmacosx-version-min=10.4 -Wno-deprecated-declarations" } */
#include <objc/objc-api.h>
#include <Foundation/Foundation.h>
@interface Person : NSObject
@property NSString *firstName, *lastName;
@property(readonly) NSString *fullName;
@end
@interface Group : NSObject
@property Person *techLead, *runtimeGuru, *propertiesMaven;
@end
@implementation Group
@property Person *techLead, *runtimeGuru, *propertiesMaven;
- - init {
techLead = [[Person alloc] init];
runtimeGuru = [[Person alloc] init];
propertiesMaven = [[Person alloc] init];
return self;
}
@end
@implementation Person
@property NSString *firstName, *lastName;
@property(readonly) NSString *fullName;
- (NSString*)fullName { // computed getter
return [NSString stringWithFormat:@"%@ %@", firstName, lastName];
}
@end
NSString *playWithProperties()
{
Group *g = [[Group alloc] init] ;
g.techLead.firstName = @"Blaine";
g.techLead.lastName = @"Garst";
g.runtimeGuru.firstName = @"Greg";
g.runtimeGuru.lastName = @"Parker";
g.propertiesMaven.firstName = @"Patrick";
g.propertiesMaven.lastName = @"Beard";
return [NSString stringWithFormat:@"techlead %@ runtimeGuru %@ propertiesMaven %@",
g.techLead.fullName, g.runtimeGuru.fullName, g.propertiesMaven.fullName];
}
main()
{
char buf [256];
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
sprintf(buf, "%s", [playWithProperties() cString]);
[pool release];
return strcmp (buf, "techlead Blaine Garst runtimeGuru Greg Parker propertiesMaven Patrick Beard");
}
/* This program tests use of properties . */
/* { dg-do run { target *-*-darwin* } } */
/* { dg-skip-if "" { *-*-* } { "-fgnu-runtime" } { "" } } */
/* We can't do this yet on m64, since we have not got the NSConstantString implementation
built-in to the compiler, and therefore we get missing implementation warnings. */
/* { dg-require-effective-target ilp32 } */
/* Force ABI = 0 in the NeXT headers, also suppress deprecation warnings. */
/* { dg-options "-framework Foundation -fobjc-exceptions -mmacosx-version-min=10.4 -Wno-deprecated-declarations" } */
#include <objc/objc-api.h>
#include <Foundation/Foundation.h>
@interface Person : NSObject
{
}
@property NSString *firstName, *lastName;
@property(readonly) NSString *fullName;
@end
@interface Group : NSObject
{
}
@property Person *techLead, *runtimeGuru, *propertiesMaven;
@end
@implementation Group
@property Person *techLead, *runtimeGuru, *propertiesMaven;
- - init {
techLead = [[Person alloc] init];
runtimeGuru = [[Person alloc] init];
propertiesMaven = [[Person alloc] init];
return self;
}
@end
@implementation Person
@property NSString *firstName, *lastName;
@property(readonly, getter = fullName) NSString *fullName;
- (NSString*)fullName { // computed getter
return [NSString stringWithFormat:@"%@ %@", firstName, lastName];
}
@end
NSString *playWithProperties()
{
Group *g = [[Group alloc] init] ;
g.techLead.firstName = @"Blaine";
g.techLead.lastName = @"Garst";
g.runtimeGuru.firstName = @"Greg";
g.runtimeGuru.lastName = @"Parker";
g.propertiesMaven.firstName = @"Patrick";
g.propertiesMaven.lastName = @"Beard";
return [NSString stringWithFormat:@"techlead %@ runtimeGuru %@ propertiesMaven %@",
g.techLead.fullName, g.runtimeGuru.fullName, g.propertiesMaven.fullName];
}
main()
{
char buf [256];
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
sprintf(buf, "%s", [playWithProperties() cString]);
[pool release];
return strcmp (buf, "techlead Blaine Garst runtimeGuru Greg Parker propertiesMaven Patrick Beard");
}
/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, October 2010. */ /* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, October 2010. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include <objc/objc.h> #include <objc/objc.h>
#include <objc/runtime.h> #include <objc/runtime.h>
......
...@@ -3,18 +3,21 @@ ...@@ -3,18 +3,21 @@
/* Author: Fariborz Jahanian <fjahanian@apple.com> */ /* Author: Fariborz Jahanian <fjahanian@apple.com> */
/* Adapted by Nicola Pero <nicola.pero@meta-innovation.com> */ /* Adapted by Nicola Pero <nicola.pero@meta-innovation.com> */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include <objc/objc.h> #include <objc/objc.h>
#include <objc/runtime.h> #include <objc/runtime.h>
@interface MyRootClass @interface MyRootClass
{ Class isa; } { Class isa; }
+ (id) initialize;
+ + alloc; + + alloc;
- - init; - - init;
- - doSomething; - - doSomething;
@end @end
@implementation MyRootClass @implementation MyRootClass
+ (id) initialize { return self; }
+ alloc { return class_createInstance (self, 0); } + alloc { return class_createInstance (self, 0); }
- init { return self; } - init { return self; }
- doSomething { return self; } - doSomething { return self; }
......
...@@ -12,15 +12,14 @@ ...@@ -12,15 +12,14 @@
{ {
Class isa; Class isa;
} }
+ (id) initialize;
+ (int) testFunction1; + (int) testFunction1;
+ (int) test_function2; + (int) test_function2;
+ (int) __testFunction3: (int)unused andArgument: (char)unused2; + (int) __testFunction3: (int)unused andArgument: (char)unused2;
#ifdef __NEXT_RUNTIME__
+ (id) initialize ;
#endif
@end @end
@implementation DemangleTest @implementation DemangleTest
+ (id) initialize { return self; }
+ (int) testFunction1 + (int) testFunction1
{ {
printf ("%s\n", __PRETTY_FUNCTION__); printf ("%s\n", __PRETTY_FUNCTION__);
...@@ -41,9 +40,6 @@ ...@@ -41,9 +40,6 @@
printf ("%s\n", __PRETTY_FUNCTION__); printf ("%s\n", __PRETTY_FUNCTION__);
return strcmp (__PRETTY_FUNCTION__, "+[DemangleTest __testFunction3:andArgument:]"); return strcmp (__PRETTY_FUNCTION__, "+[DemangleTest __testFunction3:andArgument:]");
} }
#ifdef __NEXT_RUNTIME__
+ (id) initialize { return self; }
#endif
@end @end
int main () int main ()
......
/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, November 2010. */ /* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, November 2010. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
/* Test the 'dot syntax' without a declarated property. This tests the case where /* Test the 'dot syntax' without a declarated property. This tests the case where
the object is a Class. */ the object is a Class. */
......
/* { dg-do run } */
/* See if -forward::/-performv:: is able to work. */
/* { dg-skip-if "PR36610" { *-*-* } { "-fgnu-runtime" } { "" } } */
/* { dg-skip-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment