Changeset 244978 in webkit
- Timestamp:
- May 6, 2019 2:33:27 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 11 added
- 38 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JSTests/ChangeLog
r244972 r244978 1 2019-05-06 Yusuke Suzuki <ysuzuki@apple.com> 2 3 TemplateObject passed to template literal tags are not always identical for the same source location. 4 https://bugs.webkit.org/show_bug.cgi?id=190756 5 6 Reviewed by Saam Barati. 7 8 * complex.yaml: 9 * complex/tagged-template-regeneration-after.js: Added. 10 (shouldBe): 11 * complex/tagged-template-regeneration.js: Added. 12 (call): 13 (test): 14 * modules/tagged-template-inside-module.js: Added. 15 (from.string_appeared_here.call): 16 * modules/tagged-template-inside-module/other-tagged-templates.js: Added. 17 (call): 18 (export.otherTaggedTemplates): 19 * stress/call-and-construct-should-return-same-tagged-templates.js: Added. 20 (shouldBe): 21 (call): 22 (poly): 23 * stress/tagged-templates-in-direct-eval-should-not-produce-same-site-object.js: Added. 24 (shouldBe): 25 (call): 26 * stress/tagged-templates-in-global-function-should-not-produce-same-site-object.js: Added. 27 (shouldBe): 28 (call): 29 * stress/tagged-templates-in-indirect-eval-should-not-produce-same-site-object.js: Added. 30 (shouldBe): 31 (call): 32 * stress/tagged-templates-in-multiple-functions.js: Added. 33 (shouldBe): 34 (call): 35 (a): 36 (b): 37 (c): 38 1 39 2019-05-06 Stephan Szabo <stephan.szabo@sony.com> 2 40 -
trunk/JSTests/complex.yaml
r244915 r244978 26 26 - path: complex/generator-regeneration.js 27 27 cmd: runComplexTest [], ["generator-regeneration-after.js"], "--useDollarVM=1" 28 29 - path: complex/tagged-template-regeneration.js 30 cmd: runComplexTest [], ["tagged-template-regeneration-after.js"], "--useDollarVM=1" -
trunk/Source/JavaScriptCore/ChangeLog
r244950 r244978 1 2019-05-06 Yusuke Suzuki <ysuzuki@apple.com> 2 3 TemplateObject passed to template literal tags are not always identical for the same source location. 4 https://bugs.webkit.org/show_bug.cgi?id=190756 5 6 Reviewed by Saam Barati. 7 8 Tagged template literal requires that the site object is allocated per source location. Previously, we create the site object 9 when linking CodeBlock and cache it in CodeBlock. But this is wrong because, 10 11 1. CodeBlock can be jettisoned and regenerated. So every time CodeBlock is regenerated, we get the different site object. 12 2. Call and Construct can have different CodeBlock. Even if the function is called in call-form or construct-form, we should return the same site object. 13 14 In this patch, we start caching these site objects in the top-level ScriptExecutable, this matches the spec's per source location since the only one top-level 15 ScriptExecutable is created for the given script code. Each ScriptExecutable of JSFunction can be created multiple times because CodeBlock creates it. 16 But the top-level one is not created by CodeBlock. This top-level ScriptExecutable is well-aligned to the Script itself. The top-level ScriptExecutable now has HashMap, 17 which maps source locations to cached site objects. 18 19 1. This patch threads the top-level ScriptExecutable to each FunctionExecutable creation. Each FunctionExecutable has a reference to the top-level ScriptExecutable. 20 2. We put TemplateObjectMap in ScriptExecutable, which manages cached template objects. 21 3. We move FunctionExecutable::m_cachedPolyProtoStructure to the FunctionExecutable::RareDate to keep FunctionExecutable 128 bytes. 22 23 * Scripts/tests/builtins/expected/JavaScriptCore-Builtin.Promise-Combined.js-result: 24 * Scripts/tests/builtins/expected/JavaScriptCore-Builtin.Promise-Separate.js-result: 25 * Scripts/tests/builtins/expected/JavaScriptCore-Builtin.prototype-Combined.js-result: 26 * Scripts/tests/builtins/expected/JavaScriptCore-Builtin.prototype-Separate.js-result: 27 * Scripts/tests/builtins/expected/JavaScriptCore-BuiltinConstructor-Combined.js-result: 28 * Scripts/tests/builtins/expected/JavaScriptCore-BuiltinConstructor-Separate.js-result: 29 * Scripts/tests/builtins/expected/JavaScriptCore-InternalClashingNames-Combined.js-result: 30 * Scripts/tests/builtins/expected/WebCore-AnotherGuardedInternalBuiltin-Separate.js-result: 31 * Scripts/tests/builtins/expected/WebCore-ArbitraryConditionalGuard-Separate.js-result: 32 * Scripts/tests/builtins/expected/WebCore-GuardedBuiltin-Separate.js-result: 33 * Scripts/tests/builtins/expected/WebCore-GuardedInternalBuiltin-Separate.js-result: 34 * Scripts/tests/builtins/expected/WebCore-UnguardedBuiltin-Separate.js-result: 35 * Scripts/tests/builtins/expected/WebCore-xmlCasingTest-Separate.js-result: 36 * Scripts/wkbuiltins/builtins_templates.py: 37 * bytecode/CodeBlock.cpp: 38 (JSC::CodeBlock::finishCreation): 39 (JSC::CodeBlock::setConstantRegisters): 40 * bytecode/CodeBlock.h: 41 * bytecode/UnlinkedFunctionExecutable.cpp: 42 (JSC::UnlinkedFunctionExecutable::link): 43 * bytecode/UnlinkedFunctionExecutable.h: 44 * bytecompiler/BytecodeGenerator.cpp: 45 (JSC::BytecodeGenerator::addTemplateObjectConstant): 46 (JSC::BytecodeGenerator::emitGetTemplateObject): 47 * bytecompiler/BytecodeGenerator.h: 48 * runtime/CachedTypes.cpp: 49 (JSC::CachedTemplateObjectDescriptor::encode): 50 (JSC::CachedTemplateObjectDescriptor::decode const): 51 (JSC::CachedJSValue::encode): 52 (JSC::CachedJSValue::decode const): 53 * runtime/EvalExecutable.cpp: 54 (JSC::EvalExecutable::ensureTemplateObjectMap): 55 (JSC::EvalExecutable::visitChildren): 56 * runtime/EvalExecutable.h: 57 * runtime/FunctionExecutable.cpp: 58 (JSC::FunctionExecutable::finishCreation): 59 (JSC::FunctionExecutable::visitChildren): 60 (JSC::FunctionExecutable::fromGlobalCode): 61 (JSC::FunctionExecutable::ensureRareDataSlow): 62 (JSC::FunctionExecutable::ensureTemplateObjectMap): 63 * runtime/FunctionExecutable.h: 64 * runtime/JSModuleRecord.cpp: 65 (JSC::JSModuleRecord::instantiateDeclarations): 66 * runtime/JSTemplateObjectDescriptor.cpp: 67 (JSC::JSTemplateObjectDescriptor::JSTemplateObjectDescriptor): 68 (JSC::JSTemplateObjectDescriptor::create): 69 * runtime/JSTemplateObjectDescriptor.h: 70 * runtime/ModuleProgramExecutable.cpp: 71 (JSC::ModuleProgramExecutable::ensureTemplateObjectMap): 72 (JSC::ModuleProgramExecutable::visitChildren): 73 * runtime/ModuleProgramExecutable.h: 74 * runtime/ProgramExecutable.cpp: 75 (JSC::ProgramExecutable::ensureTemplateObjectMap): 76 (JSC::ProgramExecutable::visitChildren): 77 * runtime/ProgramExecutable.h: 78 * runtime/ScriptExecutable.cpp: 79 (JSC::ScriptExecutable::topLevelExecutable): 80 (JSC::ScriptExecutable::createTemplateObject): 81 (JSC::ScriptExecutable::ensureTemplateObjectMap): 82 * runtime/ScriptExecutable.h: 83 * tools/JSDollarVM.cpp: 84 (JSC::functionCreateBuiltin): 85 (JSC::functionDeleteAllCodeWhenIdle): 86 (JSC::JSDollarVM::finishCreation): 87 1 88 2019-05-04 Tadeu Zagallo <tzagallo@apple.com> 2 89 -
trunk/Source/JavaScriptCore/Scripts/tests/builtins/expected/JavaScriptCore-Builtin.Promise-Combined.js-result
r240726 r244978 142 142 JSC::FunctionExecutable* codeName##Generator(JSC::VM& vm) \ 143 143 {\ 144 return vm.builtinExecutables()->codeName##Executable()->link(vm, vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); }144 return vm.builtinExecutables()->codeName##Executable()->link(vm, nullptr, 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
r240726 r244978 159 159 JSC::FunctionExecutable* codeName##Generator(JSC::VM& vm) \ 160 160 {\ 161 return vm.builtinExecutables()->codeName##Executable()->link(vm, vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); }161 return vm.builtinExecutables()->codeName##Executable()->link(vm, nullptr, 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
r240726 r244978 168 168 JSC::FunctionExecutable* codeName##Generator(JSC::VM& vm) \ 169 169 {\ 170 return vm.builtinExecutables()->codeName##Executable()->link(vm, vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); }170 return vm.builtinExecutables()->codeName##Executable()->link(vm, nullptr, 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
r240726 r244978 283 283 JSC::FunctionExecutable* codeName##Generator(JSC::VM& vm) \ 284 284 {\ 285 return vm.builtinExecutables()->codeName##Executable()->link(vm, vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); }285 return vm.builtinExecutables()->codeName##Executable()->link(vm, nullptr, 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
r240726 r244978 140 140 JSC::FunctionExecutable* codeName##Generator(JSC::VM& vm) \ 141 141 {\ 142 return vm.builtinExecutables()->codeName##Executable()->link(vm, vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); }142 return vm.builtinExecutables()->codeName##Executable()->link(vm, nullptr, 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
r240726 r244978 213 213 JSC::FunctionExecutable* codeName##Generator(JSC::VM& vm) \ 214 214 {\ 215 return vm.builtinExecutables()->codeName##Executable()->link(vm, vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); }215 return vm.builtinExecutables()->codeName##Executable()->link(vm, nullptr, 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
r240726 r244978 141 141 JSC::FunctionExecutable* codeName##Generator(JSC::VM& vm) \ 142 142 {\ 143 return vm.builtinExecutables()->codeName##Executable()->link(vm, vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); }143 return vm.builtinExecutables()->codeName##Executable()->link(vm, nullptr, 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
r240726 r244978 221 221 {\ 222 222 JSVMClientData* clientData = static_cast<JSVMClientData*>(vm.clientData); \ 223 return clientData->builtinFunctions().anotherGuardedInternalBuiltinBuiltins().codeName##Executable()->link(vm, clientData->builtinFunctions().anotherGuardedInternalBuiltinBuiltins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \223 return clientData->builtinFunctions().anotherGuardedInternalBuiltinBuiltins().codeName##Executable()->link(vm, nullptr, 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
r240726 r244978 191 191 {\ 192 192 JSVMClientData* clientData = static_cast<JSVMClientData*>(vm.clientData); \ 193 return clientData->builtinFunctions().arbitraryConditionalGuardBuiltins().codeName##Executable()->link(vm, clientData->builtinFunctions().arbitraryConditionalGuardBuiltins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \193 return clientData->builtinFunctions().arbitraryConditionalGuardBuiltins().codeName##Executable()->link(vm, nullptr, 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
r240726 r244978 191 191 {\ 192 192 JSVMClientData* clientData = static_cast<JSVMClientData*>(vm.clientData); \ 193 return clientData->builtinFunctions().guardedBuiltinBuiltins().codeName##Executable()->link(vm, clientData->builtinFunctions().guardedBuiltinBuiltins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \193 return clientData->builtinFunctions().guardedBuiltinBuiltins().codeName##Executable()->link(vm, nullptr, 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
r240726 r244978 223 223 {\ 224 224 JSVMClientData* clientData = static_cast<JSVMClientData*>(vm.clientData); \ 225 return clientData->builtinFunctions().guardedInternalBuiltinBuiltins().codeName##Executable()->link(vm, clientData->builtinFunctions().guardedInternalBuiltinBuiltins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \225 return clientData->builtinFunctions().guardedInternalBuiltinBuiltins().codeName##Executable()->link(vm, nullptr, 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
r240726 r244978 185 185 {\ 186 186 JSVMClientData* clientData = static_cast<JSVMClientData*>(vm.clientData); \ 187 return clientData->builtinFunctions().unguardedBuiltinBuiltins().codeName##Executable()->link(vm, clientData->builtinFunctions().unguardedBuiltinBuiltins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \187 return clientData->builtinFunctions().unguardedBuiltinBuiltins().codeName##Executable()->link(vm, nullptr, 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
r240726 r244978 276 276 {\ 277 277 JSVMClientData* clientData = static_cast<JSVMClientData*>(vm.clientData); \ 278 return clientData->builtinFunctions().xmlCasingTestBuiltins().codeName##Executable()->link(vm, clientData->builtinFunctions().xmlCasingTestBuiltins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \278 return clientData->builtinFunctions().xmlCasingTestBuiltins().codeName##Executable()->link(vm, nullptr, 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
r239427 r244978 86 86 JSC::FunctionExecutable* codeName##Generator(JSC::VM& vm) \\ 87 87 {\\ 88 return vm.builtinExecutables()->codeName##Executable()->link(vm, vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \88 return vm.builtinExecutables()->codeName##Executable()->link(vm, nullptr, 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, vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \99 return vm.builtinExecutables()->codeName##Executable()->link(vm, nullptr, 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, clientData->builtinFunctions().${objectNameLC}Builtins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \\111 return clientData->builtinFunctions().${objectNameLC}Builtins().codeName##Executable()->link(vm, nullptr, 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, clientData->builtinFunctions().${objectNameLC}Builtins().codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); \\123 return clientData->builtinFunctions().${objectNameLC}Builtins().codeName##Executable()->link(vm, nullptr, 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
r244915 r244978 396 396 vm.functionHasExecutedCache()->removeUnexecutedRange(ownerExecutable->sourceID(), ownerExecutable->typeProfilingStartOffset(vm), ownerExecutable->typeProfilingEndOffset(vm)); 397 397 398 setConstantRegisters(unlinkedCodeBlock->constantRegisters(), unlinkedCodeBlock->constantsSourceCodeRepresentation()); 398 ScriptExecutable* topLevelExecutable = ownerExecutable->topLevelExecutable(); 399 setConstantRegisters(unlinkedCodeBlock->constantRegisters(), unlinkedCodeBlock->constantsSourceCodeRepresentation(), topLevelExecutable); 399 400 RETURN_IF_EXCEPTION(throwScope, false); 400 401 … … 422 423 if (shouldUpdateFunctionHasExecutedCache) 423 424 vm.functionHasExecutedCache()->insertUnexecutedRange(ownerExecutable->sourceID(), unlinkedExecutable->typeProfilingStartOffset(), unlinkedExecutable->typeProfilingEndOffset()); 424 m_functionDecls[i].set(vm, this, unlinkedExecutable->link(vm, ownerExecutable->source()));425 m_functionDecls[i].set(vm, this, unlinkedExecutable->link(vm, topLevelExecutable, ownerExecutable->source())); 425 426 } 426 427 … … 430 431 if (shouldUpdateFunctionHasExecutedCache) 431 432 vm.functionHasExecutedCache()->insertUnexecutedRange(ownerExecutable->sourceID(), unlinkedExecutable->typeProfilingStartOffset(), unlinkedExecutable->typeProfilingEndOffset()); 432 m_functionExprs[i].set(vm, this, unlinkedExecutable->link(vm, ownerExecutable->source()));433 m_functionExprs[i].set(vm, this, unlinkedExecutable->link(vm, topLevelExecutable, ownerExecutable->source())); 433 434 } 434 435 … … 871 872 } 872 873 873 void CodeBlock::setConstantRegisters(const Vector<WriteBarrier<Unknown>>& constants, const Vector<SourceCodeRepresentation>& constantsSourceCodeRepresentation )874 void CodeBlock::setConstantRegisters(const Vector<WriteBarrier<Unknown>>& constants, const Vector<SourceCodeRepresentation>& constantsSourceCodeRepresentation, ScriptExecutable* topLevelExecutable) 874 875 { 875 876 VM& vm = *m_vm; … … 899 900 constant = clone; 900 901 } else if (auto* descriptor = jsDynamicCast<JSTemplateObjectDescriptor*>(vm, cell)) { 901 auto* templateObject = descriptor->createTemplateObject(exec);902 auto* templateObject = topLevelExecutable->createTemplateObject(exec, descriptor); 902 903 RETURN_IF_EXCEPTION(scope, void()); 903 904 constant = templateObject; -
trunk/Source/JavaScriptCore/bytecode/CodeBlock.h
r244811 r244978 912 912 void setConstantIdentifierSetRegisters(VM&, const Vector<ConstantIdentifierSetEntry>& constants); 913 913 914 void setConstantRegisters(const Vector<WriteBarrier<Unknown>>& constants, const Vector<SourceCodeRepresentation>& constantsSourceCodeRepresentation );914 void setConstantRegisters(const Vector<WriteBarrier<Unknown>>& constants, const Vector<SourceCodeRepresentation>& constantsSourceCodeRepresentation, ScriptExecutable* topLevelExecutable); 915 915 916 916 void replaceConstant(int index, JSValue value) -
trunk/Source/JavaScriptCore/bytecode/UnlinkedFunctionExecutable.cpp
r244915 r244978 159 159 } 160 160 161 FunctionExecutable* UnlinkedFunctionExecutable::link(VM& vm, const SourceCode& passedParentSource, Optional<int> overrideLineNumber, Intrinsic intrinsic)161 FunctionExecutable* UnlinkedFunctionExecutable::link(VM& vm, ScriptExecutable* topLevelExecutable, 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, source, this, intrinsic);169 FunctionExecutable* result = FunctionExecutable::create(vm, topLevelExecutable, source, this, intrinsic); 170 170 if (overrideLineNumber) 171 171 result->setOverrideLineNumber(*overrideLineNumber); -
trunk/Source/JavaScriptCore/bytecode/UnlinkedFunctionExecutable.h
r244915 r244978 127 127 128 128 SourceCode linkedSourceCode(const SourceCode&) const; 129 JS_EXPORT_PRIVATE FunctionExecutable* link(VM&, const SourceCode& parentSource, Optional<int> overrideLineNumber = WTF::nullopt, Intrinsic = NoIntrinsic);129 JS_EXPORT_PRIVATE FunctionExecutable* link(VM&, ScriptExecutable* topLevelExecutable, const SourceCode& parentSource, Optional<int> overrideLineNumber = WTF::nullopt, Intrinsic = NoIntrinsic); 130 130 131 131 void clearCode(VM& vm) -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
r244915 r244978 2949 2949 } 2950 2950 2951 RegisterID* BytecodeGenerator::addTemplateObjectConstant(Ref<TemplateObjectDescriptor>&& descriptor) 2952 { 2953 JSTemplateObjectDescriptor* descriptorValue = m_templateObjectDescriptorMap.ensure(descriptor.copyRef(), [&] { 2954 return JSTemplateObjectDescriptor::create(*vm(), WTFMove(descriptor)); 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); 2955 2956 }).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)) );4144 RefPtr<RegisterID> constant = addTemplateObjectConstant(TemplateObjectDescriptor::create(WTFMove(rawStrings), WTFMove(cookedStrings)), taggedTemplate->startOffset()); 4145 4145 if (!dst) 4146 4146 return constant.get(); -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
r244915 r244978 1061 1061 using IdentifierStringMap = HashMap<UniquedStringImpl*, JSString*, IdentifierRepHash>; 1062 1062 using IdentifierBigIntMap = HashMap<BigIntMapEntry, JSBigInt*>; 1063 using TemplateObjectDescriptorMap = HashMap<Ref<TemplateObjectDescriptor>, JSTemplateObjectDescriptor*>; 1063 using TemplateObjectDescriptorSet = HashSet<Ref<TemplateObjectDescriptor>>; 1064 using TemplateDescriptorMap = HashMap<uint64_t, JSTemplateObjectDescriptor*, WTF::IntHash<uint64_t>, WTF::UnsignedWithZeroKeyHashTraits<uint64_t>>; 1064 1065 1065 1066 // Helper for emitCall() and emitConstruct(). This works because the set of … … 1153 1154 JSString* addStringConstant(const Identifier&); 1154 1155 JSValue addBigIntConstant(const Identifier&, uint8_t radix, bool sign); 1155 RegisterID* addTemplateObjectConstant(Ref<TemplateObjectDescriptor>&& );1156 RegisterID* addTemplateObjectConstant(Ref<TemplateObjectDescriptor>&&, int); 1156 1157 1157 1158 const InstructionStream& instructions() const { return m_writer; } … … 1271 1272 IdentifierStringMap m_stringMap; 1272 1273 IdentifierBigIntMap m_bigIntMap; 1273 TemplateObjectDescriptorMap m_templateObjectDescriptorMap; 1274 TemplateObjectDescriptorSet m_templateObjectDescriptorSet; 1275 TemplateDescriptorMap m_templateDescriptorMap; 1274 1276 1275 1277 StaticPropertyAnalyzer m_staticPropertyAnalyzer; -
trunk/Source/JavaScriptCore/runtime/CachedTypes.cpp
r244915 r244978 1153 1153 class CachedTemplateObjectDescriptor : public CachedObject<TemplateObjectDescriptor> { 1154 1154 public: 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 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 1162 1163 { 1163 1164 TemplateObjectDescriptor::StringVector decodedRawStrings; … … 1165 1166 m_rawStrings.decode(decoder, decodedRawStrings); 1166 1167 m_cookedStrings.decode(decoder, decodedCookedStrings); 1167 return TemplateObjectDescriptor::create(WTFMove(decodedRawStrings), WTFMove(decodedCookedStrings));1168 return JSTemplateObjectDescriptor::create(decoder.vm(), TemplateObjectDescriptor::create(WTFMove(decodedRawStrings), WTFMove(decodedCookedStrings)), m_startOffset); 1168 1169 } 1169 1170 … … 1171 1172 CachedVector<CachedString, 4> m_rawStrings; 1172 1173 CachedVector<CachedOptional<CachedString>, 4> m_cookedStrings; 1174 int m_startOffset; 1173 1175 }; 1174 1176 … … 1244 1246 if (auto* templateObjectDescriptor = jsDynamicCast<JSTemplateObjectDescriptor*>(vm, cell)) { 1245 1247 m_type = EncodedType::TemplateObjectDescriptor; 1246 this->allocate<CachedTemplateObjectDescriptor>(encoder)->encode(encoder, templateObjectDescriptor->descriptor());1248 this->allocate<CachedTemplateObjectDescriptor>(encoder)->encode(encoder, *templateObjectDescriptor); 1247 1249 return; 1248 1250 } … … 1279 1281 break; 1280 1282 case EncodedType::TemplateObjectDescriptor: 1281 v = JSTemplateObjectDescriptor::create(decoder.vm(), this->buffer<CachedTemplateObjectDescriptor>()->decode(decoder));1283 v = this->buffer<CachedTemplateObjectDescriptor>()->decode(decoder); 1282 1284 break; 1283 1285 case EncodedType::BigInt: -
trunk/Source/JavaScriptCore/runtime/EvalExecutable.cpp
r243365 r244978 45 45 } 46 46 47 auto EvalExecutable::ensureTemplateObjectMap(VM&) -> TemplateObjectMap& 48 { 49 return ensureTemplateObjectMapImpl(m_templateObjectMap); 50 } 51 47 52 void EvalExecutable::visitChildren(JSCell* cell, SlotVisitor& visitor) 48 53 { … … 52 57 visitor.append(thisObject->m_unlinkedEvalCodeBlock); 53 58 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 } 54 64 } 55 65 -
trunk/Source/JavaScriptCore/runtime/EvalExecutable.h
r243365 r244978 70 70 bool allowDirectEvalCache() const { return m_unlinkedEvalCodeBlock->allowDirectEvalCache(); } 71 71 72 TemplateObjectMap& ensureTemplateObjectMap(VM&); 73 72 74 protected: 73 75 friend class ExecutableBase; … … 81 83 WriteBarrier<ExecutableToCodeBlockEdge> m_evalCodeBlock; 82 84 WriteBarrier<UnlinkedEvalCodeBlock> m_unlinkedEvalCodeBlock; 85 std::unique_ptr<TemplateObjectMap> m_templateObjectMap; 83 86 }; 84 87 -
trunk/Source/JavaScriptCore/runtime/FunctionExecutable.cpp
r243367 r244978 55 55 } 56 56 57 void FunctionExecutable::finishCreation(VM& vm )57 void FunctionExecutable::finishCreation(VM& vm, ScriptExecutable* topLevelExecutable) 58 58 { 59 59 Base::finishCreation(vm); 60 m_topLevelExecutable.set(vm, this, topLevelExecutable ? topLevelExecutable : this); 60 61 if (VM::canUseJIT()) 61 62 m_singletonFunction.set(vm, this, InferredValue::create(vm)); … … 86 87 ASSERT_GC_OBJECT_INHERITS(thisObject, info()); 87 88 Base::visitChildren(thisObject, visitor); 89 visitor.append(thisObject->m_topLevelExecutable); 88 90 visitor.append(thisObject->m_codeBlockForCall); 89 91 visitor.append(thisObject->m_codeBlockForConstruct); … … 91 93 if (VM::canUseJIT()) 92 94 visitor.append(thisObject->m_singletonFunction); 93 visitor.append(thisObject->m_cachedPolyProtoStructure); 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 } 94 103 } 95 104 … … 104 113 return nullptr; 105 114 106 return unlinkedExecutable->link(exec.vm(), source, overrideLineNumber);115 return unlinkedExecutable->link(exec.vm(), nullptr, source, overrideLineNumber); 107 116 } 108 117 … … 116 125 rareData->m_typeProfilingStartOffset = typeProfilingStartOffset(); 117 126 rareData->m_typeProfilingEndOffset = typeProfilingEndOffset(); 127 WTF::storeStoreFence(); 118 128 m_rareData = WTFMove(rareData); 119 129 return *m_rareData; … … 131 141 } 132 142 143 auto FunctionExecutable::ensureTemplateObjectMap(VM&) -> TemplateObjectMap& 144 { 145 RareData& rareData = ensureRareData(); 146 return ensureTemplateObjectMapImpl(rareData.m_templateObjectMap); 147 } 148 133 149 } // namespace JSC -
trunk/Source/JavaScriptCore/runtime/FunctionExecutable.h
r243365 r244978 49 49 } 50 50 51 static FunctionExecutable* create(VM& vm, const SourceCode& source, UnlinkedFunctionExecutable* unlinkedExecutable, Intrinsic intrinsic)51 static FunctionExecutable* create(VM& vm, ScriptExecutable* topLevelExecutable, 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 );54 executable->finishCreation(vm, topLevelExecutable); 55 55 return executable; 56 56 } … … 283 283 284 284 // Cached poly proto structure for the result of constructing this executable. 285 Structure* cachedPolyProtoStructure() { return m_cachedPolyProtoStructure.get(); } 286 void setCachedPolyProtoStructure(VM& vm, Structure* structure) { m_cachedPolyProtoStructure.set(vm, this, structure); } 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 } 287 295 288 296 InlineWatchpointSet& ensurePolyProtoWatchpoint() … … 294 302 295 303 Box<InlineWatchpointSet> sharedPolyProtoWatchpoint() const { return m_polyProtoWatchpoint; } 304 305 ScriptExecutable* topLevelExecutable() const { return m_topLevelExecutable.get(); } 306 307 TemplateObjectMap& ensureTemplateObjectMap(VM&); 296 308 297 309 private: … … 299 311 FunctionExecutable(VM&, const SourceCode&, UnlinkedFunctionExecutable*, Intrinsic); 300 312 301 void finishCreation(VM& );313 void finishCreation(VM&, ScriptExecutable* topLevelExecutable); 302 314 303 315 friend class ScriptExecutable; … … 312 324 unsigned m_typeProfilingStartOffset { UINT_MAX }; 313 325 unsigned m_typeProfilingEndOffset { UINT_MAX }; 326 std::unique_ptr<TemplateObjectMap> m_templateObjectMap; 327 WriteBarrier<Structure> m_cachedPolyProtoStructure; 314 328 }; 315 329 … … 322 336 RareData& ensureRareDataSlow(); 323 337 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=197625 324 341 std::unique_ptr<RareData> m_rareData; 342 WriteBarrier<ScriptExecutable> m_topLevelExecutable; 325 343 WriteBarrier<UnlinkedFunctionExecutable> m_unlinkedExecutable; 326 344 WriteBarrier<ExecutableToCodeBlockEdge> m_codeBlockForCall; … … 330 348 WatchpointState m_singletonFunctionState; 331 349 }; 332 WriteBarrier<Structure> m_cachedPolyProtoStructure;333 350 Box<InlineWatchpointSet> m_polyProtoWatchpoint; 334 351 }; -
trunk/Source/JavaScriptCore/runtime/JSModuleRecord.cpp
r230759 r244978 201 201 unlinkedFunctionExecutable->typeProfilingEndOffset()); 202 202 } 203 JSFunction* function = JSFunction::create(vm, unlinkedFunctionExecutable->link(vm, moduleProgramExecutable ->source()), moduleEnvironment);203 JSFunction* function = JSFunction::create(vm, unlinkedFunctionExecutable->link(vm, moduleProgramExecutable, 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
r228422 r244978 37 37 38 38 39 JSTemplateObjectDescriptor::JSTemplateObjectDescriptor(VM& vm, Ref<TemplateObjectDescriptor>&& descriptor )39 JSTemplateObjectDescriptor::JSTemplateObjectDescriptor(VM& vm, Ref<TemplateObjectDescriptor>&& descriptor, int startOffset) 40 40 : Base(vm, vm.templateObjectDescriptorStructure.get()) 41 41 , m_descriptor(WTFMove(descriptor)) 42 , m_startOffset(startOffset) 42 43 { 43 44 } 44 45 45 JSTemplateObjectDescriptor* JSTemplateObjectDescriptor::create(VM& vm, Ref<TemplateObjectDescriptor>&& descriptor )46 JSTemplateObjectDescriptor* JSTemplateObjectDescriptor::create(VM& vm, Ref<TemplateObjectDescriptor>&& descriptor, int startOffset) 46 47 { 47 JSTemplateObjectDescriptor* result = new (NotNull, allocateCell<JSTemplateObjectDescriptor>(vm.heap)) JSTemplateObjectDescriptor(vm, WTFMove(descriptor) );48 JSTemplateObjectDescriptor* result = new (NotNull, allocateCell<JSTemplateObjectDescriptor>(vm.heap)) JSTemplateObjectDescriptor(vm, WTFMove(descriptor), startOffset); 48 49 result->finishCreation(vm); 49 50 return result; -
trunk/Source/JavaScriptCore/runtime/JSTemplateObjectDescriptor.h
r229413 r244978 39 39 DECLARE_INFO; 40 40 41 static JSTemplateObjectDescriptor* create(VM&, Ref<TemplateObjectDescriptor>&& );41 static JSTemplateObjectDescriptor* create(VM&, Ref<TemplateObjectDescriptor>&&, int); 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 52 54 protected: 53 55 static void destroy(JSCell*); 54 56 55 57 private: 56 JSTemplateObjectDescriptor(VM&, Ref<TemplateObjectDescriptor>&& );58 JSTemplateObjectDescriptor(VM&, Ref<TemplateObjectDescriptor>&&, int); 57 59 58 60 Ref<TemplateObjectDescriptor> m_descriptor; 61 int m_startOffset { 0 }; 59 62 }; 60 63 -
trunk/Source/JavaScriptCore/runtime/ModuleProgramExecutable.cpp
r244915 r244978 86 86 } 87 87 88 auto ModuleProgramExecutable::ensureTemplateObjectMap(VM&) -> TemplateObjectMap& 89 { 90 return ensureTemplateObjectMapImpl(m_templateObjectMap); 91 } 92 88 93 void ModuleProgramExecutable::visitChildren(JSCell* cell, SlotVisitor& visitor) 89 94 { … … 94 99 visitor.append(thisObject->m_moduleEnvironmentSymbolTable); 95 100 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 } 96 106 } 97 107 -
trunk/Source/JavaScriptCore/runtime/ModuleProgramExecutable.h
r243365 r244978 70 70 SymbolTable* moduleEnvironmentSymbolTable() { return m_moduleEnvironmentSymbolTable.get(); } 71 71 72 TemplateObjectMap& ensureTemplateObjectMap(VM&); 73 72 74 private: 73 75 friend class ExecutableBase; … … 81 83 WriteBarrier<SymbolTable> m_moduleEnvironmentSymbolTable; 82 84 WriteBarrier<ExecutableToCodeBlockEdge> m_moduleProgramCodeBlock; 85 std::unique_ptr<TemplateObjectMap> m_templateObjectMap; 83 86 }; 84 87 -
trunk/Source/JavaScriptCore/runtime/ProgramExecutable.cpp
r244915 r244978 217 217 } 218 218 219 auto ProgramExecutable::ensureTemplateObjectMap(VM&) -> TemplateObjectMap& 220 { 221 return ensureTemplateObjectMapImpl(m_templateObjectMap); 222 } 223 219 224 void ProgramExecutable::visitChildren(JSCell* cell, SlotVisitor& visitor) 220 225 { … … 224 229 visitor.append(thisObject->m_unlinkedProgramCodeBlock); 225 230 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 } 226 236 } 227 237 -
trunk/Source/JavaScriptCore/runtime/ProgramExecutable.h
r243365 r244978 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 76 78 private: 77 79 friend class ExecutableBase; … … 84 86 WriteBarrier<UnlinkedProgramCodeBlock> m_unlinkedProgramCodeBlock; 85 87 WriteBarrier<ExecutableToCodeBlockEdge> m_programCodeBlock; 88 std::unique_ptr<TemplateObjectMap> m_templateObjectMap; 86 89 }; 87 90 -
trunk/Source/JavaScriptCore/runtime/ScriptExecutable.cpp
r244915 r244978 35 35 #include "JIT.h" 36 36 #include "JSCInlines.h" 37 #include "JSTemplateObjectDescriptor.h" 37 38 #include "LLIntEntrypoint.h" 38 39 #include "ModuleProgramCodeBlock.h" … … 436 437 } 437 438 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 438 494 CodeBlockHash ScriptExecutable::hashFor(CodeSpecializationKind kind) const 439 495 { -
trunk/Source/JavaScriptCore/runtime/ScriptExecutable.h
r244915 r244978 30 30 namespace JSC { 31 31 32 class JSArray; 33 class JSTemplateObjectDescriptor; 32 34 class IsoCellSet; 33 35 … … 38 40 39 41 static void destroy(JSCell*); 42 43 using TemplateObjectMap = HashMap<uint64_t, WriteBarrier<JSArray>, WTF::IntHash<uint64_t>, WTF::UnsignedWithZeroKeyHashTraits<uint64_t>>; 40 44 41 45 CodeBlockHash hashFor(CodeSpecializationKind) const; … … 113 117 Exception* prepareForExecution(VM&, JSFunction*, JSScope*, CodeSpecializationKind, CodeBlock*& resultCodeBlock); 114 118 119 ScriptExecutable* topLevelExecutable(); 120 JSArray* createTemplateObject(ExecState*, JSTemplateObjectDescriptor*); 121 115 122 private: 116 123 friend class ExecutableBase; … … 118 125 119 126 bool hasClearableCode(VM&) const; 127 128 TemplateObjectMap& ensureTemplateObjectMap(VM&); 120 129 121 130 protected: … … 138 147 } 139 148 149 static TemplateObjectMap& ensureTemplateObjectMapImpl(std::unique_ptr<TemplateObjectMap>& dest); 150 140 151 SourceCode m_source; 141 152 Intrinsic m_intrinsic { NoIntrinsic }; -
trunk/Source/JavaScriptCore/tools/JSDollarVM.cpp
r244915 r244978 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, source), exec->lexicalGlobalObject());1849 JSFunction* func = JSFunction::create(vm, createBuiltinExecutable(vm, source, Identifier::fromString(&vm, "foo"), ConstructorKind::None, ConstructAbility::CannotConstruct)->link(vm, nullptr, 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()); 2088 2097 } 2089 2098 … … 2277 2286 addFunction(vm, "disableDebuggerModeWhenIdle", functionDisableDebuggerModeWhenIdle, 0); 2278 2287 2288 addFunction(vm, "deleteAllCodeWhenIdle", functionDeleteAllCodeWhenIdle, 0); 2289 2279 2290 addFunction(vm, "globalObjectCount", functionGlobalObjectCount, 0); 2280 2291 addFunction(vm, "globalObjectForObject", functionGlobalObjectForObject, 1);
Note: See TracChangeset
for help on using the changeset viewer.