Changeset 207869 in webkit
- Timestamp:
- Oct 25, 2016 10:43:04 PM (7 years ago)
- Location:
- trunk/Source
- Files:
-
- 3 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r207861 r207869 1 2016-10-25 Yusuke Suzuki <utatane.tea@gmail.com> 2 3 [DOMJIT] Tell IDL result type to DFG to drop type checks in AI 4 https://bugs.webkit.org/show_bug.cgi?id=163900 5 6 Reviewed by Sam Weinig. 7 8 The IDL tells the conservative result type. While we use the heap prediction 9 for prediction propagation phase in DOMJIT getter (it is offered by get_by_id!), 10 we leverage the type told by IDL to produce the abstract value with the proven type 11 in AI. It effectively drops unnecessary type checks followed by CallDOM operations. 12 13 For example, when you write the code like, 14 15 if (node.nodeType === 9) { 16 // document. 17 } 18 19 Previously, we inserted a Int32 check for the result of node.nodeType. 20 It is dropped now. 21 22 We annotate the DOMJIT getter in jsc.cpp to ensure that the unnecessary type checks 23 are correctly dropped when executing JSTests/stress/domjit-getter.js. 24 25 * dfg/DFGAbstractInterpreterInlines.h: 26 (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): 27 * domjit/DOMJITGetterSetter.h: 28 (JSC::DOMJIT::GetterSetter::GetterSetter): 29 (JSC::DOMJIT::GetterSetter::resultType): 30 * jsc.cpp: 31 (WTF::DOMJITGetter::DOMJITNodeDOMJIT::DOMJITNodeDOMJIT): 32 (WTF::DOMJITGetterComplex::DOMJITNodeDOMJIT::DOMJITNodeDOMJIT): 33 1 34 2016-10-25 Mark Lam <mark.lam@apple.com> 2 35 -
trunk/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h
r207787 r207869 2291 2291 } 2292 2292 case CallDOM: { 2293 DOMJIT::CallDOMPatchpoint* patchpoint = node->callDOMData()->patchpoint; 2293 CallDOMData* callDOMData = node->callDOMData(); 2294 DOMJIT::CallDOMPatchpoint* patchpoint = callDOMData->patchpoint; 2294 2295 if (patchpoint->effect.writes) 2295 2296 clobberWorld(node->origin.semantic, clobberLimit); 2296 forNode(node). makeBytecodeTop();2297 forNode(node).setType(m_graph, callDOMData->domJIT->resultType()); 2297 2298 break; 2298 2299 } -
trunk/Source/JavaScriptCore/domjit/DOMJITGetterSetter.h
r207239 r207869 38 38 typedef PutPropertySlot::PutValueFunc CustomSetter; 39 39 40 GetterSetter(CustomGetter getter, CustomSetter setter, const ClassInfo* classInfo )40 GetterSetter(CustomGetter getter, CustomSetter setter, const ClassInfo* classInfo, SpeculatedType resultType) 41 41 : m_getter(getter) 42 42 , m_setter(setter) 43 43 , m_thisClassInfo(classInfo) 44 , m_resultType(resultType) 44 45 { 45 46 } … … 50 51 CustomSetter setter() const { return m_setter; } 51 52 const ClassInfo* thisClassInfo() const { return m_thisClassInfo; } 53 SpeculatedType resultType() const { return m_resultType; } 52 54 53 55 #if ENABLE(JIT) … … 60 62 CustomSetter m_setter; 61 63 const ClassInfo* m_thisClassInfo; 64 SpeculatedType m_resultType; 62 65 }; 63 66 -
trunk/Source/JavaScriptCore/jsc.cpp
r207842 r207869 617 617 public: 618 618 DOMJITNodeDOMJIT() 619 : DOMJIT::GetterSetter(DOMJITGetter::customGetter, nullptr, DOMJITNode::info() )619 : DOMJIT::GetterSetter(DOMJITGetter::customGetter, nullptr, DOMJITNode::info(), SpecInt32Only) 620 620 { 621 621 } … … 702 702 public: 703 703 DOMJITNodeDOMJIT() 704 : DOMJIT::GetterSetter(DOMJITGetterComplex::customGetter, nullptr, DOMJITNode::info() )704 : DOMJIT::GetterSetter(DOMJITGetterComplex::customGetter, nullptr, DOMJITNode::info(), SpecInt32Only) 705 705 { 706 706 } -
trunk/Source/WebCore/ChangeLog
r207868 r207869 1 2016-10-25 Yusuke Suzuki <utatane.tea@gmail.com> 2 3 [DOMJIT] Tell IDL result type to DFG to drop type checks in AI 4 https://bugs.webkit.org/show_bug.cgi?id=163900 5 6 Reviewed by Sam Weinig. 7 8 Add TestDOMJIT.idl for bindings generation tests. 9 10 * bindings/scripts/CodeGeneratorJS.pm: 11 (GetResultTypeFilter): 12 (GenerateImplementation): 13 * bindings/scripts/test/JS/JSTestDOMJIT.cpp: Added. 14 (WebCore::JSTestDOMJITPrototype::create): 15 (WebCore::JSTestDOMJITPrototype::createStructure): 16 (WebCore::JSTestDOMJITPrototype::JSTestDOMJITPrototype): 17 (WebCore::JSTestDOMJITConstructor::prototypeForStructure): 18 (WebCore::JSTestDOMJITConstructor::initializeProperties): 19 (WebCore::JSTestDOMJITPrototype::finishCreation): 20 (WebCore::JSTestDOMJIT::JSTestDOMJIT): 21 (WebCore::JSTestDOMJIT::createPrototype): 22 (WebCore::JSTestDOMJIT::prototype): 23 (WebCore::BindingCaller<JSTestDOMJIT>::castForAttribute): 24 (WebCore::jsTestDOMJITAnyAttr): 25 (WebCore::jsTestDOMJITAnyAttrGetter): 26 (WebCore::TestDOMJITAnyAttrDOMJIT::TestDOMJITAnyAttrDOMJIT): 27 (WebCore::domJITGetterSetterForTestDOMJITAnyAttr): 28 (WebCore::jsTestDOMJITBooleanAttr): 29 (WebCore::jsTestDOMJITBooleanAttrGetter): 30 (WebCore::TestDOMJITBooleanAttrDOMJIT::TestDOMJITBooleanAttrDOMJIT): 31 (WebCore::domJITGetterSetterForTestDOMJITBooleanAttr): 32 (WebCore::jsTestDOMJITByteAttr): 33 (WebCore::jsTestDOMJITByteAttrGetter): 34 (WebCore::TestDOMJITByteAttrDOMJIT::TestDOMJITByteAttrDOMJIT): 35 (WebCore::domJITGetterSetterForTestDOMJITByteAttr): 36 (WebCore::jsTestDOMJITOctetAttr): 37 (WebCore::jsTestDOMJITOctetAttrGetter): 38 (WebCore::TestDOMJITOctetAttrDOMJIT::TestDOMJITOctetAttrDOMJIT): 39 (WebCore::domJITGetterSetterForTestDOMJITOctetAttr): 40 (WebCore::jsTestDOMJITShortAttr): 41 (WebCore::jsTestDOMJITShortAttrGetter): 42 (WebCore::TestDOMJITShortAttrDOMJIT::TestDOMJITShortAttrDOMJIT): 43 (WebCore::domJITGetterSetterForTestDOMJITShortAttr): 44 (WebCore::jsTestDOMJITUnsignedShortAttr): 45 (WebCore::jsTestDOMJITUnsignedShortAttrGetter): 46 (WebCore::TestDOMJITUnsignedShortAttrDOMJIT::TestDOMJITUnsignedShortAttrDOMJIT): 47 (WebCore::domJITGetterSetterForTestDOMJITUnsignedShortAttr): 48 (WebCore::jsTestDOMJITLongAttr): 49 (WebCore::jsTestDOMJITLongAttrGetter): 50 (WebCore::TestDOMJITLongAttrDOMJIT::TestDOMJITLongAttrDOMJIT): 51 (WebCore::domJITGetterSetterForTestDOMJITLongAttr): 52 (WebCore::jsTestDOMJITUnsignedLongAttr): 53 (WebCore::jsTestDOMJITUnsignedLongAttrGetter): 54 (WebCore::TestDOMJITUnsignedLongAttrDOMJIT::TestDOMJITUnsignedLongAttrDOMJIT): 55 (WebCore::domJITGetterSetterForTestDOMJITUnsignedLongAttr): 56 (WebCore::jsTestDOMJITLongLongAttr): 57 (WebCore::jsTestDOMJITLongLongAttrGetter): 58 (WebCore::TestDOMJITLongLongAttrDOMJIT::TestDOMJITLongLongAttrDOMJIT): 59 (WebCore::domJITGetterSetterForTestDOMJITLongLongAttr): 60 (WebCore::jsTestDOMJITUnsignedLongLongAttr): 61 (WebCore::jsTestDOMJITUnsignedLongLongAttrGetter): 62 (WebCore::TestDOMJITUnsignedLongLongAttrDOMJIT::TestDOMJITUnsignedLongLongAttrDOMJIT): 63 (WebCore::domJITGetterSetterForTestDOMJITUnsignedLongLongAttr): 64 (WebCore::jsTestDOMJITFloatAttr): 65 (WebCore::jsTestDOMJITFloatAttrGetter): 66 (WebCore::TestDOMJITFloatAttrDOMJIT::TestDOMJITFloatAttrDOMJIT): 67 (WebCore::domJITGetterSetterForTestDOMJITFloatAttr): 68 (WebCore::jsTestDOMJITUnrestrictedFloatAttr): 69 (WebCore::jsTestDOMJITUnrestrictedFloatAttrGetter): 70 (WebCore::TestDOMJITUnrestrictedFloatAttrDOMJIT::TestDOMJITUnrestrictedFloatAttrDOMJIT): 71 (WebCore::domJITGetterSetterForTestDOMJITUnrestrictedFloatAttr): 72 (WebCore::jsTestDOMJITDoubleAttr): 73 (WebCore::jsTestDOMJITDoubleAttrGetter): 74 (WebCore::TestDOMJITDoubleAttrDOMJIT::TestDOMJITDoubleAttrDOMJIT): 75 (WebCore::domJITGetterSetterForTestDOMJITDoubleAttr): 76 (WebCore::jsTestDOMJITUnrestrictedDoubleAttr): 77 (WebCore::jsTestDOMJITUnrestrictedDoubleAttrGetter): 78 (WebCore::TestDOMJITUnrestrictedDoubleAttrDOMJIT::TestDOMJITUnrestrictedDoubleAttrDOMJIT): 79 (WebCore::domJITGetterSetterForTestDOMJITUnrestrictedDoubleAttr): 80 (WebCore::jsTestDOMJITDomStringAttr): 81 (WebCore::jsTestDOMJITDomStringAttrGetter): 82 (WebCore::TestDOMJITDomStringAttrDOMJIT::TestDOMJITDomStringAttrDOMJIT): 83 (WebCore::domJITGetterSetterForTestDOMJITDomStringAttr): 84 (WebCore::jsTestDOMJITByteStringAttr): 85 (WebCore::jsTestDOMJITByteStringAttrGetter): 86 (WebCore::TestDOMJITByteStringAttrDOMJIT::TestDOMJITByteStringAttrDOMJIT): 87 (WebCore::domJITGetterSetterForTestDOMJITByteStringAttr): 88 (WebCore::jsTestDOMJITUsvStringAttr): 89 (WebCore::jsTestDOMJITUsvStringAttrGetter): 90 (WebCore::TestDOMJITUsvStringAttrDOMJIT::TestDOMJITUsvStringAttrDOMJIT): 91 (WebCore::domJITGetterSetterForTestDOMJITUsvStringAttr): 92 (WebCore::jsTestDOMJITNodeAttr): 93 (WebCore::jsTestDOMJITNodeAttrGetter): 94 (WebCore::TestDOMJITNodeAttrDOMJIT::TestDOMJITNodeAttrDOMJIT): 95 (WebCore::domJITGetterSetterForTestDOMJITNodeAttr): 96 (WebCore::jsTestDOMJITBooleanNullableAttr): 97 (WebCore::jsTestDOMJITBooleanNullableAttrGetter): 98 (WebCore::TestDOMJITBooleanNullableAttrDOMJIT::TestDOMJITBooleanNullableAttrDOMJIT): 99 (WebCore::domJITGetterSetterForTestDOMJITBooleanNullableAttr): 100 (WebCore::jsTestDOMJITByteNullableAttr): 101 (WebCore::jsTestDOMJITByteNullableAttrGetter): 102 (WebCore::TestDOMJITByteNullableAttrDOMJIT::TestDOMJITByteNullableAttrDOMJIT): 103 (WebCore::domJITGetterSetterForTestDOMJITByteNullableAttr): 104 (WebCore::jsTestDOMJITOctetNullableAttr): 105 (WebCore::jsTestDOMJITOctetNullableAttrGetter): 106 (WebCore::TestDOMJITOctetNullableAttrDOMJIT::TestDOMJITOctetNullableAttrDOMJIT): 107 (WebCore::domJITGetterSetterForTestDOMJITOctetNullableAttr): 108 (WebCore::jsTestDOMJITShortNullableAttr): 109 (WebCore::jsTestDOMJITShortNullableAttrGetter): 110 (WebCore::TestDOMJITShortNullableAttrDOMJIT::TestDOMJITShortNullableAttrDOMJIT): 111 (WebCore::domJITGetterSetterForTestDOMJITShortNullableAttr): 112 (WebCore::jsTestDOMJITUnsignedShortNullableAttr): 113 (WebCore::jsTestDOMJITUnsignedShortNullableAttrGetter): 114 (WebCore::TestDOMJITUnsignedShortNullableAttrDOMJIT::TestDOMJITUnsignedShortNullableAttrDOMJIT): 115 (WebCore::domJITGetterSetterForTestDOMJITUnsignedShortNullableAttr): 116 (WebCore::jsTestDOMJITLongNullableAttr): 117 (WebCore::jsTestDOMJITLongNullableAttrGetter): 118 (WebCore::TestDOMJITLongNullableAttrDOMJIT::TestDOMJITLongNullableAttrDOMJIT): 119 (WebCore::domJITGetterSetterForTestDOMJITLongNullableAttr): 120 (WebCore::jsTestDOMJITUnsignedLongNullableAttr): 121 (WebCore::jsTestDOMJITUnsignedLongNullableAttrGetter): 122 (WebCore::TestDOMJITUnsignedLongNullableAttrDOMJIT::TestDOMJITUnsignedLongNullableAttrDOMJIT): 123 (WebCore::domJITGetterSetterForTestDOMJITUnsignedLongNullableAttr): 124 (WebCore::jsTestDOMJITLongLongNullableAttr): 125 (WebCore::jsTestDOMJITLongLongNullableAttrGetter): 126 (WebCore::TestDOMJITLongLongNullableAttrDOMJIT::TestDOMJITLongLongNullableAttrDOMJIT): 127 (WebCore::domJITGetterSetterForTestDOMJITLongLongNullableAttr): 128 (WebCore::jsTestDOMJITUnsignedLongLongNullableAttr): 129 (WebCore::jsTestDOMJITUnsignedLongLongNullableAttrGetter): 130 (WebCore::TestDOMJITUnsignedLongLongNullableAttrDOMJIT::TestDOMJITUnsignedLongLongNullableAttrDOMJIT): 131 (WebCore::domJITGetterSetterForTestDOMJITUnsignedLongLongNullableAttr): 132 (WebCore::jsTestDOMJITFloatNullableAttr): 133 (WebCore::jsTestDOMJITFloatNullableAttrGetter): 134 (WebCore::TestDOMJITFloatNullableAttrDOMJIT::TestDOMJITFloatNullableAttrDOMJIT): 135 (WebCore::domJITGetterSetterForTestDOMJITFloatNullableAttr): 136 (WebCore::jsTestDOMJITUnrestrictedFloatNullableAttr): 137 (WebCore::jsTestDOMJITUnrestrictedFloatNullableAttrGetter): 138 (WebCore::TestDOMJITUnrestrictedFloatNullableAttrDOMJIT::TestDOMJITUnrestrictedFloatNullableAttrDOMJIT): 139 (WebCore::domJITGetterSetterForTestDOMJITUnrestrictedFloatNullableAttr): 140 (WebCore::jsTestDOMJITDoubleNullableAttr): 141 (WebCore::jsTestDOMJITDoubleNullableAttrGetter): 142 (WebCore::TestDOMJITDoubleNullableAttrDOMJIT::TestDOMJITDoubleNullableAttrDOMJIT): 143 (WebCore::domJITGetterSetterForTestDOMJITDoubleNullableAttr): 144 (WebCore::jsTestDOMJITUnrestrictedDoubleNullableAttr): 145 (WebCore::jsTestDOMJITUnrestrictedDoubleNullableAttrGetter): 146 (WebCore::TestDOMJITUnrestrictedDoubleNullableAttrDOMJIT::TestDOMJITUnrestrictedDoubleNullableAttrDOMJIT): 147 (WebCore::domJITGetterSetterForTestDOMJITUnrestrictedDoubleNullableAttr): 148 (WebCore::jsTestDOMJITDomStringNullableAttr): 149 (WebCore::jsTestDOMJITDomStringNullableAttrGetter): 150 (WebCore::TestDOMJITDomStringNullableAttrDOMJIT::TestDOMJITDomStringNullableAttrDOMJIT): 151 (WebCore::domJITGetterSetterForTestDOMJITDomStringNullableAttr): 152 (WebCore::jsTestDOMJITByteStringNullableAttr): 153 (WebCore::jsTestDOMJITByteStringNullableAttrGetter): 154 (WebCore::TestDOMJITByteStringNullableAttrDOMJIT::TestDOMJITByteStringNullableAttrDOMJIT): 155 (WebCore::domJITGetterSetterForTestDOMJITByteStringNullableAttr): 156 (WebCore::jsTestDOMJITUsvStringNullableAttr): 157 (WebCore::jsTestDOMJITUsvStringNullableAttrGetter): 158 (WebCore::TestDOMJITUsvStringNullableAttrDOMJIT::TestDOMJITUsvStringNullableAttrDOMJIT): 159 (WebCore::domJITGetterSetterForTestDOMJITUsvStringNullableAttr): 160 (WebCore::jsTestDOMJITNodeNullableAttr): 161 (WebCore::jsTestDOMJITNodeNullableAttrGetter): 162 (WebCore::TestDOMJITNodeNullableAttrDOMJIT::TestDOMJITNodeNullableAttrDOMJIT): 163 (WebCore::domJITGetterSetterForTestDOMJITNodeNullableAttr): 164 (WebCore::jsTestDOMJITConstructor): 165 (WebCore::setJSTestDOMJITConstructor): 166 (WebCore::JSTestDOMJIT::getConstructor): 167 (WebCore::JSTestDOMJIT::visitChildren): 168 * bindings/scripts/test/JS/JSTestDOMJIT.h: Added. 169 (WebCore::JSTestDOMJIT::create): 170 (WebCore::JSTestDOMJIT::createStructure): 171 (WebCore::JSTestDOMJIT::wrapped): 172 (WebCore::JSTestDOMJIT::finishCreation): 173 * bindings/scripts/test/TestDOMJIT.idl: Added. 174 1 175 2016-10-25 Brent Fulgham <bfulgham@apple.com> 2 176 -
trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
r207829 r207869 2492 2492 } 2493 2493 2494 sub GetResultTypeFilter 2495 { 2496 my ($signature) = @_; 2497 my $idlType = $signature->idlType; 2498 2499 my %TypeFilters = ( 2500 "any" => "SpecHeapTop", 2501 "boolean" => "SpecBoolean", 2502 "byte" => "SpecInt32Only", 2503 "octet" => "SpecInt32Only", 2504 "short" => "SpecInt32Only", 2505 "unsigned short" => "SpecInt32Only", 2506 "long" => "SpecInt32Only", 2507 "unsigned long" => "SpecBytecodeNumber", 2508 "long long" => "SpecBytecodeNumber", 2509 "unsigned long long" => "SpecBytecodeNumber", 2510 "float" => "SpecBytecodeNumber", 2511 "unrestricted float" => "SpecBytecodeNumber", 2512 "double" => "SpecBytecodeNumber", 2513 "unrestricted double" => "SpecBytecodeNumber", 2514 "DOMString" => "SpecString", 2515 "ByteString" => "SpecString", 2516 "USVString" => "SpecString", 2517 ); 2518 2519 if (exists $TypeFilters{$idlType->name}) { 2520 my $resultType = "JSC::$TypeFilters{$idlType->name}"; 2521 if ($idlType->isNullable) { 2522 die "\"any\" type must not become nullable." if $idlType->name eq "any"; 2523 $resultType = "($resultType | JSC::SpecOther)"; 2524 } 2525 return $resultType; 2526 } 2527 return "SpecHeapTop"; 2528 } 2529 2494 2530 sub GenerateImplementation 2495 2531 { … … 3269 3305 my $getter = GetAttributeGetterName($interface, $generatorName, $attribute); 3270 3306 my $setter = IsReadonly($attribute) ? "nullptr" : GetAttributeSetterName($interface, $generatorName, $attribute); 3307 my $resultType = GetResultTypeFilter($attribute->signature); 3271 3308 push(@implContent, "$domJITClassName::$domJITClassName()\n"); 3272 push(@implContent, " : JSC::DOMJIT::GetterSetter($getter, $setter, ${className}::info() )\n");3309 push(@implContent, " : JSC::DOMJIT::GetterSetter($getter, $setter, ${className}::info(), $resultType)\n"); 3273 3310 push(@implContent, "{\n"); 3274 3311 push(@implContent, "}\n\n");
Note: See TracChangeset
for help on using the changeset viewer.