@@ -82,7 +82,8 @@ class BasicJsonStringifier BASE_EMBEDDED {
8282 INLINE (Result SerializeJSArray (Handle<JSArray> object));
8383 INLINE (Result SerializeJSObject (Handle<JSObject> object));
8484
85- Result SerializeJSArraySlow (Handle<JSArray> object, uint32_t length);
85+ Result SerializeJSArraySlow (Handle<JSArray> object, uint32_t start,
86+ uint32_t length);
8687
8788 void SerializeString (Handle<String> object);
8889
@@ -434,17 +435,68 @@ BasicJsonStringifier::Result BasicJsonStringifier::SerializeJSArray(
434435 uint32_t length = 0 ;
435436 CHECK (object->length ()->ToArrayLength (&length));
436437 builder_.AppendCharacter (' [' );
437- Result result = SerializeJSArraySlow (object, length);
438- if (result != SUCCESS) return result;
438+ switch (object->GetElementsKind ()) {
439+ case FAST_SMI_ELEMENTS: {
440+ Handle<FixedArray> elements (FixedArray::cast (object->elements ()),
441+ isolate_);
442+ for (uint32_t i = 0 ; i < length; i++) {
443+ if (i > 0 ) builder_.AppendCharacter (' ,' );
444+ SerializeSmi (Smi::cast (elements->get (i)));
445+ }
446+ break ;
447+ }
448+ case FAST_DOUBLE_ELEMENTS: {
449+ // Empty array is FixedArray but not FixedDoubleArray.
450+ if (length == 0 ) break ;
451+ Handle<FixedDoubleArray> elements (
452+ FixedDoubleArray::cast (object->elements ()), isolate_);
453+ for (uint32_t i = 0 ; i < length; i++) {
454+ if (i > 0 ) builder_.AppendCharacter (' ,' );
455+ SerializeDouble (elements->get_scalar (i));
456+ }
457+ break ;
458+ }
459+ case FAST_ELEMENTS: {
460+ Handle<Object> old_length (object->length (), isolate_);
461+ for (uint32_t i = 0 ; i < length; i++) {
462+ if (object->length () != *old_length ||
463+ object->GetElementsKind () != FAST_ELEMENTS) {
464+ Result result = SerializeJSArraySlow (object, i, length);
465+ if (result != SUCCESS) return result;
466+ break ;
467+ }
468+ if (i > 0 ) builder_.AppendCharacter (' ,' );
469+ Result result = SerializeElement (
470+ isolate_,
471+ Handle<Object>(FixedArray::cast (object->elements ())->get (i),
472+ isolate_),
473+ i);
474+ if (result == SUCCESS) continue ;
475+ if (result == UNCHANGED) {
476+ builder_.AppendCString (" null" );
477+ } else {
478+ return result;
479+ }
480+ }
481+ break ;
482+ }
483+ // The FAST_HOLEY_* cases could be handled in a faster way. They resemble
484+ // the non-holey cases except that a lookup is necessary for holes.
485+ default : {
486+ Result result = SerializeJSArraySlow (object, 0 , length);
487+ if (result != SUCCESS) return result;
488+ break ;
489+ }
490+ }
439491 builder_.AppendCharacter (' ]' );
440492 StackPop ();
441493 return SUCCESS;
442494}
443495
444496
445497BasicJsonStringifier::Result BasicJsonStringifier::SerializeJSArraySlow (
446- Handle<JSArray> object, uint32_t length) {
447- for (uint32_t i = 0 ; i < length; i++) {
498+ Handle<JSArray> object, uint32_t start, uint32_t length) {
499+ for (uint32_t i = start ; i < length; i++) {
448500 if (i > 0 ) builder_.AppendCharacter (' ,' );
449501 Handle<Object> element;
450502 ASSIGN_RETURN_ON_EXCEPTION_VALUE (
0 commit comments