Skip to content

Commit 2d947c4

Browse files
committed
Merge pull request #7 from zulkis/patch-1
Fix for x64
2 parents 717d503 + 9811210 commit 2d947c4

File tree

1 file changed

+84
-28
lines changed

1 file changed

+84
-28
lines changed

NSObject+NSCoding.m

Lines changed: 84 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ - (void)autoEncodeWithCoder:(NSCoder *)coder {
4848
NSString *type = [properties objectForKey:key];
4949
id value;
5050
unsigned long long ullValue;
51+
long long llValue;
5152
BOOL boolValue;
5253
float floatValue;
5354
double doubleValue;
@@ -57,7 +58,6 @@ - (void)autoEncodeWithCoder:(NSCoder *)coder {
5758
unsigned unsignedValue;
5859
short shortValue;
5960
NSString *className;
60-
6161
NSMethodSignature *signature = [self methodSignatureForSelector:NSSelectorFromString(key)];
6262
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
6363
[invocation setSelector:NSSelectorFromString(key)];
@@ -76,6 +76,11 @@ - (void)autoEncodeWithCoder:(NSCoder *)coder {
7676
}
7777
}
7878
break;
79+
case 'B':
80+
[invocation invoke];
81+
[invocation getReturnValue:&boolValue];
82+
[coder encodeObject:[NSNumber numberWithBool:boolValue] forKey:key];
83+
break;
7984
case 'c': // bool
8085
[invocation invoke];
8186
[invocation getReturnValue:&boolValue];
@@ -94,7 +99,7 @@ - (void)autoEncodeWithCoder:(NSCoder *)coder {
9499
case 'i': // int
95100
[invocation invoke];
96101
[invocation getReturnValue:&intValue];
97-
[coder encodeObject:[NSNumber numberWithInt:intValue] forKey:key];
102+
[coder encodeObject:[NSNumber numberWithInteger:intValue] forKey:key];
98103
break;
99104
case 'L': // unsigned long
100105
[invocation invoke];
@@ -106,6 +111,11 @@ - (void)autoEncodeWithCoder:(NSCoder *)coder {
106111
[invocation getReturnValue:&ullValue];
107112
[coder encodeObject:[NSNumber numberWithUnsignedLongLong:ullValue] forKey:key];
108113
break;
114+
case 'q': // long long
115+
[invocation invoke];
116+
[invocation getReturnValue:&llValue];
117+
[coder encodeObject:[NSNumber numberWithLongLong:llValue] forKey:key];
118+
break;
109119
case 'l': // long
110120
[invocation invoke];
111121
[invocation getReturnValue:&longValue];
@@ -130,8 +140,8 @@ - (void)autoEncodeWithCoder:(NSCoder *)coder {
130140
- (void)autoDecode:(NSCoder *)coder {
131141
NSDictionary *properties = [self properties];
132142
for (NSString *key in properties) {
143+
NSString *ivarKey = [@"_"stringByAppendingString:key];
133144
NSString *type = [properties objectForKey:key];
134-
id value;
135145
NSNumber *number;
136146
unsigned int addr;
137147
NSInteger i;
@@ -141,81 +151,127 @@ - (void)autoDecode:(NSCoder *)coder {
141151
unsigned long ul;
142152
unsigned long long ull;
143153
long longValue;
154+
long long longLongValue;
144155
unsigned unsignedValue;
145156
short shortValue;
146157
Ivar ivar;
147-
double *varIndex;
148158

149-
NSString *className;
159+
bool *varIndexBool;
160+
float *varIndexFloat;
161+
double *varIndexDouble;
162+
unsigned long long *varIndexULongLong;
163+
unsigned long *varIndexULong;
164+
long *varIndexLong;
165+
long long *varIndexLongLong;
166+
unsigned *varU;
167+
short *varShort;
150168

169+
NSString *className;
151170
switch ([type characterAtIndex:0]) {
152171
case '@': // object
153172
if ([[type componentsSeparatedByString:@"\""] count] > 1) {
154173
className = [[type componentsSeparatedByString:@"\""] objectAtIndex:1];
155174
Class class = NSClassFromString(className);
156175
// only decode if the property conforms to NSCoding
157176
if ([class conformsToProtocol:@protocol(NSCoding )]){
158-
value = [[coder decodeObjectForKey:key] retain];
159-
addr = (NSInteger)&value;
160-
object_setInstanceVariable(self, [key UTF8String], *(id**)addr);
177+
id value = [coder decodeObjectForKey:key];
178+
// object_setInstanceVariable(self, [ivarKey UTF8String], &value);
179+
[self setValue:value forKey:key];
161180
}
162181
}
163182
break;
183+
case 'B': // bool
184+
number = [coder decodeObjectForKey:key];
185+
b = [number boolValue];
186+
187+
if ((ivar = class_getInstanceVariable([self class], [ivarKey UTF8String]))) {
188+
varIndexBool = (bool *)(void **)((char *)self + ivar_getOffset(ivar));
189+
*varIndexBool = b;
190+
}
191+
break;
164192
case 'c': // bool
165193
number = [coder decodeObjectForKey:key];
166194
b = [number boolValue];
167-
addr = (NSInteger)&b;
168-
object_setInstanceVariable(self, [key UTF8String], *(NSInteger**)addr);
195+
if ((ivar = class_getInstanceVariable([self class], [ivarKey UTF8String]))) {
196+
varIndexBool = (bool *)(void **)((char *)self + ivar_getOffset(ivar));
197+
*varIndexBool = b;
198+
}
169199
break;
170200
case 'f': // float
171201
number = [coder decodeObjectForKey:key];
172202
f = [number floatValue];
173-
addr = (NSInteger)&f;
174-
object_setInstanceVariable(self, [key UTF8String], *(NSInteger**)addr);
203+
if ((ivar = class_getInstanceVariable([self class], [ivarKey UTF8String]))) {
204+
varIndexFloat = (float *)(void **)((char *)self + ivar_getOffset(ivar));
205+
*varIndexFloat = f;
206+
}
175207
break;
176208
case 'd': // double
177209
number = [coder decodeObjectForKey:key];
178210
d = [number doubleValue];
179-
if ((ivar = class_getInstanceVariable([self class], [key UTF8String]))) {
180-
varIndex = (double *)(void **)((char *)self + ivar_getOffset(ivar));
181-
*varIndex = d;
211+
if ((ivar = class_getInstanceVariable([self class], [ivarKey UTF8String]))) {
212+
varIndexDouble = (double *)(void **)((char *)self + ivar_getOffset(ivar));
213+
*varIndexDouble = d;
182214
}
183215
break;
184216
case 'i': // int
185217
number = [coder decodeObjectForKey:key];
186218
i = [number intValue];
187-
addr = (NSInteger)&i;
188-
object_setInstanceVariable(self, [key UTF8String], *(NSInteger**)addr);
219+
if ((ivar = class_getInstanceVariable([self class], [ivarKey UTF8String]))) {
220+
varIndexLong = (long *)(void **)((char *)self + ivar_getOffset(ivar));
221+
*varIndexLong = i;
222+
}
189223
break;
190224
case 'L': // unsigned long
191225
number = [coder decodeObjectForKey:key];
192226
ul = [number unsignedLongValue];
193-
addr = (NSInteger)&ul;
194-
object_setInstanceVariable(self, [key UTF8String], *(NSInteger**)addr);
227+
228+
if ((ivar = class_getInstanceVariable([self class], [ivarKey UTF8String]))) {
229+
varIndexULong = (unsigned long *)(void **)((char *)self + ivar_getOffset(ivar));
230+
*varIndexULong = ul;
231+
}
232+
195233
break;
196234
case 'Q': // unsigned long long
197235
number = [coder decodeObjectForKey:key];
198236
ull = [number unsignedLongLongValue];
199-
addr = (NSInteger)&ull;
200-
object_setInstanceVariable(self, [key UTF8String], *(NSInteger**)addr);
237+
addr = (unsigned int)&ull;
238+
239+
if ((ivar = class_getInstanceVariable([self class], [ivarKey UTF8String]))) {
240+
varIndexULongLong = (unsigned long long *)(void **)((char *)self + ivar_getOffset(ivar));
241+
*varIndexULongLong = ull;
242+
}
201243
break;
202244
case 'l': // long
203245
number = [coder decodeObjectForKey:key];
204246
longValue = [number longValue];
205-
addr = (NSInteger)&longValue;
206-
object_setInstanceVariable(self, [key UTF8String], *(NSInteger**)addr);
247+
if ((ivar = class_getInstanceVariable([self class], [ivarKey UTF8String]))) {
248+
varIndexLong = (long *)(void **)((char *)self + ivar_getOffset(ivar));
249+
*varIndexLong = longValue;
250+
}
207251
break;
208252
case 'I': // unsigned
209253
number = [coder decodeObjectForKey:key];
210254
unsignedValue = [number unsignedIntValue];
211-
addr = (NSInteger)&unsignedValue;
212-
object_setInstanceVariable(self, [key UTF8String], *(NSInteger**)addr);
255+
if ((ivar = class_getInstanceVariable([self class], [ivarKey UTF8String]))) {
256+
varU = (unsigned *)(void **)((char *)self + ivar_getOffset(ivar));
257+
*varU = unsignedValue;
258+
}
213259
break;
214260
case 's': // short
215261
number = [coder decodeObjectForKey:key];
216262
shortValue = [number shortValue];
217-
addr = (NSInteger)&shortValue;
218-
object_setInstanceVariable(self, [key UTF8String], *(NSInteger**)addr);
263+
if ((ivar = class_getInstanceVariable([self class], [ivarKey UTF8String]))) {
264+
varShort = (short *)(void **)((char *)self + ivar_getOffset(ivar));
265+
*varShort = shortValue;
266+
}
267+
break;
268+
case 'q': // long long
269+
number = [coder decodeObjectForKey:key];
270+
longLongValue = [number longLongValue];
271+
if ((ivar = class_getInstanceVariable([self class], [ivarKey UTF8String]))) {
272+
varIndexLongLong = (long long *)(void **)((char *)self + ivar_getOffset(ivar));
273+
*varIndexLongLong = longLongValue;
274+
}
219275
break;
220276

221277
default:
@@ -224,4 +280,4 @@ - (void)autoDecode:(NSCoder *)coder {
224280
}
225281
}
226282

227-
@end
283+
@end

0 commit comments

Comments
 (0)