/ bytecode / LazyOperandValueProfile.cpp
LazyOperandValueProfile.cpp
  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  #include "config.h"
 27  #include "LazyOperandValueProfile.h"
 28  
 29  #include "JSCJSValueInlines.h"
 30  
 31  namespace JSC {
 32  
 33  CompressedLazyOperandValueProfileHolder::CompressedLazyOperandValueProfileHolder() { }
 34  CompressedLazyOperandValueProfileHolder::~CompressedLazyOperandValueProfileHolder() { }
 35  
 36  void CompressedLazyOperandValueProfileHolder::computeUpdatedPredictions(const ConcurrentJSLocker& locker)
 37  {
 38      if (!m_data)
 39          return;
 40      
 41      for (unsigned i = 0; i < m_data->size(); ++i)
 42          m_data->at(i).computeUpdatedPrediction(locker);
 43  }
 44  
 45  LazyOperandValueProfile* CompressedLazyOperandValueProfileHolder::add(
 46      const ConcurrentJSLocker&, const LazyOperandValueProfileKey& key)
 47  {
 48      if (!m_data)
 49          m_data = makeUnique<LazyOperandValueProfile::List>();
 50      else {
 51          for (unsigned i = 0; i < m_data->size(); ++i) {
 52              if (m_data->at(i).key() == key)
 53                  return &m_data->at(i);
 54          }
 55      }
 56      
 57      m_data->append(LazyOperandValueProfile(key));
 58      return &m_data->last();
 59  }
 60  
 61  LazyOperandValueProfileParser::LazyOperandValueProfileParser() { }
 62  LazyOperandValueProfileParser::~LazyOperandValueProfileParser() { }
 63  
 64  void LazyOperandValueProfileParser::initialize(
 65      const ConcurrentJSLocker&, CompressedLazyOperandValueProfileHolder& holder)
 66  {
 67      ASSERT(m_map.isEmpty());
 68      
 69      if (!holder.m_data)
 70          return;
 71      
 72      LazyOperandValueProfile::List& data = *holder.m_data;
 73      for (unsigned i = 0; i < data.size(); ++i)
 74          m_map.add(data[i].key(), &data[i]);
 75  }
 76  
 77  LazyOperandValueProfile* LazyOperandValueProfileParser::getIfPresent(
 78      const LazyOperandValueProfileKey& key) const
 79  {
 80      HashMap<LazyOperandValueProfileKey, LazyOperandValueProfile*>::const_iterator iter =
 81          m_map.find(key);
 82      
 83      if (iter == m_map.end())
 84          return nullptr;
 85      
 86      return iter->value;
 87  }
 88  
 89  SpeculatedType LazyOperandValueProfileParser::prediction(
 90      const ConcurrentJSLocker& locker, const LazyOperandValueProfileKey& key) const
 91  {
 92      LazyOperandValueProfile* profile = getIfPresent(key);
 93      if (!profile)
 94          return SpecNone;
 95      
 96      return profile->computeUpdatedPrediction(locker);
 97  }
 98  
 99  } // namespace JSC
100