Move the MayBePrototype JSCell header bit to InlineTypeFlags
authorkeith_miller@apple.com <keith_miller@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 30 Apr 2018 22:13:10 +0000 (22:13 +0000)
committerkeith_miller@apple.com <keith_miller@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 30 Apr 2018 22:13:10 +0000 (22:13 +0000)
https://bugs.webkit.org/show_bug.cgi?id=185143

Reviewed by Mark Lam.

* runtime/IndexingType.h:
* runtime/JSCellInlines.h:
(JSC::JSCell::setStructure):
(JSC::JSCell::mayBePrototype const):
(JSC::JSCell::didBecomePrototype):
* runtime/JSTypeInfo.h:
(JSC::TypeInfo::mayBePrototype):
(JSC::TypeInfo::mergeInlineTypeFlags):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@231172 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/IndexingType.h
Source/JavaScriptCore/runtime/JSCellInlines.h
Source/JavaScriptCore/runtime/JSTypeInfo.h

index fc19048..f8739f5 100644 (file)
@@ -1,5 +1,21 @@
 2018-04-30  Keith Miller  <keith_miller@apple.com>
 
+        Move the MayBePrototype JSCell header bit to InlineTypeFlags
+        https://bugs.webkit.org/show_bug.cgi?id=185143
+
+        Reviewed by Mark Lam.
+
+        * runtime/IndexingType.h:
+        * runtime/JSCellInlines.h:
+        (JSC::JSCell::setStructure):
+        (JSC::JSCell::mayBePrototype const):
+        (JSC::JSCell::didBecomePrototype):
+        * runtime/JSTypeInfo.h:
+        (JSC::TypeInfo::mayBePrototype):
+        (JSC::TypeInfo::mergeInlineTypeFlags):
+
+2018-04-30  Keith Miller  <keith_miller@apple.com>
+
         Remove unneeded exception check from String.fromCharCode
         https://bugs.webkit.org/show_bug.cgi?id=185083
 
index 2426afe..689fae2 100644 (file)
@@ -73,7 +73,6 @@ static const IndexingType MayHaveIndexedAccessors         = 0x10;
 // prototype.
 static const IndexingType IndexingTypeLockIsHeld          = 0x20;
 static const IndexingType IndexingTypeLockHasParked       = 0x40;
-static const IndexingType IndexingTypeMayBePrototype      = 0x80;
 
 // List of acceptable array types.
 static const IndexingType NonArray                        = 0x0;
index ad86c48..8028b89 100644 (file)
@@ -230,7 +230,7 @@ ALWAYS_INLINE void JSCell::setStructure(VM& vm, Structure* structure)
         || this->structure()->transitionWatchpointSetHasBeenInvalidated()
         || Heap::heap(this)->structureIDTable().get(structure->id()) == structure);
     m_structureID = structure->id();
-    m_flags = structure->typeInfo().inlineTypeFlags();
+    m_flags = TypeInfo::mergeInlineTypeFlags(structure->typeInfo().inlineTypeFlags(), m_flags);
     m_type = structure->typeInfo().type();
     IndexingType newIndexingType = structure->indexingTypeIncludingHistory();
     if (m_indexingTypeAndMisc != newIndexingType) {
@@ -342,14 +342,14 @@ inline bool JSCellLock::isLocked() const
 
 inline bool JSCell::mayBePrototype() const
 {
-    return m_indexingTypeAndMisc & IndexingTypeMayBePrototype;
+    return TypeInfo::mayBePrototype(inlineTypeFlags());
 }
 
 inline void JSCell::didBecomePrototype()
 {
     if (mayBePrototype())
         return;
-    WTF::atomicExchangeOr(&m_indexingTypeAndMisc, IndexingTypeMayBePrototype);
+    m_flags |= static_cast<TypeInfo::InlineTypeFlags>(TypeInfoMayBePrototype);
 }
 
 inline JSObject* JSCell::toObject(ExecState* exec, JSGlobalObject* globalObject) const
index 2e04e13..fc4bb44 100644 (file)
@@ -43,6 +43,7 @@ static const unsigned TypeOfShouldCallGetCallData = 1 << 2; // Need this flag if
 static const unsigned OverridesGetOwnPropertySlot = 1 << 3;
 static const unsigned OverridesToThis = 1 << 4; // If this is false then this returns something other than 'this'. Non-object cells that are visible to JS have this set as do some exotic objects.
 static const unsigned HasStaticPropertyTable = 1 << 5;
+static const unsigned TypeInfoMayBePrototype = 1 << 7; // Unlike other inline flags, this will only be set on the cell itself and will not be set on the Structure.
 
 // Out of line flags.
 
@@ -88,6 +89,7 @@ public:
     bool overridesGetOwnPropertySlot() const { return overridesGetOwnPropertySlot(inlineTypeFlags()); }
     static bool overridesGetOwnPropertySlot(InlineTypeFlags flags) { return flags & OverridesGetOwnPropertySlot; }
     static bool hasStaticPropertyTable(InlineTypeFlags flags) { return flags & HasStaticPropertyTable; }
+    static bool mayBePrototype(InlineTypeFlags flags) { return flags & TypeInfoMayBePrototype; }
     bool overridesToThis() const { return isSetOnFlags1(OverridesToThis); }
     bool structureIsImmortal() const { return isSetOnFlags2(StructureIsImmortal); }
     bool overridesGetPropertyNames() const { return isSetOnFlags2(OverridesGetPropertyNames); }
@@ -115,6 +117,12 @@ public:
         return OBJECT_OFFSETOF(TypeInfo, m_type);
     }
 
+    // Since the Structure doesn't track TypeInfoMayBePrototype, we need to make sure we copy it.
+    static InlineTypeFlags mergeInlineTypeFlags(InlineTypeFlags structureFlags, InlineTypeFlags oldCellFlags)
+    {
+        return structureFlags | (oldCellFlags & static_cast<InlineTypeFlags>(TypeInfoMayBePrototype));
+    }
+
     InlineTypeFlags inlineTypeFlags() const { return m_flags; }
     OutOfLineTypeFlags outOfLineTypeFlags() const { return m_flags2; }