/ bytecode / ArrayAllocationProfile.h
ArrayAllocationProfile.h
  1  /*
  2   * Copyright (C) 2012, 2013 Apple Inc. All rights reserved.
  3   *
  4   * Redistribution and use in source and binary forms, with or without
  5   * modification, are permitted provided that the following conditions
  6   * are met:
  7   * 1. Redistributions of source code must retain the above copyright
  8   *    notice, this list of conditions and the following disclaimer.
  9   * 2. Redistributions in binary form must reproduce the above copyright
 10   *    notice, this list of conditions and the following disclaimer in the
 11   *    documentation and/or other materials provided with the distribution.
 12   *
 13   * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 14   * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 15   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 16   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 17   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 18   * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 19   * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 20   * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 21   * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 22   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 23   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 24   */
 25  
 26  #pragma once
 27  
 28  #include "IndexingType.h"
 29  #include "JSArray.h"
 30  
 31  namespace JSC {
 32  
 33  class ArrayAllocationProfile {
 34  public:
 35      ArrayAllocationProfile() = default;
 36  
 37      ArrayAllocationProfile(IndexingType recommendedIndexingMode)
 38      {
 39          initializeIndexingMode(recommendedIndexingMode);
 40      }
 41  
 42      IndexingType selectIndexingTypeConcurrently()
 43      {
 44          return m_currentIndexingType;
 45      }
 46  
 47      IndexingType selectIndexingType()
 48      {
 49          ASSERT(!isCompilationThread());
 50          JSArray* lastArray = m_lastArray;
 51          if (lastArray && UNLIKELY(lastArray->indexingType() != m_currentIndexingType))
 52              updateProfile();
 53          return m_currentIndexingType;
 54      }
 55  
 56      // vector length hint becomes [0, BASE_CONTIGUOUS_VECTOR_LEN_MAX].
 57      unsigned vectorLengthHintConcurrently()
 58      {
 59          return m_largestSeenVectorLength;
 60      }
 61  
 62      unsigned vectorLengthHint()
 63      {
 64          ASSERT(!isCompilationThread());
 65          JSArray* lastArray = m_lastArray;
 66          if (lastArray && (m_largestSeenVectorLength != BASE_CONTIGUOUS_VECTOR_LEN_MAX) && UNLIKELY(lastArray->getVectorLength() > m_largestSeenVectorLength))
 67              updateProfile();
 68          return m_largestSeenVectorLength;
 69      }
 70      
 71      JSArray* updateLastAllocation(JSArray* lastArray)
 72      {
 73          m_lastArray = lastArray;
 74          return lastArray;
 75      }
 76      
 77      JS_EXPORT_PRIVATE void updateProfile();
 78  
 79      static IndexingType selectIndexingTypeFor(ArrayAllocationProfile* profile)
 80      {
 81          if (!profile)
 82              return ArrayWithUndecided;
 83          return profile->selectIndexingType();
 84      }
 85      
 86      static JSArray* updateLastAllocationFor(ArrayAllocationProfile* profile, JSArray* lastArray)
 87      {
 88          if (profile)
 89              profile->updateLastAllocation(lastArray);
 90          return lastArray;
 91      }
 92  
 93      void initializeIndexingMode(IndexingType recommendedIndexingMode) { m_currentIndexingType = recommendedIndexingMode; }
 94  
 95  private:
 96      
 97      IndexingType m_currentIndexingType { ArrayWithUndecided };
 98      unsigned m_largestSeenVectorLength { 0 };
 99      JSArray* m_lastArray { nullptr };
100  };
101  
102  } // namespace JSC