[X86] Use NSW/NUW flags on ISD::TRUNCATE nodes to improve X86 PACKSS/PACKUS lowering...
[llvm-project.git] / lldb / test / API / lang / objc / objc-dynamic-value / dynamic-value.m
blob2bcb76b1d9dc6ee03e264715473e615eb2d7a33d
1 #import <Foundation/Foundation.h>
3 // SourceBase will be the base class of Source.  We'll pass a Source object into a
4 // function as a SourceBase, and then see if the dynamic typing can get us through the KVO
5 // goo and all the way back to Source.
7 @interface SourceBase: NSObject
9     uint32_t _value;
11 - (SourceBase *) init;
12 - (uint32_t) getValue;
13 @end
15 @implementation SourceBase
16 - (SourceBase *) init
18     [super init];
19     _value = 10;
20     return self;
22 - (uint32_t) getValue
24     return _value;
26 @end
28 // Source is a class that will be observed by the Observer class below.
29 // When Observer sets itself up to observe this property (in initWithASource)
30 // the KVO system will overwrite the "isa" pointer of the object with the "kvo'ed" 
31 // one.
33 @interface Source : SourceBase
35     int _property;
37 - (Source *) init;
38 - (void) setProperty: (int) newValue;
39 @end
41 @implementation Source
42 - (Source *) init
44     [super init];
45     _property = 20;
46     return self;
48 - (void) setProperty: (int) newValue
50     _property = newValue;  // This is the line in setProperty, make sure we step to here.
52 @end
54 @interface SourceDerived : Source
56     int _derivedValue;
58 - (SourceDerived *) init;
59 - (uint32_t) getValue;
60 @end
62 @implementation SourceDerived
63 - (SourceDerived *) init
65     [super init];
66     _derivedValue = 30;
67     return self;
69 - (uint32_t) getValue
71     return _derivedValue;
73 @end
75 // Observer is the object that will watch Source and cause KVO to swizzle it...
77 @interface Observer : NSObject
79     Source *_source;
81 + (Observer *) observerWithSource: (Source *) source;
82 - (Observer *) initWithASource: (Source *) source;
83 - (void) observeValueForKeyPath: (NSString *) path 
84                        ofObject: (id) object
85                          change: (NSDictionary *) change
86                         context: (void *) context;
87 @end
89 @implementation Observer
91 + (Observer *) observerWithSource: (Source *) inSource;
93     Observer *retval;
95     retval = [[Observer alloc] initWithASource: inSource];
96     return retval;
99 - (Observer *) initWithASource: (Source *) source
101     [super init];
102     _source = source;
103     [_source addObserver: self 
104             forKeyPath: @"property" 
105             options: (NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
106             context: NULL];
107     return self;
110 - (void) observeValueForKeyPath: (NSString *) path 
111                        ofObject: (id) object
112                          change: (NSDictionary *) change
113                         context: (void *) context
115     printf ("Observer function called.\n");
116     return;
118 @end
120 uint32_t 
121 handle_SourceBase (SourceBase *object)
123     return [object getValue];  // Break here to check dynamic values.
126 int main ()
128     Source *mySource;
129     Observer *myObserver;
131     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
133     mySource = [[SourceDerived alloc] init];
134     myObserver = [Observer observerWithSource: mySource];
136     [mySource setProperty: 5];      // Break here to see if we can step into real method.
137     
138     uint32_t return_value = handle_SourceBase (mySource);
140     SourceDerived *unwatchedSource = [[SourceDerived alloc] init];
141     
142     return_value = handle_SourceBase (unwatchedSource);
143     
144     [pool release];
145     return 0;