⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 286502 in webkit


Ignore:
Timestamp:
Dec 3, 2021, 10:30:11 AM (5 years ago)
Author:
keith_miller@apple.com
Message:

Remove StructureIDBlob
https://bugs.webkit.org/show_bug.cgi?id=233723

Reviewed by Yusuke Suzuki.

StructureIDBlob isn't very useful now that StructureIDs are just the
bottom bits of the pointer on 64 bit platforms. In a follow up patch
I'll change the layout of JSCell and Structure so that TypeInfo creation
can be a single load platforms that allow (and don't penalize) misaligned loads.

  • CMakeLists.txt:
  • JavaScriptCore.xcodeproj/project.pbxproj:
  • ftl/FTLAbstractHeapRepository.h:
  • ftl/FTLLowerDFGToB3.cpp:

(JSC::FTL::DFG::LowerDFGToB3::compileCompareStrictEq):

  • jit/AssemblyHelpers.h:

(JSC::AssemblyHelpers::emitStoreStructureWithTypeInfo):

  • jit/JITPropertyAccess.cpp:

(JSC::JIT::emit_op_put_to_scope):

  • runtime/Structure.cpp:

(JSC::Structure::Structure):
(JSC::Structure::addNewPropertyTransition):
(JSC::Structure::removeNewPropertyTransition):
(JSC::Structure::attributeChangeTransition):
(JSC::Structure::nonPropertyTransitionSlow):
(JSC::Structure::setBrandTransition):

  • runtime/Structure.h:

(JSC::Structure::id const):
(JSC::Structure::objectInitializationBlob const):
(JSC::Structure::idBlob const):
(JSC::Structure::isProxy const):
(JSC::Structure::typeInfo const):
(JSC::Structure::indexingType const):
(JSC::Structure::indexingMode const):
(JSC::Structure::fencedIndexingMode):
(JSC::Structure::indexingModeIncludingHistory const):
(JSC::Structure::indexingModeIncludingHistoryOffset):
(JSC::Structure::structureIDOffset): Deleted.

  • runtime/StructureIDBlob.h: Removed.
  • runtime/StructureInlines.h:

(JSC::Structure::hasIndexingHeader const):

  • tools/VMInspectorInlines.h:

(JSC::VMInspector::verifyCellSize):

Location:
trunk/Source/JavaScriptCore
Files:
1 deleted
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/CMakeLists.txt

    r286378 r286502  
    11871187    runtime/StructureChain.h
    11881188    runtime/StructureID.h
    1189     runtime/StructureIDBlob.h
    11901189    runtime/StructureInlines.h
    11911190    runtime/StructureRareData.h
  • trunk/Source/JavaScriptCore/ChangeLog

    r286478 r286502  
     12021-12-03  Keith Miller  <keith_miller@apple.com>
     2
     3        Remove StructureIDBlob
     4        https://bugs.webkit.org/show_bug.cgi?id=233723
     5
     6        Reviewed by Yusuke Suzuki.
     7
     8        StructureIDBlob isn't very useful now that StructureIDs are just the
     9        bottom bits of the pointer on 64 bit platforms. In a follow up patch
     10        I'll change the layout of JSCell and Structure so that TypeInfo creation
     11        can be a single load platforms that allow (and don't penalize) misaligned loads.
     12
     13        * CMakeLists.txt:
     14        * JavaScriptCore.xcodeproj/project.pbxproj:
     15        * ftl/FTLAbstractHeapRepository.h:
     16        * ftl/FTLLowerDFGToB3.cpp:
     17        (JSC::FTL::DFG::LowerDFGToB3::compileCompareStrictEq):
     18        * jit/AssemblyHelpers.h:
     19        (JSC::AssemblyHelpers::emitStoreStructureWithTypeInfo):
     20        * jit/JITPropertyAccess.cpp:
     21        (JSC::JIT::emit_op_put_to_scope):
     22        * runtime/Structure.cpp:
     23        (JSC::Structure::Structure):
     24        (JSC::Structure::addNewPropertyTransition):
     25        (JSC::Structure::removeNewPropertyTransition):
     26        (JSC::Structure::attributeChangeTransition):
     27        (JSC::Structure::nonPropertyTransitionSlow):
     28        (JSC::Structure::setBrandTransition):
     29        * runtime/Structure.h:
     30        (JSC::Structure::id const):
     31        (JSC::Structure::objectInitializationBlob const):
     32        (JSC::Structure::idBlob const):
     33        (JSC::Structure::isProxy const):
     34        (JSC::Structure::typeInfo const):
     35        (JSC::Structure::indexingType const):
     36        (JSC::Structure::indexingMode const):
     37        (JSC::Structure::fencedIndexingMode):
     38        (JSC::Structure::indexingModeIncludingHistory const):
     39        (JSC::Structure::indexingModeIncludingHistoryOffset):
     40        (JSC::Structure::structureIDOffset): Deleted.
     41        * runtime/StructureIDBlob.h: Removed.
     42        * runtime/StructureInlines.h:
     43        (JSC::Structure::hasIndexingHeader const):
     44        * tools/VMInspectorInlines.h:
     45        (JSC::VMInspector::verifyCellSize):
     46
    1472021-12-02  Yusuke Suzuki  <ysuzuki@apple.com>
    248
  • trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj

    r286347 r286502  
    853853                2A83638618D7D0EE0000EBCC /* EdenGCActivityCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A83638418D7D0EE0000EBCC /* EdenGCActivityCallback.h */; settings = {ATTRIBUTES = (Private, ); }; };
    854854                2A83638A18D7D0FE0000EBCC /* FullGCActivityCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A83638818D7D0FE0000EBCC /* FullGCActivityCallback.h */; settings = {ATTRIBUTES = (Private, ); }; };
    855                 2AAAA31218BD49D100394CC8 /* StructureIDBlob.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AAAA31018BD49D100394CC8 /* StructureIDBlob.h */; settings = {ATTRIBUTES = (Private, ); }; };
    856855                2AABCDE718EF294200002096 /* GCLogging.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AABCDE618EF294200002096 /* GCLogging.h */; settings = {ATTRIBUTES = (Private, ); }; };
    857856                2AACE63D18CA5A0300ED0191 /* GCActivityCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AACE63B18CA5A0300ED0191 /* GCActivityCallback.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    36333632                2A83638718D7D0FE0000EBCC /* FullGCActivityCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FullGCActivityCallback.cpp; sourceTree = "<group>"; };
    36343633                2A83638818D7D0FE0000EBCC /* FullGCActivityCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FullGCActivityCallback.h; sourceTree = "<group>"; };
    3635                 2AAAA31018BD49D100394CC8 /* StructureIDBlob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StructureIDBlob.h; sourceTree = "<group>"; };
    36363634                2AABCDE618EF294200002096 /* GCLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCLogging.h; sourceTree = "<group>"; };
    36373635                2AACE63A18CA5A0300ED0191 /* GCActivityCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GCActivityCallback.cpp; sourceTree = "<group>"; };
     
    80778075                                7E4EE7080EBB7963005934AA /* StructureChain.h */,
    80788076                                537FEEC82742BDA300C9EFEE /* StructureID.h */,
    8079                                 2AAAA31018BD49D100394CC8 /* StructureIDBlob.h */,
    80808077                                0FD2C92316D01EE900C7803F /* StructureInlines.h */,
    80818078                                C2F0F2D016BAEEE900187C19 /* StructureRareData.cpp */,
     
    1016110158                                A54C2AB11C6544F200A18D78 /* HeapSnapshot.h in Headers */,
    1016210159                                A5311C361C77CEC500E6B1B6 /* HeapSnapshotBuilder.h in Headers */,
     10160                                FE2CC9302756B2B9003F5AB8 /* HeapSubspaceTypes.h in Headers */,
    1016310161                                0FADE6731D4D23BE00768457 /* HeapUtil.h in Headers */,
    1016410162                                FE1BD0251E72053800134BC9 /* HeapVerifier.h in Headers */,
     
    1027710275                                E3BF1BAE238AAEDB003A1C2B /* IsoHeapCellType.h in Headers */,
    1027810276                                E3C8ED4323A1DBCB00131958 /* IsoInlinedHeapCellType.h in Headers */,
     10277                                FE65B1512748601F00DB5B16 /* IsoInlinedHeapCellTypeInlines.h in Headers */,
    1027910278                                537FEED12742BDE100C9EFEE /* IsoMemoryAllocatorBase.h in Headers */,
    1028010279                                537FEECE2742BDE100C9EFEE /* IsoMemoryAllocatorBaseInlines.h in Headers */,
     
    1042710426                                E33F50791B84225700413856 /* JSInternalPromiseConstructor.h in Headers */,
    1042810427                                E33F50871B8449EF00413856 /* JSInternalPromiseConstructor.lut.h in Headers */,
    10429                                 FE65B1512748601F00DB5B16 /* IsoInlinedHeapCellTypeInlines.h in Headers */,
    1043010428                                E33F50751B8421C000413856 /* JSInternalPromisePrototype.h in Headers */,
    1043110429                                A503FA1E188E0FB000110F14 /* JSJavaScriptCallFramePrototype.h in Headers */,
     
    1083310831                                7E4EE7090EBB7963005934AA /* StructureChain.h in Headers */,
    1083410832                                537FEEC92742BDA300C9EFEE /* StructureID.h in Headers */,
    10835                                 2AAAA31218BD49D100394CC8 /* StructureIDBlob.h in Headers */,
    1083610833                                0FD2C92416D01EE900C7803F /* StructureInlines.h in Headers */,
    1083710834                                C2FE18A416BAEC4000AF3061 /* StructureRareData.h in Headers */,
     
    1095610953                                526AC4B71E977C5D003500E1 /* WasmCodeBlock.h in Headers */,
    1095710954                                E3BD2B7622F275020011765C /* WasmCompilationMode.h in Headers */,
    10958                                 FE2CC9302756B2B9003F5AB8 /* HeapSubspaceTypes.h in Headers */,
    1095910955                                AD412B341E7B2E9E008AF157 /* WasmContext.h in Headers */,
    1096010956                                7593C898BE714A64BE93A6E7 /* WasmContextInlines.h in Headers */,
  • trunk/Source/JavaScriptCore/ftl/FTLAbstractHeapRepository.h

    r283874 r286502  
    150150    macro(Structure_previousOrRareData, Structure::previousOrRareDataOffset()) \
    151151    macro(Structure_prototype, Structure::prototypeOffset()) \
    152     macro(Structure_structureID, Structure::structureIDOffset()) \
    153152    macro(StructureRareData_cachedKeys, StructureRareData::offsetOfCachedPropertyNames(CachedPropertyNamesKind::Keys)) \
    154153    macro(StructureRareData_cachedGetOwnPropertyNames, StructureRareData::offsetOfCachedPropertyNames(CachedPropertyNamesKind::GetOwnPropertyNames)) \
  • trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp

    r286347 r286502  
    1680316803        }
    1680416804
    16805         LValue id = m_out.load32(structure, m_heaps.Structure_structureID);
     16805        LValue id = m_out.bitAnd(m_out.castToInt32(structure), m_out.constInt32(structureIDMask));
    1680616806        m_out.store32(id, object, m_heaps.JSCell_structureID);
    1680716807
  • trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h

    r286424 r286502  
    15881588    void emitStoreStructureWithTypeInfo(RegisterID structure, RegisterID dest, RegisterID scratch)
    15891589    {
    1590 #if USE(JSVALUE64)
    1591         load64(MacroAssembler::Address(structure, Structure::structureIDOffset()), scratch);
    1592         store64(scratch, MacroAssembler::Address(dest, JSCell::structureIDOffset()));
    1593 #else
    15941590        // Store all the info flags using a single 32-bit wide load and store.
    15951591        load32(MacroAssembler::Address(structure, Structure::indexingModeIncludingHistoryOffset()), scratch);
    15961592        store32(scratch, MacroAssembler::Address(dest, JSCell::indexingTypeAndMiscOffset()));
    15971593
     1594#if CPU(ADDRESS64)
     1595        and32(MacroAssembler::TrustedImm32(structureIDMask), structure, scratch);
     1596        store32(scratch, MacroAssembler::Address(dest, JSCell::structureIDOffset()));
     1597#else
    15981598        // Store the StructureID
    15991599        storePtr(structure, MacroAssembler::Address(dest, JSCell::structureIDOffset()));
  • trunk/Source/JavaScriptCore/jit/JITPropertyAccess.cpp

    r286424 r286502  
    24652465            emitGetVirtualRegisterPayload(scope, scopeGPR);
    24662466            addSlowCase(branchTestPtr(Zero, scratchGPR1));
    2467             load32(Address(scratchGPR1, Structure::structureIDOffset()), scratchGPR1);
     2467            and32(TrustedImm32(structureIDMask), scratchGPR1);
    24682468            addSlowCase(branch32(NotEqual, Address(scopeGPR, JSCell::structureIDOffset()), scratchGPR1));
    24692469
  • trunk/Source/JavaScriptCore/runtime/Structure.cpp

    r286345 r286502  
    198198Structure::Structure(VM& vm, JSGlobalObject* globalObject, JSValue prototype, const TypeInfo& typeInfo, const ClassInfo* classInfo, IndexingType indexingType, unsigned inlineCapacity)
    199199    : JSCell(vm, vm.structureStructure.get())
    200     , m_blob(StructureID::encode(this), indexingType, typeInfo)
     200    , m_cellHeaderIndexingModeIncludingHistory(indexingType)
     201    , m_cellHeaderType(typeInfo.type())
     202    , m_cellHeaderInlineTypeFlags(typeInfo.inlineTypeFlags())
    201203    , m_outOfLineTypeFlags(typeInfo.outOfLineTypeFlags())
    202204    , m_inlineCapacity(inlineCapacity)
     
    239241Structure::Structure(VM& vm, CreatingEarlyCellTag)
    240242    : JSCell(CreatingEarlyCell)
     243    , m_cellHeaderIndexingModeIncludingHistory(NoIndexingShape)
     244    , m_cellHeaderType(StructureType)
    241245    , m_inlineCapacity(0)
    242246    , m_bitField(0)
     
    265269 
    266270    TypeInfo typeInfo = TypeInfo(StructureType, StructureFlags);
    267     m_blob = StructureIDBlob(StructureID::encode(this), 0, typeInfo);
     271    m_cellHeaderInlineTypeFlags = typeInfo.inlineTypeFlags();
    268272    m_outOfLineTypeFlags = typeInfo.outOfLineTypeFlags();
    269273
     
    275279Structure::Structure(VM& vm, Structure* previous, DeferredStructureTransitionWatchpointFire* deferred)
    276280    : JSCell(vm, vm.structureStructure.get())
     281    , m_cellHeaderIndexingModeIncludingHistory(previous->m_cellHeaderIndexingModeIncludingHistory)
     282    , m_cellHeaderType(previous->m_cellHeaderType)
     283    , m_cellHeaderInlineTypeFlags(previous->m_cellHeaderInlineTypeFlags)
     284    , m_outOfLineTypeFlags(previous->m_outOfLineTypeFlags)
    277285    , m_inlineCapacity(previous->m_inlineCapacity)
    278286    , m_bitField(0)
     
    301309    setMaxOffset(vm, invalidOffset);
    302310 
    303     TypeInfo typeInfo = previous->typeInfo();
    304     m_blob = StructureIDBlob(StructureID::encode(this), previous->indexingModeIncludingHistory(), typeInfo);
    305     m_outOfLineTypeFlags = typeInfo.outOfLineTypeFlags();
    306 
    307311    ASSERT(!previous->typeInfo().structureIsImmortal());
    308312    setPreviousID(vm, previous);
     
    530534    }
    531535
    532     transition->m_blob.setIndexingModeIncludingHistory(structure->indexingModeIncludingHistory() & ~CopyOnWrite);
     536    transition->m_cellHeaderIndexingModeIncludingHistory = structure->indexingModeIncludingHistory() & ~CopyOnWrite;
    533537    transition->m_transitionPropertyName = propertyName.uid();
    534538    transition->setTransitionPropertyAttributes(attributes);
     
    627631    }
    628632
    629     transition->m_blob.setIndexingModeIncludingHistory(structure->indexingModeIncludingHistory() & ~CopyOnWrite);
     633    transition->m_cellHeaderIndexingModeIncludingHistory = structure->indexingModeIncludingHistory() & ~CopyOnWrite;
    630634    transition->m_transitionPropertyName = propertyName.uid();
    631635    transition->setTransitionKind(TransitionKind::PropertyDeletion);
     
    721725    }
    722726
    723     transition->m_blob.setIndexingModeIncludingHistory(structure->indexingModeIncludingHistory() & ~CopyOnWrite);
     727    transition->m_cellHeaderIndexingModeIncludingHistory = structure->indexingModeIncludingHistory() & ~CopyOnWrite;
    724728    transition->m_transitionPropertyName = propertyName.uid();
    725729    transition->setTransitionPropertyAttributes(attributes);
     
    819823    Structure* transition = create(vm, structure);
    820824    transition->setTransitionKind(transitionKind);
    821     transition->m_blob.setIndexingModeIncludingHistory(indexingModeIncludingHistory);
     825    transition->m_cellHeaderIndexingModeIncludingHistory = indexingModeIncludingHistory;
    822826   
    823827    if (preventsExtensions(transitionKind))
     
    15471551
    15481552    transition->m_cachedPrototypeChain.setMayBeNull(vm, transition, structure->m_cachedPrototypeChain.get());
    1549     transition->m_blob.setIndexingModeIncludingHistory(structure->indexingModeIncludingHistory());
     1553    transition->m_cellHeaderIndexingModeIncludingHistory = structure->indexingModeIncludingHistory();
    15501554    transition->m_transitionPropertyName = &brand->uid();
    15511555    transition->setTransitionPropertyAttributes(0);
  • trunk/Source/JavaScriptCore/runtime/Structure.h

    r286347 r286502  
    3838#include "PropertyOffset.h"
    3939#include "PutPropertySlot.h"
    40 #include "StructureIDBlob.h"
    4140#include "StructureRareData.h"
    4241#include "StructureTransitionTable.h"
     
    166165
    167166public:
    168     StructureID id() const { ASSERT(m_blob.structureID() == StructureID::encode(this)); return m_blob.structureID(); }
    169     int32_t objectInitializationBlob() const { return m_blob.blobExcludingStructureID(); }
    170     int64_t idBlob() const { return m_blob.blob(); }
     167    StructureID id() const { return StructureID::encode(this); }
     168    int32_t objectInitializationBlob() const { return *reinterpret_cast_ptr<const uint32_t*>(&m_cellHeaderIndexingModeIncludingHistory); }
     169    int64_t idBlob() const { return static_cast<uint64_t>(objectInitializationBlob()) << 32 | id().bits(); }
    171170
    172171    bool isProxy() const
    173172    {
    174         JSType type = m_blob.type();
    175         return type == PureForwardingProxyType || type == ProxyObjectType;
     173        return m_cellHeaderType == PureForwardingProxyType || m_cellHeaderType == ProxyObjectType;
    176174    }
    177175
     
    264262   
    265263    // Type accessors.
    266     TypeInfo typeInfo() const { return m_blob.typeInfo(m_outOfLineTypeFlags); }
     264    TypeInfo typeInfo() const { return TypeInfo(m_cellHeaderType, m_cellHeaderInlineTypeFlags, m_outOfLineTypeFlags); }
    267265    bool isObject() const { return typeInfo().isObject(); }
    268266protected:
     
    271269public:
    272270
    273     IndexingType indexingType() const { return m_blob.indexingModeIncludingHistory() & AllWritableArrayTypes; }
    274     IndexingType indexingMode() const  { return m_blob.indexingModeIncludingHistory() & AllArrayTypes; }
     271    IndexingType indexingType() const { return indexingModeIncludingHistory() & AllWritableArrayTypes; }
     272    IndexingType indexingMode() const  { return indexingModeIncludingHistory() & AllArrayTypes; }
    275273    Dependency fencedIndexingMode(IndexingType& indexingType)
    276274    {
    277         Dependency dependency = m_blob.fencedIndexingModeIncludingHistory(indexingType);
     275        Dependency dependency = Dependency::loadAndFence(&m_cellHeaderIndexingModeIncludingHistory, indexingType);
    278276        indexingType &= AllArrayTypes;
    279277        return dependency;
    280278    }
    281     IndexingType indexingModeIncludingHistory() const { return m_blob.indexingModeIncludingHistory(); }
     279    IndexingType indexingModeIncludingHistory() const { return m_cellHeaderIndexingModeIncludingHistory; }
    282280       
    283281    inline bool mayInterceptIndexedAccesses() const;
     
    558556    const ClassInfo* classInfo() const { return m_classInfo; }
    559557
    560     static ptrdiff_t structureIDOffset()
    561     {
    562         return OBJECT_OFFSETOF(Structure, m_blob) + StructureIDBlob::structureIDOffset();
    563     }
    564 
    565558    static ptrdiff_t prototypeOffset()
    566559    {
     
    585578    static ptrdiff_t indexingModeIncludingHistoryOffset()
    586579    {
    587         return OBJECT_OFFSETOF(Structure, m_blob) + StructureIDBlob::indexingModeIncludingHistoryOffset();
     580        return OBJECT_OFFSETOF(Structure, m_cellHeaderIndexingModeIncludingHistory);
    588581    }
    589582   
     
    861854
    862855    // These need to be properly aligned at the beginning of the 'Structure'
    863     // part of the object.
    864     StructureIDBlob m_blob;
     856    // part of the object. And need to match the order of the equivalent properties in
     857    // JSCell.
     858    IndexingType m_cellHeaderIndexingModeIncludingHistory;
     859    const JSType m_cellHeaderType;
     860    TypeInfo::InlineTypeFlags m_cellHeaderInlineTypeFlags;
     861    const CellState m_cellHeaderDefaultCellState { CellState::DefinitelyWhite };
    865862    TypeInfo::OutOfLineTypeFlags m_outOfLineTypeFlags;
    866863
  • trunk/Source/JavaScriptCore/runtime/StructureInlines.h

    r286034 r286502  
    257257        return true;
    258258   
    259     if (!isTypedView(typedArrayTypeForType(m_blob.type())))
     259    if (!isTypedView(typedArrayTypeForType(m_cellHeaderType)))
    260260        return false;
    261261
  • trunk/Source/JavaScriptCore/tools/VMInspectorInlines.h

    r252302 r286502  
    4646    const ClassInfo* classInfo = structure->classInfo();
    4747    JSType cellType = cell->type();
    48     AUDIT_VERIFY(action, verifier, cellType == structure->m_blob.type(), cell, cellType, structure->m_blob.type());
     48    AUDIT_VERIFY(action, verifier, cellType == structure->typeInfo().type(), cell, cellType, structure->typeInfo().type());
    4949
    5050    size_t size = cellSize(vm, cell);
Note: See TracChangeset for help on using the changeset viewer.