93 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
| #import <Foundation/Foundation.h>
 | |
| 
 | |
| int side_effect = 0;
 | |
| 
 | |
| NSString *str = @"some string";
 | |
| 
 | |
| const char *directCallConflictingName() {
 | |
|   return "wrong function";
 | |
| }
 | |
| 
 | |
| @interface Foo : NSObject {
 | |
|   int instance_var;
 | |
| }
 | |
| -(int) entryPoint;
 | |
| @end
 | |
| 
 | |
| @implementation Foo
 | |
| -(int) entryPoint
 | |
| {
 | |
|   // Try calling directly with self. Same as in the main method otherwise.
 | |
|   return 0; //%self.expect_expr("[self directCallNoArgs]", result_summary='"called directCallNoArgs"')
 | |
|             //%self.expect_expr("[self directCallArgs: 1111]", result_value="2345")
 | |
|             //%self.expect_expr("side_effect = 0; [self directCallVoidReturn]; side_effect", result_value="4321")
 | |
|             //%self.expect_expr("[self directCallNSStringArg: str]", result_summary='@"some string"')
 | |
|             //%self.expect_expr("[self directCallIdArg: (id)str]", result_summary='@"some string appendix"')
 | |
|             //%self.expect_expr("[self directCallConflictingName]", result_summary='"correct function"')
 | |
|             //%self.expect_expr("[self directCallWithCategory]", result_summary='"called function with category"')
 | |
| }
 | |
| 
 | |
| // Declare several objc_direct functions we can test.
 | |
| -(const char *) directCallNoArgs __attribute__((objc_direct))
 | |
| {
 | |
|   return "called directCallNoArgs";
 | |
| }
 | |
| 
 | |
| -(void) directCallVoidReturn __attribute__((objc_direct))
 | |
| {
 | |
|   side_effect = 4321;
 | |
| }
 | |
| 
 | |
| -(int) directCallArgs:(int)i __attribute__((objc_direct))
 | |
| {
 | |
|   // Use the arg in some way to make sure that gets passed correctly.
 | |
|   return i + 1234;
 | |
| }
 | |
| 
 | |
| -(NSString *) directCallNSStringArg:(NSString *)str __attribute__((objc_direct))
 | |
| {
 | |
|   return str;
 | |
| }
 | |
| 
 | |
| -(NSString *) directCallIdArg:(id)param __attribute__((objc_direct))
 | |
| {
 | |
|   return [param stringByAppendingString:@" appendix"];
 | |
| }
 | |
| 
 | |
| // We have another function with the same name above. Make sure this doesn't influence
 | |
| // what we call.
 | |
| -(const char *) directCallConflictingName  __attribute__((objc_direct))
 | |
| {
 | |
|   return "correct function";
 | |
| }
 | |
| @end
 | |
| 
 | |
| 
 | |
| @interface Foo (Cat)
 | |
| @end
 | |
| 
 | |
| @implementation Foo (Cat)
 | |
| -(const char *) directCallWithCategory  __attribute__((objc_direct))
 | |
| {
 | |
|   return "called function with category";
 | |
| }
 | |
| @end
 | |
| 
 | |
| int main()
 | |
| {
 | |
|   Foo *foo = [[Foo alloc] init];
 | |
|   [foo directCallNoArgs];
 | |
|   [foo directCallArgs: 1];
 | |
|   [foo directCallVoidReturn];
 | |
|   [foo directCallNSStringArg: str];
 | |
|   [foo directCallIdArg: (id)str];
 | |
|   [foo entryPoint];  //%self.expect_expr("[foo directCallNoArgs]", result_summary='"called directCallNoArgs"')
 | |
|                      //%self.expect_expr("[foo directCallArgs: 1111]", result_value="2345")
 | |
|                      //%self.expect_expr("side_effect = 0; [foo directCallVoidReturn]; side_effect", result_value="4321")
 | |
|                      //%self.expect_expr("[foo directCallNSStringArg: str]", result_summary='@"some string"')
 | |
|                      //%self.expect_expr("[foo directCallIdArg: (id)str]", result_summary='@"some string appendix"')
 | |
|                      //%self.expect_expr("[foo directCallConflictingName]", result_summary='"correct function"')
 | |
|                      //%self.expect_expr("[foo directCallWithCategory]", result_summary='"called function with category"')
 | |
|   return 0;
 | |
| }
 |