Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 48a8c72db72281068a18847926c158d0b49673e1
https://github.com/WebKit/WebKit/commit/48a8c72db72281068a18847926c158d0b49673e1
Author: Alexey Shvayka <[email protected]>
Date: 2023-03-14 (Tue, 14 Mar 2023)
Changed paths:
A JSTests/microbenchmarks/proxy-has-hit.js
A JSTests/microbenchmarks/proxy-has-miss-handler.js
A JSTests/microbenchmarks/proxy-has-miss.js
M Source/JavaScriptCore/builtins/BuiltinNames.h
M Source/JavaScriptCore/builtins/ProxyHelpers.js
M Source/JavaScriptCore/bytecode/AccessCase.cpp
M Source/JavaScriptCore/bytecode/AccessCase.h
M Source/JavaScriptCore/bytecode/LinkTimeConstant.h
M Source/JavaScriptCore/bytecode/ProxyObjectAccessCase.cpp
M Source/JavaScriptCore/bytecode/Repatch.cpp
M Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
M Source/JavaScriptCore/runtime/JSGlobalObject.cpp
M Source/JavaScriptCore/runtime/JSGlobalObject.h
M Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp
M Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.h
M Source/JavaScriptCore/runtime/JSGlobalObjectInlines.h
M Source/JavaScriptCore/runtime/ProxyObject.cpp
M Source/JavaScriptCore/runtime/ProxyObject.h
Log Message:
-----------
[JSC] Add ProxyObjectHas IC to optimize "has" trap
https://bugs.webkit.org/show_bug.cgi?id=253830
<rdar://problem/106644477>
Reviewed by Yusuke Suzuki.
This change adds ProxyObjectHas IC for Proxy "has" trap, which detects
ProxyObject and calls
@performProxyObjectHas JS function that, in the most common case, avoids
calling into C++
to validate the trap result.
While progressing provided microbenchmarks by up to 10x, unfortunately this
patch does not
affect Speedometer2 nor JetStream3: JS3/proxy-mobx invokes "has" trap only on
indexed properties,
which are currently rejected by isCacheableIdentifierCell() and not supported
by ProxyObjectAccessCase.
Parameter order of "get" and "set" IC helpers had to be rearranged to simplify
ProxyObjectAccessCase::emit().
ToT patch
proxy-has-hit 48.4694+-0.3179 ^ 4.8357+-0.0314 ^
definitely 10.0232x faster
proxy-has-miss 53.6834+-0.3113 ^ 15.9198+-0.0730 ^
definitely 3.3721x faster
proxy-has-miss-handler 30.9117+-0.1541 ^ 4.9238+-0.0337 ^
definitely 6.2781x faster
<geometric> 43.1641+-0.1435 ^ 7.2367+-0.0233 ^
definitely 5.9646x faster
* JSTests/microbenchmarks/proxy-has-hit.js: Added.
* JSTests/microbenchmarks/proxy-has-miss-handler.js: Added.
* JSTests/microbenchmarks/proxy-has-miss.js: Added.
* Source/JavaScriptCore/builtins/BuiltinNames.h:
* Source/JavaScriptCore/builtins/ProxyHelpers.js:
(linkTimeConstant.performProxyObjectHas):
(linkTimeConstant.performProxyObjectGet):
(linkTimeConstant.performProxyObjectSetSloppy):
(linkTimeConstant.performProxyObjectSetStrict):
* Source/JavaScriptCore/bytecode/AccessCase.cpp:
(JSC::AccessCase::create):
(JSC::AccessCase::guardedByStructureCheckSkippingConstantIdentifierCheck const):
(JSC::AccessCase::requiresIdentifierNameMatch const):
(JSC::AccessCase::requiresInt32PropertyCheck const):
(JSC::AccessCase::needsScratchFPR const):
(JSC::AccessCase::forEachDependentCell const):
(JSC::AccessCase::doesCalls const):
(JSC::AccessCase::canReplace const):
(JSC::AccessCase::generateWithGuard):
(JSC::AccessCase::generateImpl):
(JSC::AccessCase::runWithDowncast):
(JSC::AccessCase::canBeShared):
* Source/JavaScriptCore/bytecode/AccessCase.h:
* Source/JavaScriptCore/bytecode/LinkTimeConstant.h:
* Source/JavaScriptCore/bytecode/ProxyObjectAccessCase.cpp:
(JSC::ProxyObjectAccessCase::emit):
* Source/JavaScriptCore/bytecode/Repatch.cpp:
(JSC::tryCacheInBy):
* Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:
(JSC::DFG::ByteCodeParser::handleProxyObjectLoad):
(JSC::DFG::ByteCodeParser::handlePutById):
* Source/JavaScriptCore/runtime/JSGlobalObject.cpp:
(JSC::JSGlobalObject::init):
* Source/JavaScriptCore/runtime/JSGlobalObject.h:
* Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp:
(JSC::JSC_DEFINE_HOST_FUNCTION):
* Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.h:
* Source/JavaScriptCore/runtime/JSGlobalObjectInlines.h:
(JSC::JSGlobalObject::performProxyObjectHasFunction const):
* Source/JavaScriptCore/runtime/ProxyObject.cpp:
(JSC::ProxyObject::performHasProperty):
(JSC::ProxyObject::validateNegativeHasTrapResult):
* Source/JavaScriptCore/runtime/ProxyObject.h:
Canonical link: https://commits.webkit.org/261628@main
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes