Skip to content

Commit 305c822

Browse files
committed
[DOMJIT] Introduce DOMJIT::GetterSetter to tell JIT information
https://bugs.webkit.org/show_bug.cgi?id=162916 Reviewed by Filip Pizlo. Source/JavaScriptCore: In this patch, we introduce DOMJIT::GetterSetter. This class maintains information required to emit JIT code in DFG and FTL. DOMJIT::GetterSetter has 2 virtual functions: checkDOM and callDOM. These functions can return a DOMJIT::Patchpoint that allows us to inject appropriate machine code during DFG and FTL phases. DFG and FTL will invoke these functions to get a patchpoint. And this patchpoint will be used to emit code corresponding to CheckDOM and CallDOM DFG nodes, which will be added in subsqeunt patch. We propagate DOMJIT::GetterSetter through PropertySlot, AccessCase, GetByIdVariant, and GetByIdStatus along with CustomGetter to teach DFG that this custom access code has a chance to be inlined with this DOMJIT::GetterSetter information. Instead of propagating CustomGetterSetter holding DOMJIT::GetterSetter and CustomGetter, we propagate CustomGetter and DOMJIT::GetterSetter. This is because of the current CustomGetterSetter design that we reify CustomGetterSetters only when we need to reify all the properties. This design allows us to avoid frequent CustomGetterSetter allocations and structure transitions. Currently, domJIT field is always nullptr since there is no DOMJITAttribute user. When we add this, we will add code handling this DOMJIT::GetterSetter in DFG::ByteCodeParser. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * bytecode/GetByIdStatus.cpp: (JSC::GetByIdStatus::computeForStubInfoWithoutExitSiteFeedback): * bytecode/GetByIdVariant.cpp: (JSC::GetByIdVariant::GetByIdVariant): (JSC::GetByIdVariant::operator=): (JSC::GetByIdVariant::attemptToMerge): (JSC::GetByIdVariant::dumpInContext): * bytecode/GetByIdVariant.h: (JSC::GetByIdVariant::domJIT): (JSC::GetByIdVariant::intrinsic): Deleted. * bytecode/PolymorphicAccess.cpp: (JSC::AccessCase::get): (JSC::AccessCase::clone): * bytecode/PolymorphicAccess.h: (JSC::AccessCase::domJIT): (JSC::AccessCase::RareData::RareData): * dfg/DFGNode.h: * domjit/DOMJITGetterSetter.h: Added. (JSC::DOMJIT::GetterSetter::GetterSetter): (JSC::DOMJIT::GetterSetter::~GetterSetter): (JSC::DOMJIT::GetterSetter::getter): (JSC::DOMJIT::GetterSetter::setter): (JSC::DOMJIT::GetterSetter::thisClassInfo): * domjit/DOMJITPatchpoint.h: Added. (JSC::DOMJIT::Patchpoint::create): (JSC::DOMJIT::Patchpoint::setGenerator): (JSC::DOMJIT::Patchpoint::generator): * jit/Repatch.cpp: (JSC::tryCacheGetByID): * runtime/CustomGetterSetter.h: * runtime/JSObject.h: (JSC::JSObject::fillCustomGetterPropertySlot): * runtime/Lookup.h: (JSC::HashTableValue::domJIT): (JSC::getStaticPropertySlotFromTable): (JSC::putEntry): (JSC::reifyStaticProperty): * runtime/PropertySlot.h: (JSC::PropertySlot::domJIT): (JSC::PropertySlot::setCacheableCustom): Source/WebCore: * ForwardingHeaders/domjit/DOMJITGetterSetter.h: Added. * PlatformEfl.cmake: * PlatformGTK.cmake: * PlatformMac.cmake: * PlatformWin.cmake: Source/WebKit2: * CMakeLists.txt: Tools: * DumpRenderTree/CMakeLists.txt: Canonical link: https://commits.webkit.org/180836@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@206779 268f45cc-cd09-0410-ab3c-d52691b4dbfc
1 parent c144c40 commit 305c822

26 files changed

Lines changed: 370 additions & 14 deletions

‎Source/JavaScriptCore/CMakeLists.txt‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ set(JavaScriptCore_INCLUDE_DIRECTORIES
1818
"${JAVASCRIPTCORE_DIR}/dfg"
1919
"${JAVASCRIPTCORE_DIR}/disassembler"
2020
"${JAVASCRIPTCORE_DIR}/disassembler/udis86"
21+
"${JAVASCRIPTCORE_DIR}/domjit"
2122
"${JAVASCRIPTCORE_DIR}/ftl"
2223
"${JAVASCRIPTCORE_DIR}/heap"
2324
"${JAVASCRIPTCORE_DIR}/debugger"
@@ -1095,6 +1096,7 @@ set(JavaScriptCore_FORWARDING_HEADERS_DIRECTORIES
10951096
debugger
10961097
dfg
10971098
disassembler
1099+
domjit
10981100
heap
10991101
inspector
11001102
interpreter

‎Source/JavaScriptCore/ChangeLog‎

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,74 @@
1+
2016-10-04 Yusuke Suzuki <utatane.tea@gmail.com>
2+
3+
[DOMJIT] Introduce DOMJIT::GetterSetter to tell JIT information
4+
https://bugs.webkit.org/show_bug.cgi?id=162916
5+
6+
Reviewed by Filip Pizlo.
7+
8+
In this patch, we introduce DOMJIT::GetterSetter.
9+
This class maintains information required to emit JIT code in DFG and FTL.
10+
DOMJIT::GetterSetter has 2 virtual functions: checkDOM and callDOM.
11+
These functions can return a DOMJIT::Patchpoint that allows us to inject
12+
appropriate machine code during DFG and FTL phases. DFG and FTL will invoke
13+
these functions to get a patchpoint. And this patchpoint will be used to
14+
emit code corresponding to CheckDOM and CallDOM DFG nodes, which will be added
15+
in subsqeunt patch.
16+
17+
We propagate DOMJIT::GetterSetter through PropertySlot, AccessCase, GetByIdVariant,
18+
and GetByIdStatus along with CustomGetter to teach DFG that this custom access
19+
code has a chance to be inlined with this DOMJIT::GetterSetter information.
20+
Instead of propagating CustomGetterSetter holding DOMJIT::GetterSetter and CustomGetter,
21+
we propagate CustomGetter and DOMJIT::GetterSetter. This is because of the current
22+
CustomGetterSetter design that we reify CustomGetterSetters only when we need to reify
23+
all the properties. This design allows us to avoid frequent CustomGetterSetter allocations
24+
and structure transitions.
25+
26+
Currently, domJIT field is always nullptr since there is no DOMJITAttribute user.
27+
When we add this, we will add code handling this DOMJIT::GetterSetter in DFG::ByteCodeParser.
28+
29+
* CMakeLists.txt:
30+
* JavaScriptCore.xcodeproj/project.pbxproj:
31+
* bytecode/GetByIdStatus.cpp:
32+
(JSC::GetByIdStatus::computeForStubInfoWithoutExitSiteFeedback):
33+
* bytecode/GetByIdVariant.cpp:
34+
(JSC::GetByIdVariant::GetByIdVariant):
35+
(JSC::GetByIdVariant::operator=):
36+
(JSC::GetByIdVariant::attemptToMerge):
37+
(JSC::GetByIdVariant::dumpInContext):
38+
* bytecode/GetByIdVariant.h:
39+
(JSC::GetByIdVariant::domJIT):
40+
(JSC::GetByIdVariant::intrinsic): Deleted.
41+
* bytecode/PolymorphicAccess.cpp:
42+
(JSC::AccessCase::get):
43+
(JSC::AccessCase::clone):
44+
* bytecode/PolymorphicAccess.h:
45+
(JSC::AccessCase::domJIT):
46+
(JSC::AccessCase::RareData::RareData):
47+
* dfg/DFGNode.h:
48+
* domjit/DOMJITGetterSetter.h: Added.
49+
(JSC::DOMJIT::GetterSetter::GetterSetter):
50+
(JSC::DOMJIT::GetterSetter::~GetterSetter):
51+
(JSC::DOMJIT::GetterSetter::getter):
52+
(JSC::DOMJIT::GetterSetter::setter):
53+
(JSC::DOMJIT::GetterSetter::thisClassInfo):
54+
* domjit/DOMJITPatchpoint.h: Added.
55+
(JSC::DOMJIT::Patchpoint::create):
56+
(JSC::DOMJIT::Patchpoint::setGenerator):
57+
(JSC::DOMJIT::Patchpoint::generator):
58+
* jit/Repatch.cpp:
59+
(JSC::tryCacheGetByID):
60+
* runtime/CustomGetterSetter.h:
61+
* runtime/JSObject.h:
62+
(JSC::JSObject::fillCustomGetterPropertySlot):
63+
* runtime/Lookup.h:
64+
(JSC::HashTableValue::domJIT):
65+
(JSC::getStaticPropertySlotFromTable):
66+
(JSC::putEntry):
67+
(JSC::reifyStaticProperty):
68+
* runtime/PropertySlot.h:
69+
(JSC::PropertySlot::domJIT):
70+
(JSC::PropertySlot::setCacheableCustom):
71+
172
2016-09-27 Yusuke Suzuki <utatane.tea@gmail.com>
273

374
[JSC] Add a new byte code op_define_property instead of calling defineProperty

‎Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj‎

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@
271271
0F2DD8141AB3D8BE00BBB8E8 /* DFGArgumentsUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F2DD80F1AB3D8BE00BBB8E8 /* DFGArgumentsUtilities.h */; };
272272
0F2DD8151AB3D8BE00BBB8E8 /* DFGForAllKills.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F2DD8101AB3D8BE00BBB8E8 /* DFGForAllKills.h */; };
273273
0F2E892C16D028AD009E4FD2 /* UnusedPointer.h in Headers */ = {isa = PBXBuildFile; fileRef = 65987F2F16828A7E003C2F8D /* UnusedPointer.h */; settings = {ATTRIBUTES = (Private, ); }; };
274-
0F2E892D16D02BAF009E4FD2 /* DFGMinifiedID.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FB4B51016B3A964003F696B /* DFGMinifiedID.h */; };
274+
0F2E892D16D02BAF009E4FD2 /* DFGMinifiedID.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FB4B51016B3A964003F696B /* DFGMinifiedID.h */; settings = {ATTRIBUTES = (Private, ); }; };
275275
0F2FC77216E12F710038D976 /* DFGDCEPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F2FC77016E12F6F0038D976 /* DFGDCEPhase.cpp */; };
276276
0F2FC77316E12F740038D976 /* DFGDCEPhase.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F2FC77116E12F6F0038D976 /* DFGDCEPhase.h */; };
277277
0F2FCCF918A60070001A27F8 /* DFGGraphSafepoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F2FCCF218A60070001A27F8 /* DFGGraphSafepoint.cpp */; };
@@ -2067,6 +2067,9 @@
20672067
E18E3A590DF9278C00D90B34 /* VM.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E18E3A570DF9278C00D90B34 /* VM.cpp */; };
20682068
E318CBC01B8AEF5100A2929D /* JSModuleNamespaceObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E318CBBE1B8AEF5100A2929D /* JSModuleNamespaceObject.cpp */; };
20692069
E318CBC11B8AEF5100A2929D /* JSModuleNamespaceObject.h in Headers */ = {isa = PBXBuildFile; fileRef = E318CBBF1B8AEF5100A2929D /* JSModuleNamespaceObject.h */; settings = {ATTRIBUTES = (Private, ); }; };
2070+
E328C6C71DA4304500D255FD /* MaxFrameExtentForSlowPathCall.h in Headers */ = {isa = PBXBuildFile; fileRef = 65860177185A8F5E00030EEE /* MaxFrameExtentForSlowPathCall.h */; settings = {ATTRIBUTES = (Private, ); }; };
2071+
E328C6C81DA4306100D255FD /* RegisterAtOffsetList.h in Headers */ = {isa = PBXBuildFile; fileRef = 6540C79D1B82D99D000F6B79 /* RegisterAtOffsetList.h */; settings = {ATTRIBUTES = (Private, ); }; };
2072+
E328C6C91DA432F900D255FD /* RegisterAtOffset.h in Headers */ = {isa = PBXBuildFile; fileRef = 6540C79F1B82D9CE000F6B79 /* RegisterAtOffset.h */; settings = {ATTRIBUTES = (Private, ); }; };
20702073
E328DAE71D38D004001A2529 /* BytecodeGeneratorification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3D264261D38C042000BE174 /* BytecodeGeneratorification.cpp */; };
20712074
E328DAE81D38D005001A2529 /* BytecodeGeneratorification.h in Headers */ = {isa = PBXBuildFile; fileRef = E3D264271D38C042000BE174 /* BytecodeGeneratorification.h */; settings = {ATTRIBUTES = (Private, ); }; };
20722075
E328DAE91D38D005001A2529 /* BytecodeGraph.h in Headers */ = {isa = PBXBuildFile; fileRef = E3D264281D38C042000BE174 /* BytecodeGraph.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -2100,10 +2103,12 @@
21002103
E39DA4A61B7E8B7C0084F33A /* JSModuleRecord.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E39DA4A41B7E8B7C0084F33A /* JSModuleRecord.cpp */; };
21012104
E39DA4A71B7E8B7C0084F33A /* JSModuleRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = E39DA4A51B7E8B7C0084F33A /* JSModuleRecord.h */; settings = {ATTRIBUTES = (Private, ); }; };
21022105
E3A421431D6F58930007C617 /* PreciseJumpTargetsInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = E3A421421D6F588F0007C617 /* PreciseJumpTargetsInlines.h */; settings = {ATTRIBUTES = (Private, ); }; };
2106+
E3C08E3C1DA41B810039478F /* DOMJITPatchpoint.h in Headers */ = {isa = PBXBuildFile; fileRef = E3C08E3B1DA41B7B0039478F /* DOMJITPatchpoint.h */; settings = {ATTRIBUTES = (Private, ); }; };
21032107
E3D239C81B829C1C00BBEF67 /* JSModuleEnvironment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3D239C61B829C1C00BBEF67 /* JSModuleEnvironment.cpp */; };
21042108
E3D239C91B829C1C00BBEF67 /* JSModuleEnvironment.h in Headers */ = {isa = PBXBuildFile; fileRef = E3D239C71B829C1C00BBEF67 /* JSModuleEnvironment.h */; settings = {ATTRIBUTES = (Private, ); }; };
21052109
E3EF88741B66DF23003F26CB /* JSPropertyNameIterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3EF88721B66DF23003F26CB /* JSPropertyNameIterator.cpp */; };
21062110
E3EF88751B66DF23003F26CB /* JSPropertyNameIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = E3EF88731B66DF23003F26CB /* JSPropertyNameIterator.h */; settings = {ATTRIBUTES = (Private, ); }; };
2111+
E3FF75331D9CEA1800C7E16D /* DOMJITGetterSetter.h in Headers */ = {isa = PBXBuildFile; fileRef = E3FF752F1D9CEA1200C7E16D /* DOMJITGetterSetter.h */; settings = {ATTRIBUTES = (Private, ); }; };
21072112
E49DC16B12EF293E00184A1F /* SourceProviderCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E49DC15512EF277200184A1F /* SourceProviderCache.cpp */; };
21082113
E49DC16C12EF294E00184A1F /* SourceProviderCache.h in Headers */ = {isa = PBXBuildFile; fileRef = E49DC15112EF272200184A1F /* SourceProviderCache.h */; settings = {ATTRIBUTES = (Private, ); }; };
21092114
E49DC16D12EF295300184A1F /* SourceProviderCacheItem.h in Headers */ = {isa = PBXBuildFile; fileRef = E49DC14912EF261A00184A1F /* SourceProviderCacheItem.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -4397,6 +4402,7 @@
43974402
E39DA4A41B7E8B7C0084F33A /* JSModuleRecord.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSModuleRecord.cpp; sourceTree = "<group>"; };
43984403
E39DA4A51B7E8B7C0084F33A /* JSModuleRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSModuleRecord.h; sourceTree = "<group>"; };
43994404
E3A421421D6F588F0007C617 /* PreciseJumpTargetsInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PreciseJumpTargetsInlines.h; sourceTree = "<group>"; };
4405+
E3C08E3B1DA41B7B0039478F /* DOMJITPatchpoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMJITPatchpoint.h; sourceTree = "<group>"; };
44004406
E3D239C61B829C1C00BBEF67 /* JSModuleEnvironment.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSModuleEnvironment.cpp; sourceTree = "<group>"; };
44014407
E3D239C71B829C1C00BBEF67 /* JSModuleEnvironment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSModuleEnvironment.h; sourceTree = "<group>"; };
44024408
E3D264261D38C042000BE174 /* BytecodeGeneratorification.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BytecodeGeneratorification.cpp; sourceTree = "<group>"; };
@@ -4406,6 +4412,7 @@
44064412
E3D2642A1D38C042000BE174 /* BytecodeRewriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BytecodeRewriter.h; sourceTree = "<group>"; };
44074413
E3EF88721B66DF23003F26CB /* JSPropertyNameIterator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPropertyNameIterator.cpp; sourceTree = "<group>"; };
44084414
E3EF88731B66DF23003F26CB /* JSPropertyNameIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPropertyNameIterator.h; sourceTree = "<group>"; };
4415+
E3FF752F1D9CEA1200C7E16D /* DOMJITGetterSetter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMJITGetterSetter.h; sourceTree = "<group>"; };
44094416
E49DC14912EF261A00184A1F /* SourceProviderCacheItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SourceProviderCacheItem.h; sourceTree = "<group>"; };
44104417
E49DC15112EF272200184A1F /* SourceProviderCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SourceProviderCache.h; sourceTree = "<group>"; };
44114418
E49DC15512EF277200184A1F /* SourceProviderCache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SourceProviderCache.cpp; sourceTree = "<group>"; };
@@ -4664,6 +4671,7 @@
46644671
650FDF8D09D0FCA700769E54 /* Derived Sources */,
46654672
86EC9DB31328DF44002B2AD7 /* dfg */,
46664673
0FF4272E158EBCCE004CB9FF /* disassembler */,
4674+
E3FF752D1D9CE9EA00C7E16D /* domjit */,
46674675
0867D69AFE84028FC02AAC07 /* Frameworks */,
46684676
0FEA09FC1705137F00BB722C /* ftl */,
46694677
142E312A134FF0A600AFADB5 /* heap */,
@@ -7170,6 +7178,15 @@
71707178
path = codegen;
71717179
sourceTree = "<group>";
71727180
};
7181+
E3FF752D1D9CE9EA00C7E16D /* domjit */ = {
7182+
isa = PBXGroup;
7183+
children = (
7184+
E3FF752F1D9CEA1200C7E16D /* DOMJITGetterSetter.h */,
7185+
E3C08E3B1DA41B7B0039478F /* DOMJITPatchpoint.h */,
7186+
);
7187+
path = domjit;
7188+
sourceTree = "<group>";
7189+
};
71737190
/* End PBXGroup section */
71747191

71757192
/* Begin PBXHeadersBuildPhase section */
@@ -7228,6 +7245,7 @@
72287245
0FEC858A1BDACDC70080FF74 /* AirSpillEverything.h in Headers */,
72297246
0FEC858C1BDACDC70080FF74 /* AirStackSlot.h in Headers */,
72307247
0FEC858E1BDACDC70080FF74 /* AirTmp.h in Headers */,
7248+
E328C6C81DA4306100D255FD /* RegisterAtOffsetList.h in Headers */,
72317249
0FEC858F1BDACDC70080FF74 /* AirTmpInlines.h in Headers */,
72327250
0FEC85911BDACDC70080FF74 /* AirValidate.h in Headers */,
72337251
A5EA70E919F5B1010098F5EC /* AlternateDispatchableAgent.h in Headers */,
@@ -7454,6 +7472,7 @@
74547472
0F2DD8121AB3D8BE00BBB8E8 /* DFGArgumentsEliminationPhase.h in Headers */,
74557473
0F2DD8141AB3D8BE00BBB8E8 /* DFGArgumentsUtilities.h in Headers */,
74567474
0F485322187750560083B687 /* DFGArithMode.h in Headers */,
7475+
E3C08E3C1DA41B810039478F /* DOMJITPatchpoint.h in Headers */,
74577476
0F05C3B41683CF9200BAF45B /* DFGArrayifySlowPathGenerator.h in Headers */,
74587477
0F63948515E4811B006A597C /* DFGArrayMode.h in Headers */,
74597478
A7D9A29517A0BC7400EE2618 /* DFGAtTailAbstractState.h in Headers */,
@@ -7615,6 +7634,7 @@
76157634
0FC20CBA18556A3500C9E954 /* DFGSSALoweringPhase.h in Headers */,
76167635
0F9FB4F517FCB91700CB67F8 /* DFGStackLayoutPhase.h in Headers */,
76177636
0F4F29E018B6AD1C0057BC15 /* DFGStaticExecutionCountEstimationPhase.h in Headers */,
7637+
E3FF75331D9CEA1800C7E16D /* DOMJITGetterSetter.h in Headers */,
76187638
0F9E32641B05AB0400801ED5 /* DFGStoreBarrierInsertionPhase.h in Headers */,
76197639
0FC20CB61852E2C600C9E954 /* DFGStrengthReductionPhase.h in Headers */,
76207640
0F63947815DCE34B006A597C /* DFGStructureAbstractValue.h in Headers */,
@@ -7839,6 +7859,7 @@
78397859
A57D23E61890CEBF0031C7FA /* InspectorDebuggerAgent.h in Headers */,
78407860
A5D0A1BB1862301B00C7B496 /* InspectorEnvironment.h in Headers */,
78417861
A5945595182479EB00CC3843 /* InspectorFrontendChannel.h in Headers */,
7862+
E328C6C71DA4304500D255FD /* MaxFrameExtentForSlowPathCall.h in Headers */,
78427863
A532438A18568335002ED692 /* InspectorFrontendDispatchers.h in Headers */,
78437864
99F1A7011B98FBEC00463B26 /* InspectorFrontendRouter.h in Headers */,
78447865
A5339EC61BB399A60054F005 /* InspectorHeapAgent.h in Headers */,
@@ -8175,6 +8196,7 @@
81758196
0FCCAE4516D0CF7400D0C65B /* ParserError.h in Headers */,
81768197
DCF3D56A1CD29470003D5C65 /* LazyClassStructure.h in Headers */,
81778198
A77F1825164192C700640A47 /* ParserModes.h in Headers */,
8199+
E328C6C91DA432F900D255FD /* RegisterAtOffset.h in Headers */,
81788200
65303D641447B9E100D3F904 /* ParserTokens.h in Headers */,
81798201
0FF9CE741B9CD6D0004EDCA6 /* PolymorphicAccess.h in Headers */,
81808202
0FE834181A6EF97B00D04847 /* PolymorphicCallStubRoutine.h in Headers */,

‎Source/JavaScriptCore/bytecode/GetByIdStatus.cpp‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@
3737
#include <wtf/ListDump.h>
3838

3939
namespace JSC {
40+
namespace DOMJIT {
41+
class GetterSetter;
42+
}
4043

4144
bool GetByIdStatus::appendVariant(const GetByIdVariant& variant)
4245
{
@@ -215,6 +218,7 @@ GetByIdStatus GetByIdStatus::computeForStubInfoWithoutExitSiteFeedback(
215218
case ComplexGetStatus::Inlineable: {
216219
std::unique_ptr<CallLinkStatus> callLinkStatus;
217220
JSFunction* intrinsicFunction = nullptr;
221+
DOMJIT::GetterSetter* domJIT = nullptr;
218222

219223
switch (access.type()) {
220224
case AccessCase::Load:
@@ -234,6 +238,12 @@ GetByIdStatus GetByIdStatus::computeForStubInfoWithoutExitSiteFeedback(
234238
}
235239
break;
236240
}
241+
case AccessCase::CustomAccessorGetter: {
242+
domJIT = access.domJIT();
243+
if (!domJIT)
244+
return GetByIdStatus(slowPathState, true);
245+
break;
246+
}
237247
default: {
238248
// FIXME: It would be totally sweet to support more of these at some point in the
239249
// future. https://bugs.webkit.org/show_bug.cgi?id=133052
@@ -244,7 +254,8 @@ GetByIdStatus GetByIdStatus::computeForStubInfoWithoutExitSiteFeedback(
244254
GetByIdVariant variant(
245255
StructureSet(structure), complexGetStatus.offset(),
246256
complexGetStatus.conditionSet(), WTFMove(callLinkStatus),
247-
intrinsicFunction);
257+
intrinsicFunction,
258+
domJIT);
248259

249260
if (!result.appendVariant(variant))
250261
return GetByIdStatus(slowPathState, true);

‎Source/JavaScriptCore/bytecode/GetByIdVariant.cpp‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,14 @@ GetByIdVariant::GetByIdVariant(
3636
const StructureSet& structureSet, PropertyOffset offset,
3737
const ObjectPropertyConditionSet& conditionSet,
3838
std::unique_ptr<CallLinkStatus> callLinkStatus,
39-
JSFunction* intrinsicFunction)
39+
JSFunction* intrinsicFunction,
40+
DOMJIT::GetterSetter* domJIT)
4041
: m_structureSet(structureSet)
4142
, m_conditionSet(conditionSet)
4243
, m_offset(offset)
4344
, m_callLinkStatus(WTFMove(callLinkStatus))
4445
, m_intrinsicFunction(intrinsicFunction)
46+
, m_domJIT(domJIT)
4547
{
4648
if (!structureSet.size()) {
4749
ASSERT(offset == invalidOffset);
@@ -65,6 +67,7 @@ GetByIdVariant& GetByIdVariant::operator=(const GetByIdVariant& other)
6567
m_conditionSet = other.m_conditionSet;
6668
m_offset = other.m_offset;
6769
m_intrinsicFunction = other.m_intrinsicFunction;
70+
m_domJIT = other.m_domJIT;
6871
if (other.m_callLinkStatus)
6972
m_callLinkStatus = std::make_unique<CallLinkStatus>(*other.m_callLinkStatus);
7073
else
@@ -103,6 +106,9 @@ bool GetByIdVariant::attemptToMerge(const GetByIdVariant& other)
103106
if (!canMergeIntrinsicStructures(other))
104107
return false;
105108

109+
if (m_domJIT != other.m_domJIT)
110+
return false;
111+
106112
if (m_conditionSet.isEmpty() != other.m_conditionSet.isEmpty())
107113
return false;
108114

@@ -138,6 +144,8 @@ void GetByIdVariant::dumpInContext(PrintStream& out, DumpContext* context) const
138144
out.print(", call = ", *m_callLinkStatus);
139145
if (m_intrinsicFunction)
140146
out.print(", intrinsic = ", *m_intrinsicFunction);
147+
if (m_domJIT)
148+
out.print(", domjit = ", RawPointer(m_domJIT));
141149
out.print(">");
142150
}
143151

‎Source/JavaScriptCore/bytecode/GetByIdVariant.h‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@
3232
#include "StructureSet.h"
3333

3434
namespace JSC {
35+
namespace DOMJIT {
36+
class GetterSetter;
37+
}
3538

3639
class CallLinkStatus;
3740
class GetByIdStatus;
@@ -43,7 +46,8 @@ class GetByIdVariant {
4346
const StructureSet& structureSet = StructureSet(), PropertyOffset offset = invalidOffset,
4447
const ObjectPropertyConditionSet& = ObjectPropertyConditionSet(),
4548
std::unique_ptr<CallLinkStatus> = nullptr,
46-
JSFunction* = nullptr);
49+
JSFunction* = nullptr,
50+
DOMJIT::GetterSetter* = nullptr);
4751

4852
~GetByIdVariant();
4953

@@ -62,6 +66,7 @@ class GetByIdVariant {
6266
CallLinkStatus* callLinkStatus() const { return m_callLinkStatus.get(); }
6367
JSFunction* intrinsicFunction() const { return m_intrinsicFunction; }
6468
Intrinsic intrinsic() const { return m_intrinsicFunction ? m_intrinsicFunction->intrinsic() : NoIntrinsic; }
69+
DOMJIT::GetterSetter* domJIT() const { return m_domJIT; }
6570

6671
bool isPropertyUnset() const { return offset() == invalidOffset; }
6772

@@ -80,6 +85,7 @@ class GetByIdVariant {
8085
PropertyOffset m_offset;
8186
std::unique_ptr<CallLinkStatus> m_callLinkStatus;
8287
JSFunction* m_intrinsicFunction;
88+
DOMJIT::GetterSetter* m_domJIT;
8389
};
8490

8591
} // namespace JSC

0 commit comments

Comments
 (0)