@@ -82,7 +82,8 @@ class BasicJsonStringifier BASE_EMBEDDED {
82
82
INLINE (Result SerializeJSArray (Handle <JSArray> object));
83
83
INLINE (Result SerializeJSObject (Handle <JSObject> object));
84
84
85
- Result SerializeJSArraySlow (Handle <JSArray> object, uint32_t length);
85
+ Result SerializeJSArraySlow (Handle <JSArray> object, uint32_t start,
86
+ uint32_t length);
86
87
87
88
void SerializeString (Handle <String> object);
88
89
@@ -434,17 +435,68 @@ BasicJsonStringifier::Result BasicJsonStringifier::SerializeJSArray(
434
435
uint32_t length = 0 ;
435
436
CHECK (object->length ()->ToArrayLength (&length));
436
437
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
+ }
439
491
builder_.AppendCharacter (' ]' );
440
492
StackPop ();
441
493
return SUCCESS;
442
494
}
443
495
444
496
445
497
BasicJsonStringifier::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++) {
448
500
if (i > 0 ) builder_.AppendCharacter (' ,' );
449
501
Handle <Object> element;
450
502
ASSIGN_RETURN_ON_EXCEPTION_VALUE (
0 commit comments