Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: ef0e6f6c2894bccf259ee6fc8a782425568980cb
      
https://github.com/WebKit/WebKit/commit/ef0e6f6c2894bccf259ee6fc8a782425568980cb
  Author: Alexey Shvayka <[email protected]>
  Date:   2023-06-15 (Thu, 15 Jun 2023)

  Changed paths:
    A JSTests/microbenchmarks/proxy-ownkeys-via-object-assign-miss-handler.js
    A JSTests/microbenchmarks/proxy-ownkeys-via-object-assign.js
    A JSTests/microbenchmarks/proxy-ownkeys-via-object-keys-miss-handler.js
    A JSTests/microbenchmarks/proxy-ownkeys-via-object-keys.js
    A JSTests/microbenchmarks/proxy-ownkeys-via-reflect-ownkeys-miss-handler.js
    A JSTests/microbenchmarks/proxy-ownkeys-via-reflect-ownkeys.js
    M Source/JavaScriptCore/runtime/CommonIdentifiers.h
    M Source/JavaScriptCore/runtime/ObjectConstructor.cpp
    M Source/JavaScriptCore/runtime/ProxyObject.cpp
    M Source/JavaScriptCore/runtime/ProxyObject.h

  Log Message:
  -----------
  [JSC] Optimize ProxyObject's "ownKeys" trap
https://bugs.webkit.org/show_bug.cgi?id=257346
<rdar://problem/109850846>

Reviewed by Yusuke Suzuki.

It is a common JS pattern to mass-assign properties and clone / merge objects 
via Object.assign(),
and since in Vue.js v3 front-end developers mostly operate on reactive objects 
(that are wrapped
in a ProxyObject), optimizing its "ownKeys" trap and related operations is 
crucial.

This change:

  1. Enables [[ProxyHandler]] trap caching for "ownKeys" and 
"getOwnPropertyDescriptor" traps.

  2. Introduces forwardsGetOwnPropertyNamesToTarget() fast path that expands 
existing property
     names caching (based on StructureRareData) to handle ProxyObjects which 
are missing
     "ownKeys" and "getOwnPropertyDescriptor" traps.

     This was made possible by [[ProxyHandler]] trap caching added in 
https://webkit.org/b/256554.

  3. Leveraging Structure flags introduced in https://webkit.org/b/255661, 
skips "ownKeys" trap
     result validation in the common case of [[ProxyTarget]] being an ordinary 
extensible object
     without non-configurable properties.

     This results in nice speed-up given the spec requires [1] to enumerate all 
[[ProxyTarget]]
     properties and ensure that all non-configurable ones are listed by the 
userland trap code.

[1]: 
https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots-ownpropertykeys
 (step 16)

                                                          ToT                   
   patch

proxy-ownkeys-via-reflect-ownkeys                   81.7443+-0.7848     ^     
46.7884+-0.4395        ^ definitely 1.7471x faster
proxy-ownkeys-via-reflect-ownkeys-miss-handler      31.4378+-0.4010     ^      
2.2589+-0.0293        ^ definitely 13.9172x faster
proxy-ownkeys-via-object-keys                      215.2480+-1.1130     ^     
95.5261+-0.7659        ^ definitely 2.2533x faster
proxy-ownkeys-via-object-keys-miss-handler         168.9327+-0.7422     ^      
2.2765+-0.0276        ^ definitely 74.2064x faster
proxy-ownkeys-via-object-assign                    233.9777+-2.1404     ^    
112.9695+-0.8461        ^ definitely 2.0712x faster
proxy-ownkeys-via-object-assign-miss-handler       187.8766+-1.0055     ^     
93.1520+-0.1716        ^ definitely 2.0169x faster

<geometric>                                        125.4813+-0.2685     ^     
24.8795+-0.1193        ^ definitely 5.0436x faster

* JSTests/microbenchmarks/proxy-ownkeys-via-object-assign-miss-handler.js: 
Added.
* JSTests/microbenchmarks/proxy-ownkeys-via-object-assign.js: Added.
* JSTests/microbenchmarks/proxy-ownkeys-via-object-keys-miss-handler.js: Added.
* JSTests/microbenchmarks/proxy-ownkeys-via-object-keys.js: Added.
* JSTests/microbenchmarks/proxy-ownkeys-via-reflect-ownkeys-miss-handler.js: 
Added.
* JSTests/microbenchmarks/proxy-ownkeys-via-reflect-ownkeys.js: Added.
* Source/JavaScriptCore/runtime/CommonIdentifiers.h:
* Source/JavaScriptCore/runtime/ObjectConstructor.cpp:
(JSC::ownPropertyKeys):
* Source/JavaScriptCore/runtime/ProxyObject.cpp:
(JSC::ProxyObject::getHandlerTrap):
(JSC::ProxyObject::performInternalMethodGetOwnProperty):
(JSC::ProxyObject::forwardsGetOwnPropertyNamesToTarget):
(JSC::ProxyObject::performGetOwnPropertyNames):
* Source/JavaScriptCore/runtime/ProxyObject.h:
(JSC::ProxyObject::isHandlerTrapsCacheValid):

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


_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to