Chromium Code Reviews| Index: src/json-parser.h |
| diff --git a/src/json-parser.h b/src/json-parser.h |
| index d481ed02b6744a827a98185106d560170e36ea12..60cb786d03fbcd9a7aa8ba831927252680243424 100644 |
| --- a/src/json-parser.h |
| +++ b/src/json-parser.h |
| @@ -304,45 +304,56 @@ Handle<Object> JsonParser<seq_ascii>::ParseJsonObject() { |
| Advance(); |
| uint32_t index = 0; |
| - while (c0_ >= '0' && c0_ <= '9') { |
| - int d = c0_ - '0'; |
| - if (index > 429496729U - ((d > 5) ? 1 : 0)) break; |
| - index = (index * 10) + d; |
| - Advance(); |
| - } |
| + if (c0_ >= '0' && c0_ <= '9') { |
| + // Maybe an array index, try to parse it. |
| + if (c0_ == '0') { |
| + // With a leading zero, the string has to be "0" only to be an index. |
| + Advance(); |
| + } else { |
| + do { |
| + int d = c0_ - '0'; |
| + if (index > 429496729U - ((d > 5) ? 1 : 0)) break; |
| + index = (index * 10) + d; |
| + Advance(); |
| + } while (c0_ >= '0' && c0_ <= '9'); |
| + } |
| - if (position_ != start_position + 1 && c0_ == '"') { |
| - AdvanceSkipWhitespace(); |
| + if (position_ != start_position + 1 && c0_ == '"') { |
|
Toon Verwaest
2012/10/29 11:08:22
Now that this if moved into the parent if, the fir
Yang
2012/10/29 12:01:12
Done.
|
| + // Successfully parsed index, parse and store element. |
| + AdvanceSkipWhitespace(); |
| - if (c0_ != ':') return ReportUnexpectedCharacter(); |
| - AdvanceSkipWhitespace(); |
| - Handle<Object> value = ParseJsonValue(); |
| - if (value.is_null()) return ReportUnexpectedCharacter(); |
| + if (c0_ != ':') return ReportUnexpectedCharacter(); |
| + AdvanceSkipWhitespace(); |
| + Handle<Object> value = ParseJsonValue(); |
| + if (value.is_null()) return ReportUnexpectedCharacter(); |
| - JSObject::SetOwnElement(json_object, index, value, kNonStrictMode); |
| - } else { |
| - position_ = start_position; |
| + JSObject::SetOwnElement(json_object, index, value, kNonStrictMode); |
| + continue; |
| + } |
| + // Not an index, fallback to the slow path. |
| + } |
| + |
| + position_ = start_position; |
| #ifdef DEBUG |
| - c0_ = '"'; |
| + c0_ = '"'; |
| #endif |
| - Handle<String> key = ParseJsonSymbol(); |
| - if (key.is_null() || c0_ != ':') return ReportUnexpectedCharacter(); |
| + Handle<String> key = ParseJsonSymbol(); |
| + if (key.is_null() || c0_ != ':') return ReportUnexpectedCharacter(); |
| - AdvanceSkipWhitespace(); |
| - Handle<Object> value = ParseJsonValue(); |
| - if (value.is_null()) return ReportUnexpectedCharacter(); |
| + AdvanceSkipWhitespace(); |
| + Handle<Object> value = ParseJsonValue(); |
| + if (value.is_null()) return ReportUnexpectedCharacter(); |
| - if (key->Equals(isolate()->heap()->Proto_symbol())) { |
| - prototype = value; |
| + if (key->Equals(isolate()->heap()->Proto_symbol())) { |
| + prototype = value; |
| + } else { |
| + if (JSObject::TryTransitionToField(json_object, key)) { |
| + int index = json_object->LastAddedFieldIndex(); |
| + json_object->FastPropertyAtPut(index, *value); |
| } else { |
| - if (JSObject::TryTransitionToField(json_object, key)) { |
| - int index = json_object->LastAddedFieldIndex(); |
| - json_object->FastPropertyAtPut(index, *value); |
| - } else { |
| - JSObject::SetLocalPropertyIgnoreAttributes( |
| - json_object, key, value, NONE); |
| - } |
| + JSObject::SetLocalPropertyIgnoreAttributes( |
| + json_object, key, value, NONE); |
| } |
| } |
| } while (MatchSkipWhiteSpace(',')); |