File: main.mm

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (149 lines) | stat: -rw-r--r-- 3,282 bytes parent folder | download | duplicates (21)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#import <Foundation/Foundation.h>

// SourceBase will be the base class of Source.  We'll pass a Source object into a
// function as a SourceBase, and then see if the dynamic typing can get us through the KVO
// goo and all the way back to Source.

@interface SourceBase: NSObject
{
    uint32_t _value;
}
- (SourceBase *) init;
- (uint32_t) getValue;
@end

@implementation SourceBase
- (SourceBase *) init
{
    [super init];
    _value = 10;
    return self;
}
- (uint32_t) getValue
{
    return _value;
}
@end

// Source is a class that will be observed by the Observer class below.
// When Observer sets itself up to observe this property (in initWithASource)
// the KVO system will overwrite the "isa" pointer of the object with the "kvo'ed" 
// one.

@interface Source : SourceBase
{
    int _property;
}
- (Source *) init;
- (void) setProperty: (int) newValue;
@end

@implementation Source
- (Source *) init
{
    [super init];
    _property = 20;
    return self;
}
- (void) setProperty: (int) newValue
{
    _property = newValue;  // This is the line in setProperty, make sure we step to here.
}
@end

@interface SourceDerived : Source
{
    int _derivedValue;
}
- (SourceDerived *) init;
- (uint32_t) getValue;
@end

@implementation SourceDerived
- (SourceDerived *) init
{
    [super init];
    _derivedValue = 30;
    return self;
}
- (uint32_t) getValue
{
    return _derivedValue;
}
@end

// Observer is the object that will watch Source and cause KVO to swizzle it...

@interface Observer : NSObject
{
    Source *_source;
}
+ (Observer *) observerWithSource: (Source *) source;
- (Observer *) initWithASource: (Source *) source;
- (void) observeValueForKeyPath: (NSString *) path 
		       ofObject: (id) object
			 change: (NSDictionary *) change
			context: (void *) context;
@end

@implementation Observer

+ (Observer *) observerWithSource: (Source *) inSource;
{
    Observer *retval;

    retval = [[Observer alloc] initWithASource: inSource];
    return retval;
}

- (Observer *) initWithASource: (Source *) source
{
    [super init];
    _source = source;
    [_source addObserver: self 
	    forKeyPath: @"property" 
	    options: (NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
	    context: NULL];
    return self;
}

- (void) observeValueForKeyPath: (NSString *) path 
		       ofObject: (id) object
			 change: (NSDictionary *) change
			context: (void *) context
{
    printf ("Observer function called.\n");
    return;
}
@end


int patval;          // external symbol, will not be completely stripped
int pat(int in) {    // external symbol, will not be completely stripped
  if (patval == 0)
    patval = in;
  return patval;
}

static int fooval;  // static symbol, stripped
int foo() {         // external symbol, will not be completely stripped
  if (fooval == 0)
    fooval = 5;
  return fooval;
}

int bazval = 10;   // external symbol, will not be completely stripped
int baz () {       // external symbol, will not be completely stripped
  return foo() + bazval;
}

static int barval = 15; // static symbol, stripped
static int bar () {     // static symbol, stripped; __lldb_unnamed_symbol from func starts
  return baz() + barval;
}

int calculate ()   // external symbol, will not be completely stripped
{
  return bar();
}