Ignore:
Timestamp:
Oct 14, 2012, 3:05:16 PM (13 years ago)
Author:
[email protected]
Message:

IndexingType should not have a bit for each type
https://bugs.webkit.org/show_bug.cgi?id=98997

Reviewed by Oliver Hunt.

Somewhat incidentally, the introduction of butterflies led to each indexing
type being represented by a unique bit. This is superficially nice since it
allows you to test if a structure corresponds to a particular indexing type
by saying !!(structure->indexingType() & TheType). But the downside is that
given the 8 bits we have for the m_indexingType field, that leaves only a
small number of possible indexing types if we have one per bit.

This changeset changes the indexing type to be:

Bit #1: Tells you if you're an array.

Bits #2 - #5: 16 possible indexing types, including the blank type for

objects that don't have indexed properties.


Bits #6-8: Auxiliary bits that we could use for other things. Currently we

just use one of those bits, for MayHaveIndexedAccessors.


This is performance-neutral, and is primarily intended to give us more
breathing room for introducing new inferred array modes.

  • assembler/AbstractMacroAssembler.h:

(JSC::AbstractMacroAssembler::JumpList::jumps):

  • assembler/MacroAssembler.h:

(MacroAssembler):
(JSC::MacroAssembler::patchableBranch32):

  • assembler/MacroAssemblerARMv7.h:

(JSC::MacroAssemblerARMv7::patchableBranch32):
(MacroAssemblerARMv7):

  • dfg/DFGArrayMode.cpp:

(JSC::DFG::modeAlreadyChecked):

  • dfg/DFGRepatch.cpp:

(JSC::DFG::tryCacheGetByID):

  • dfg/DFGSpeculativeJIT.cpp:

(JSC::DFG::SpeculativeJIT::speculationCheck):
(JSC::DFG::SpeculativeJIT::forwardSpeculationCheck):
(JSC::DFG::SpeculativeJIT::jumpSlowForUnwantedArrayMode):
(DFG):
(JSC::DFG::SpeculativeJIT::checkArray):
(JSC::DFG::SpeculativeJIT::arrayify):

  • dfg/DFGSpeculativeJIT.h:

(SpeculativeJIT):

  • dfg/DFGSpeculativeJIT32_64.cpp:

(JSC::DFG::SpeculativeJIT::compile):

  • dfg/DFGSpeculativeJIT64.cpp:

(JSC::DFG::SpeculativeJIT::compile):

  • jit/JITInlineMethods.h:

(JSC::JIT::emitAllocateJSArray):
(JSC::JIT::chooseArrayMode):

  • jit/JITPropertyAccess.cpp:

(JSC::JIT::emit_op_get_by_val):
(JSC::JIT::emitContiguousGetByVal):
(JSC::JIT::emitArrayStorageGetByVal):
(JSC::JIT::emit_op_put_by_val):
(JSC::JIT::emitContiguousPutByVal):
(JSC::JIT::emitArrayStoragePutByVal):
(JSC::JIT::privateCompilePatchGetArrayLength):

  • jit/JITPropertyAccess32_64.cpp:

(JSC::JIT::emit_op_get_by_val):
(JSC::JIT::emitContiguousGetByVal):
(JSC::JIT::emitArrayStorageGetByVal):
(JSC::JIT::emit_op_put_by_val):
(JSC::JIT::emitContiguousPutByVal):
(JSC::JIT::emitArrayStoragePutByVal):
(JSC::JIT::privateCompilePatchGetArrayLength):

  • llint/LowLevelInterpreter.asm:
  • llint/LowLevelInterpreter32_64.asm:
  • llint/LowLevelInterpreter64.asm:
  • runtime/IndexingType.h:

(JSC):
(JSC::hasIndexedProperties):
(JSC::hasContiguous):
(JSC::hasFastArrayStorage):
(JSC::hasArrayStorage):
(JSC::shouldUseSlowPut):

  • runtime/JSGlobalObject.cpp:

(JSC):

  • runtime/StructureTransitionTable.h:

(JSC::newIndexingType):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/dfg/DFGArrayMode.cpp

    r130826 r131276  
    172172    case Array::PossiblyArrayWithContiguousOutOfBounds:
    173173        return value.m_currentKnownStructure.hasSingleton()
    174             && (value.m_currentKnownStructure.singleton()->indexingType() & HasContiguous);
     174            && hasContiguous(value.m_currentKnownStructure.singleton()->indexingType());
    175175       
    176176    case Array::ArrayWithContiguous:
     
    178178    case Array::ArrayWithContiguousOutOfBounds:
    179179        return value.m_currentKnownStructure.hasSingleton()
    180             && (value.m_currentKnownStructure.singleton()->indexingType() & HasContiguous)
     180            && hasContiguous(value.m_currentKnownStructure.singleton()->indexingType())
    181181            && (value.m_currentKnownStructure.singleton()->indexingType() & IsArray);
    182182
     
    188188    case Array::PossiblyArrayWithArrayStorageOutOfBounds:
    189189        return value.m_currentKnownStructure.hasSingleton()
    190             && (value.m_currentKnownStructure.singleton()->indexingType() & HasArrayStorage);
     190            && hasFastArrayStorage(value.m_currentKnownStructure.singleton()->indexingType());
    191191       
    192192    case Array::SlowPutArrayStorage:
    193193    case Array::PossiblyArrayWithSlowPutArrayStorage:
    194194        return value.m_currentKnownStructure.hasSingleton()
    195             && (value.m_currentKnownStructure.singleton()->indexingType() & (HasArrayStorage | HasSlowPutArrayStorage));
     195            && hasArrayStorage(value.m_currentKnownStructure.singleton()->indexingType());
    196196       
    197197    case Array::ArrayWithArrayStorage:
     
    199199    case Array::ArrayWithArrayStorageOutOfBounds:
    200200        return value.m_currentKnownStructure.hasSingleton()
    201             && (value.m_currentKnownStructure.singleton()->indexingType() & HasArrayStorage)
     201            && hasFastArrayStorage(value.m_currentKnownStructure.singleton()->indexingType())
    202202            && (value.m_currentKnownStructure.singleton()->indexingType() & IsArray);
    203203       
    204204    case Array::ArrayWithSlowPutArrayStorage:
    205205        return value.m_currentKnownStructure.hasSingleton()
    206             && (value.m_currentKnownStructure.singleton()->indexingType() & (HasArrayStorage | HasSlowPutArrayStorage))
     206            && hasArrayStorage(value.m_currentKnownStructure.singleton()->indexingType())
    207207            && (value.m_currentKnownStructure.singleton()->indexingType() & IsArray);
    208208       
Note: See TracChangeset for help on using the changeset viewer.