760eed0525
This is a reland of ef2a19a211
.
Use AllocateJSArray to avoid allocating an empty fixed array.
Original change's description:
> Add fast path for spreading primitive strings.
>
> This improves the performance on primitive strings of
> IterableToListWithSymbolLookup, which implements the
> CreateArrayFromIterable bytecode. The fast path is only
> taken if the string iterator protector is valid (that is,
> String.prototype[Symbol.iterator] and
> String.prototype[Symbol.iterator]().next are untouched).
>
> This brings spreading of primitive strings closer to the
> performance of the string iterator optimizations.
> (see https://docs.google.com/document/d/13z1fvRVpe_oEroplXEEX0a3WK94fhXorHjcOMsDmR-8/).
>
> Bug: chromium:881273, v8:7980
> Change-Id: Ic8d8619da2f2afcc9346203613a844f62653fd7a
> Reviewed-on: https://chromium-review.googlesource.com/1243110
> Commit-Queue: Hai Dang <dhai@google.com>
> Reviewed-by: Georg Neis <neis@chromium.org>
> Reviewed-by: Ulan Degenbaev <ulan@chromium.org>
> Reviewed-by: Benedikt Meurer <bmeurer@chromium.org>
> Reviewed-by: Sigurd Schneider <sigurds@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#56329}
Bug: chromium:881273, v8:7980
Change-Id: I746c57ddfc300e1032057b5125bc824adf5c2cd3
Reviewed-on: https://chromium-review.googlesource.com/c/1267497
Commit-Queue: Georg Neis <neis@chromium.org>
Reviewed-by: Ulan Degenbaev <ulan@chromium.org>
Reviewed-by: Georg Neis <neis@chromium.org>
Cr-Commit-Position: refs/heads/master@{#56438}
27 lines
843 B
JavaScript
27 lines
843 B
JavaScript
// Copyright 2018 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// Flags: --allow-natives-syntax --no-stress-opt
|
|
|
|
// Tests for spreading primitive strings.
|
|
|
|
assertEquals([...''], []);
|
|
|
|
var str = 'ott';
|
|
assertEquals(['o', 't', 't'], [...str]);
|
|
assertTrue(%StringIteratorProtector());
|
|
|
|
str[Symbol.iterator] = {};
|
|
// Symbol.iterator can't be set on primitive strings, so it shouldn't invalidate
|
|
// the protector.
|
|
assertTrue(%StringIteratorProtector());
|
|
|
|
// This changes the String Iterator prototype. No more tests should be run after
|
|
// this in the same instance.
|
|
var iterator = str[Symbol.iterator]();
|
|
iterator.__proto__.next = () => ({value : undefined, done : true});
|
|
|
|
assertFalse(%StringIteratorProtector());
|
|
assertEquals([], [...str]);
|