Overview
Comment: | Key Value Coding: Add fallback to isFoo |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
10fbb20fd6e457db23a2892bc4fcec0d |
User & Date: | js on 2016-06-05 16:00:07 |
Other Links: | manifest | tags |
Context
2016-06-05
| ||
16:04 | Key Value Coding: Make sure free is always called check-in: 49ed0fa5ec user: js tags: trunk | |
16:00 | Key Value Coding: Add fallback to isFoo check-in: 10fbb20fd6 user: js tags: trunk | |
15:51 | Key Value Coding: Add -[setNilValueForKey:] check-in: 7bb4cae9db user: js tags: trunk | |
Changes
Modified src/OFObject+KeyValueCoding.m from [08642a6afa] to [f4fafd457a].
︙ | ︙ | |||
44 45 46 47 48 49 50 | @implementation OFObject (KeyValueCoding) - (id)valueForKey: (OFString*)key { SEL selector = sel_registerName([key UTF8String]); const char *typeEncoding = [self typeEncodingForSelector: selector]; id ret; | | > > > > | > > > > > > > > > > > > > > > > > > > > > | 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 | @implementation OFObject (KeyValueCoding) - (id)valueForKey: (OFString*)key { SEL selector = sel_registerName([key UTF8String]); const char *typeEncoding = [self typeEncodingForSelector: selector]; id ret; if (typeEncoding == NULL) { size_t keyLength; char *name; if ((keyLength = [key UTF8StringLength]) < 1) return [self valueForUndefinedKey: key]; if ((name = malloc(keyLength + 3)) == NULL) @throw [OFOutOfMemoryException exceptionWithRequestedSize: keyLength + 3]; memcpy(name, "is", 2); memcpy(name + 2, [key UTF8String], keyLength); name[keyLength + 2] = '\0'; name[2] = toupper(name[2]); selector = sel_registerName(name); free(name); typeEncoding = [self typeEncodingForSelector: selector]; if (typeEncoding == NULL || *typeEncoding == '@' || *typeEncoding == '#') return [self valueForUndefinedKey: key]; } switch (nextType(&typeEncoding)) { case '@': case '#': ret = [self performSelector: selector]; break; #define CASE(encoding, type, method) \ |
︙ | ︙ |
Modified tests/OFObjectTests.m from [e6767683b4] to [00f82faeb0].
︙ | ︙ | |||
52 53 54 55 56 57 58 | unsigned long long _unsignedLongLongValue; float _floatValue; double _doubleValue; } @property (retain) id objectValue; @property Class classValue; | | | 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | unsigned long long _unsignedLongLongValue; float _floatValue; double _doubleValue; } @property (retain) id objectValue; @property Class classValue; @property (getter=isBoolValue) bool boolValue; @property char charValue; @property short shortValue; @property int intValue; @property long longValue; @property long long longLongValue; @property unsigned char unsignedCharValue; @property unsigned short unsignedShortValue; |
︙ | ︙ | |||
238 239 240 241 242 243 244 | forKey: @"unsignedLongValue"]) && R([m setValue: [OFNumber numberWithUnsignedLongLong: 100] forKey: @"unsignedLongLongValue"]) && R([m setValue: [OFNumber numberWithFloat: 110] forKey: @"floatValue"]) && R([m setValue: [OFNumber numberWithDouble: 120] forKey: @"doubleValue"]) && | | | 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 | forKey: @"unsignedLongValue"]) && R([m setValue: [OFNumber numberWithUnsignedLongLong: 100] forKey: @"unsignedLongLongValue"]) && R([m setValue: [OFNumber numberWithFloat: 110] forKey: @"floatValue"]) && R([m setValue: [OFNumber numberWithDouble: 120] forKey: @"doubleValue"]) && [m isBoolValue] == 0 && [m charValue] == 10 && [m shortValue] == 20 && [m intValue] == 30 && [m longValue] == 40 && [m longLongValue] == 50 && [m unsignedCharValue] == 60 && [m unsignedShortValue] == 70 && |
︙ | ︙ |