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), |
+ 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( |