Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 485bcf1b176ab39831836fcfb40af6232ea21fc5
      
https://github.com/WebKit/WebKit/commit/485bcf1b176ab39831836fcfb40af6232ea21fc5
  Author: Sosuke Suzuki <[email protected]>
  Date:   2026-07-07 (Tue, 07 Jul 2026)

  Changed paths:
    A JSTests/microbenchmarks/concat-multiarg-int32-three.js
    A JSTests/microbenchmarks/concat-multiarg-receiver.js
    A JSTests/microbenchmarks/concat-multiarg-scalar.js
    A JSTests/microbenchmarks/concat-multiarg-strings.js
    A JSTests/stress/array-concat-multiple-arguments-holes.js
    A JSTests/stress/array-concat-multiple-arguments-is-concat-spreadable.js
    A JSTests/stress/array-concat-multiple-arguments-scalars.js
    A JSTests/stress/array-concat-multiple-arguments-species-and-exotic.js
    A JSTests/stress/array-concat-multiple-arguments.js
    M Source/JavaScriptCore/runtime/ArrayPrototype.cpp
    M Source/JavaScriptCore/runtime/JSArrayInlines.h

  Log Message:
  -----------
  [JSC] Add fast path for `Array#concat` with multiple arguments
https://bugs.webkit.org/show_bug.cgi?id=318655

Reviewed by Yusuke Suzuki.

Array.prototype.concat had fast paths only for 0 and 1 argument; more
arguments fell through to the generic loop, which grows the result
incrementally. This matters because @babel/plugin-transform-spread
compiles [...a, ...b] into [].concat(a, b), so transpiled code hits
multi-argument concat on hot paths.

Add tryConcatMultipleArraysFast: when the receiver and all arguments are
plain JSArrays or non-spreadable scalars, compute the total length in one
pass, allocate the butterfly once at exactly the right size, then memcpy
each source at a running offset. Proxies and derived arrays bail out.

                                                   Baseline                  
Patched

concat-multiarg-strings                       133.8260+-0.9464     ^     
46.1617+-1.2060        ^ definitely 2.8991x faster
concat-multiarg-receiver                      134.4724+-1.5618     ^     
46.5028+-0.9827        ^ definitely 2.8917x faster
concat-multiarg-int32-three                   150.9612+-2.3111     ^     
59.5219+-1.2661        ^ definitely 2.5362x faster
concat-multiarg-scalar                        172.1870+-2.0075     ^     
71.6830+-1.8256        ^ definitely 2.4021x faster

Tests: JSTests/microbenchmarks/concat-multiarg-int32-three.js
       JSTests/microbenchmarks/concat-multiarg-receiver.js
       JSTests/microbenchmarks/concat-multiarg-scalar.js
       JSTests/microbenchmarks/concat-multiarg-strings.js
       JSTests/stress/array-concat-multiple-arguments-holes.js
       JSTests/stress/array-concat-multiple-arguments-is-concat-spreadable.js
       JSTests/stress/array-concat-multiple-arguments-scalars.js
       JSTests/stress/array-concat-multiple-arguments-species-and-exotic.js
       JSTests/stress/array-concat-multiple-arguments.js

* JSTests/microbenchmarks/concat-multiarg-int32-three.js: Added.
* JSTests/microbenchmarks/concat-multiarg-receiver.js: Added.
* JSTests/microbenchmarks/concat-multiarg-scalar.js: Added.
* JSTests/microbenchmarks/concat-multiarg-strings.js: Added.
* JSTests/stress/array-concat-multiple-arguments-holes.js: Added.
(shouldBe):
* JSTests/stress/array-concat-multiple-arguments-is-concat-spreadable.js: Added.
(shouldBe):
(shouldThrow):
(2.join):
(i.let.tricky.get Symbol):
* JSTests/stress/array-concat-multiple-arguments-scalars.js: Added.
(shouldBe):
(i.let.evil.valueOf):
* JSTests/stress/array-concat-multiple-arguments-species-and-exotic.js: Added.
(shouldBe):
(MyArray):
(i.Weird.get Symbol):
(i.Weird):
* JSTests/stress/array-concat-multiple-arguments.js: Added.
(shouldBe):
(arrayEq):
(throw.new.Error):
* Source/JavaScriptCore/runtime/ArrayPrototype.cpp:
(JSC::tryConcatMultipleArraysFast):
(JSC::JSC_DEFINE_HOST_FUNCTION):
* Source/JavaScriptCore/runtime/JSArrayInlines.h:
(JSC::mergeIndexingTypesForCopying):
(JSC::JSArray::mergeIndexingTypeForCopying):

Canonical link: https://commits.webkit.org/316619@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications

Reply via email to