Title: [277620] trunk/Source/_javascript_Core
Revision
277620
Author
gga...@apple.com
Date
2021-05-17 17:41:59 -0700 (Mon, 17 May 2021)

Log Message

StructureRareData::m_replacementWatchpointSets should not be a pointer to a pointer
https://bugs.webkit.org/show_bug.cgi?id=225840

Reviewed by Mark Lam.

HashMap is already just one pointer. Making it a pointer to a pointer
causes heap fragmentation. Worth about 1MB on GMail.

* runtime/Structure.cpp:
(JSC::Structure::ensurePropertyReplacementWatchpointSet):
* runtime/StructureInlines.h:
(JSC::Structure::didReplaceProperty):
(JSC::Structure::propertyReplacementWatchpointSet):
* runtime/StructureRareData.h:

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (277619 => 277620)


--- trunk/Source/_javascript_Core/ChangeLog	2021-05-18 00:26:10 UTC (rev 277619)
+++ trunk/Source/_javascript_Core/ChangeLog	2021-05-18 00:41:59 UTC (rev 277620)
@@ -1,3 +1,20 @@
+2021-05-17  Geoffrey Garen  <gga...@apple.com>
+
+        StructureRareData::m_replacementWatchpointSets should not be a pointer to a pointer
+        https://bugs.webkit.org/show_bug.cgi?id=225840
+
+        Reviewed by Mark Lam.
+
+        HashMap is already just one pointer. Making it a pointer to a pointer
+        causes heap fragmentation. Worth about 1MB on GMail.
+
+        * runtime/Structure.cpp:
+        (JSC::Structure::ensurePropertyReplacementWatchpointSet):
+        * runtime/StructureInlines.h:
+        (JSC::Structure::didReplaceProperty):
+        (JSC::Structure::propertyReplacementWatchpointSet):
+        * runtime/StructureRareData.h:
+
 2021-05-17  Alexey Shvayka  <shvaikal...@gmail.com>
 
         REGRESSION (r271119): Object methods defined with shorthand notation cannot access "caller" in non-strict mode

Modified: trunk/Source/_javascript_Core/runtime/Structure.cpp (277619 => 277620)


--- trunk/Source/_javascript_Core/runtime/Structure.cpp	2021-05-18 00:26:10 UTC (rev 277619)
+++ trunk/Source/_javascript_Core/runtime/Structure.cpp	2021-05-18 00:41:59 UTC (rev 277620)
@@ -1073,12 +1073,7 @@
         allocateRareData(vm);
     ConcurrentJSLocker locker(m_lock);
     StructureRareData* rareData = this->rareData();
-    if (!rareData->m_replacementWatchpointSets) {
-        rareData->m_replacementWatchpointSets =
-            makeUnique<StructureRareData::PropertyWatchpointMap>();
-        WTF::storeStoreFence();
-    }
-    auto result = rareData->m_replacementWatchpointSets->add(offset, nullptr);
+    auto result = rareData->m_replacementWatchpointSets.add(offset, nullptr);
     if (result.isNewEntry)
         result.iterator->value = WatchpointSet::create(IsWatched);
     return result.iterator->value.get();

Modified: trunk/Source/_javascript_Core/runtime/StructureInlines.h (277619 => 277620)


--- trunk/Source/_javascript_Core/runtime/StructureInlines.h	2021-05-18 00:26:10 UTC (rev 277619)
+++ trunk/Source/_javascript_Core/runtime/StructureInlines.h	2021-05-18 00:41:59 UTC (rev 277620)
@@ -355,10 +355,7 @@
 {
     if (LIKELY(!hasRareData()))
         return;
-    StructureRareData::PropertyWatchpointMap* map = rareData()->m_replacementWatchpointSets.get();
-    if (LIKELY(!map))
-        return;
-    WatchpointSet* set = map->get(offset);
+    WatchpointSet* set = rareData()->m_replacementWatchpointSets.get(offset);
     if (LIKELY(!set))
         return;
     set->fireAll(vm(), "Property did get replaced");
@@ -370,10 +367,7 @@
     StructureRareData* rareData = tryRareData();
     if (!rareData)
         return nullptr;
-    StructureRareData::PropertyWatchpointMap* map = rareData->m_replacementWatchpointSets.get();
-    if (!map)
-        return nullptr;
-    return map->get(offset);
+    return rareData->m_replacementWatchpointSets.get(offset);
 }
 
 template<typename DetailsFunc>

Modified: trunk/Source/_javascript_Core/runtime/StructureRareData.h (277619 => 277620)


--- trunk/Source/_javascript_Core/runtime/StructureRareData.h	2021-05-18 00:26:10 UTC (rev 277619)
+++ trunk/Source/_javascript_Core/runtime/StructureRareData.h	2021-05-18 00:41:59 UTC (rev 277620)
@@ -128,7 +128,11 @@
     WriteBarrier<JSImmutableButterfly> m_cachedPropertyNames[numberOfCachedPropertyNames] { };
 
     typedef HashMap<PropertyOffset, RefPtr<WatchpointSet>, WTF::IntHash<PropertyOffset>, WTF::UnsignedWithZeroKeyHashTraits<PropertyOffset>> PropertyWatchpointMap;
-    std::unique_ptr<PropertyWatchpointMap> m_replacementWatchpointSets;
+#ifdef NDEBUG
+    static_assert(sizeof(PropertyWatchpointMap) == sizeof(void*), "StructureRareData should remain small");
+#endif
+
+    PropertyWatchpointMap m_replacementWatchpointSets;
     std::unique_ptr<SpecialPropertyCache> m_specialPropertyCache;
     Box<InlineWatchpointSet> m_polyProtoWatchpoint;
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to