• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#import <Foundation/Foundation.h>
2
3int side_effect = 0;
4
5NSString *str = @"some string";
6
7const char *directCallConflictingName() {
8  return "wrong function";
9}
10
11@interface Foo : NSObject {
12  int instance_var;
13}
14-(int) entryPoint;
15@end
16
17@implementation Foo
18-(int) entryPoint
19{
20  // Try calling directly with self. Same as in the main method otherwise.
21  return 0; //%self.expect_expr("[self directCallNoArgs]", result_summary='"called directCallNoArgs"')
22            //%self.expect_expr("[self directCallArgs: 1111]", result_value="2345")
23            //%self.expect_expr("side_effect = 0; [self directCallVoidReturn]; side_effect", result_value="4321")
24            //%self.expect_expr("[self directCallNSStringArg: str]", result_summary='@"some string"')
25            //%self.expect_expr("[self directCallIdArg: (id)str]", result_summary='@"some string appendix"')
26            //%self.expect_expr("[self directCallConflictingName]", result_summary='"correct function"')
27            //%self.expect_expr("[self directCallWithCategory]", result_summary='"called function with category"')
28}
29
30// Declare several objc_direct functions we can test.
31-(const char *) directCallNoArgs __attribute__((objc_direct))
32{
33  return "called directCallNoArgs";
34}
35
36-(void) directCallVoidReturn __attribute__((objc_direct))
37{
38  side_effect = 4321;
39}
40
41-(int) directCallArgs:(int)i __attribute__((objc_direct))
42{
43  // Use the arg in some way to make sure that gets passed correctly.
44  return i + 1234;
45}
46
47-(NSString *) directCallNSStringArg:(NSString *)str __attribute__((objc_direct))
48{
49  return str;
50}
51
52-(NSString *) directCallIdArg:(id)param __attribute__((objc_direct))
53{
54  return [param stringByAppendingString:@" appendix"];
55}
56
57// We have another function with the same name above. Make sure this doesn't influence
58// what we call.
59-(const char *) directCallConflictingName  __attribute__((objc_direct))
60{
61  return "correct function";
62}
63@end
64
65
66@interface Foo (Cat)
67@end
68
69@implementation Foo (Cat)
70-(const char *) directCallWithCategory  __attribute__((objc_direct))
71{
72  return "called function with category";
73}
74@end
75
76int main()
77{
78  Foo *foo = [[Foo alloc] init];
79  [foo directCallNoArgs];
80  [foo directCallArgs: 1];
81  [foo directCallVoidReturn];
82  [foo directCallNSStringArg: str];
83  [foo directCallIdArg: (id)str];
84  [foo entryPoint];  //%self.expect_expr("[foo directCallNoArgs]", result_summary='"called directCallNoArgs"')
85                     //%self.expect_expr("[foo directCallArgs: 1111]", result_value="2345")
86                     //%self.expect_expr("side_effect = 0; [foo directCallVoidReturn]; side_effect", result_value="4321")
87                     //%self.expect_expr("[foo directCallNSStringArg: str]", result_summary='@"some string"')
88                     //%self.expect_expr("[foo directCallIdArg: (id)str]", result_summary='@"some string appendix"')
89                     //%self.expect_expr("[foo directCallConflictingName]", result_summary='"correct function"')
90                     //%self.expect_expr("[foo directCallWithCategory]", result_summary='"called function with category"')
91  return 0;
92}
93