@@ -25,6 +25,8 @@ @interface OCClassMockObjectInstanceVars : NSObject
25
25
@property (nonatomic ) Class mockedClass;
26
26
@property (nonatomic ) Class originalMetaClass;
27
27
@property (nonatomic ) Class classCreatedForNewMetaClass;
28
+ @property (nonatomic ) void *classScribbleStart;
29
+ @property (nonatomic ) size_t classScribbleSize;
28
30
@end
29
31
30
32
@implementation OCClassMockObjectInstanceVars
@@ -34,24 +36,38 @@ @interface OCClassMockObject ()
34
36
@property (nonatomic ) Class mockedClass;
35
37
@property (nonatomic ) Class originalMetaClass;
36
38
@property (nonatomic ) Class classCreatedForNewMetaClass;
39
+ @property (nonatomic ) void *classScribbleStart;
40
+ @property (nonatomic ) size_t classScribbleSize;
37
41
@end
38
42
39
43
static const char *OCClassMockObjectInstanceVarsKey = " OCClassMockObjectInstanceVarsKey" ;
40
44
41
45
@implementation OCClassMockObject
42
46
43
- #pragma mark Initialisers, description, accessors, etc.
47
+ #pragma mark Initialisers, description, etc.
44
48
45
49
- (id )initWithClass : (Class )aClass
46
50
{
47
51
if (aClass == Nil )
48
52
[NSException raise :NSInvalidArgumentException format: @" Class cannot be Nil." ];
49
53
54
+ size_t allocedSize = class_getInstanceSize (aClass);
55
+ Class selfClass = object_getClass (self);
56
+ size_t selfSize = class_getInstanceSize (selfClass);
57
+ if (allocedSize > selfSize)
58
+ {
59
+ self = realloc (self, allocedSize);
60
+ }
50
61
self = [super init ];
62
+
51
63
OCClassMockObjectInstanceVars *vars = [[OCClassMockObjectInstanceVars alloc ] init ];
52
64
objc_setAssociatedObject (self, OCClassMockObjectInstanceVarsKey, vars, OBJC_ASSOCIATION_RETAIN_NONATOMIC );
53
65
[vars release ];
54
66
67
+ self.classScribbleSize = allocedSize - selfSize;
68
+ self.classScribbleStart = (void *)self + selfSize;
69
+ [self scribbleOnMemory: self .classScribbleStart ofSize: self .classScribbleSize];
70
+
55
71
self.mockedClass = aClass;
56
72
[self prepareClassForClassMethodMocking ];
57
73
return self;
@@ -68,9 +84,20 @@ - (NSString *)description
68
84
return [NSString stringWithFormat: @" OCClassMockObject(%@ )" , NSStringFromClass (self .mockedClass)];
69
85
}
70
86
87
+ - (void )scribbleOnMemory : (void *)start ofSize : (size_t )size
88
+ {
89
+ bzero (start, size);
90
+ }
91
+
92
+ - (void )verifyScribbleAt : (void *)start ofSize : (size_t )size
93
+ {
94
+ // Default version does no verification
95
+ }
96
+
71
97
#pragma mark Setters/Getters
72
98
73
- - (OCClassMockObjectInstanceVars *)classMockObjectInstanceVars {
99
+ - (OCClassMockObjectInstanceVars *)classMockObjectInstanceVars
100
+ {
74
101
return objc_getAssociatedObject (self, OCClassMockObjectInstanceVarsKey);
75
102
}
76
103
@@ -89,6 +116,16 @@ - (Class)originalMetaClass
89
116
return self.classMockObjectInstanceVars .originalMetaClass ;
90
117
}
91
118
119
+ - (void *)classScribbleStart
120
+ {
121
+ return self.classMockObjectInstanceVars .classScribbleStart ;
122
+ }
123
+
124
+ - (size_t )classScribbleSize
125
+ {
126
+ return self.classMockObjectInstanceVars .classScribbleSize ;
127
+ }
128
+
92
129
- (void )setMockedClass : (Class )mockedClass
93
130
{
94
131
self.classMockObjectInstanceVars .mockedClass = mockedClass;
@@ -104,6 +141,15 @@ - (void)setOriginalMetaClass:(Class)originalMetaClass
104
141
self.classMockObjectInstanceVars .originalMetaClass = originalMetaClass;
105
142
}
106
143
144
+ - (void )setClassScribbleSize : (size_t )classScribbleSize
145
+ {
146
+ self.classMockObjectInstanceVars .classScribbleSize = classScribbleSize;
147
+ }
148
+
149
+ - (void )setClassScribbleStart : (void *)classScribbleStart
150
+ {
151
+ self.classMockObjectInstanceVars .classScribbleStart = classScribbleStart;
152
+ }
107
153
108
154
#pragma mark Extending/overriding superclass behaviour
109
155
@@ -119,6 +165,7 @@ - (void)stopMocking
119
165
self.classCreatedForNewMetaClass = nil ;
120
166
}
121
167
[super stopMocking ];
168
+ [self verifyScribbleAt: self .classScribbleStart ofSize: self .classScribbleSize];
122
169
}
123
170
124
171
0 commit comments