Title: [255380] trunk/Source/_javascript_Core
Revision
255380
Author
justin_mich...@apple.com
Date
2020-01-29 13:30:28 -0800 (Wed, 29 Jan 2020)

Log Message

Fix small memory regression caused by r206365
https://bugs.webkit.org/show_bug.cgi?id=206557

Reviewed by Yusuke Suzuki.

Put StructureRareData::m_giveUpOnObjectToStringValueCache into m_objectToStringValue to prevent increasing StructureRareData's size. We make a special value for the pointer
objectToStringCacheGiveUpMarker() to signal that we should not cache the string value. As a result, adding m_transitionOffset does not increase the size of the class.

* runtime/Structure.h:
* runtime/StructureRareData.cpp:
(JSC::StructureRareData::StructureRareData):
(JSC::StructureRareData::visitChildren):
(JSC::StructureRareData::setObjectToStringValue):
(JSC::StructureRareData::clearObjectToStringValue):
* runtime/StructureRareData.h:
* runtime/StructureRareDataInlines.h:
(JSC::StructureRareData::objectToStringValue const):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (255379 => 255380)


--- trunk/Source/_javascript_Core/ChangeLog	2020-01-29 21:26:06 UTC (rev 255379)
+++ trunk/Source/_javascript_Core/ChangeLog	2020-01-29 21:30:28 UTC (rev 255380)
@@ -1,3 +1,23 @@
+2020-01-29  Justin Michaud  <justin_mich...@apple.com>
+
+        Fix small memory regression caused by r206365
+        https://bugs.webkit.org/show_bug.cgi?id=206557
+
+        Reviewed by Yusuke Suzuki.
+
+        Put StructureRareData::m_giveUpOnObjectToStringValueCache into m_objectToStringValue to prevent increasing StructureRareData's size. We make a special value for the pointer
+        objectToStringCacheGiveUpMarker() to signal that we should not cache the string value. As a result, adding m_transitionOffset does not increase the size of the class.
+
+        * runtime/Structure.h:
+        * runtime/StructureRareData.cpp:
+        (JSC::StructureRareData::StructureRareData):
+        (JSC::StructureRareData::visitChildren):
+        (JSC::StructureRareData::setObjectToStringValue):
+        (JSC::StructureRareData::clearObjectToStringValue):
+        * runtime/StructureRareData.h:
+        * runtime/StructureRareDataInlines.h:
+        (JSC::StructureRareData::objectToStringValue const):
+
 2020-01-28  Yusuke Suzuki  <ysuz...@apple.com>
 
         [JSC] Give up IC when unknown structure transition happens

Modified: trunk/Source/_javascript_Core/runtime/Structure.h (255379 => 255380)


--- trunk/Source/_javascript_Core/runtime/Structure.h	2020-01-29 21:26:06 UTC (rev 255379)
+++ trunk/Source/_javascript_Core/runtime/Structure.h	2020-01-29 21:30:28 UTC (rev 255380)
@@ -123,6 +123,8 @@
 };
 
 class Structure final : public JSCell {
+    static constexpr uint16_t shortInvalidOffset = std::numeric_limits<uint16_t>::max() - 1;
+    static constexpr uint16_t useRareDataFlag = std::numeric_limits<uint16_t>::max();
 public:
     friend class StructureTransitionTable;
 
@@ -361,7 +363,7 @@
             return rareData()->m_maxOffset;
         return m_maxOffset;
     }
-    
+
     void setMaxOffset(VM& vm, PropertyOffset offset)
     {
         if (offset == invalidOffset)
@@ -824,9 +826,6 @@
 
     COMPILE_ASSERT(firstOutOfLineOffset < 256, firstOutOfLineOffset_fits);
 
-    static constexpr uint16_t shortInvalidOffset = std::numeric_limits<uint16_t>::max();
-    static constexpr uint16_t useRareDataFlag = std::numeric_limits<uint16_t>::max() - 1;
-
     uint16_t m_transitionOffset;
     uint16_t m_maxOffset;
 

Modified: trunk/Source/_javascript_Core/runtime/StructureRareData.cpp (255379 => 255380)


--- trunk/Source/_javascript_Core/runtime/StructureRareData.cpp	2020-01-29 21:26:06 UTC (rev 255379)
+++ trunk/Source/_javascript_Core/runtime/StructureRareData.cpp	2020-01-29 21:30:28 UTC (rev 255380)
@@ -57,7 +57,6 @@
 
 StructureRareData::StructureRareData(VM& vm, Structure* previous)
     : JSCell(vm, vm.structureRareDataStructure.get())
-    , m_giveUpOnObjectToStringValueCache(false)
     , m_maxOffset(invalidOffset)
     , m_transitionOffset(invalidOffset)
 {
@@ -72,7 +71,7 @@
 
     Base::visitChildren(thisObject, visitor);
     visitor.append(thisObject->m_previous);
-    visitor.append(thisObject->m_objectToStringValue);
+    visitor.appendUnbarriered(thisObject->objectToStringValue());
     visitor.append(thisObject->m_cachedPropertyNameEnumerator);
     auto* cachedOwnKeys = thisObject->m_cachedOwnKeys.unvalidatedGet();
     if (cachedOwnKeys != cachedOwnKeysSentinel())
@@ -95,7 +94,7 @@
 
 void StructureRareData::setObjectToStringValue(JSGlobalObject* globalObject, VM& vm, Structure* ownStructure, JSString* value, PropertySlot toStringTagSymbolSlot)
 {
-    if (m_giveUpOnObjectToStringValueCache)
+    if (canCacheObjectToStringValue())
         return;
 
     ObjectPropertyConditionSet conditionSet;
@@ -119,7 +118,7 @@
         return;
 
     if (!conditionSet.isValid()) {
-        m_giveUpOnObjectToStringValueCache = true;
+        giveUpOnObjectToStringValueCache();
         return;
     }
 
@@ -132,11 +131,11 @@
 
             // The equivalence condition won't be watchable if we have already seen a replacement.
             if (!equivCondition.isWatchable()) {
-                m_giveUpOnObjectToStringValueCache = true;
+                giveUpOnObjectToStringValueCache();
                 return;
             }
         } else if (!condition.isWatchable()) {
-            m_giveUpOnObjectToStringValueCache = true;
+            giveUpOnObjectToStringValueCache();
             return;
         }
     }
@@ -157,7 +156,8 @@
 {
     m_objectToStringAdaptiveWatchpointSet.clear();
     m_objectToStringAdaptiveInferredValueWatchpoint.reset();
-    m_objectToStringValue.clear();
+    if (!canCacheObjectToStringValue())
+        m_objectToStringValue.clear();
 }
 
 void StructureRareData::finalizeUnconditionally(VM& vm)

Modified: trunk/Source/_javascript_Core/runtime/StructureRareData.h (255379 => 255380)


--- trunk/Source/_javascript_Core/runtime/StructureRareData.h	2020-01-29 21:26:06 UTC (rev 255379)
+++ trunk/Source/_javascript_Core/runtime/StructureRareData.h	2020-01-29 21:30:28 UTC (rev 255380)
@@ -67,6 +67,9 @@
 
     JSString* objectToStringValue() const;
     void setObjectToStringValue(JSGlobalObject*, VM&, Structure* baseStructure, JSString* value, PropertySlot toStringTagSymbolSlot);
+    void giveUpOnObjectToStringValueCache() { m_objectToStringValue.setWithoutWriteBarrier(objectToStringCacheGiveUpMarker()); }
+    bool canCacheObjectToStringValue() { return m_objectToStringValue.unvalidatedGet() == objectToStringCacheGiveUpMarker(); }
+    static JSString* objectToStringCacheGiveUpMarker() { return bitwise_cast<JSString*>(static_cast<uintptr_t>(1)); }
 
     JSPropertyNameEnumerator* cachedPropertyNameEnumerator() const;
     void setCachedPropertyNameEnumerator(VM&, JSPropertyNameEnumerator*);
@@ -113,7 +116,6 @@
     Bag<ObjectToStringAdaptiveStructureWatchpoint> m_objectToStringAdaptiveWatchpointSet;
     std::unique_ptr<ObjectToStringAdaptiveInferredPropertyValueWatchpoint> m_objectToStringAdaptiveInferredValueWatchpoint;
     Box<InlineWatchpointSet> m_polyProtoWatchpoint;
-    bool m_giveUpOnObjectToStringValueCache;
 
     PropertyOffset m_maxOffset;
     PropertyOffset m_transitionOffset;

Modified: trunk/Source/_javascript_Core/runtime/StructureRareDataInlines.h (255379 => 255380)


--- trunk/Source/_javascript_Core/runtime/StructureRareDataInlines.h	2020-01-29 21:26:06 UTC (rev 255379)
+++ trunk/Source/_javascript_Core/runtime/StructureRareDataInlines.h	2020-01-29 21:30:28 UTC (rev 255380)
@@ -44,7 +44,12 @@
 
 inline JSString* StructureRareData::objectToStringValue() const
 {
-    return m_objectToStringValue.get();
+    auto* value = m_objectToStringValue.unvalidatedGet();
+    if (value == objectToStringCacheGiveUpMarker())
+        return nullptr;
+    if (value)
+        validateCell(value);
+    return value;
 }
 
 inline JSPropertyNameEnumerator* StructureRareData::cachedPropertyNameEnumerator() const
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to