Index: src/json-stringifier.h |
diff --git a/src/json-stringifier.h b/src/json-stringifier.h |
index fb6b80dde4ec4c5ffe2a4c8cdff26795384794af..3bbfb63a658ffebc588ec76f698b3c29b74b2482 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); |
@@ -436,8 +437,8 @@ BasicJsonStringifier::Result BasicJsonStringifier::SerializeJSArray( |
builder_.AppendCharacter('['); |
switch (object->GetElementsKind()) { |
case FAST_SMI_ELEMENTS: { |
- Handle<FixedArray> elements( |
- FixedArray::cast(object->elements()), isolate_); |
+ 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))); |
@@ -456,14 +457,20 @@ BasicJsonStringifier::Result BasicJsonStringifier::SerializeJSArray( |
break; |
} |
case FAST_ELEMENTS: { |
- Handle<FixedArray> elements( |
- FixedArray::cast(object->elements()), isolate_); |
+ 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>(elements->get(i), isolate_), |
- i); |
+ Result result = SerializeElement( |
+ isolate_, |
+ Handle<Object>(FixedArray::cast(object->elements())->get(i), |
+ isolate_), |
+ i); |
if (result == SUCCESS) continue; |
if (result == UNCHANGED) { |
builder_.AppendCString("null"); |
@@ -473,11 +480,10 @@ BasicJsonStringifier::Result BasicJsonStringifier::SerializeJSArray( |
} |
break; |
} |
- // TODO(yangguo): The FAST_HOLEY_* cases could be handled in a faster way. |
- // They resemble the non-holey cases except that a prototype chain lookup |
- // is necessary for holes. |
+ // 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, length); |
+ Result result = SerializeJSArraySlow(object, 0, length); |
if (result != SUCCESS) return result; |
break; |
} |
@@ -489,8 +495,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( |