Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (240863 => 240864)
--- trunk/Source/_javascript_Core/ChangeLog 2019-02-01 20:22:51 UTC (rev 240863)
+++ trunk/Source/_javascript_Core/ChangeLog 2019-02-01 21:14:19 UTC (rev 240864)
@@ -1,5 +1,47 @@
2019-02-01 Yusuke Suzuki <ysuz...@apple.com>
+ [JSC] Unify CodeBlock IsoSubspaces
+ https://bugs.webkit.org/show_bug.cgi?id=194167
+
+ Reviewed by Saam Barati.
+
+ When we move CodeBlock into its IsoSubspace, we create IsoSubspaces for each subclass of CodeBlock.
+ But this is not necessary since,
+
+ 1. They do not override the classInfo methods.
+ 2. sizeof(ProgramCodeBlock etc.) == sizeof(CodeBlock) since subclasses adds no additional fields.
+
+ Creating IsoSubspace for each subclass is costly in terms of memory. Especially, IsoSubspace for
+ ProgramCodeBlock is. We typically create only one ProgramCodeBlock, and it means the rest of the
+ MarkedBlock (16KB - sizeof(footer) - sizeof(ProgramCodeBlock)) is just wasted.
+
+ This patch unifies these IsoSubspaces into one.
+
+ * bytecode/CodeBlock.cpp:
+ (JSC::CodeBlock::destroy):
+ * bytecode/CodeBlock.h:
+ * bytecode/EvalCodeBlock.cpp:
+ (JSC::EvalCodeBlock::destroy): Deleted.
+ * bytecode/EvalCodeBlock.h: We drop some utility functions in EvalCodeBlock and use UnlinkedEvalCodeBlock's one directly.
+ * bytecode/FunctionCodeBlock.cpp:
+ (JSC::FunctionCodeBlock::destroy): Deleted.
+ * bytecode/FunctionCodeBlock.h:
+ * bytecode/GlobalCodeBlock.h:
+ * bytecode/ModuleProgramCodeBlock.cpp:
+ (JSC::ModuleProgramCodeBlock::destroy): Deleted.
+ * bytecode/ModuleProgramCodeBlock.h:
+ * bytecode/ProgramCodeBlock.cpp:
+ (JSC::ProgramCodeBlock::destroy): Deleted.
+ * bytecode/ProgramCodeBlock.h:
+ * interpreter/Interpreter.cpp:
+ (JSC::Interpreter::execute):
+ * runtime/VM.cpp:
+ (JSC::VM::VM):
+ * runtime/VM.h:
+ (JSC::VM::forEachCodeBlockSpace):
+
+2019-02-01 Yusuke Suzuki <ysuz...@apple.com>
+
Unreviewed, follow-up after r240859
https://bugs.webkit.org/show_bug.cgi?id=194145
Modified: trunk/Source/_javascript_Core/bytecode/CodeBlock.cpp (240863 => 240864)
--- trunk/Source/_javascript_Core/bytecode/CodeBlock.cpp 2019-02-01 20:22:51 UTC (rev 240863)
+++ trunk/Source/_javascript_Core/bytecode/CodeBlock.cpp 2019-02-01 21:14:19 UTC (rev 240864)
@@ -1385,6 +1385,11 @@
VM::SpaceAndFinalizerSet::finalizerSetFor(*subspace()).remove(this);
}
+void CodeBlock::destroy(JSCell* cell)
+{
+ static_cast<CodeBlock*>(cell)->~CodeBlock();
+}
+
void CodeBlock::getICStatusMap(const ConcurrentJSLocker&, ICStatusMap& result)
{
#if ENABLE(JIT)
Modified: trunk/Source/_javascript_Core/bytecode/CodeBlock.h (240863 => 240864)
--- trunk/Source/_javascript_Core/bytecode/CodeBlock.h 2019-02-01 20:22:51 UTC (rev 240863)
+++ trunk/Source/_javascript_Core/bytecode/CodeBlock.h 2019-02-01 21:14:19 UTC (rev 240864)
@@ -191,6 +191,7 @@
static size_t estimatedSize(JSCell*, VM&);
static void visitChildren(JSCell*, SlotVisitor&);
+ static void destroy(JSCell*);
void visitChildren(SlotVisitor&);
void finalizeUnconditionally(VM&);
Modified: trunk/Source/_javascript_Core/bytecode/EvalCodeBlock.cpp (240863 => 240864)
--- trunk/Source/_javascript_Core/bytecode/EvalCodeBlock.cpp 2019-02-01 20:22:51 UTC (rev 240863)
+++ trunk/Source/_javascript_Core/bytecode/EvalCodeBlock.cpp 2019-02-01 21:14:19 UTC (rev 240864)
@@ -37,9 +37,4 @@
CREATE_METHOD_TABLE(EvalCodeBlock)
};
-void EvalCodeBlock::destroy(JSCell* cell)
-{
- static_cast<EvalCodeBlock*>(cell)->~EvalCodeBlock();
-}
-
} // namespace JSC
Modified: trunk/Source/_javascript_Core/bytecode/EvalCodeBlock.h (240863 => 240864)
--- trunk/Source/_javascript_Core/bytecode/EvalCodeBlock.h 2019-02-01 20:22:51 UTC (rev 240863)
+++ trunk/Source/_javascript_Core/bytecode/EvalCodeBlock.h 2019-02-01 21:14:19 UTC (rev 240864)
@@ -41,7 +41,7 @@
template<typename>
static IsoSubspace* subspaceFor(VM& vm)
{
- return &vm.evalCodeBlockSpace.space;
+ return &vm.codeBlockSpace.space;
}
static EvalCodeBlock* create(VM* vm, CopyParsedBlockTag, EvalCodeBlock& other)
@@ -67,11 +67,8 @@
return Structure::create(vm, globalObject, prototype, TypeInfo(CodeBlockType, StructureFlags), info());
}
- const Identifier& variable(unsigned index) { return unlinkedEvalCodeBlock()->variable(index); }
- unsigned numVariables() { return unlinkedEvalCodeBlock()->numVariables(); }
- const Identifier& functionHoistingCandidate(unsigned index) { return unlinkedEvalCodeBlock()->functionHoistingCandidate(index); }
- unsigned numFunctionHoistingCandidates() { return unlinkedEvalCodeBlock()->numFunctionHoistingCandidates(); }
-
+ UnlinkedEvalCodeBlock* unlinkedEvalCodeBlock() const { return jsCast<UnlinkedEvalCodeBlock*>(unlinkedCodeBlock()); }
+
private:
EvalCodeBlock(VM* vm, Structure* structure, CopyParsedBlockTag, EvalCodeBlock& other)
: GlobalCodeBlock(vm, structure, CopyParsedBlock, other)
@@ -83,11 +80,7 @@
: GlobalCodeBlock(vm, structure, ownerExecutable, unlinkedCodeBlock, scope, WTFMove(sourceProvider), 0, 1)
{
}
-
- static void destroy(JSCell*);
-
-private:
- UnlinkedEvalCodeBlock* unlinkedEvalCodeBlock() const { return jsCast<UnlinkedEvalCodeBlock*>(unlinkedCodeBlock()); }
};
+static_assert(sizeof(EvalCodeBlock) == sizeof(CodeBlock), "Subclasses of CodeBlock should be the same size to share IsoSubspace");
} // namespace JSC
Modified: trunk/Source/_javascript_Core/bytecode/FunctionCodeBlock.cpp (240863 => 240864)
--- trunk/Source/_javascript_Core/bytecode/FunctionCodeBlock.cpp 2019-02-01 20:22:51 UTC (rev 240863)
+++ trunk/Source/_javascript_Core/bytecode/FunctionCodeBlock.cpp 2019-02-01 21:14:19 UTC (rev 240864)
@@ -37,9 +37,4 @@
CREATE_METHOD_TABLE(FunctionCodeBlock)
};
-void FunctionCodeBlock::destroy(JSCell* cell)
-{
- static_cast<FunctionCodeBlock*>(cell)->~FunctionCodeBlock();
-}
-
} // namespace JSC
Modified: trunk/Source/_javascript_Core/bytecode/FunctionCodeBlock.h (240863 => 240864)
--- trunk/Source/_javascript_Core/bytecode/FunctionCodeBlock.h 2019-02-01 20:22:51 UTC (rev 240863)
+++ trunk/Source/_javascript_Core/bytecode/FunctionCodeBlock.h 2019-02-01 21:14:19 UTC (rev 240864)
@@ -42,7 +42,7 @@
template<typename>
static IsoSubspace* subspaceFor(VM& vm)
{
- return &vm.functionCodeBlockSpace.space;
+ return &vm.codeBlockSpace.space;
}
static FunctionCodeBlock* create(VM* vm, CopyParsedBlockTag, FunctionCodeBlock& other)
@@ -79,8 +79,7 @@
: CodeBlock(vm, structure, ownerExecutable, unlinkedCodeBlock, scope, WTFMove(sourceProvider), sourceOffset, firstLineColumnOffset)
{
}
-
- static void destroy(JSCell*);
};
+static_assert(sizeof(FunctionCodeBlock) == sizeof(CodeBlock), "Subclasses of CodeBlock should be the same size to share IsoSubspace");
} // namespace JSC
Modified: trunk/Source/_javascript_Core/bytecode/GlobalCodeBlock.h (240863 => 240864)
--- trunk/Source/_javascript_Core/bytecode/GlobalCodeBlock.h 2019-02-01 20:22:51 UTC (rev 240863)
+++ trunk/Source/_javascript_Core/bytecode/GlobalCodeBlock.h 2019-02-01 21:14:19 UTC (rev 240864)
@@ -50,5 +50,6 @@
{
}
};
+static_assert(sizeof(GlobalCodeBlock) == sizeof(CodeBlock), "Subclasses of CodeBlock should be the same size to share IsoSubspace");
} // namespace JSC
Modified: trunk/Source/_javascript_Core/bytecode/ModuleProgramCodeBlock.cpp (240863 => 240864)
--- trunk/Source/_javascript_Core/bytecode/ModuleProgramCodeBlock.cpp 2019-02-01 20:22:51 UTC (rev 240863)
+++ trunk/Source/_javascript_Core/bytecode/ModuleProgramCodeBlock.cpp 2019-02-01 21:14:19 UTC (rev 240864)
@@ -37,9 +37,4 @@
CREATE_METHOD_TABLE(ModuleProgramCodeBlock)
};
-void ModuleProgramCodeBlock::destroy(JSCell* cell)
-{
- static_cast<ModuleProgramCodeBlock*>(cell)->~ModuleProgramCodeBlock();
-}
-
} // namespace JSC
Modified: trunk/Source/_javascript_Core/bytecode/ModuleProgramCodeBlock.h (240863 => 240864)
--- trunk/Source/_javascript_Core/bytecode/ModuleProgramCodeBlock.h 2019-02-01 20:22:51 UTC (rev 240863)
+++ trunk/Source/_javascript_Core/bytecode/ModuleProgramCodeBlock.h 2019-02-01 21:14:19 UTC (rev 240864)
@@ -42,7 +42,7 @@
template<typename>
static IsoSubspace* subspaceFor(VM& vm)
{
- return &vm.moduleProgramCodeBlockSpace.space;
+ return &vm.codeBlockSpace.space;
}
static ModuleProgramCodeBlock* create(VM* vm, CopyParsedBlockTag, ModuleProgramCodeBlock& other)
@@ -79,8 +79,7 @@
: GlobalCodeBlock(vm, structure, ownerExecutable, unlinkedCodeBlock, scope, WTFMove(sourceProvider), 0, firstLineColumnOffset)
{
}
-
- static void destroy(JSCell*);
};
+static_assert(sizeof(ModuleProgramCodeBlock) == sizeof(CodeBlock), "Subclasses of CodeBlock should be the same size to share IsoSubspace");
} // namespace JSC
Modified: trunk/Source/_javascript_Core/bytecode/ProgramCodeBlock.cpp (240863 => 240864)
--- trunk/Source/_javascript_Core/bytecode/ProgramCodeBlock.cpp 2019-02-01 20:22:51 UTC (rev 240863)
+++ trunk/Source/_javascript_Core/bytecode/ProgramCodeBlock.cpp 2019-02-01 21:14:19 UTC (rev 240864)
@@ -37,9 +37,4 @@
CREATE_METHOD_TABLE(ProgramCodeBlock)
};
-void ProgramCodeBlock::destroy(JSCell* cell)
-{
- static_cast<ProgramCodeBlock*>(cell)->~ProgramCodeBlock();
-}
-
} // namespace JSC
Modified: trunk/Source/_javascript_Core/bytecode/ProgramCodeBlock.h (240863 => 240864)
--- trunk/Source/_javascript_Core/bytecode/ProgramCodeBlock.h 2019-02-01 20:22:51 UTC (rev 240863)
+++ trunk/Source/_javascript_Core/bytecode/ProgramCodeBlock.h 2019-02-01 21:14:19 UTC (rev 240864)
@@ -42,7 +42,7 @@
template<typename>
static IsoSubspace* subspaceFor(VM& vm)
{
- return &vm.programCodeBlockSpace.space;
+ return &vm.codeBlockSpace.space;
}
static ProgramCodeBlock* create(VM* vm, CopyParsedBlockTag, ProgramCodeBlock& other)
@@ -79,8 +79,7 @@
: GlobalCodeBlock(vm, structure, ownerExecutable, unlinkedCodeBlock, scope, WTFMove(sourceProvider), 0, firstLineColumnOffset)
{
}
-
- static void destroy(JSCell*);
};
+static_assert(sizeof(ProgramCodeBlock) == sizeof(CodeBlock), "Subclasses of CodeBlock should be the same size to share IsoSubspace");
} // namespace JSC
Modified: trunk/Source/_javascript_Core/interpreter/Interpreter.cpp (240863 => 240864)
--- trunk/Source/_javascript_Core/interpreter/Interpreter.cpp 2019-02-01 20:22:51 UTC (rev 240863)
+++ trunk/Source/_javascript_Core/interpreter/Interpreter.cpp 2019-02-01 21:14:19 UTC (rev 240864)
@@ -1044,12 +1044,13 @@
return checkedReturn(compileError);
codeBlock = jsCast<EvalCodeBlock*>(tempCodeBlock);
}
+ UnlinkedEvalCodeBlock* unlinkedCodeBlock = codeBlock->unlinkedEvalCodeBlock();
// We can't declare a "var"/"function" that overwrites a global "let"/"const"/"class" in a sloppy-mode eval.
if (variableObject->isGlobalObject() && !eval->isStrictMode() && (numVariables || numTopLevelFunctionDecls)) {
JSGlobalLexicalEnvironment* globalLexicalEnvironment = jsCast<JSGlobalObject*>(variableObject)->globalLexicalEnvironment();
for (unsigned i = 0; i < numVariables; ++i) {
- const Identifier& ident = codeBlock->variable(i);
+ const Identifier& ident = unlinkedCodeBlock->variable(i);
PropertySlot slot(globalLexicalEnvironment, PropertySlot::InternalMethodType::VMInquiry);
if (JSGlobalLexicalEnvironment::getOwnPropertySlot(globalLexicalEnvironment, callFrame, ident, slot)) {
return checkedReturn(throwTypeError(callFrame, throwScope, makeString("Can't create duplicate global variable in eval: '", String(ident.impl()), "'")));
@@ -1074,7 +1075,7 @@
variableObject->globalObject(vm)->varInjectionWatchpoint()->fireAll(vm, "Executed eval, fired VarInjection watchpoint");
for (unsigned i = 0; i < numVariables; ++i) {
- const Identifier& ident = codeBlock->variable(i);
+ const Identifier& ident = unlinkedCodeBlock->variable(i);
bool hasProperty = variableObject->hasProperty(callFrame, ident);
RETURN_IF_EXCEPTION(throwScope, checkedReturn(throwScope.exception()));
if (!hasProperty) {
@@ -1108,7 +1109,7 @@
}
for (unsigned i = 0; i < numFunctionHoistingCandidates; ++i) {
- const Identifier& ident = codeBlock->functionHoistingCandidate(i);
+ const Identifier& ident = unlinkedCodeBlock->functionHoistingCandidate(i);
JSValue resolvedScope = JSScope::resolveScopeForHoistingFuncDeclInEval(callFrame, scope, ident);
RETURN_IF_EXCEPTION(throwScope, checkedReturn(throwScope.exception()));
if (!resolvedScope.isUndefined()) {
Modified: trunk/Source/_javascript_Core/runtime/VM.cpp (240863 => 240864)
--- trunk/Source/_javascript_Core/runtime/VM.cpp 2019-02-01 20:22:51 UTC (rev 240863)
+++ trunk/Source/_javascript_Core/runtime/VM.cpp 2019-02-01 21:14:19 UTC (rev 240864)
@@ -317,10 +317,7 @@
, executableToCodeBlockEdgesWithConstraints(executableToCodeBlockEdgeSpace)
, executableToCodeBlockEdgesWithFinalizers(executableToCodeBlockEdgeSpace)
, inferredValuesWithFinalizers(inferredValueSpace)
- , evalCodeBlockSpace ISO_SUBSPACE_INIT(heap, destructibleCellHeapCellType.get(), EvalCodeBlock)
- , functionCodeBlockSpace ISO_SUBSPACE_INIT(heap, destructibleCellHeapCellType.get(), FunctionCodeBlock)
- , moduleProgramCodeBlockSpace ISO_SUBSPACE_INIT(heap, destructibleCellHeapCellType.get(), ModuleProgramCodeBlock)
- , programCodeBlockSpace ISO_SUBSPACE_INIT(heap, destructibleCellHeapCellType.get(), ProgramCodeBlock)
+ , codeBlockSpace ISO_SUBSPACE_INIT(heap, destructibleCellHeapCellType.get(), CodeBlock)
, directEvalExecutableSpace ISO_SUBSPACE_INIT(heap, destructibleCellHeapCellType.get(), DirectEvalExecutable)
, functionExecutableSpace ISO_SUBSPACE_INIT(heap, destructibleCellHeapCellType.get(), FunctionExecutable)
, indirectEvalExecutableSpace ISO_SUBSPACE_INIT(heap, destructibleCellHeapCellType.get(), IndirectEvalExecutable)
Modified: trunk/Source/_javascript_Core/runtime/VM.h (240863 => 240864)
--- trunk/Source/_javascript_Core/runtime/VM.h 2019-02-01 20:22:51 UTC (rev 240863)
+++ trunk/Source/_javascript_Core/runtime/VM.h 2019-02-01 21:14:19 UTC (rev 240864)
@@ -418,10 +418,7 @@
}
};
- SpaceAndFinalizerSet evalCodeBlockSpace;
- SpaceAndFinalizerSet functionCodeBlockSpace;
- SpaceAndFinalizerSet moduleProgramCodeBlockSpace;
- SpaceAndFinalizerSet programCodeBlockSpace;
+ SpaceAndFinalizerSet codeBlockSpace;
template<typename Func>
void forEachCodeBlockSpace(const Func& func)
@@ -428,10 +425,7 @@
{
// This should not include webAssemblyCodeBlockSpace because this is about subsclasses of
// JSC::CodeBlock.
- func(evalCodeBlockSpace);
- func(functionCodeBlockSpace);
- func(moduleProgramCodeBlockSpace);
- func(programCodeBlockSpace);
+ func(codeBlockSpace);
}
struct ScriptExecutableSpaceAndSet {