WebKit Bugzilla
Attachment 371361 Details for
Bug 198023
: [JSC] UnlinkedCodeBlock should be eventually jettisoned in VM mini mode
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-198023-20190604184844.patch (text/plain), 31.94 KB, created by
Yusuke Suzuki
on 2019-06-04 18:48:45 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Yusuke Suzuki
Created:
2019-06-04 18:48:45 PDT
Size:
31.94 KB
patch
obsolete
>Subversion Revision: 246093 >diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog >index 521baaaa39e8ed45945f2be0f4398681e8473d70..5ec1ec27c4e8d8c9c3dca7adb1a65b6fd8f737e8 100644 >--- a/Source/JavaScriptCore/ChangeLog >+++ b/Source/JavaScriptCore/ChangeLog >@@ -1,3 +1,56 @@ >+2019-06-04 Yusuke Suzuki <ysuzuki@apple.com> >+ >+ [JSC] UnlinkedCodeBlock should be eventually jettisoned too or cached >+ https://bugs.webkit.org/show_bug.cgi?id=198023 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * bytecode/BytecodeDumper.cpp: >+ (JSC::BytecodeDumper<Block>::dumpConstants): >+ * bytecode/CodeBlock.cpp: >+ (JSC::CodeBlock::CodeBlock): >+ (JSC::CodeBlock::finishCreation): >+ (JSC::CodeBlock::setConstantRegisters): >+ (JSC::CodeBlock::shrinkToFit): >+ * bytecode/CodeBlock.h: >+ (JSC::CodeBlock::constantMetadata): >+ (JSC::CodeBlock::addConstant): >+ (JSC::CodeBlock::addConstantLazily): >+ (JSC::CodeBlock::constantConstantMetadata const): >+ (JSC::CodeBlock::constantsSourceCodeRepresentation): Deleted. >+ (JSC::CodeBlock::constantSourceCodeRepresentation const): Deleted. >+ * bytecode/UnlinkedCodeBlock.cpp: >+ (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock): >+ (JSC::UnlinkedCodeBlock::shrinkToFit): >+ * bytecode/UnlinkedCodeBlock.h: >+ (JSC::UnlinkedCodeBlock::addSetConstant): >+ (JSC::UnlinkedCodeBlock::addConstant): >+ (JSC::UnlinkedCodeBlock::constantMetadata): >+ (JSC::UnlinkedCodeBlock::setCachedCodeBlockOffset): >+ (JSC::UnlinkedCodeBlock::registerIndexForLinkTimeConstant): Deleted. >+ (JSC::UnlinkedCodeBlock::constantsSourceCodeRepresentation): Deleted. >+ * bytecompiler/BytecodeGenerator.cpp: >+ (JSC::BytecodeGenerator::addConstantValue): >+ (JSC::BytecodeGenerator::emitLoad): >+ * bytecompiler/BytecodeGenerator.h: >+ * bytecompiler/NodesCodegen.cpp: >+ (JSC::NumberNode::emitBytecode): >+ * dfg/DFGByteCodeParser.cpp: >+ (JSC::DFG::ByteCodeParser::get): >+ * dfg/DFGGraph.cpp: >+ (JSC::DFG::Graph::registerFrozenValues): >+ * dfg/DFGJITFinalizer.cpp: >+ (JSC::DFG::JITFinalizer::finalizeCommon): >+ * runtime/CachedTypes.cpp: >+ (JSC::CachedCodeBlock<CodeBlockType>::decode const): >+ (JSC::CachedCodeBlock<CodeBlockType>::encode): >+ (JSC::decodeFunctionCodeBlock): >+ * runtime/JSCJSValue.h: >+ (JSC::EncodedJSValueWithRepresentationHashTraits::emptyValue): >+ (JSC::EncodedJSValueWithRepresentationHashTraits::constructDeletedValue): >+ (JSC::EncodedJSValueWithRepresentationHashTraits::isDeletedValue): >+ (JSC::EncodedJSValueWithRepresentationHash::hash): >+ > 2019-06-04 Yusuke Suzuki <ysuzuki@apple.com> > > Unreviewed, update exception scope for putByIndexBeyondVectorLength >diff --git a/Source/JavaScriptCore/bytecode/BytecodeDumper.cpp b/Source/JavaScriptCore/bytecode/BytecodeDumper.cpp >index 371472c412e45222261060a82f02b14253603ced..6d41ef8f032dede6514a483fc009430bd049a18b 100644 >--- a/Source/JavaScriptCore/bytecode/BytecodeDumper.cpp >+++ b/Source/JavaScriptCore/bytecode/BytecodeDumper.cpp >@@ -117,19 +117,22 @@ void BytecodeDumper<Block>::dumpConstants() > m_out.printf("\nConstants:\n"); > size_t i = 0; > for (const auto& constant : block()->constantRegisters()) { >- const char* sourceCodeRepresentationDescription = nullptr; >- switch (block()->constantsSourceCodeRepresentation()[i]) { >- case SourceCodeRepresentation::Double: >- sourceCodeRepresentationDescription = ": in source as double"; >+ const char* constantMetadataDescription = nullptr; >+ switch (block()->constantMetadata()[i]) { >+ case ConstantMetadata::Double: >+ constantMetadataDescription = ": in source as double"; > break; >- case SourceCodeRepresentation::Integer: >- sourceCodeRepresentationDescription = ": in source as integer"; >+ case ConstantMetadata::Integer: >+ constantMetadataDescription = ": in source as integer"; > break; >- case SourceCodeRepresentation::Other: >- sourceCodeRepresentationDescription = ""; >+ case ConstantMetadata::LinkTimeConstant: >+ constantMetadataDescription = ": link time constant"; >+ break; >+ case ConstantMetadata::Other: >+ constantMetadataDescription = ""; > break; > } >- m_out.printf(" k%u = %s%s\n", static_cast<unsigned>(i), toCString(constant.get()).data(), sourceCodeRepresentationDescription); >+ m_out.printf(" k%u = %s%s\n", static_cast<unsigned>(i), toCString(constant.get()).data(), constantMetadataDescription); > ++i; > } > } >diff --git a/Source/JavaScriptCore/bytecode/CodeBlock.cpp b/Source/JavaScriptCore/bytecode/CodeBlock.cpp >index ade2ace3d1a46d1316a043d31058201001770d50..60b65e19ffaa24ed8d5558276d5f9ebbd788f6c8 100644 >--- a/Source/JavaScriptCore/bytecode/CodeBlock.cpp >+++ b/Source/JavaScriptCore/bytecode/CodeBlock.cpp >@@ -306,7 +306,7 @@ CodeBlock::CodeBlock(VM* vm, Structure* structure, CopyParsedBlockTag, CodeBlock > , m_vm(other.m_vm) > , m_instructionsRawPointer(other.m_instructionsRawPointer) > , m_constantRegisters(other.m_constantRegisters) >- , m_constantsSourceCodeRepresentation(other.m_constantsSourceCodeRepresentation) >+ , m_constantMetadata(other.m_constantMetadata) > , m_functionDecls(other.m_functionDecls) > , m_functionExprs(other.m_functionExprs) > , m_osrExitCounter(0) >@@ -396,15 +396,9 @@ bool CodeBlock::finishCreation(VM& vm, ScriptExecutable* ownerExecutable, Unlink > vm.functionHasExecutedCache()->removeUnexecutedRange(ownerExecutable->sourceID(), ownerExecutable->typeProfilingStartOffset(vm), ownerExecutable->typeProfilingEndOffset(vm)); > > ScriptExecutable* topLevelExecutable = ownerExecutable->topLevelExecutable(); >- setConstantRegisters(unlinkedCodeBlock->constantRegisters(), unlinkedCodeBlock->constantsSourceCodeRepresentation(), topLevelExecutable); >+ setConstantRegisters(unlinkedCodeBlock->constantRegisters(), unlinkedCodeBlock->constantMetadata(), topLevelExecutable); > RETURN_IF_EXCEPTION(throwScope, false); > >- for (unsigned i = 0; i < LinkTimeConstantCount; i++) { >- LinkTimeConstant type = static_cast<LinkTimeConstant>(i); >- if (unsigned registerIndex = unlinkedCodeBlock->registerIndexForLinkTimeConstant(type)) >- m_constantRegisters[registerIndex].set(vm, this, m_globalObject->jsCellForLinkTimeConstant(type)); >- } >- > // We already have the cloned symbol table for the module environment since we need to instantiate > // the module environments before linking the code block. We replace the stored symbol table with the already cloned one. > if (UnlinkedModuleProgramCodeBlock* unlinkedModuleProgramCodeBlock = jsDynamicCast<UnlinkedModuleProgramCodeBlock*>(vm, unlinkedCodeBlock)) { >@@ -867,18 +861,19 @@ void CodeBlock::setConstantIdentifierSetRegisters(VM& vm, const Vector<ConstantI > } > } > >-void CodeBlock::setConstantRegisters(const Vector<WriteBarrier<Unknown>>& constants, const Vector<SourceCodeRepresentation>& constantsSourceCodeRepresentation, ScriptExecutable* topLevelExecutable) >+void CodeBlock::setConstantRegisters(const Vector<WriteBarrier<Unknown>>& constants, const Vector<ConstantMetadata>& constantMetadata, ScriptExecutable* topLevelExecutable) > { > VM& vm = *m_vm; > auto scope = DECLARE_THROW_SCOPE(vm); > JSGlobalObject* globalObject = m_globalObject.get(); > ExecState* exec = globalObject->globalExec(); > >- ASSERT(constants.size() == constantsSourceCodeRepresentation.size()); >+ ASSERT(constants.size() == constantMetadata.size()); > size_t count = constants.size(); > m_constantRegisters.resizeToFit(count); > for (size_t i = 0; i < count; i++) { > JSValue constant = constants[i].get(); >+ ConstantMetadata metadata = constantMetadata[i]; > > if (!constant.isEmpty()) { > if (constant.isCell()) { >@@ -899,13 +894,17 @@ void CodeBlock::setConstantRegisters(const Vector<WriteBarrier<Unknown>>& consta > RETURN_IF_EXCEPTION(scope, void()); > constant = templateObject; > } >+ } else if (metadata == ConstantMetadata::LinkTimeConstant) { >+ ASSERT(constant.isInt32()); >+ LinkTimeConstant linkTimeConstant = static_cast<LinkTimeConstant>(constant.asInt32()); >+ constant = m_globalObject->jsCellForLinkTimeConstant(linkTimeConstant); > } > } > > m_constantRegisters[i].set(vm, this, constant); > } > >- m_constantsSourceCodeRepresentation = constantsSourceCodeRepresentation; >+ m_constantMetadata = constantMetadata; > } > > void CodeBlock::setAlternative(VM& vm, CodeBlock* alternative) >@@ -1841,7 +1840,7 @@ void CodeBlock::shrinkToFit(ShrinkMode shrinkMode) > > if (shrinkMode == EarlyShrink) { > m_constantRegisters.shrinkToFit(); >- m_constantsSourceCodeRepresentation.shrinkToFit(); >+ m_constantMetadata.shrinkToFit(); > > if (m_rareData) { > m_rareData->m_switchJumpTables.shrinkToFit(); >diff --git a/Source/JavaScriptCore/bytecode/CodeBlock.h b/Source/JavaScriptCore/bytecode/CodeBlock.h >index 4e62bdec22ee9e5e286f9165404b0fc32d77c289..e2599da8f62def5cb160dfa8a6555ef7799ba445 100644 >--- a/Source/JavaScriptCore/bytecode/CodeBlock.h >+++ b/Source/JavaScriptCore/bytecode/CodeBlock.h >@@ -545,13 +545,13 @@ class CodeBlock : public JSCell { > #endif > > Vector<WriteBarrier<Unknown>>& constants() { return m_constantRegisters; } >- Vector<SourceCodeRepresentation>& constantsSourceCodeRepresentation() { return m_constantsSourceCodeRepresentation; } >+ Vector<ConstantMetadata>& constantMetadata() { return m_constantMetadata; } > unsigned addConstant(JSValue v) > { > unsigned result = m_constantRegisters.size(); > m_constantRegisters.append(WriteBarrier<Unknown>()); > m_constantRegisters.last().set(*m_vm, this, v); >- m_constantsSourceCodeRepresentation.append(SourceCodeRepresentation::Other); >+ m_constantMetadata.append(ConstantMetadata::Other); > return result; > } > >@@ -559,7 +559,7 @@ class CodeBlock : public JSCell { > { > unsigned result = m_constantRegisters.size(); > m_constantRegisters.append(WriteBarrier<Unknown>()); >- m_constantsSourceCodeRepresentation.append(SourceCodeRepresentation::Other); >+ m_constantMetadata.append(ConstantMetadata::Other); > return result; > } > >@@ -567,7 +567,7 @@ class CodeBlock : public JSCell { > WriteBarrier<Unknown>& constantRegister(int index) { return m_constantRegisters[index - FirstConstantRegisterIndex]; } > static ALWAYS_INLINE bool isConstantRegisterIndex(int index) { return index >= FirstConstantRegisterIndex; } > ALWAYS_INLINE JSValue getConstant(int index) const { return m_constantRegisters[index - FirstConstantRegisterIndex].get(); } >- ALWAYS_INLINE SourceCodeRepresentation constantSourceCodeRepresentation(int index) const { return m_constantsSourceCodeRepresentation[index - FirstConstantRegisterIndex]; } >+ ALWAYS_INLINE ConstantMetadata constantConstantMetadata(int index) const { return m_constantMetadata[index - FirstConstantRegisterIndex]; } > > FunctionExecutable* functionDecl(int index) { return m_functionDecls[index].get(); } > int numberOfFunctionDecls() { return m_functionDecls.size(); } >@@ -912,7 +912,7 @@ class CodeBlock : public JSCell { > > void setConstantIdentifierSetRegisters(VM&, const Vector<ConstantIdentifierSetEntry>& constants); > >- void setConstantRegisters(const Vector<WriteBarrier<Unknown>>& constants, const Vector<SourceCodeRepresentation>& constantsSourceCodeRepresentation, ScriptExecutable* topLevelExecutable); >+ void setConstantRegisters(const Vector<WriteBarrier<Unknown>>& constants, const Vector<ConstantMetadata>& constantMetadata, ScriptExecutable* topLevelExecutable); > > void replaceConstant(int index, JSValue value) > { >@@ -993,7 +993,7 @@ class CodeBlock : public JSCell { > // TODO: This could just be a pointer to m_unlinkedCodeBlock's data, but the DFG mutates > // it, so we're stuck with it for now. > Vector<WriteBarrier<Unknown>> m_constantRegisters; >- Vector<SourceCodeRepresentation> m_constantsSourceCodeRepresentation; >+ Vector<ConstantMetadata> m_constantMetadata; > RefCountedArray<WriteBarrier<FunctionExecutable>> m_functionDecls; > RefCountedArray<WriteBarrier<FunctionExecutable>> m_functionExprs; > >diff --git a/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp b/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp >index f9c3ba9d71647d423db18a14419804d34f30f441..02a026a61d0c44dd759a83f54a359e8ac1527a8b 100644 >--- a/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp >+++ b/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp >@@ -75,8 +75,6 @@ UnlinkedCodeBlock::UnlinkedCodeBlock(VM* vm, Structure* structure, CodeType code > , m_codeGenerationMode(codeGenerationMode) > , m_metadata(UnlinkedMetadataTable::create()) > { >- for (auto& constantRegisterIndex : m_linkTimeConstants) >- constantRegisterIndex = 0; > ASSERT(m_constructorKind == static_cast<unsigned>(info.constructorKind())); > ASSERT(m_codeType == static_cast<unsigned>(codeType)); > ASSERT(m_didOptimize == static_cast<unsigned>(MixedTriState)); >@@ -382,7 +380,7 @@ void UnlinkedCodeBlock::shrinkToFit() > m_propertyAccessInstructions.shrinkToFit(); > m_identifiers.shrinkToFit(); > m_constantRegisters.shrinkToFit(); >- m_constantsSourceCodeRepresentation.shrinkToFit(); >+ m_constantMetadata.shrinkToFit(); > m_functionDecls.shrinkToFit(); > m_functionExprs.shrinkToFit(); > m_expressionInfo.shrinkToFit(); >diff --git a/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h b/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h >index 2a350a1f11cf2131f72c2b4bd809018fe712eff2..d8035de585f10de81a50f6e624a12a9c6201bfb2 100644 >--- a/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h >+++ b/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h >@@ -167,18 +167,18 @@ class UnlinkedCodeBlock : public JSCell { > auto locker = lockDuringMarking(vm.heap, cellLock()); > unsigned result = m_constantRegisters.size(); > m_constantRegisters.append(WriteBarrier<Unknown>()); >- m_constantsSourceCodeRepresentation.append(SourceCodeRepresentation::Other); >+ m_constantMetadata.append(ConstantMetadata::Other); > m_rareData->m_constantIdentifierSets.append(ConstantIdentifierSetEntry(set, result)); > } > >- unsigned addConstant(JSValue v, SourceCodeRepresentation sourceCodeRepresentation = SourceCodeRepresentation::Other) >+ unsigned addConstant(JSValue v, ConstantMetadata constantMetadata = ConstantMetadata::Other) > { > VM& vm = *this->vm(); > auto locker = lockDuringMarking(vm.heap, cellLock()); > unsigned result = m_constantRegisters.size(); > m_constantRegisters.append(WriteBarrier<Unknown>()); > m_constantRegisters.last().set(vm, this, v); >- m_constantsSourceCodeRepresentation.append(sourceCodeRepresentation); >+ m_constantMetadata.append(constantMetadata); > return result; > } > unsigned addConstant(LinkTimeConstant type) >@@ -187,26 +187,18 @@ class UnlinkedCodeBlock : public JSCell { > auto locker = lockDuringMarking(vm.heap, cellLock()); > unsigned result = m_constantRegisters.size(); > ASSERT(result); >- unsigned index = static_cast<unsigned>(type); >- ASSERT(index < LinkTimeConstantCount); >- m_linkTimeConstants[index] = result; >+ ASSERT(static_cast<unsigned>(type) < LinkTimeConstantCount); > m_constantRegisters.append(WriteBarrier<Unknown>()); >- m_constantsSourceCodeRepresentation.append(SourceCodeRepresentation::Other); >+ m_constantRegisters.last().set(vm, this, jsNumber(static_cast<int32_t>(type))); >+ m_constantMetadata.append(ConstantMetadata::LinkTimeConstant); > return result; > } > >- unsigned registerIndexForLinkTimeConstant(LinkTimeConstant type) >- { >- unsigned index = static_cast<unsigned>(type); >- ASSERT(index < LinkTimeConstantCount); >- return m_linkTimeConstants[index]; >- } >- > const Vector<WriteBarrier<Unknown>>& constantRegisters() { return m_constantRegisters; } > const WriteBarrier<Unknown>& constantRegister(int index) const { return m_constantRegisters[index - FirstConstantRegisterIndex]; } > ALWAYS_INLINE bool isConstantRegisterIndex(int index) const { return index >= FirstConstantRegisterIndex; } > ALWAYS_INLINE JSValue getConstant(int index) const { return m_constantRegisters[index - FirstConstantRegisterIndex].get(); } >- const Vector<SourceCodeRepresentation>& constantsSourceCodeRepresentation() { return m_constantsSourceCodeRepresentation; } >+ const Vector<ConstantMetadata>& constantMetadata() { return m_constantMetadata; } > > unsigned numberOfConstantIdentifierSets() const { return m_rareData ? m_rareData->m_constantIdentifierSets.size() : 0; } > const Vector<ConstantIdentifierSetEntry>& constantIdentifierSets() { ASSERT(m_rareData); return m_rareData->m_constantIdentifierSets; } >@@ -370,6 +362,10 @@ class UnlinkedCodeBlock : public JSCell { > return m_metadata->sizeInBytes(); > } > >+ void setCachedCodeBlockOffset(int32_t offset) >+ { >+ m_cachedCodeBlockOffset = offset; >+ } > > protected: > UnlinkedCodeBlock(VM*, Structure*, CodeType, const ExecutableInfo&, OptionSet<CodeGenerationMode>); >@@ -406,8 +402,7 @@ class UnlinkedCodeBlock : public JSCell { > > VirtualRegister m_thisRegister; > VirtualRegister m_scopeRegister; >- >- std::array<unsigned, LinkTimeConstantCount> m_linkTimeConstants; >+ int32_t m_cachedCodeBlockOffset { -1 }; > > unsigned m_usesEval : 1; > unsigned m_isStrictMode : 1; >@@ -457,7 +452,7 @@ class UnlinkedCodeBlock : public JSCell { > // Constant Pools > Vector<Identifier> m_identifiers; > Vector<WriteBarrier<Unknown>> m_constantRegisters; >- Vector<SourceCodeRepresentation> m_constantsSourceCodeRepresentation; >+ Vector<ConstantMetadata> m_constantMetadata; > typedef Vector<WriteBarrier<UnlinkedFunctionExecutable>> FunctionExpressionVector; > FunctionExpressionVector m_functionDecls; > FunctionExpressionVector m_functionExprs; >diff --git a/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp b/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp >index abe4166c5b86e3220ae73a4a48118023f21f74ca..98c028bd28a43a6fd9c487b206751bc956ab8bfa 100644 >--- a/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp >+++ b/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp >@@ -1573,20 +1573,20 @@ RegisterID* BytecodeGenerator::addConstantEmptyValue() > return m_emptyValueRegister; > } > >-RegisterID* BytecodeGenerator::addConstantValue(JSValue v, SourceCodeRepresentation sourceCodeRepresentation) >+RegisterID* BytecodeGenerator::addConstantValue(JSValue v, ConstantMetadata constantMetadata) > { > if (!v) > return addConstantEmptyValue(); > > int index = m_nextConstantOffset; > >- if (sourceCodeRepresentation == SourceCodeRepresentation::Double && v.isInt32()) >+ if (constantMetadata == ConstantMetadata::Double && v.isInt32()) > v = jsDoubleNumber(v.asNumber()); >- EncodedJSValueWithRepresentation valueMapKey { JSValue::encode(v), sourceCodeRepresentation }; >+ EncodedJSValueWithRepresentation valueMapKey { JSValue::encode(v), constantMetadata }; > JSValueMap::AddResult result = m_jsValueMap.add(valueMapKey, m_nextConstantOffset); > if (result.isNewEntry) { > addConstantIndex(); >- m_codeBlock->addConstant(v, sourceCodeRepresentation); >+ m_codeBlock->addConstant(v, constantMetadata); > } else > index = result.iterator->value; > return &m_constantPoolRegisters[index]; >@@ -1891,9 +1891,9 @@ RegisterID* BytecodeGenerator::emitLoad(RegisterID* dst, const Identifier& ident > return emitLoad(dst, JSValue(stringInMap)); > } > >-RegisterID* BytecodeGenerator::emitLoad(RegisterID* dst, JSValue v, SourceCodeRepresentation sourceCodeRepresentation) >+RegisterID* BytecodeGenerator::emitLoad(RegisterID* dst, JSValue v, ConstantMetadata constantMetadata) > { >- RegisterID* constantID = addConstantValue(v, sourceCodeRepresentation); >+ RegisterID* constantID = addConstantValue(v, constantMetadata); > if (dst) > return move(dst, constantID); > return constantID; >diff --git a/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h b/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h >index e97686aa3edcdd8d3f9b57c4a6d123bac9cb3987..925f7c20e7ef0d7e1f233425861c815010babac8 100644 >--- a/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h >+++ b/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h >@@ -671,7 +671,7 @@ namespace JSC { > unsigned addConstantIndex(); > RegisterID* emitLoad(RegisterID* dst, bool); > RegisterID* emitLoad(RegisterID* dst, const Identifier&); >- RegisterID* emitLoad(RegisterID* dst, JSValue, SourceCodeRepresentation = SourceCodeRepresentation::Other); >+ RegisterID* emitLoad(RegisterID* dst, JSValue, ConstantMetadata = ConstantMetadata::Other); > RegisterID* emitLoad(RegisterID* dst, IdentifierSet& excludedList); > > template<typename UnaryOp, typename = std::enable_if_t<UnaryOp::opcodeID != op_negate>> >@@ -1104,7 +1104,7 @@ namespace JSC { > > bool hasConstant(const Identifier&) const; > unsigned addConstant(const Identifier&); >- RegisterID* addConstantValue(JSValue, SourceCodeRepresentation = SourceCodeRepresentation::Other); >+ RegisterID* addConstantValue(JSValue, ConstantMetadata = ConstantMetadata::Other); > RegisterID* addConstantEmptyValue(); > > UnlinkedFunctionExecutable* makeFunction(FunctionMetadataNode* metadata) >diff --git a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp b/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp >index 629d416bf94a32348462408395808ddb40c7c87f..a066cfdd375289124e9d2e5afb4765bcfd30849e 100644 >--- a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp >+++ b/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp >@@ -134,7 +134,7 @@ RegisterID* NumberNode::emitBytecode(BytecodeGenerator& generator, RegisterID* d > { > if (dst == generator.ignoredResult()) > return nullptr; >- return generator.emitLoad(dst, jsValue(generator), isIntegerNode() ? SourceCodeRepresentation::Integer : SourceCodeRepresentation::Double); >+ return generator.emitLoad(dst, jsValue(generator), isIntegerNode() ? ConstantMetadata::Integer : ConstantMetadata::Double); > } > > // ------------------------------ RegExpNode ----------------------------------- >diff --git a/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp b/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp >index a69b01cce2ad2fa99866e5bfba15a395f856f776..42b8cdcb0966f70bcbf1f668b352d88214cd3922 100644 >--- a/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp >+++ b/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp >@@ -292,7 +292,7 @@ class ByteCodeParser { > if (constantIndex >= oldSize || !m_constants[constantIndex]) { > const CodeBlock& codeBlock = *m_inlineStackTop->m_codeBlock; > JSValue value = codeBlock.getConstant(operand.offset()); >- SourceCodeRepresentation sourceCodeRepresentation = codeBlock.constantSourceCodeRepresentation(operand.offset()); >+ ConstantMetadata constantMetadata = codeBlock.constantConstantMetadata(operand.offset()); > if (constantIndex >= oldSize) { > m_constants.grow(constantIndex + 1); > for (unsigned i = oldSize; i < m_constants.size(); ++i) >@@ -300,7 +300,7 @@ class ByteCodeParser { > } > > Node* constantNode = nullptr; >- if (sourceCodeRepresentation == SourceCodeRepresentation::Double) >+ if (constantMetadata == ConstantMetadata::Double) > constantNode = addToGraph(DoubleConstant, OpInfo(m_graph.freezeStrong(jsDoubleNumber(value.asNumber())))); > else > constantNode = addToGraph(JSConstant, OpInfo(m_graph.freezeStrong(value))); >diff --git a/Source/JavaScriptCore/dfg/DFGGraph.cpp b/Source/JavaScriptCore/dfg/DFGGraph.cpp >index 32a2c9049fed6f82c6aba4076766bf429b139383..30c56e48dea62c3ce1305d2d57c3f3cfc6df4c31 100644 >--- a/Source/JavaScriptCore/dfg/DFGGraph.cpp >+++ b/Source/JavaScriptCore/dfg/DFGGraph.cpp >@@ -1385,7 +1385,7 @@ JSArrayBufferView* Graph::tryGetFoldableView(JSValue value, ArrayMode arrayMode) > void Graph::registerFrozenValues() > { > m_codeBlock->constants().shrink(0); >- m_codeBlock->constantsSourceCodeRepresentation().resize(0); >+ m_codeBlock->constantMetadata().resize(0); > for (FrozenValue* value : m_frozenValues) { > if (!value->pointsToHeap()) > continue; >@@ -1406,7 +1406,7 @@ void Graph::registerFrozenValues() > } } > } > m_codeBlock->constants().shrinkToFit(); >- m_codeBlock->constantsSourceCodeRepresentation().shrinkToFit(); >+ m_codeBlock->constantMetadata().shrinkToFit(); > } > > void Graph::visitChildren(SlotVisitor& visitor) >diff --git a/Source/JavaScriptCore/dfg/DFGJITFinalizer.cpp b/Source/JavaScriptCore/dfg/DFGJITFinalizer.cpp >index 0f0808b9812df2f7b912d1cc73b2aba20cb12740..8d800ded0f0f3f9f851b267a9491094ab10174af 100644 >--- a/Source/JavaScriptCore/dfg/DFGJITFinalizer.cpp >+++ b/Source/JavaScriptCore/dfg/DFGJITFinalizer.cpp >@@ -83,7 +83,7 @@ void JITFinalizer::finalizeCommon() > { > // Some JIT finalizers may have added more constants. Shrink-to-fit those things now. > m_plan.codeBlock()->constants().shrinkToFit(); >- m_plan.codeBlock()->constantsSourceCodeRepresentation().shrinkToFit(); >+ m_plan.codeBlock()->constantMetadata().shrinkToFit(); > > #if ENABLE(FTL_JIT) > m_jitCode->optimizeAfterWarmUp(m_plan.codeBlock()); >diff --git a/Source/JavaScriptCore/runtime/CachedTypes.cpp b/Source/JavaScriptCore/runtime/CachedTypes.cpp >index d461e569329f1d9e8b86ecbc357b9ae7699d718a..0f9b08a7c21553dec87455e32c4cd0ad6ed358d4 100644 >--- a/Source/JavaScriptCore/runtime/CachedTypes.cpp >+++ b/Source/JavaScriptCore/runtime/CachedTypes.cpp >@@ -1817,7 +1817,6 @@ class CachedCodeBlock : public CachedObject<CodeBlockType> { > private: > VirtualRegister m_thisRegister; > VirtualRegister m_scopeRegister; >- std::array<unsigned, LinkTimeConstantCount> m_linkTimeConstants; > > unsigned m_usesEval : 1; > unsigned m_isStrictMode : 1; >@@ -1856,7 +1855,7 @@ class CachedCodeBlock : public CachedObject<CodeBlockType> { > CachedVector<InstructionStream::Offset> m_jumpTargets; > CachedVector<InstructionStream::Offset> m_propertyAccessInstructions; > CachedVector<CachedJSValue> m_constantRegisters; >- CachedVector<SourceCodeRepresentation> m_constantsSourceCodeRepresentation; >+ CachedVector<ConstantMetadata> m_constantMetadata; > CachedVector<ExpressionRangeInfo> m_expressionInfo; > CachedHashMap<InstructionStream::Offset, int> m_outOfLineJumpTargets; > >@@ -2055,12 +2054,9 @@ ALWAYS_INLINE UnlinkedCodeBlock::UnlinkedCodeBlock(Decoder& decoder, Structure* > template<typename CodeBlockType> > ALWAYS_INLINE void CachedCodeBlock<CodeBlockType>::decode(Decoder& decoder, UnlinkedCodeBlock& codeBlock) const > { >- for (unsigned i = LinkTimeConstantCount; i--;) >- codeBlock.m_linkTimeConstants[i] = m_linkTimeConstants[i]; >- > m_propertyAccessInstructions.decode(decoder, codeBlock.m_propertyAccessInstructions); > m_constantRegisters.decode(decoder, codeBlock.m_constantRegisters, &codeBlock); >- m_constantsSourceCodeRepresentation.decode(decoder, codeBlock.m_constantsSourceCodeRepresentation); >+ m_constantMetadata.decode(decoder, codeBlock.m_constantMetadata); > m_expressionInfo.decode(decoder, codeBlock.m_expressionInfo); > m_outOfLineJumpTargets.decode(decoder, codeBlock.m_outOfLineJumpTargets); > m_jumpTargets.decode(decoder, codeBlock.m_jumpTargets); >@@ -2223,9 +2219,6 @@ ALWAYS_INLINE void CachedCodeBlock<CodeBlockType>::encode(Encoder& encoder, cons > m_codeGenerationMode = codeBlock.m_codeGenerationMode; > m_codeType = codeBlock.m_codeType; > >- for (unsigned i = LinkTimeConstantCount; i--;) >- m_linkTimeConstants[i] = codeBlock.m_linkTimeConstants[i]; >- > m_metadata.encode(encoder, codeBlock.m_metadata.get()); > m_rareData.encode(encoder, codeBlock.m_rareData.get()); > >@@ -2235,7 +2228,7 @@ ALWAYS_INLINE void CachedCodeBlock<CodeBlockType>::encode(Encoder& encoder, cons > m_instructions.encode(encoder, codeBlock.m_instructions.get()); > m_propertyAccessInstructions.encode(encoder, codeBlock.m_propertyAccessInstructions); > m_constantRegisters.encode(encoder, codeBlock.m_constantRegisters); >- m_constantsSourceCodeRepresentation.encode(encoder, codeBlock.m_constantsSourceCodeRepresentation); >+ m_constantMetadata.encode(encoder, codeBlock.m_constantMetadata); > m_expressionInfo.encode(encoder, codeBlock.m_expressionInfo); > m_jumpTargets.encode(encoder, codeBlock.m_jumpTargets); > m_outOfLineJumpTargets.encode(encoder, codeBlock.m_outOfLineJumpTargets); >@@ -2445,6 +2438,8 @@ void decodeFunctionCodeBlock(Decoder& decoder, int32_t cachedFunctionCodeBlockOf > ASSERT(decoder.vm().heap.isDeferred()); > auto* cachedCodeBlock = static_cast<const CachedWriteBarrier<CachedFunctionCodeBlock, UnlinkedFunctionCodeBlock>*>(decoder.ptrForOffsetFromBase(cachedFunctionCodeBlockOffset)); > cachedCodeBlock->decode(decoder, codeBlock, owner); >+ if (codeBlock) >+ codeBlock->setCachedCodeBlockOffset(cachedFunctionCodeBlockOffset); > } > > } // namespace JSC >diff --git a/Source/JavaScriptCore/runtime/JSCJSValue.h b/Source/JavaScriptCore/runtime/JSCJSValue.h >index ef7033e591c8442f97aab7722cd03ff892632632..82672946e1e2874e778029b15e7bf3523e6f46ca 100644 >--- a/Source/JavaScriptCore/runtime/JSCJSValue.h >+++ b/Source/JavaScriptCore/runtime/JSCJSValue.h >@@ -126,10 +126,11 @@ enum WhichValueWord { > int64_t tryConvertToInt52(double); > bool isInt52(double); > >-enum class SourceCodeRepresentation : uint8_t { >+enum class ConstantMetadata : uint8_t { > Other, > Integer, >- Double >+ Double, >+ LinkTimeConstant, > }; > > class JSValue { >@@ -502,19 +503,19 @@ struct EncodedJSValueHashTraits : HashTraits<EncodedJSValue> { > }; > #endif > >-typedef std::pair<EncodedJSValue, SourceCodeRepresentation> EncodedJSValueWithRepresentation; >+typedef std::pair<EncodedJSValue, ConstantMetadata> EncodedJSValueWithRepresentation; > > struct EncodedJSValueWithRepresentationHashTraits : HashTraits<EncodedJSValueWithRepresentation> { > static const bool emptyValueIsZero = false; >- static EncodedJSValueWithRepresentation emptyValue() { return std::make_pair(JSValue::encode(JSValue()), SourceCodeRepresentation::Other); } >- static void constructDeletedValue(EncodedJSValueWithRepresentation& slot) { slot = std::make_pair(JSValue::encode(JSValue(JSValue::HashTableDeletedValue)), SourceCodeRepresentation::Other); } >- static bool isDeletedValue(EncodedJSValueWithRepresentation value) { return value == std::make_pair(JSValue::encode(JSValue(JSValue::HashTableDeletedValue)), SourceCodeRepresentation::Other); } >+ static EncodedJSValueWithRepresentation emptyValue() { return std::make_pair(JSValue::encode(JSValue()), ConstantMetadata::Other); } >+ static void constructDeletedValue(EncodedJSValueWithRepresentation& slot) { slot = std::make_pair(JSValue::encode(JSValue(JSValue::HashTableDeletedValue)), ConstantMetadata::Other); } >+ static bool isDeletedValue(EncodedJSValueWithRepresentation value) { return value == std::make_pair(JSValue::encode(JSValue(JSValue::HashTableDeletedValue)), ConstantMetadata::Other); } > }; > > struct EncodedJSValueWithRepresentationHash { > static unsigned hash(const EncodedJSValueWithRepresentation& value) > { >- return WTF::pairIntHash(EncodedJSValueHash::hash(value.first), IntHash<SourceCodeRepresentation>::hash(value.second)); >+ return WTF::pairIntHash(EncodedJSValueHash::hash(value.first), IntHash<ConstantMetadata>::hash(value.second)); > } > static bool equal(const EncodedJSValueWithRepresentation& a, const EncodedJSValueWithRepresentation& b) > {
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 198023
:
370283
|
371361
|
371455
|
371472
|
371473
|
371474
|
371560
|
371564
|
371569
|
371624