Title: [226017] trunk/Source/_javascript_Core
Revision
226017
Author
[email protected]
Date
2017-12-17 21:24:05 -0800 (Sun, 17 Dec 2017)

Log Message

[JSC] Use IsoSpace for JSWeakMap and JSWeakSet to use finalizeUnconditionally
https://bugs.webkit.org/show_bug.cgi?id=180916

Reviewed by Darin Adler.

This patch drops UnconditionalFinalizer for JSWeakMap and JSWeakSetby using IsoSpace.
Since these cells always require calling finalizeUnconditionally, we do not need to
track cells by using IsoCellSet.

Currently we still have WeakReferenceHarvester in JSWeakMap and JSWeakSet. We should
avoid using a global linked-list for this in the future.

* _javascript_Core.xcodeproj/project.pbxproj:
* heap/Heap.cpp:
(JSC::Heap::finalizeUnconditionalFinalizersInIsoSubspace):
(JSC::Heap::finalizeUnconditionalFinalizers):
* heap/Heap.h:
* runtime/VM.cpp:
(JSC::VM::VM):
* runtime/VM.h:
* runtime/WeakMapImpl.cpp:
(JSC::WeakMapImpl<WeakMapBucket>::visitChildren):
(JSC::WeakMapImpl<WeakMapBucket>::finalizeUnconditionally): Deleted.
* runtime/WeakMapImpl.h:
(JSC::WeakMapImpl::isWeakMap):
(JSC::WeakMapImpl::isWeakSet):
(JSC::WeakMapImpl::subspaceFor):
* runtime/WeakMapImplInlines.h: Added.
(JSC::WeakMapImpl<WeakMapBucket>::finalizeUnconditionally):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (226016 => 226017)


--- trunk/Source/_javascript_Core/ChangeLog	2017-12-18 03:44:54 UTC (rev 226016)
+++ trunk/Source/_javascript_Core/ChangeLog	2017-12-18 05:24:05 UTC (rev 226017)
@@ -1,3 +1,35 @@
+2017-12-17  Yusuke Suzuki  <[email protected]>
+
+        [JSC] Use IsoSpace for JSWeakMap and JSWeakSet to use finalizeUnconditionally
+        https://bugs.webkit.org/show_bug.cgi?id=180916
+
+        Reviewed by Darin Adler.
+
+        This patch drops UnconditionalFinalizer for JSWeakMap and JSWeakSetby using IsoSpace.
+        Since these cells always require calling finalizeUnconditionally, we do not need to
+        track cells by using IsoCellSet.
+
+        Currently we still have WeakReferenceHarvester in JSWeakMap and JSWeakSet. We should
+        avoid using a global linked-list for this in the future.
+
+        * _javascript_Core.xcodeproj/project.pbxproj:
+        * heap/Heap.cpp:
+        (JSC::Heap::finalizeUnconditionalFinalizersInIsoSubspace):
+        (JSC::Heap::finalizeUnconditionalFinalizers):
+        * heap/Heap.h:
+        * runtime/VM.cpp:
+        (JSC::VM::VM):
+        * runtime/VM.h:
+        * runtime/WeakMapImpl.cpp:
+        (JSC::WeakMapImpl<WeakMapBucket>::visitChildren):
+        (JSC::WeakMapImpl<WeakMapBucket>::finalizeUnconditionally): Deleted.
+        * runtime/WeakMapImpl.h:
+        (JSC::WeakMapImpl::isWeakMap):
+        (JSC::WeakMapImpl::isWeakSet):
+        (JSC::WeakMapImpl::subspaceFor):
+        * runtime/WeakMapImplInlines.h: Added.
+        (JSC::WeakMapImpl<WeakMapBucket>::finalizeUnconditionally):
+
 2017-12-17  Mark Lam  <[email protected]>
 
         Hollow out stub implementation of InspectorBackendDispatcher::sendResponse().

Modified: trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj (226016 => 226017)


--- trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj	2017-12-18 03:44:54 UTC (rev 226016)
+++ trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj	2017-12-18 05:24:05 UTC (rev 226017)
@@ -1698,6 +1698,7 @@
 		E35CA1561DBC3A5F00F83516 /* DOMJITAbstractHeap.h in Headers */ = {isa = PBXBuildFile; fileRef = E35CA1501DBC3A5600F83516 /* DOMJITAbstractHeap.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		E35E03601B7AB43E0073AD2A /* InspectorInstrumentationObject.h in Headers */ = {isa = PBXBuildFile; fileRef = E35E035E1B7AB43E0073AD2A /* InspectorInstrumentationObject.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		E3794E761B77EB97005543AE /* ModuleAnalyzer.h in Headers */ = {isa = PBXBuildFile; fileRef = E3794E741B77EB97005543AE /* ModuleAnalyzer.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		E393ADD81FE702D00022D681 /* WeakMapImplInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = E393ADD71FE702CC0022D681 /* WeakMapImplInlines.h */; };
 		E39D45F51D39005600B3B377 /* InterpreterInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = E39D9D841D39000600667282 /* InterpreterInlines.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		E39DA4A71B7E8B7C0084F33A /* JSModuleRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = E39DA4A51B7E8B7C0084F33A /* JSModuleRecord.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		E3A32BC71FC83147007D7E76 /* WeakMapImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = E3A32BC61FC8312E007D7E76 /* WeakMapImpl.h */; };
@@ -4534,6 +4535,7 @@
 		E38D060B1F8E814100649CF2 /* JSScriptFetchParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSScriptFetchParameters.h; sourceTree = "<group>"; };
 		E38D060C1F8E814100649CF2 /* ScriptFetchParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScriptFetchParameters.h; sourceTree = "<group>"; };
 		E38D060D1F8E814100649CF2 /* JSScriptFetchParameters.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSScriptFetchParameters.cpp; sourceTree = "<group>"; };
+		E393ADD71FE702CC0022D681 /* WeakMapImplInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WeakMapImplInlines.h; sourceTree = "<group>"; };
 		E3963CEC1B73F75000EB4CE5 /* NodesAnalyzeModule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NodesAnalyzeModule.cpp; sourceTree = "<group>"; };
 		E39D9D841D39000600667282 /* InterpreterInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InterpreterInlines.h; sourceTree = "<group>"; };
 		E39DA4A41B7E8B7C0084F33A /* JSModuleRecord.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSModuleRecord.cpp; sourceTree = "<group>"; };
@@ -6514,9 +6516,9 @@
 				E178633F0D9BEC0000D74E75 /* InitializeThreading.h */,
 				E35E035D1B7AB43E0073AD2A /* InspectorInstrumentationObject.cpp */,
 				E35E035E1B7AB43E0073AD2A /* InspectorInstrumentationObject.h */,
-				A7A8AF2B17ADB5F3005AB174 /* Int8Array.h */,
 				A7A8AF2C17ADB5F3005AB174 /* Int16Array.h */,
 				A7A8AF2D17ADB5F3005AB174 /* Int32Array.h */,
+				A7A8AF2B17ADB5F3005AB174 /* Int8Array.h */,
 				BC9BB95B0E19680600DF8855 /* InternalFunction.cpp */,
 				BC11667A0E199C05008066DD /* InternalFunction.h */,
 				A1B9E2331B4E0D6700BC7FED /* IntlCollator.cpp */,
@@ -6617,9 +6619,9 @@
 				BC756FC60E2031B200DE7D12 /* JSGlobalObjectFunctions.cpp */,
 				BC756FC70E2031B200DE7D12 /* JSGlobalObjectFunctions.h */,
 				79B819921DD25CF500DDC714 /* JSGlobalObjectInlines.h */,
-				0F2B66C917B6B5AB00A7AE3F /* JSInt8Array.h */,
 				0F2B66CA17B6B5AB00A7AE3F /* JSInt16Array.h */,
 				0F2B66CB17B6B5AB00A7AE3F /* JSInt32Array.h */,
+				0F2B66C917B6B5AB00A7AE3F /* JSInt8Array.h */,
 				E33F507E1B8429A400413856 /* JSInternalPromise.cpp */,
 				E33F507F1B8429A400413856 /* JSInternalPromise.h */,
 				E33F50761B84225700413856 /* JSInternalPromiseConstructor.cpp */,
@@ -6708,10 +6710,10 @@
 				53F256E11B87E28000B4B768 /* JSTypedArrayViewPrototype.cpp */,
 				53917E7C1B791106000EBD33 /* JSTypedArrayViewPrototype.h */,
 				6507D2970E871E4A00D7D896 /* JSTypeInfo.h */,
+				0F2B66D417B6B5AB00A7AE3F /* JSUint16Array.h */,
+				0F2B66D517B6B5AB00A7AE3F /* JSUint32Array.h */,
 				0F2B66D217B6B5AB00A7AE3F /* JSUint8Array.h */,
 				0F2B66D317B6B5AB00A7AE3F /* JSUint8ClampedArray.h */,
-				0F2B66D417B6B5AB00A7AE3F /* JSUint16Array.h */,
-				0F2B66D517B6B5AB00A7AE3F /* JSUint32Array.h */,
 				A7CA3AE117DA41AE006538AF /* JSWeakMap.cpp */,
 				A7CA3AE217DA41AE006538AF /* JSWeakMap.h */,
 				709FB8611AE335C60039D069 /* JSWeakSet.cpp */,
@@ -6925,11 +6927,11 @@
 				0F2D4DE019832D91007D4B19 /* TypeProfilerLog.h */,
 				0F2D4DE319832D91007D4B19 /* TypeSet.cpp */,
 				0F2D4DE419832D91007D4B19 /* TypeSet.h */,
-				A7A8AF3017ADB5F3005AB174 /* Uint8Array.h */,
-				A7A8AF3117ADB5F3005AB174 /* Uint8ClampedArray.h */,
 				A7A8AF3217ADB5F3005AB174 /* Uint16Array.h */,
 				866739D113BFDE710023D87C /* Uint16WithFraction.h */,
 				A7A8AF3317ADB5F3005AB174 /* Uint32Array.h */,
+				A7A8AF3017ADB5F3005AB174 /* Uint8Array.h */,
+				A7A8AF3117ADB5F3005AB174 /* Uint8ClampedArray.h */,
 				0FE050231AA9095600D33B33 /* VarOffset.cpp */,
 				0FE050241AA9095600D33B33 /* VarOffset.h */,
 				E18E3A570DF9278C00D90B34 /* VM.cpp */,
@@ -6947,6 +6949,7 @@
 				A7CA3ADE17DA41AE006538AF /* WeakMapConstructor.h */,
 				E3A32BC51FC8312D007D7E76 /* WeakMapImpl.cpp */,
 				E3A32BC61FC8312E007D7E76 /* WeakMapImpl.h */,
+				E393ADD71FE702CC0022D681 /* WeakMapImplInlines.h */,
 				A7CA3ADF17DA41AE006538AF /* WeakMapPrototype.cpp */,
 				A7CA3AE017DA41AE006538AF /* WeakMapPrototype.h */,
 				709FB8631AE335C60039D069 /* WeakSetConstructor.cpp */,
@@ -7991,8 +7994,8 @@
 			buildActionMask = 2147483647;
 			files = (
 				A72701B90DADE94900E548D7 /* ExceptionHelpers.h in Headers */,
+				5370806B1FE232DF00299E44 /* JSArrayBufferView.h in Headers */,
 				144005CB0A5338D10005F061 /* JSNode.h in Headers */,
-				5370806B1FE232DF00299E44 /* JSArrayBufferView.h in Headers */,
 				144007570A5370D20005F061 /* JSNodeList.h in Headers */,
 				144005CC0A5338F80005F061 /* Node.h in Headers */,
 				1440074A0A536CC20005F061 /* NodeList.h in Headers */,
@@ -8019,7 +8022,6 @@
 				0FEC85721BDACDC70080FF74 /* AirBasicBlock.h in Headers */,
 				0F2C63BC1E63440C00C13839 /* AirBlockInsertionSet.h in Headers */,
 				0FB3878E1BFBC44D00E3AB1E /* AirBlockWorklist.h in Headers */,
-				0FB467811FDDA6F7003FCB09 /* IsoCellSetInlines.h in Headers */,
 				0F79C7CA1E74C93B00EB34D1 /* AirBreakCriticalEdges.h in Headers */,
 				0F61832A1C45BF070072450B /* AirCCallingConvention.h in Headers */,
 				0FEC85741BDACDC70080FF74 /* AirCCallSpecial.h in Headers */,
@@ -8116,6 +8118,7 @@
 				8BC064961E1D845C00B2B8CA /* AsyncIteratorPrototype.h in Headers */,
 				6A38CFAA1E32B5AB0060206F /* AsyncStackTrace.h in Headers */,
 				0F7CF9571DC125900098CC12 /* AtomicsObject.h in Headers */,
+				0FB4677F1FDDA6E9003FCB09 /* AtomIndices.h in Headers */,
 				A5EA70E719F5B1010098F5EC /* AugmentableInspectorController.h in Headers */,
 				A5EA70E819F5B1010098F5EC /* AugmentableInspectorControllerClient.h in Headers */,
 				0F38D2A21D44196800680499 /* AuxiliaryBarrier.h in Headers */,
@@ -8732,8 +8735,10 @@
 				0FBF92B91FD76FFF00AC28A8 /* InferredStructure.h in Headers */,
 				0FBF92BA1FD7700400AC28A8 /* InferredStructureWatchpoint.h in Headers */,
 				0F0A75231B94BFA900110660 /* InferredType.h in Headers */,
+				0FB467851FDFB454003FCB09 /* InferredTypeInlines.h in Headers */,
 				0FFC92121B94D4DF0071DD66 /* InferredTypeTable.h in Headers */,
 				0FF8BDEB1AD4CF7100DFE884 /* InferredValue.h in Headers */,
+				0F4AE0431FE0D25700E20839 /* InferredValueInlines.h in Headers */,
 				BC18C4100E16F5CD00B34460 /* InitializeThreading.h in Headers */,
 				A513E5B8185B8BD3007E95AD /* InjectedScript.h in Headers */,
 				A514B2C3185A684400F3C7CB /* InjectedScriptBase.h in Headers */,
@@ -8793,6 +8798,8 @@
 				860BD801148EA6F200112B2F /* Intrinsic.h in Headers */,
 				534E03541E53BD2900213F64 /* IntrinsicGetterAccessCase.h in Headers */,
 				0FDCE1321FB11DA4006F3901 /* IsoAlignedMemoryAllocator.h in Headers */,
+				0FB467801FDDA6F1003FCB09 /* IsoCellSet.h in Headers */,
+				0FB467811FDDA6F7003FCB09 /* IsoCellSetInlines.h in Headers */,
 				0FDCE12D1FAFB4E5006F3901 /* IsoSubspace.h in Headers */,
 				8B9F6D561D5912FA001C739F /* IterationKind.h in Headers */,
 				FE4D55B81AE716CA0052E459 /* IterationStatus.h in Headers */,
@@ -8799,7 +8806,6 @@
 				70113D4C1A8DB093003848C4 /* IteratorOperations.h in Headers */,
 				70DC3E0A1B2DF2C700054299 /* IteratorPrototype.h in Headers */,
 				BC18C4130E16F5CD00B34460 /* _javascript_.h in Headers */,
-				0FB467851FDFB454003FCB09 /* InferredTypeInlines.h in Headers */,
 				A503FA1A188E0FB000110F14 /* _javascript_CallFrame.h in Headers */,
 				BC18C4140E16F5CD00B34460 /* _javascript_Core.h in Headers */,
 				BC18C4150E16F5CD00B34460 /* _javascript_CorePrefix.h in Headers */,
@@ -8995,7 +9001,6 @@
 				AD2FCBE51DB58DAD00B3E736 /* JSWebAssemblyInstance.h in Headers */,
 				ADE802991E08F1DE0058DE78 /* JSWebAssemblyLinkError.h in Headers */,
 				AD2FCBE71DB58DAD00B3E736 /* JSWebAssemblyMemory.h in Headers */,
-				0FB4677F1FDDA6E9003FCB09 /* AtomIndices.h in Headers */,
 				AD2FCC051DB58DAD00B3E736 /* JSWebAssemblyModule.h in Headers */,
 				AD2FCBE91DB58DAD00B3E736 /* JSWebAssemblyRuntimeError.h in Headers */,
 				AD2FCBEB1DB58DAD00B3E736 /* JSWebAssemblyTable.h in Headers */,
@@ -9108,7 +9113,6 @@
 				E3C295DD1ED2CBDA00D3016F /* ObjectPropertyChangeAdaptiveWatchpoint.h in Headers */,
 				0FD3E40A1B618B6600C80E1E /* ObjectPropertyCondition.h in Headers */,
 				0FD3E40C1B618B6600C80E1E /* ObjectPropertyConditionSet.h in Headers */,
-				0F4AE0431FE0D25700E20839 /* InferredValueInlines.h in Headers */,
 				BC18C4460E16F5CD00B34460 /* ObjectPrototype.h in Headers */,
 				E124A8F70E555775003091F1 /* OpaqueJSString.h in Headers */,
 				969A079B0ED1D3AE00F1F681 /* Opcode.h in Headers */,
@@ -9286,7 +9290,6 @@
 				C20BA92D16BB1C1500B3AEA2 /* StructureRareDataInlines.h in Headers */,
 				0F9332A514CA7DDD0085F3C6 /* StructureSet.h in Headers */,
 				0F766D3915AE4A1F008F363E /* StructureStubClearingWatchpoint.h in Headers */,
-				0FB467801FDDA6F1003FCB09 /* IsoCellSet.h in Headers */,
 				BCCF0D080EF0AAB900413C8F /* StructureStubInfo.h in Headers */,
 				BC9041480EB9250900FE26FA /* StructureTransitionTable.h in Headers */,
 				0F7DF1371E2970E10095951B /* Subspace.h in Headers */,
@@ -9417,6 +9420,7 @@
 				14BE7D3317135CF400D1807A /* WeakInlines.h in Headers */,
 				A7CA3AE417DA41AE006538AF /* WeakMapConstructor.h in Headers */,
 				E3A32BC71FC83147007D7E76 /* WeakMapImpl.h in Headers */,
+				E393ADD81FE702D00022D681 /* WeakMapImplInlines.h in Headers */,
 				A7CA3AE617DA41AE006538AF /* WeakMapPrototype.h in Headers */,
 				0F242DA713F3B1E8007ADD4C /* WeakReferenceHarvester.h in Headers */,
 				14E84FA114EE1ACC00D6D5D4 /* WeakSet.h in Headers */,

Modified: trunk/Source/_javascript_Core/heap/Heap.cpp (226016 => 226017)


--- trunk/Source/_javascript_Core/heap/Heap.cpp	2017-12-18 03:44:54 UTC (rev 226016)
+++ trunk/Source/_javascript_Core/heap/Heap.cpp	2017-12-18 05:24:05 UTC (rev 226017)
@@ -50,6 +50,8 @@
 #include "JSGlobalObject.h"
 #include "JSLock.h"
 #include "JSVirtualMachineInternal.h"
+#include "JSWeakMap.h"
+#include "JSWeakSet.h"
 #include "JSWebAssemblyCodeBlock.h"
 #include "MachineStackMarker.h"
 #include "MarkStackMergingConstraint.h"
@@ -72,6 +74,7 @@
 #include "VM.h"
 #include "VisitCounter.h"
 #include "WasmMemory.h"
+#include "WeakMapImplInlines.h"
 #include "WeakSetInlines.h"
 #include <algorithm>
 #if PLATFORM(IOS)
@@ -563,10 +566,21 @@
         });
 }
 
+template<typename CellType>
+void Heap::finalizeUnconditionalFinalizersInIsoSubspace()
+{
+    JSC::subspaceFor<CellType>(*vm())->forEachMarkedCell(
+        [&] (HeapCell* cell, HeapCell::Kind) {
+            static_cast<CellType*>(cell)->finalizeUnconditionally(*vm());
+        });
+}
+
 void Heap::finalizeUnconditionalFinalizers()
 {
     finalizeUnconditionalFinalizers<InferredType>(vm()->inferredTypesWithFinalizers);
     finalizeUnconditionalFinalizers<InferredValue>(vm()->inferredValuesWithFinalizers);
+    finalizeUnconditionalFinalizersInIsoSubspace<JSWeakSet>();
+    finalizeUnconditionalFinalizersInIsoSubspace<JSWeakMap>();
     
     while (m_unconditionalFinalizers.hasNext()) {
         UnconditionalFinalizer* finalizer = m_unconditionalFinalizers.removeNext();

Modified: trunk/Source/_javascript_Core/heap/Heap.h (226016 => 226017)


--- trunk/Source/_javascript_Core/heap/Heap.h	2017-12-18 03:44:54 UTC (rev 226016)
+++ trunk/Source/_javascript_Core/heap/Heap.h	2017-12-18 05:24:05 UTC (rev 226017)
@@ -499,6 +499,9 @@
 
     template<typename CellType, typename CellSet>
     void finalizeUnconditionalFinalizers(CellSet&);
+
+    template<typename CellType>
+    void finalizeUnconditionalFinalizersInIsoSubspace();
     
     void finalizeUnconditionalFinalizers();
     

Modified: trunk/Source/_javascript_Core/runtime/VM.cpp (226016 => 226017)


--- trunk/Source/_javascript_Core/runtime/VM.cpp	2017-12-18 03:44:54 UTC (rev 226016)
+++ trunk/Source/_javascript_Core/runtime/VM.cpp	2017-12-18 05:24:05 UTC (rev 226017)
@@ -88,6 +88,7 @@
 #include "JSStringHeapCellType.h"
 #include "JSTemplateRegistryKey.h"
 #include "JSWeakMap.h"
+#include "JSWeakSet.h"
 #include "JSWebAssembly.h"
 #include "JSWebAssemblyCodeBlockHeapCellType.h"
 #include "JSWithScope.h"
@@ -258,6 +259,8 @@
     , propertyTableSpace ISO_SUBSPACE_INIT(heap, destructibleCellHeapCellType.get(), PropertyTable)
     , structureRareDataSpace ISO_SUBSPACE_INIT(heap, destructibleCellHeapCellType.get(), StructureRareData)
     , structureSpace ISO_SUBSPACE_INIT(heap, destructibleCellHeapCellType.get(), Structure)
+    , weakSetSpace ISO_SUBSPACE_INIT(heap, destructibleObjectHeapCellType.get(), JSWeakSet)
+    , weakMapSpace ISO_SUBSPACE_INIT(heap, destructibleObjectHeapCellType.get(), JSWeakMap)
     , inferredTypesWithFinalizers(inferredTypeSpace)
     , inferredValuesWithFinalizers(inferredValueSpace)
     , vmType(vmType)

Modified: trunk/Source/_javascript_Core/runtime/VM.h (226016 => 226017)


--- trunk/Source/_javascript_Core/runtime/VM.h	2017-12-18 03:44:54 UTC (rev 226016)
+++ trunk/Source/_javascript_Core/runtime/VM.h	2017-12-18 05:24:05 UTC (rev 226017)
@@ -349,6 +349,8 @@
     IsoSubspace propertyTableSpace;
     IsoSubspace structureRareDataSpace;
     IsoSubspace structureSpace;
+    IsoSubspace weakSetSpace;
+    IsoSubspace weakMapSpace;
     
     IsoCellSet inferredTypesWithFinalizers;
     IsoCellSet inferredValuesWithFinalizers;

Modified: trunk/Source/_javascript_Core/runtime/WeakMapImpl.cpp (226016 => 226017)


--- trunk/Source/_javascript_Core/runtime/WeakMapImpl.cpp	2017-12-18 03:44:54 UTC (rev 226016)
+++ trunk/Source/_javascript_Core/runtime/WeakMapImpl.cpp	2017-12-18 05:24:05 UTC (rev 226017)
@@ -27,7 +27,9 @@
 #include "config.h"
 #include "WeakMapImpl.h"
 
+#include "IsoCellSetInlines.h"
 #include "JSCInlines.h"
+#include "WeakMapImplInlines.h"
 
 namespace JSC {
 
@@ -44,10 +46,8 @@
     ASSERT_GC_OBJECT_INHERITS(thisObject, info());
     Base::visitChildren(thisObject, visitor);
 
-    visitor.addUnconditionalFinalizer(&thisObject->m_deadKeyCleaner);
-    if (std::is_same<WeakMapBucket, JSC::WeakMapBucket<WeakMapBucketDataKeyValue>>::value)
+    if (isWeakMap())
         visitor.addWeakReferenceHarvester(&thisObject->m_deadKeyCleaner);
-
     visitor.reportExtraMemoryVisited(thisObject->m_capacity * sizeof(WeakMapBucket));
 }
 
@@ -79,28 +79,6 @@
 }
 
 template <typename WeakMapBucket>
-void WeakMapImpl<WeakMapBucket>::finalizeUnconditionally()
-{
-    auto* buffer = this->buffer();
-    for (uint32_t index = 0; index < m_capacity; ++index) {
-        auto* bucket = buffer + index;
-        if (bucket->isEmpty() || bucket->isDeleted())
-            continue;
-
-        if (Heap::isMarked(bucket->key()))
-            continue;
-
-        bucket->makeDeleted();
-        ++m_deleteCount;
-        RELEASE_ASSERT(m_keyCount > 0);
-        --m_keyCount;
-    }
-
-    if (shouldShrink())
-        rehash(RehashMode::RemoveBatching);
-}
-
-template <typename WeakMapBucket>
 template<typename Appender>
 void WeakMapImpl<WeakMapBucket>::takeSnapshotInternal(unsigned limit, Appender appender)
 {

Modified: trunk/Source/_javascript_Core/runtime/WeakMapImpl.h (226016 => 226017)


--- trunk/Source/_javascript_Core/runtime/WeakMapImpl.h	2017-12-18 03:44:54 UTC (rev 226016)
+++ trunk/Source/_javascript_Core/runtime/WeakMapImpl.h	2017-12-18 05:24:05 UTC (rev 226017)
@@ -288,6 +288,26 @@
         return OBJECT_OFFSETOF(WeakMapImpl<WeakMapBucketType>, m_capacity);
     }
 
+    static constexpr bool isWeakMap()
+    {
+        return std::is_same<WeakMapBucketType, JSC::WeakMapBucket<WeakMapBucketDataKeyValue>>::value;
+    }
+
+    static constexpr bool isWeakSet()
+    {
+        return std::is_same<WeakMapBucketType, JSC::WeakMapBucket<WeakMapBucketDataKey>>::value;
+    }
+
+    template<typename CellType>
+    static IsoSubspace* subspaceFor(VM& vm)
+    {
+        if (isWeakMap())
+            return &vm.weakMapSpace;
+        return &vm.weakSetSpace;
+    }
+
+    void finalizeUnconditionally(VM&);
+
 private:
     ALWAYS_INLINE WeakMapBucketType* findBucket(JSObject* key)
     {
@@ -446,7 +466,7 @@
     template<typename Appender>
     void takeSnapshotInternal(unsigned limit, Appender);
 
-    class DeadKeyCleaner : public UnconditionalFinalizer, public WeakReferenceHarvester {
+    class DeadKeyCleaner : public WeakReferenceHarvester {
     public:
         WeakMapImpl* target()
         {
@@ -458,15 +478,9 @@
         {
             target()->visitWeakReferences(visitor);
         }
-
-        void finalizeUnconditionally() override
-        {
-            target()->finalizeUnconditionally();
-        }
     };
 
     void visitWeakReferences(SlotVisitor&);
-    void finalizeUnconditionally();
 
     MallocPtr<WeakMapBufferType, JSValueMalloc> m_buffer;
     uint32_t m_keyCount;

Added: trunk/Source/_javascript_Core/runtime/WeakMapImplInlines.h (0 => 226017)


--- trunk/Source/_javascript_Core/runtime/WeakMapImplInlines.h	                        (rev 0)
+++ trunk/Source/_javascript_Core/runtime/WeakMapImplInlines.h	2017-12-18 05:24:05 UTC (rev 226017)
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2017 Yusuke Suzuki <[email protected]>.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include "WeakMapImpl.h"
+
+namespace JSC {
+
+// Note that this function can be executed in parallel as long as the mutator stops.
+template<typename WeakMapBucket>
+void WeakMapImpl<WeakMapBucket>::finalizeUnconditionally(VM&)
+{
+    auto* buffer = this->buffer();
+    for (uint32_t index = 0; index < m_capacity; ++index) {
+        auto* bucket = buffer + index;
+        if (bucket->isEmpty() || bucket->isDeleted())
+            continue;
+
+        if (Heap::isMarked(bucket->key()))
+            continue;
+
+        bucket->makeDeleted();
+        ++m_deleteCount;
+        RELEASE_ASSERT(m_keyCount > 0);
+        --m_keyCount;
+    }
+
+    if (shouldShrink())
+        rehash(RehashMode::RemoveBatching);
+}
+
+}
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to