@@ -32,11 +32,11 @@ #import "OFInvalidJSONException.h" int _OFString_JSONValue_reference; static id nextObject(const char **pointer, const char *stop, size_t *line, - size_t depth, size_t depthLimit); + size_t depthLimit); static void skipWhitespaces(const char **pointer, const char *stop, size_t *line) { while (*pointer < stop && (**pointer == ' ' || **pointer == '\t' || @@ -388,18 +388,18 @@ return nil; } static inline OFMutableArray * parseArray(const char **pointer, const char *stop, size_t *line, - size_t depth, size_t depthLimit) + size_t depthLimit) { OFMutableArray *array = [OFMutableArray array]; if (++(*pointer) >= stop) return nil; - if (++depth > depthLimit) + if (--depthLimit == 0) return nil; while (**pointer != ']') { id object; @@ -418,11 +418,11 @@ return nil; break; } - object = nextObject(pointer, stop, line, depth, depthLimit); + object = nextObject(pointer, stop, line, depthLimit); if (object == nil) return nil; [array addObject: object]; @@ -445,18 +445,18 @@ return array; } static inline OFMutableDictionary * parseDictionary(const char **pointer, const char *stop, size_t *line, - size_t depth, size_t depthLimit) + size_t depthLimit) { OFMutableDictionary *dictionary = [OFMutableDictionary dictionary]; if (++(*pointer) >= stop) return nil; - if (++depth > depthLimit) + if (--depthLimit == 0) return nil; while (**pointer != '}') { id key, object; @@ -484,12 +484,11 @@ if ((**pointer >= 'a' && **pointer <= 'z') || (**pointer >= 'A' && **pointer <= 'Z') || **pointer == '_' || **pointer == '$' || **pointer == '\\') key = parseIdentifier(pointer, stop); else - key = nextObject(pointer, stop, line, - depth, depthLimit); + key = nextObject(pointer, stop, line, depthLimit); if (key == nil) return nil; skipWhitespacesAndComments(pointer, stop, line); @@ -496,11 +495,11 @@ if (*pointer + 1 >= stop || **pointer != ':') return nil; (*pointer)++; - object = nextObject(pointer, stop, line, depth, depthLimit); + object = nextObject(pointer, stop, line, depthLimit); if (object == nil) return nil; [dictionary setObject: object forKey: key]; @@ -573,11 +572,11 @@ return number; } static id nextObject(const char **pointer, const char *stop, size_t *line, - size_t depth, size_t depthLimit) + size_t depthLimit) { skipWhitespacesAndComments(pointer, stop, line); if (*pointer >= stop) return nil; @@ -585,13 +584,13 @@ switch (**pointer) { case '"': case '\'': return parseString(pointer, stop, line); case '[': - return parseArray(pointer, stop, line, depth, depthLimit); + return parseArray(pointer, stop, line, depthLimit); case '{': - return parseDictionary(pointer, stop, line, depth, depthLimit); + return parseDictionary(pointer, stop, line, depthLimit); case 't': if (*pointer + 3 >= stop) return nil; if (memcmp(*pointer, "true", 4) != 0) @@ -652,11 +651,11 @@ const char *pointer = [self UTF8String]; const char *stop = pointer + [self UTF8StringLength]; id object; size_t line = 1; - object = nextObject(&pointer, stop, &line, 0, depthLimit); + object = nextObject(&pointer, stop, &line, depthLimit); skipWhitespacesAndComments(&pointer, stop, &line); if (pointer < stop || object == nil) @throw [OFInvalidJSONException exceptionWithString: self line: line];