Skip to content

Commit

Permalink
Revert "Be more memory-efficient when parsing long strings containing…
Browse files Browse the repository at this point in the history
… escaped characters. Suggested by Bob McCune."

This reverts commit aaa6b06.
  • Loading branch information
stig committed Aug 28, 2011
1 parent aaa6b06 commit cb0c9c1
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 118 deletions.
173 changes: 83 additions & 90 deletions Classes/SBJsonStreamParser.m
Expand Up @@ -264,97 +264,90 @@ - (void) handleTokenNotExpectedHere: (sbjson_token_t) tok {
}

- (SBJsonStreamParserStatus)parse:(NSData *)data_ {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
@try {
[tokeniser appendData:data_];

for (;;) {

if ([state isError])
return SBJsonStreamParserError;

NSObject *token;
sbjson_token_t tok = [tokeniser getToken:&token];
switch (tok) {
case sbjson_token_eof:
return [state parserShouldReturn:self];
break;

case sbjson_token_error:
self.state = [SBJsonStreamParserStateError sharedInstance];
self.error = tokeniser.error;
return SBJsonStreamParserError;
break;

default:

if (![state parser:self shouldAcceptToken:tok]) {
[self handleTokenNotExpectedHere: tok];
return SBJsonStreamParserError;
}

switch (tok) {
case sbjson_token_object_start:
[self handleObjectStart];
break;

case sbjson_token_object_end:
[self handleObjectEnd: tok];
break;

case sbjson_token_array_start:
[self handleArrayStart];
break;

case sbjson_token_array_end:
[self handleArrayEnd: tok];
break;

case sbjson_token_separator:
case sbjson_token_keyval_separator:
[state parser:self shouldTransitionTo:tok];
break;

case sbjson_token_true:
[self parserFoundObject:kTrue];
[state parser:self shouldTransitionTo:tok];
break;

case sbjson_token_false:
[self parserFoundObject:kFalse];
[state parser:self shouldTransitionTo:tok];
break;

case sbjson_token_null:
[self parserFoundObject:kNull];
[state parser:self shouldTransitionTo:tok];
break;

case sbjson_token_number:
[tokeniser appendData:data_];

for (;;) {

if ([state isError])
return SBJsonStreamParserError;

NSObject *token;
sbjson_token_t tok = [tokeniser getToken:&token];
switch (tok) {
case sbjson_token_eof:
return [state parserShouldReturn:self];
break;

case sbjson_token_error:
self.state = [SBJsonStreamParserStateError sharedInstance];
self.error = tokeniser.error;
return SBJsonStreamParserError;
break;

default:

if (![state parser:self shouldAcceptToken:tok]) {
[self handleTokenNotExpectedHere: tok];
return SBJsonStreamParserError;
}

switch (tok) {
case sbjson_token_object_start:
[self handleObjectStart];
break;

case sbjson_token_object_end:
[self handleObjectEnd: tok];
break;

case sbjson_token_array_start:
[self handleArrayStart];
break;

case sbjson_token_array_end:
[self handleArrayEnd: tok];
break;

case sbjson_token_separator:
case sbjson_token_keyval_separator:
[state parser:self shouldTransitionTo:tok];
break;

case sbjson_token_true:
[self parserFoundObject:kTrue];
[state parser:self shouldTransitionTo:tok];
break;

case sbjson_token_false:
[self parserFoundObject:kFalse];
[state parser:self shouldTransitionTo:tok];
break;

case sbjson_token_null:
[self parserFoundObject:kNull];
[state parser:self shouldTransitionTo:tok];
break;

case sbjson_token_number:
[self parserFoundObject:token];
[state parser:self shouldTransitionTo:tok];
break;

case sbjson_token_string:
if ([state needKey])
[keyStack addObject:token];
else
[self parserFoundObject:token];
[state parser:self shouldTransitionTo:tok];
break;

case sbjson_token_string:
if ([state needKey])
[keyStack addObject:token];
else
[self parserFoundObject:token];
[state parser:self shouldTransitionTo:tok];
break;

default:
break;
}
break;
}
}
return SBJsonStreamParserComplete;

}
@finally {
[pool drain];
}
[state parser:self shouldTransitionTo:tok];
break;

default:
break;
}
break;
}
}
return SBJsonStreamParserComplete;
}


Expand Down
44 changes: 19 additions & 25 deletions Classes/SBJsonTokeniser.m
Expand Up @@ -145,36 +145,30 @@ - (sbjson_token_t)getStringToken:(NSObject**)token {
unichar ch;
{
NSMutableString *string = nil;
@try {
if (![_stream getRetainedStringFragment:&string])
return sbjson_token_eof;

if (!string) {
self.error = @"Broken Unicode encoding";
return sbjson_token_error;
}
if (![_stream getSimpleString:&string])
return sbjson_token_eof;

if (![_stream getUnichar:&ch]) {
return sbjson_token_eof;
}
if (!string) {
self.error = @"Broken Unicode encoding";
return sbjson_token_error;
}


if (![_stream getUnichar:&ch])
return sbjson_token_eof;

if (acc) {
[acc appendString:string];

if (acc) {
[acc appendString:string];
} else if (ch == '"') {
*token = string;
[_stream skip];
return sbjson_token_string;

} else if (ch == '"') {
*token = [[string copy] autorelease];
[_stream skip];
return sbjson_token_string;

} else {
acc = [[string mutableCopy] autorelease];
}
}
@finally {
[string release];
} else {
acc = [[string mutableCopy] autorelease];
}
}


switch (ch) {
case 0 ... 0x1F:
Expand Down
2 changes: 1 addition & 1 deletion Classes/SBJsonUTF8Stream.h
Expand Up @@ -51,7 +51,7 @@

- (BOOL)getUnichar:(unichar*)ch;
- (BOOL)getNextUnichar:(unichar*)ch;
- (BOOL)getRetainedStringFragment:(NSString**)string;
- (BOOL)getSimpleString:(NSString**)string;

- (NSString*)stringWithRange:(NSRange)range;

Expand Down
4 changes: 2 additions & 2 deletions Classes/SBJsonUTF8Stream.m
Expand Up @@ -83,14 +83,14 @@ - (BOOL)getNextUnichar:(unichar*)ch {
return NO;
}

- (BOOL)getRetainedStringFragment:(NSString **)string {
- (BOOL)getSimpleString:(NSString **)string {
NSUInteger start = _index;
while (_index < _length) {
switch (_bytes[_index]) {
case '"':
case '\\':
case 0 ... 0x1f:
*string = [[NSString alloc] initWithBytes:(_bytes + start) length:(_index - start) encoding:NSUTF8StringEncoding];
*string = [[[NSString alloc] initWithBytes:(_bytes + start) length:(_index - start) encoding:NSUTF8StringEncoding] autorelease];
return YES;
break;
default:
Expand Down

0 comments on commit cb0c9c1

Please sign in to comment.