| #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; |
| } |