Title: [240864] trunk/Source/_javascript_Core
Revision
240864
Author
ysuz...@apple.com
Date
2019-02-01 13:14:19 -0800 (Fri, 01 Feb 2019)

Log Message

[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):

Modified Paths

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 {
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to