| 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(
|
|
|