• Hai Dang's avatar
    Reland "[interpreter] Add bytecode for leading array spreads." · 5f8a4272
    Hai Dang authored
    This is a reland of 1c48d52b.
    
    It turned out that IterableToList doesn't always behave according to
    the ES operation with the same name. Specifically, it allows holey arrays
    to take its fast path, which produces an output array with holes where
    actually "undefined" elements should appear.
    
    This CL changes the version of IterableToList that is used for spreads
    (IterableToListWithSymbolLookup) such that holey arrays take the slow path.
    It also includes tests for such situations.
    
    Original change's description:
    > [interpreter] Add bytecode for leading array spreads.
    >
    > This CL improves the performance of creating [...a, b] or [...a].
    > If the array literal has a leading spread, this CL emits the bytecode
    > [CreateArrayFromIterable] to create the literal. CreateArrayFromIterable
    > is implemented by [IterableToListDefault] builtin to create the initial
    > array for the leading spread. IterableToListDefault has a fast path to
    > clone efficiently if the spread is an actual array.
    >
    > The bytecode generated is now shorter. Bytecode generation is refactored
    > into to BuildCreateArrayLiteral, which allows VisitCallSuper to benefit
    > from this optimization also.
    > For now, turbofan also lowers the bytecode to the builtin.
    >
    > The idiomatic use of [...a] to clone the array a now performs better
    > than a simple for-loop, but still does not match the performance of slice.
    >
    > Bug: v8:7980
    >
    > Cq-Include-Trybots: luci.v8.try:v8_linux_noi18n_rel_ng
    > Change-Id: Ibde659c82d3c7aa1b1777a3d2f6426ac8cc15e35
    > Reviewed-on: https://chromium-review.googlesource.com/1181024
    > Reviewed-by: Ross McIlroy <rmcilroy@chromium.org>
    > Reviewed-by: Sigurd Schneider <sigurds@chromium.org>
    > Reviewed-by: Jakob Gruber <jgruber@chromium.org>
    > Reviewed-by: Georg Neis <neis@chromium.org>
    > Commit-Queue: Georg Neis <neis@chromium.org>
    > Commit-Queue: Hai Dang <dhai@google.com>
    > Cr-Commit-Position: refs/heads/master@{#55520}
    
    Bug: v8:7980
    Change-Id: I0b5603a12d2b588327658bf0a9b214bd0f22e237
    Cq-Include-Trybots: luci.v8.try:v8_linux_noi18n_rel_ng
    Reviewed-on: https://chromium-review.googlesource.com/1201882
    Commit-Queue: Hai Dang <dhai@google.com>
    Reviewed-by: 's avatarGeorg Neis <neis@chromium.org>
    Reviewed-by: 's avatarRoss McIlroy <rmcilroy@chromium.org>
    Reviewed-by: 's avatarJakob Gruber <jgruber@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#55639}
    5f8a4272
map-arg-non-iterable.out 251 Bytes