• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#import <Foundation/Foundation.h>
2#include <stdio.h>
3
4struct return_me
5{
6  int first;
7  int second;
8};
9
10@interface SourceBase: NSObject
11{
12  struct return_me my_return;
13}
14- (SourceBase *) initWithFirst: (int) first andSecond: (int) second;
15- (void) randomMethod;
16- (struct return_me) returnsStruct;
17@end
18
19@implementation SourceBase
20- (void) randomMethod
21{
22  printf ("Called in SourceBase version of randomMethod.\n"); // SourceBase randomMethod start line.
23}
24
25- (struct return_me) returnsStruct
26{
27  return my_return; // SourceBase returnsStruct start line.
28}
29
30- (SourceBase *) initWithFirst: (int) first andSecond: (int) second
31{
32  my_return.first = first;
33  my_return.second = second;
34
35  return self;
36}
37@end
38
39@interface Source : SourceBase
40{
41  int _property;
42}
43- (void) setProperty: (int) newValue;
44- (void) randomMethod;
45- (struct return_me) returnsStruct;
46@end
47
48@implementation Source
49- (void) setProperty: (int) newValue
50{
51  _property = newValue;
52}
53
54- (void) randomMethod
55{
56  [super randomMethod];  // Source randomMethod start line.
57    printf ("Called in Source version of random method.");
58}
59
60- (struct return_me) returnsStruct
61{
62  printf ("Called in Source version of returnsStruct.\n");  // Source returnsStruct start line.
63  return [super returnsStruct];                             // Source returnsStruct call line.
64}
65
66@end
67
68@interface Observer : NSObject
69{
70  Source *_source;
71}
72+ (Observer *) observerWithSource: (Source *) source;
73- (Observer *) initWithASource: (Source *) source;
74- (void) observeValueForKeyPath: (NSString *) path
75		       ofObject: (id) object
76			 change: (NSDictionary *) change
77			context: (void *) context;
78@end
79
80@implementation Observer
81
82+ (Observer *) observerWithSource: (Source *) inSource;
83{
84  Observer *retval;
85
86  retval = [[Observer alloc] initWithASource: inSource];
87  return retval;
88}
89
90- (Observer *) initWithASource: (Source *) source
91{
92  [super init];
93  _source = source;
94  [_source addObserver: self
95	    forKeyPath: @"property"
96	    options: (NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
97	    context: NULL];
98  return self;
99}
100
101- (void) observeValueForKeyPath: (NSString *) path
102		       ofObject: (id) object
103			 change: (NSDictionary *) change
104			context: (void *) context
105{
106  printf ("Observer function called.\n");
107  return;
108}
109@end
110
111int main ()
112{
113  Source *mySource;
114  Observer *myObserver;
115  struct return_me ret_val;
116
117  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
118
119  mySource = [[Source alloc] init];
120
121  [mySource randomMethod];               // Set first breakpoint here.
122  ret_val = [mySource returnsStruct];    // Set second breakpoint here.
123
124  myObserver = [Observer observerWithSource: mySource];
125
126  [mySource randomMethod];              // Set third breakpoint here.
127  ret_val = [mySource returnsStruct];   // Set fourth breakpoint here.
128  [mySource setProperty: 5];            // Set fifth breakpoint here.
129
130  // We also had a bug where stepping into a method dispatch to nil turned
131  // into continue.  So make sure that works here:
132
133  mySource = nil;
134  [mySource randomMethod];             // Set nil step breakpoint here.
135  [pool release];                      // Step over nil should stop here.
136  return 0;
137
138}
139