Changeset 245026 in webkit
- Timestamp:
- May 7, 2019 12:57:10 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 10 deleted
- 38 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JSTests/ChangeLog
r245018 r245026 1 2019-05-07 Commit Queue <commit-queue@webkit.org> 2 3 Unreviewed, rolling out r244978. 4 https://bugs.webkit.org/show_bug.cgi?id=197671 5 6 TemplateObject map should use start/end offsets (Requested by 7 yusukesuzuki on #webkit). 8 9 Reverted changeset: 10 11 "TemplateObject passed to template literal tags are not always 12 identical for the same source location." 13 https://bugs.webkit.org/show_bug.cgi?id=190756 14 https://trac.webkit.org/changeset/244978 15 1 16 2019-05-07 Tadeu Zagallo <tzagallo@apple.com> 2 17 -
trunk/JSTests/complex.yaml
r244978 r245026 26 26 - path: complex/generator-regeneration.js 27 27 cmd: runComplexTest [], ["generator-regeneration-after.js"], "--useDollarVM=1" 28 29 - path: complex/tagged-template-regeneration.js30 cmd: runComplexTest [], ["tagged-template-regeneration-after.js"], "--useDollarVM=1" -
trunk/Source/JavaScriptCore/ChangeLog
r245018 r245026 1 2019-05-07 Commit Queue <commit-queue@webkit.org> 2 3 Unreviewed, rolling out r244978. 4 https://bugs.webkit.org/show_bug.cgi?id=197671 5 6 TemplateObject map should use start/end offsets (Requested by 7 yusukesuzuki on #webkit). 8 9 Reverted changeset: 10 11 "TemplateObject passed to template literal tags are not always 12 identical for the same source location." 13 https://bugs.webkit.org/show_bug.cgi?id=190756 14 https://trac.webkit.org/changeset/244978 15 1 16 2019-05-07 Tadeu Zagallo <tzagallo@apple.com> 2 17 -
trunk/Source/JavaScriptCore/Scripts/tests/builtins/expected/JavaScriptCore-Builtin.Promise-Combined.js-result
r244978 r245026 142 142 JSC::FunctionExecutable* codeName##Generator(JSC::VM& vm) \ 143 143 {\ 144 return vm.builtinExecutables()->codeName##Executable()->link(vm, nullptr,vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); }144 return vm.builtinExecutables()->codeName##Executable()->link(vm, vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); } 145 145 JSC_FOREACH_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR) 146 146 #undef DEFINE_BUILTIN_GENERATOR -
trunk/Source/JavaScriptCore/Scripts/tests/builtins/expected/JavaScriptCore-Builtin.Promise-Separate.js-result
r244978 r245026 159 159 JSC::FunctionExecutable* codeName##Generator(JSC::VM& vm) \ 160 160 {\ 161 return vm.builtinExecutables()->codeName##Executable()->link(vm, nullptr,vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); }161 return vm.builtinExecutables()->codeName##Executable()->link(vm, vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); } 162 162 JSC_FOREACH_BUILTIN.PROMISE_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR) 163 163 #undef DEFINE_BUILTIN_GENERATOR -
trunk/Source/JavaScriptCore/Scripts/tests/builtins/expected/JavaScriptCore-Builtin.prototype-Combined.js-result
r244978 r245026 168 168 JSC::FunctionExecutable* codeName##Generator(JSC::VM& vm) \ 169 169 {\ 170 return vm.builtinExecutables()->codeName##Executable()->link(vm, nullptr,vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); }170 return vm.builtinExecutables()->codeName##Executable()->link(vm, vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); } 171 171 JSC_FOREACH_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR) 172 172 #undef DEFINE_BUILTIN_GENERATOR -
trunk/Source/JavaScriptCore/Scripts/tests/builtins/expected/JavaScriptCore-Builtin.prototype-Separate.js-result
r244978 r245026 283 283 JSC::FunctionExecutable* codeName##Generator(JSC::VM& vm) \ 284 284 {\ 285 return vm.builtinExecutables()->codeName##Executable()->link(vm, nullptr,vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); }285 return vm.builtinExecutables()->codeName##Executable()->link(vm, vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); } 286 286 JSC_FOREACH_BUILTIN.PROTOTYPE_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR) 287 287 #undef DEFINE_BUILTIN_GENERATOR -
trunk/Source/JavaScriptCore/Scripts/tests/builtins/expected/JavaScriptCore-BuiltinConstructor-Combined.js-result
r244978 r245026 140 140 JSC::FunctionExecutable* codeName##Generator(JSC::VM& vm) \ 141 141 {\ 142 return vm.builtinExecutables()->codeName##Executable()->link(vm, nullptr,vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); }142 return vm.builtinExecutables()->codeName##Executable()->link(vm, vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); } 143 143 JSC_FOREACH_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR) 144 144 #undef DEFINE_BUILTIN_GENERATOR -
trunk/Source/JavaScriptCore/Scripts/tests/builtins/expected/JavaScriptCore-BuiltinConstructor-Separate.js-result
r244978 r245026 213 213 JSC::FunctionExecutable* codeName##Generator(JSC::VM& vm) \ 214 214 {\ 215 return vm.builtinExecutables()->codeName##Executable()->link(vm, nullptr,vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); }215 return vm.builtinExecutables()->codeName##Executable()->link(vm, vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); } 216 216 JSC_FOREACH_BUILTINCONSTRUCTOR_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR) 217 217 #undef DEFINE_BUILTIN_GENERATOR -
trunk/Source/JavaScriptCore/Scripts/tests/builtins/expected/JavaScriptCore-InternalClashingNames-Combined.js-result
r244978 r245026 141 141 JSC::FunctionExecutable* codeName##Generator(JSC::VM& vm) \ 142 142 {\ 143 return vm.builtinExecutables()->codeName##Executable()->link(vm, nullptr,vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); }143 return vm.builtinExecutables()->codeName##Executable()->link(vm, vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); } 144 144 JSC_FOREACH_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR) 145 145 #undef DEFINE_BUILTIN_GENERATOR -
trunk/Source/JavaScriptCore/Scripts/tests/builtins/expected/WebCore-AnotherGuardedInternalBuiltin-Separate.js-result
r244978 r245026 221 221 {\ 222 222 JSVMClientData* clientData = static_cast<JSVMClientData*>(vm.clientData); \ 223 return clientData->builtinFunctions().anotherGuardedInternalBuiltinBuiltins().codeName##Executable()->link(vm, nullptr,clientData->builtinFunctions().anotherGuardedInternalBuiltinBuiltins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \223 return clientData->builtinFunctions().anotherGuardedInternalBuiltinBuiltins().codeName##Executable()->link(vm, clientData->builtinFunctions().anotherGuardedInternalBuiltinBuiltins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \ 224 224 } 225 225 WEBCORE_FOREACH_ANOTHERGUARDEDINTERNALBUILTIN_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR) -
trunk/Source/JavaScriptCore/Scripts/tests/builtins/expected/WebCore-ArbitraryConditionalGuard-Separate.js-result
r244978 r245026 191 191 {\ 192 192 JSVMClientData* clientData = static_cast<JSVMClientData*>(vm.clientData); \ 193 return clientData->builtinFunctions().arbitraryConditionalGuardBuiltins().codeName##Executable()->link(vm, nullptr,clientData->builtinFunctions().arbitraryConditionalGuardBuiltins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \193 return clientData->builtinFunctions().arbitraryConditionalGuardBuiltins().codeName##Executable()->link(vm, clientData->builtinFunctions().arbitraryConditionalGuardBuiltins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \ 194 194 } 195 195 WEBCORE_FOREACH_ARBITRARYCONDITIONALGUARD_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR) -
trunk/Source/JavaScriptCore/Scripts/tests/builtins/expected/WebCore-GuardedBuiltin-Separate.js-result
r244978 r245026 191 191 {\ 192 192 JSVMClientData* clientData = static_cast<JSVMClientData*>(vm.clientData); \ 193 return clientData->builtinFunctions().guardedBuiltinBuiltins().codeName##Executable()->link(vm, nullptr,clientData->builtinFunctions().guardedBuiltinBuiltins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \193 return clientData->builtinFunctions().guardedBuiltinBuiltins().codeName##Executable()->link(vm, clientData->builtinFunctions().guardedBuiltinBuiltins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \ 194 194 } 195 195 WEBCORE_FOREACH_GUARDEDBUILTIN_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR) -
trunk/Source/JavaScriptCore/Scripts/tests/builtins/expected/WebCore-GuardedInternalBuiltin-Separate.js-result
r244978 r245026 223 223 {\ 224 224 JSVMClientData* clientData = static_cast<JSVMClientData*>(vm.clientData); \ 225 return clientData->builtinFunctions().guardedInternalBuiltinBuiltins().codeName##Executable()->link(vm, nullptr,clientData->builtinFunctions().guardedInternalBuiltinBuiltins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \225 return clientData->builtinFunctions().guardedInternalBuiltinBuiltins().codeName##Executable()->link(vm, clientData->builtinFunctions().guardedInternalBuiltinBuiltins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \ 226 226 } 227 227 WEBCORE_FOREACH_GUARDEDINTERNALBUILTIN_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR) -
trunk/Source/JavaScriptCore/Scripts/tests/builtins/expected/WebCore-UnguardedBuiltin-Separate.js-result
r244978 r245026 185 185 {\ 186 186 JSVMClientData* clientData = static_cast<JSVMClientData*>(vm.clientData); \ 187 return clientData->builtinFunctions().unguardedBuiltinBuiltins().codeName##Executable()->link(vm, nullptr,clientData->builtinFunctions().unguardedBuiltinBuiltins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \187 return clientData->builtinFunctions().unguardedBuiltinBuiltins().codeName##Executable()->link(vm, clientData->builtinFunctions().unguardedBuiltinBuiltins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \ 188 188 } 189 189 WEBCORE_FOREACH_UNGUARDEDBUILTIN_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR) -
trunk/Source/JavaScriptCore/Scripts/tests/builtins/expected/WebCore-xmlCasingTest-Separate.js-result
r244978 r245026 276 276 {\ 277 277 JSVMClientData* clientData = static_cast<JSVMClientData*>(vm.clientData); \ 278 return clientData->builtinFunctions().xmlCasingTestBuiltins().codeName##Executable()->link(vm, nullptr,clientData->builtinFunctions().xmlCasingTestBuiltins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \278 return clientData->builtinFunctions().xmlCasingTestBuiltins().codeName##Executable()->link(vm, clientData->builtinFunctions().xmlCasingTestBuiltins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \ 279 279 } 280 280 WEBCORE_FOREACH_XMLCASINGTEST_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR) -
trunk/Source/JavaScriptCore/Scripts/wkbuiltins/builtins_templates.py
r244978 r245026 86 86 JSC::FunctionExecutable* codeName##Generator(JSC::VM& vm) \\ 87 87 {\\ 88 return vm.builtinExecutables()->codeName##Executable()->link(vm, nullptr,vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \88 return vm.builtinExecutables()->codeName##Executable()->link(vm, vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \ 89 89 } 90 90 ${macroPrefix}_FOREACH_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR) … … 97 97 JSC::FunctionExecutable* codeName##Generator(JSC::VM& vm) \\ 98 98 {\\ 99 return vm.builtinExecutables()->codeName##Executable()->link(vm, nullptr,vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \99 return vm.builtinExecutables()->codeName##Executable()->link(vm, vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \ 100 100 } 101 101 ${macroPrefix}_FOREACH_${objectMacro}_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR) … … 109 109 {\\ 110 110 JSVMClientData* clientData = static_cast<JSVMClientData*>(vm.clientData); \\ 111 return clientData->builtinFunctions().${objectNameLC}Builtins().codeName##Executable()->link(vm, nullptr,clientData->builtinFunctions().${objectNameLC}Builtins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \\111 return clientData->builtinFunctions().${objectNameLC}Builtins().codeName##Executable()->link(vm, clientData->builtinFunctions().${objectNameLC}Builtins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \\ 112 112 } 113 113 ${macroPrefix}_FOREACH_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR) … … 121 121 {\\ 122 122 JSVMClientData* clientData = static_cast<JSVMClientData*>(vm.clientData); \\ 123 return clientData->builtinFunctions().${objectNameLC}Builtins().codeName##Executable()->link(vm, nullptr,clientData->builtinFunctions().${objectNameLC}Builtins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \\123 return clientData->builtinFunctions().${objectNameLC}Builtins().codeName##Executable()->link(vm, clientData->builtinFunctions().${objectNameLC}Builtins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \\ 124 124 } 125 125 ${macroPrefix}_FOREACH_${objectMacro}_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR) -
trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp
r244978 r245026 396 396 vm.functionHasExecutedCache()->removeUnexecutedRange(ownerExecutable->sourceID(), ownerExecutable->typeProfilingStartOffset(vm), ownerExecutable->typeProfilingEndOffset(vm)); 397 397 398 ScriptExecutable* topLevelExecutable = ownerExecutable->topLevelExecutable(); 399 setConstantRegisters(unlinkedCodeBlock->constantRegisters(), unlinkedCodeBlock->constantsSourceCodeRepresentation(), topLevelExecutable); 398 setConstantRegisters(unlinkedCodeBlock->constantRegisters(), unlinkedCodeBlock->constantsSourceCodeRepresentation()); 400 399 RETURN_IF_EXCEPTION(throwScope, false); 401 400 … … 423 422 if (shouldUpdateFunctionHasExecutedCache) 424 423 vm.functionHasExecutedCache()->insertUnexecutedRange(ownerExecutable->sourceID(), unlinkedExecutable->typeProfilingStartOffset(), unlinkedExecutable->typeProfilingEndOffset()); 425 m_functionDecls[i].set(vm, this, unlinkedExecutable->link(vm, topLevelExecutable,ownerExecutable->source()));424 m_functionDecls[i].set(vm, this, unlinkedExecutable->link(vm, ownerExecutable->source())); 426 425 } 427 426 … … 431 430 if (shouldUpdateFunctionHasExecutedCache) 432 431 vm.functionHasExecutedCache()->insertUnexecutedRange(ownerExecutable->sourceID(), unlinkedExecutable->typeProfilingStartOffset(), unlinkedExecutable->typeProfilingEndOffset()); 433 m_functionExprs[i].set(vm, this, unlinkedExecutable->link(vm, topLevelExecutable,ownerExecutable->source()));432 m_functionExprs[i].set(vm, this, unlinkedExecutable->link(vm, ownerExecutable->source())); 434 433 } 435 434 … … 872 871 } 873 872 874 void CodeBlock::setConstantRegisters(const Vector<WriteBarrier<Unknown>>& constants, const Vector<SourceCodeRepresentation>& constantsSourceCodeRepresentation , ScriptExecutable* topLevelExecutable)873 void CodeBlock::setConstantRegisters(const Vector<WriteBarrier<Unknown>>& constants, const Vector<SourceCodeRepresentation>& constantsSourceCodeRepresentation) 875 874 { 876 875 VM& vm = *m_vm; … … 900 899 constant = clone; 901 900 } else if (auto* descriptor = jsDynamicCast<JSTemplateObjectDescriptor*>(vm, cell)) { 902 auto* templateObject = topLevelExecutable->createTemplateObject(exec, descriptor);901 auto* templateObject = descriptor->createTemplateObject(exec); 903 902 RETURN_IF_EXCEPTION(scope, void()); 904 903 constant = templateObject; -
trunk/Source/JavaScriptCore/bytecode/CodeBlock.h
r244978 r245026 912 912 void setConstantIdentifierSetRegisters(VM&, const Vector<ConstantIdentifierSetEntry>& constants); 913 913 914 void setConstantRegisters(const Vector<WriteBarrier<Unknown>>& constants, const Vector<SourceCodeRepresentation>& constantsSourceCodeRepresentation , ScriptExecutable* topLevelExecutable);914 void setConstantRegisters(const Vector<WriteBarrier<Unknown>>& constants, const Vector<SourceCodeRepresentation>& constantsSourceCodeRepresentation); 915 915 916 916 void replaceConstant(int index, JSValue value) -
trunk/Source/JavaScriptCore/bytecode/UnlinkedFunctionExecutable.cpp
r244978 r245026 159 159 } 160 160 161 FunctionExecutable* UnlinkedFunctionExecutable::link(VM& vm, ScriptExecutable* topLevelExecutable,const SourceCode& passedParentSource, Optional<int> overrideLineNumber, Intrinsic intrinsic)161 FunctionExecutable* UnlinkedFunctionExecutable::link(VM& vm, const SourceCode& passedParentSource, Optional<int> overrideLineNumber, Intrinsic intrinsic) 162 162 { 163 163 SourceCode source = linkedSourceCode(passedParentSource); … … 167 167 hasFunctionOverride = FunctionOverrides::initializeOverrideFor(source, overrideInfo); 168 168 169 FunctionExecutable* result = FunctionExecutable::create(vm, topLevelExecutable,source, this, intrinsic);169 FunctionExecutable* result = FunctionExecutable::create(vm, source, this, intrinsic); 170 170 if (overrideLineNumber) 171 171 result->setOverrideLineNumber(*overrideLineNumber); -
trunk/Source/JavaScriptCore/bytecode/UnlinkedFunctionExecutable.h
r244978 r245026 127 127 128 128 SourceCode linkedSourceCode(const SourceCode&) const; 129 JS_EXPORT_PRIVATE FunctionExecutable* link(VM&, ScriptExecutable* topLevelExecutable,const SourceCode& parentSource, Optional<int> overrideLineNumber = WTF::nullopt, Intrinsic = NoIntrinsic);129 JS_EXPORT_PRIVATE FunctionExecutable* link(VM&, const SourceCode& parentSource, Optional<int> overrideLineNumber = WTF::nullopt, Intrinsic = NoIntrinsic); 130 130 131 131 void clearCode(VM& vm) -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
r244978 r245026 2949 2949 } 2950 2950 2951 RegisterID* BytecodeGenerator::addTemplateObjectConstant(Ref<TemplateObjectDescriptor>&& descriptor, int startOffset) 2952 { 2953 auto result = m_templateObjectDescriptorSet.add(WTFMove(descriptor)); 2954 JSTemplateObjectDescriptor* descriptorValue = m_templateDescriptorMap.ensure(startOffset, [&] { 2955 return JSTemplateObjectDescriptor::create(*vm(), result.iterator->copyRef(), startOffset); 2951 RegisterID* BytecodeGenerator::addTemplateObjectConstant(Ref<TemplateObjectDescriptor>&& descriptor) 2952 { 2953 JSTemplateObjectDescriptor* descriptorValue = m_templateObjectDescriptorMap.ensure(descriptor.copyRef(), [&] { 2954 return JSTemplateObjectDescriptor::create(*vm(), WTFMove(descriptor)); 2956 2955 }).iterator->value; 2956 2957 2957 int index = addConstantIndex(); 2958 2958 m_codeBlock->addConstant(descriptorValue); … … 4142 4142 cookedStrings.append(string->cooked()->impl()); 4143 4143 } 4144 RefPtr<RegisterID> constant = addTemplateObjectConstant(TemplateObjectDescriptor::create(WTFMove(rawStrings), WTFMove(cookedStrings)) , taggedTemplate->startOffset());4144 RefPtr<RegisterID> constant = addTemplateObjectConstant(TemplateObjectDescriptor::create(WTFMove(rawStrings), WTFMove(cookedStrings))); 4145 4145 if (!dst) 4146 4146 return constant.get(); -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
r244978 r245026 1061 1061 using IdentifierStringMap = HashMap<UniquedStringImpl*, JSString*, IdentifierRepHash>; 1062 1062 using IdentifierBigIntMap = HashMap<BigIntMapEntry, JSBigInt*>; 1063 using TemplateObjectDescriptorSet = HashSet<Ref<TemplateObjectDescriptor>>; 1064 using TemplateDescriptorMap = HashMap<uint64_t, JSTemplateObjectDescriptor*, WTF::IntHash<uint64_t>, WTF::UnsignedWithZeroKeyHashTraits<uint64_t>>; 1063 using TemplateObjectDescriptorMap = HashMap<Ref<TemplateObjectDescriptor>, JSTemplateObjectDescriptor*>; 1065 1064 1066 1065 // Helper for emitCall() and emitConstruct(). This works because the set of … … 1154 1153 JSString* addStringConstant(const Identifier&); 1155 1154 JSValue addBigIntConstant(const Identifier&, uint8_t radix, bool sign); 1156 RegisterID* addTemplateObjectConstant(Ref<TemplateObjectDescriptor>&& , int);1155 RegisterID* addTemplateObjectConstant(Ref<TemplateObjectDescriptor>&&); 1157 1156 1158 1157 const InstructionStream& instructions() const { return m_writer; } … … 1272 1271 IdentifierStringMap m_stringMap; 1273 1272 IdentifierBigIntMap m_bigIntMap; 1274 TemplateObjectDescriptorSet m_templateObjectDescriptorSet; 1275 TemplateDescriptorMap m_templateDescriptorMap; 1273 TemplateObjectDescriptorMap m_templateObjectDescriptorMap; 1276 1274 1277 1275 StaticPropertyAnalyzer m_staticPropertyAnalyzer; -
trunk/Source/JavaScriptCore/runtime/CachedTypes.cpp
r244978 r245026 1153 1153 class CachedTemplateObjectDescriptor : public CachedObject<TemplateObjectDescriptor> { 1154 1154 public: 1155 void encode(Encoder& encoder, const JSTemplateObjectDescriptor& descriptor) 1156 { 1157 m_rawStrings.encode(encoder, descriptor.descriptor().rawStrings()); 1158 m_cookedStrings.encode(encoder, descriptor.descriptor().cookedStrings()); 1159 m_startOffset = descriptor.startOffset(); 1160 } 1161 1162 JSTemplateObjectDescriptor* decode(Decoder& decoder) const 1155 void encode(Encoder& encoder, const TemplateObjectDescriptor& templateObjectDescriptor) 1156 { 1157 m_rawStrings.encode(encoder, templateObjectDescriptor.rawStrings()); 1158 m_cookedStrings.encode(encoder, templateObjectDescriptor.cookedStrings()); 1159 } 1160 1161 Ref<TemplateObjectDescriptor> decode(Decoder& decoder) const 1163 1162 { 1164 1163 TemplateObjectDescriptor::StringVector decodedRawStrings; … … 1166 1165 m_rawStrings.decode(decoder, decodedRawStrings); 1167 1166 m_cookedStrings.decode(decoder, decodedCookedStrings); 1168 return JSTemplateObjectDescriptor::create(decoder.vm(), TemplateObjectDescriptor::create(WTFMove(decodedRawStrings), WTFMove(decodedCookedStrings)), m_startOffset);1167 return TemplateObjectDescriptor::create(WTFMove(decodedRawStrings), WTFMove(decodedCookedStrings)); 1169 1168 } 1170 1169 … … 1172 1171 CachedVector<CachedString, 4> m_rawStrings; 1173 1172 CachedVector<CachedOptional<CachedString>, 4> m_cookedStrings; 1174 int m_startOffset;1175 1173 }; 1176 1174 … … 1246 1244 if (auto* templateObjectDescriptor = jsDynamicCast<JSTemplateObjectDescriptor*>(vm, cell)) { 1247 1245 m_type = EncodedType::TemplateObjectDescriptor; 1248 this->allocate<CachedTemplateObjectDescriptor>(encoder)->encode(encoder, *templateObjectDescriptor);1246 this->allocate<CachedTemplateObjectDescriptor>(encoder)->encode(encoder, templateObjectDescriptor->descriptor()); 1249 1247 return; 1250 1248 } … … 1281 1279 break; 1282 1280 case EncodedType::TemplateObjectDescriptor: 1283 v = this->buffer<CachedTemplateObjectDescriptor>()->decode(decoder);1281 v = JSTemplateObjectDescriptor::create(decoder.vm(), this->buffer<CachedTemplateObjectDescriptor>()->decode(decoder)); 1284 1282 break; 1285 1283 case EncodedType::BigInt: -
trunk/Source/JavaScriptCore/runtime/EvalExecutable.cpp
r244978 r245026 45 45 } 46 46 47 auto EvalExecutable::ensureTemplateObjectMap(VM&) -> TemplateObjectMap&48 {49 return ensureTemplateObjectMapImpl(m_templateObjectMap);50 }51 52 47 void EvalExecutable::visitChildren(JSCell* cell, SlotVisitor& visitor) 53 48 { … … 57 52 visitor.append(thisObject->m_unlinkedEvalCodeBlock); 58 53 visitor.append(thisObject->m_evalCodeBlock); 59 if (TemplateObjectMap* map = thisObject->m_templateObjectMap.get()) {60 auto locker = holdLock(thisObject->cellLock());61 for (auto& entry : *map)62 visitor.append(entry.value);63 }64 54 } 65 55 -
trunk/Source/JavaScriptCore/runtime/EvalExecutable.h
r244978 r245026 70 70 bool allowDirectEvalCache() const { return m_unlinkedEvalCodeBlock->allowDirectEvalCache(); } 71 71 72 TemplateObjectMap& ensureTemplateObjectMap(VM&);73 74 72 protected: 75 73 friend class ExecutableBase; … … 83 81 WriteBarrier<ExecutableToCodeBlockEdge> m_evalCodeBlock; 84 82 WriteBarrier<UnlinkedEvalCodeBlock> m_unlinkedEvalCodeBlock; 85 std::unique_ptr<TemplateObjectMap> m_templateObjectMap;86 83 }; 87 84 -
trunk/Source/JavaScriptCore/runtime/FunctionExecutable.cpp
r244978 r245026 55 55 } 56 56 57 void FunctionExecutable::finishCreation(VM& vm , ScriptExecutable* topLevelExecutable)57 void FunctionExecutable::finishCreation(VM& vm) 58 58 { 59 59 Base::finishCreation(vm); 60 m_topLevelExecutable.set(vm, this, topLevelExecutable ? topLevelExecutable : this);61 60 if (VM::canUseJIT()) 62 61 m_singletonFunction.set(vm, this, InferredValue::create(vm)); … … 87 86 ASSERT_GC_OBJECT_INHERITS(thisObject, info()); 88 87 Base::visitChildren(thisObject, visitor); 89 visitor.append(thisObject->m_topLevelExecutable);90 88 visitor.append(thisObject->m_codeBlockForCall); 91 89 visitor.append(thisObject->m_codeBlockForConstruct); … … 93 91 if (VM::canUseJIT()) 94 92 visitor.append(thisObject->m_singletonFunction); 95 if (RareData* rareData = thisObject->m_rareData.get()) { 96 visitor.append(rareData->m_cachedPolyProtoStructure); 97 if (TemplateObjectMap* map = rareData->m_templateObjectMap.get()) { 98 auto locker = holdLock(thisObject->cellLock()); 99 for (auto& entry : *map) 100 visitor.append(entry.value); 101 } 102 } 93 visitor.append(thisObject->m_cachedPolyProtoStructure); 103 94 } 104 95 … … 113 104 return nullptr; 114 105 115 return unlinkedExecutable->link(exec.vm(), nullptr,source, overrideLineNumber);106 return unlinkedExecutable->link(exec.vm(), source, overrideLineNumber); 116 107 } 117 108 … … 125 116 rareData->m_typeProfilingStartOffset = typeProfilingStartOffset(); 126 117 rareData->m_typeProfilingEndOffset = typeProfilingEndOffset(); 127 WTF::storeStoreFence();128 118 m_rareData = WTFMove(rareData); 129 119 return *m_rareData; … … 141 131 } 142 132 143 auto FunctionExecutable::ensureTemplateObjectMap(VM&) -> TemplateObjectMap&144 {145 RareData& rareData = ensureRareData();146 return ensureTemplateObjectMapImpl(rareData.m_templateObjectMap);147 }148 149 133 } // namespace JSC -
trunk/Source/JavaScriptCore/runtime/FunctionExecutable.h
r244978 r245026 49 49 } 50 50 51 static FunctionExecutable* create(VM& vm, ScriptExecutable* topLevelExecutable,const SourceCode& source, UnlinkedFunctionExecutable* unlinkedExecutable, Intrinsic intrinsic)51 static FunctionExecutable* create(VM& vm, const SourceCode& source, UnlinkedFunctionExecutable* unlinkedExecutable, Intrinsic intrinsic) 52 52 { 53 53 FunctionExecutable* executable = new (NotNull, allocateCell<FunctionExecutable>(vm.heap)) FunctionExecutable(vm, source, unlinkedExecutable, intrinsic); 54 executable->finishCreation(vm , topLevelExecutable);54 executable->finishCreation(vm); 55 55 return executable; 56 56 } … … 283 283 284 284 // Cached poly proto structure for the result of constructing this executable. 285 Structure* cachedPolyProtoStructure() 286 { 287 if (UNLIKELY(m_rareData)) 288 return m_rareData->m_cachedPolyProtoStructure.get(); 289 return nullptr; 290 } 291 void setCachedPolyProtoStructure(VM& vm, Structure* structure) 292 { 293 ensureRareData().m_cachedPolyProtoStructure.set(vm, this, structure); 294 } 285 Structure* cachedPolyProtoStructure() { return m_cachedPolyProtoStructure.get(); } 286 void setCachedPolyProtoStructure(VM& vm, Structure* structure) { m_cachedPolyProtoStructure.set(vm, this, structure); } 295 287 296 288 InlineWatchpointSet& ensurePolyProtoWatchpoint() … … 302 294 303 295 Box<InlineWatchpointSet> sharedPolyProtoWatchpoint() const { return m_polyProtoWatchpoint; } 304 305 ScriptExecutable* topLevelExecutable() const { return m_topLevelExecutable.get(); }306 307 TemplateObjectMap& ensureTemplateObjectMap(VM&);308 296 309 297 private: … … 311 299 FunctionExecutable(VM&, const SourceCode&, UnlinkedFunctionExecutable*, Intrinsic); 312 300 313 void finishCreation(VM& , ScriptExecutable* topLevelExecutable);301 void finishCreation(VM&); 314 302 315 303 friend class ScriptExecutable; … … 324 312 unsigned m_typeProfilingStartOffset { UINT_MAX }; 325 313 unsigned m_typeProfilingEndOffset { UINT_MAX }; 326 std::unique_ptr<TemplateObjectMap> m_templateObjectMap;327 WriteBarrier<Structure> m_cachedPolyProtoStructure;328 314 }; 329 315 … … 336 322 RareData& ensureRareDataSlow(); 337 323 338 // FIXME: We can merge rareData pointer and top-level executable pointer. First time, setting parent.339 // If RareData is required, materialize RareData, swap it, and store top-level executable pointer inside RareData.340 // https://bugs.webkit.org/show_bug.cgi?id=197625341 324 std::unique_ptr<RareData> m_rareData; 342 WriteBarrier<ScriptExecutable> m_topLevelExecutable;343 325 WriteBarrier<UnlinkedFunctionExecutable> m_unlinkedExecutable; 344 326 WriteBarrier<ExecutableToCodeBlockEdge> m_codeBlockForCall; … … 348 330 WatchpointState m_singletonFunctionState; 349 331 }; 332 WriteBarrier<Structure> m_cachedPolyProtoStructure; 350 333 Box<InlineWatchpointSet> m_polyProtoWatchpoint; 351 334 }; -
trunk/Source/JavaScriptCore/runtime/JSModuleRecord.cpp
r244978 r245026 201 201 unlinkedFunctionExecutable->typeProfilingEndOffset()); 202 202 } 203 JSFunction* function = JSFunction::create(vm, unlinkedFunctionExecutable->link(vm, moduleProgramExecutable , moduleProgramExecutable->source()), moduleEnvironment);203 JSFunction* function = JSFunction::create(vm, unlinkedFunctionExecutable->link(vm, moduleProgramExecutable->source()), moduleEnvironment); 204 204 bool putResult = false; 205 205 symbolTablePutTouchWatchpointSet(moduleEnvironment, exec, unlinkedFunctionExecutable->name(), function, /* shouldThrowReadOnlyError */ false, /* ignoreReadOnlyErrors */ true, putResult); -
trunk/Source/JavaScriptCore/runtime/JSTemplateObjectDescriptor.cpp
r244978 r245026 37 37 38 38 39 JSTemplateObjectDescriptor::JSTemplateObjectDescriptor(VM& vm, Ref<TemplateObjectDescriptor>&& descriptor , int startOffset)39 JSTemplateObjectDescriptor::JSTemplateObjectDescriptor(VM& vm, Ref<TemplateObjectDescriptor>&& descriptor) 40 40 : Base(vm, vm.templateObjectDescriptorStructure.get()) 41 41 , m_descriptor(WTFMove(descriptor)) 42 , m_startOffset(startOffset)43 42 { 44 43 } 45 44 46 JSTemplateObjectDescriptor* JSTemplateObjectDescriptor::create(VM& vm, Ref<TemplateObjectDescriptor>&& descriptor , int startOffset)45 JSTemplateObjectDescriptor* JSTemplateObjectDescriptor::create(VM& vm, Ref<TemplateObjectDescriptor>&& descriptor) 47 46 { 48 JSTemplateObjectDescriptor* result = new (NotNull, allocateCell<JSTemplateObjectDescriptor>(vm.heap)) JSTemplateObjectDescriptor(vm, WTFMove(descriptor) , startOffset);47 JSTemplateObjectDescriptor* result = new (NotNull, allocateCell<JSTemplateObjectDescriptor>(vm.heap)) JSTemplateObjectDescriptor(vm, WTFMove(descriptor)); 49 48 result->finishCreation(vm); 50 49 return result; -
trunk/Source/JavaScriptCore/runtime/JSTemplateObjectDescriptor.h
r244978 r245026 39 39 DECLARE_INFO; 40 40 41 static JSTemplateObjectDescriptor* create(VM&, Ref<TemplateObjectDescriptor>&& , int);41 static JSTemplateObjectDescriptor* create(VM&, Ref<TemplateObjectDescriptor>&&); 42 42 43 43 static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) … … 50 50 JSArray* createTemplateObject(ExecState*); 51 51 52 int startOffset() const { return m_startOffset; }53 54 52 protected: 55 53 static void destroy(JSCell*); 56 54 57 55 private: 58 JSTemplateObjectDescriptor(VM&, Ref<TemplateObjectDescriptor>&& , int);56 JSTemplateObjectDescriptor(VM&, Ref<TemplateObjectDescriptor>&&); 59 57 60 58 Ref<TemplateObjectDescriptor> m_descriptor; 61 int m_startOffset { 0 };62 59 }; 63 60 -
trunk/Source/JavaScriptCore/runtime/ModuleProgramExecutable.cpp
r244978 r245026 86 86 } 87 87 88 auto ModuleProgramExecutable::ensureTemplateObjectMap(VM&) -> TemplateObjectMap&89 {90 return ensureTemplateObjectMapImpl(m_templateObjectMap);91 }92 93 88 void ModuleProgramExecutable::visitChildren(JSCell* cell, SlotVisitor& visitor) 94 89 { … … 99 94 visitor.append(thisObject->m_moduleEnvironmentSymbolTable); 100 95 visitor.append(thisObject->m_moduleProgramCodeBlock); 101 if (TemplateObjectMap* map = thisObject->m_templateObjectMap.get()) {102 auto locker = holdLock(thisObject->cellLock());103 for (auto& entry : *map)104 visitor.append(entry.value);105 }106 96 } 107 97 -
trunk/Source/JavaScriptCore/runtime/ModuleProgramExecutable.h
r244978 r245026 70 70 SymbolTable* moduleEnvironmentSymbolTable() { return m_moduleEnvironmentSymbolTable.get(); } 71 71 72 TemplateObjectMap& ensureTemplateObjectMap(VM&);73 74 72 private: 75 73 friend class ExecutableBase; … … 83 81 WriteBarrier<SymbolTable> m_moduleEnvironmentSymbolTable; 84 82 WriteBarrier<ExecutableToCodeBlockEdge> m_moduleProgramCodeBlock; 85 std::unique_ptr<TemplateObjectMap> m_templateObjectMap;86 83 }; 87 84 -
trunk/Source/JavaScriptCore/runtime/ProgramExecutable.cpp
r244978 r245026 217 217 } 218 218 219 auto ProgramExecutable::ensureTemplateObjectMap(VM&) -> TemplateObjectMap&220 {221 return ensureTemplateObjectMapImpl(m_templateObjectMap);222 }223 224 219 void ProgramExecutable::visitChildren(JSCell* cell, SlotVisitor& visitor) 225 220 { … … 229 224 visitor.append(thisObject->m_unlinkedProgramCodeBlock); 230 225 visitor.append(thisObject->m_programCodeBlock); 231 if (TemplateObjectMap* map = thisObject->m_templateObjectMap.get()) {232 auto locker = holdLock(thisObject->cellLock());233 for (auto& entry : *map)234 visitor.append(entry.value);235 }236 226 } 237 227 -
trunk/Source/JavaScriptCore/runtime/ProgramExecutable.h
r244978 r245026 74 74 ExecutableInfo executableInfo() const { return ExecutableInfo(usesEval(), isStrictMode(), false, false, ConstructorKind::None, JSParserScriptMode::Classic, SuperBinding::NotNeeded, SourceParseMode::ProgramMode, derivedContextType(), isArrowFunctionContext(), false, EvalContextType::None); } 75 75 76 TemplateObjectMap& ensureTemplateObjectMap(VM&);77 78 76 private: 79 77 friend class ExecutableBase; … … 86 84 WriteBarrier<UnlinkedProgramCodeBlock> m_unlinkedProgramCodeBlock; 87 85 WriteBarrier<ExecutableToCodeBlockEdge> m_programCodeBlock; 88 std::unique_ptr<TemplateObjectMap> m_templateObjectMap;89 86 }; 90 87 -
trunk/Source/JavaScriptCore/runtime/ScriptExecutable.cpp
r244978 r245026 35 35 #include "JIT.h" 36 36 #include "JSCInlines.h" 37 #include "JSTemplateObjectDescriptor.h"38 37 #include "LLIntEntrypoint.h" 39 38 #include "ModuleProgramCodeBlock.h" … … 437 436 } 438 437 439 ScriptExecutable* ScriptExecutable::topLevelExecutable()440 {441 switch (type()) {442 case FunctionExecutableType:443 return jsCast<FunctionExecutable*>(this)->topLevelExecutable();444 default:445 return this;446 }447 }448 449 JSArray* ScriptExecutable::createTemplateObject(ExecState* exec, JSTemplateObjectDescriptor* descriptor)450 {451 VM& vm = exec->vm();452 auto scope = DECLARE_THROW_SCOPE(vm);453 454 TemplateObjectMap& templateObjectMap = ensureTemplateObjectMap(vm);455 TemplateObjectMap::AddResult result;456 {457 auto locker = holdLock(cellLock());458 result = templateObjectMap.add(descriptor->startOffset(), WriteBarrier<JSArray>());459 }460 if (JSArray* array = result.iterator->value.get())461 return array;462 JSArray* templateObject = descriptor->createTemplateObject(exec);463 RETURN_IF_EXCEPTION(scope, nullptr);464 result.iterator->value.set(vm, this, templateObject);465 return templateObject;466 }467 468 auto ScriptExecutable::ensureTemplateObjectMapImpl(std::unique_ptr<TemplateObjectMap>& dest) -> TemplateObjectMap&469 {470 if (dest)471 return *dest;472 auto result = std::make_unique<TemplateObjectMap>();473 WTF::storeStoreFence();474 dest = WTFMove(result);475 return *dest;476 }477 478 auto ScriptExecutable::ensureTemplateObjectMap(VM& vm) -> TemplateObjectMap&479 {480 switch (type()) {481 case FunctionExecutableType:482 return static_cast<FunctionExecutable*>(this)->ensureTemplateObjectMap(vm);483 case EvalExecutableType:484 return static_cast<EvalExecutable*>(this)->ensureTemplateObjectMap(vm);485 case ProgramExecutableType:486 return static_cast<ProgramExecutable*>(this)->ensureTemplateObjectMap(vm);487 case ModuleProgramExecutableType:488 default:489 ASSERT(type() == ModuleProgramExecutableType);490 return static_cast<ModuleProgramExecutable*>(this)->ensureTemplateObjectMap(vm);491 }492 }493 494 438 CodeBlockHash ScriptExecutable::hashFor(CodeSpecializationKind kind) const 495 439 { -
trunk/Source/JavaScriptCore/runtime/ScriptExecutable.h
r244978 r245026 30 30 namespace JSC { 31 31 32 class JSArray;33 class JSTemplateObjectDescriptor;34 32 class IsoCellSet; 35 33 … … 40 38 41 39 static void destroy(JSCell*); 42 43 using TemplateObjectMap = HashMap<uint64_t, WriteBarrier<JSArray>, WTF::IntHash<uint64_t>, WTF::UnsignedWithZeroKeyHashTraits<uint64_t>>;44 40 45 41 CodeBlockHash hashFor(CodeSpecializationKind) const; … … 117 113 Exception* prepareForExecution(VM&, JSFunction*, JSScope*, CodeSpecializationKind, CodeBlock*& resultCodeBlock); 118 114 119 ScriptExecutable* topLevelExecutable();120 JSArray* createTemplateObject(ExecState*, JSTemplateObjectDescriptor*);121 122 115 private: 123 116 friend class ExecutableBase; … … 125 118 126 119 bool hasClearableCode(VM&) const; 127 128 TemplateObjectMap& ensureTemplateObjectMap(VM&);129 120 130 121 protected: … … 147 138 } 148 139 149 static TemplateObjectMap& ensureTemplateObjectMapImpl(std::unique_ptr<TemplateObjectMap>& dest);150 151 140 SourceCode m_source; 152 141 Intrinsic m_intrinsic { NoIntrinsic }; -
trunk/Source/JavaScriptCore/tools/JSDollarVM.cpp
r244978 r245026 1847 1847 1848 1848 const SourceCode& source = makeSource(functionText, { }); 1849 JSFunction* func = JSFunction::create(vm, createBuiltinExecutable(vm, source, Identifier::fromString(&vm, "foo"), ConstructorKind::None, ConstructAbility::CannotConstruct)->link(vm, nullptr,source), exec->lexicalGlobalObject());1849 JSFunction* func = JSFunction::create(vm, createBuiltinExecutable(vm, source, Identifier::fromString(&vm, "foo"), ConstructorKind::None, ConstructAbility::CannotConstruct)->link(vm, source), exec->lexicalGlobalObject()); 1850 1850 1851 1851 return JSValue::encode(func); … … 2086 2086 { 2087 2087 return changeDebuggerModeWhenIdle(exec, { }); 2088 }2089 2090 static EncodedJSValue JSC_HOST_CALL functionDeleteAllCodeWhenIdle(ExecState* exec)2091 {2092 VM* vm = &exec->vm();2093 vm->whenIdle([=] () {2094 vm->deleteAllCode(PreventCollectionAndDeleteAllCode);2095 });2096 return JSValue::encode(jsUndefined());2097 2088 } 2098 2089 … … 2286 2277 addFunction(vm, "disableDebuggerModeWhenIdle", functionDisableDebuggerModeWhenIdle, 0); 2287 2278 2288 addFunction(vm, "deleteAllCodeWhenIdle", functionDeleteAllCodeWhenIdle, 0);2289 2290 2279 addFunction(vm, "globalObjectCount", functionGlobalObjectCount, 0); 2291 2280 addFunction(vm, "globalObjectForObject", functionGlobalObjectForObject, 1);
Note: See TracChangeset
for help on using the changeset viewer.