Chromium Code Reviews| Index: src/json-stringifier.h |
| diff --git a/src/json-stringifier.h b/src/json-stringifier.h |
| index 0dd54c403cda9ac8d60ed01f7298972d1fa916e7..8bcef34c79fb9b7e9ddd48e820e1b3594ae82617 100644 |
| --- a/src/json-stringifier.h |
| +++ b/src/json-stringifier.h |
| @@ -82,7 +82,8 @@ class BasicJsonStringifier BASE_EMBEDDED { |
| INLINE(Result SerializeJSArray(Handle<JSArray> object)); |
| INLINE(Result SerializeJSObject(Handle<JSObject> object)); |
| - Result SerializeJSArraySlow(Handle<JSArray> object, uint32_t length); |
| + Result SerializeJSArraySlow(Handle<JSArray> object, uint32_t start, |
| + uint32_t length); |
| void SerializeString(Handle<String> object); |
| @@ -435,8 +436,59 @@ BasicJsonStringifier::Result BasicJsonStringifier::SerializeJSArray( |
| uint32_t length = 0; |
| CHECK(object->length()->ToArrayLength(&length)); |
| builder_.AppendCharacter('['); |
| - Result result = SerializeJSArraySlow(object, length); |
| - if (result != SUCCESS) return result; |
| + switch (object->GetElementsKind()) { |
| + case FAST_SMI_ELEMENTS: { |
| + Handle<FixedArray> elements(FixedArray::cast(object->elements()), |
| + isolate_); |
| + for (uint32_t i = 0; i < length; i++) { |
| + if (i > 0) builder_.AppendCharacter(','); |
| + SerializeSmi(Smi::cast(elements->get(i))); |
| + } |
| + break; |
| + } |
| + case FAST_DOUBLE_ELEMENTS: { |
| + // Empty array is FixedArray but not FixedDoubleArray. |
| + if (length == 0) break; |
| + Handle<FixedDoubleArray> elements( |
| + FixedDoubleArray::cast(object->elements()), isolate_); |
| + for (uint32_t i = 0; i < length; i++) { |
| + if (i > 0) builder_.AppendCharacter(','); |
| + SerializeDouble(elements->get_scalar(i)); |
| + } |
| + break; |
| + } |
| + case FAST_ELEMENTS: { |
| + Handle<Object> old_length(object->length(), isolate_); |
| + for (uint32_t i = 0; i < length; i++) { |
| + if (object->length() != *old_length || |
| + object->GetElementsKind() != FAST_ELEMENTS) { |
| + Result result = SerializeJSArraySlow(object, i, length); |
| + if (result != SUCCESS) return result; |
| + break; |
| + } |
| + if (i > 0) builder_.AppendCharacter(','); |
| + Result result = SerializeElement( |
| + isolate_, |
| + Handle<Object>(FixedArray::cast(object->elements())->get(i), |
|
Toon Verwaest
2015/11/13 09:33:23
handle(...) works too.
|
| + isolate_), |
| + i); |
| + if (result == SUCCESS) continue; |
| + if (result == UNCHANGED) { |
| + builder_.AppendCString("null"); |
| + } else { |
| + return result; |
| + } |
| + } |
| + break; |
| + } |
| + // The FAST_HOLEY_* cases could be handled in a faster way. They resemble |
| + // the non-holey cases except that a lookup is necessary for holes. |
| + default: { |
| + Result result = SerializeJSArraySlow(object, 0, length); |
| + if (result != SUCCESS) return result; |
| + break; |
| + } |
| + } |
| builder_.AppendCharacter(']'); |
| StackPop(); |
| return SUCCESS; |
| @@ -444,8 +496,8 @@ BasicJsonStringifier::Result BasicJsonStringifier::SerializeJSArray( |
| BasicJsonStringifier::Result BasicJsonStringifier::SerializeJSArraySlow( |
| - Handle<JSArray> object, uint32_t length) { |
| - for (uint32_t i = 0; i < length; i++) { |
| + Handle<JSArray> object, uint32_t start, uint32_t length) { |
| + for (uint32_t i = start; i < length; i++) { |
| if (i > 0) builder_.AppendCharacter(','); |
| Handle<Object> element; |
| ASSIGN_RETURN_ON_EXCEPTION_VALUE( |