/ bytecode / CodeBlockInlines.h
CodeBlockInlines.h
  1  /*
  2   * Copyright (C) 2018 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 "BytecodeStructs.h"
 29  #include "CodeBlock.h"
 30  #include "UnlinkedMetadataTableInlines.h"
 31  
 32  namespace JSC {
 33  
 34  template<typename Functor>
 35  void CodeBlock::forEachValueProfile(const Functor& func)
 36  {
 37      for (unsigned i = 0; i < numberOfArgumentValueProfiles(); ++i)
 38          func(valueProfileForArgument(i), true);
 39  
 40      if (m_metadata) {
 41  #define VISIT(__op) \
 42          m_metadata->forEach<__op>([&] (auto& metadata) { func(metadata.m_profile, false); });
 43  
 44          FOR_EACH_OPCODE_WITH_VALUE_PROFILE(VISIT)
 45  
 46  #undef VISIT
 47  
 48          m_metadata->forEach<OpIteratorOpen>([&] (auto& metadata) { 
 49              func(metadata.m_iterableProfile, false);
 50              func(metadata.m_iteratorProfile, false);
 51              func(metadata.m_nextProfile, false);
 52          });
 53  
 54          m_metadata->forEach<OpIteratorNext>([&] (auto& metadata) {
 55              func(metadata.m_nextResultProfile, false);
 56              func(metadata.m_doneProfile, false);
 57              func(metadata.m_valueProfile, false);
 58          });
 59      }   
 60  
 61  }
 62  
 63  template<typename Functor>
 64  void CodeBlock::forEachArrayProfile(const Functor& func)
 65  {
 66      if (m_metadata) {
 67          m_metadata->forEach<OpGetById>([&] (auto& metadata) {
 68              if (metadata.m_modeMetadata.mode == GetByIdMode::ArrayLength)
 69                  func(metadata.m_modeMetadata.arrayLengthMode.arrayProfile);
 70          });
 71  
 72  #define VISIT1(__op) \
 73      m_metadata->forEach<__op>([&] (auto& metadata) { func(metadata.m_arrayProfile); });
 74  
 75  #define VISIT2(__op) \
 76      m_metadata->forEach<__op>([&] (auto& metadata) { func(metadata.m_callLinkInfo.m_arrayProfile); });
 77  
 78          FOR_EACH_OPCODE_WITH_ARRAY_PROFILE(VISIT1)
 79          FOR_EACH_OPCODE_WITH_LLINT_CALL_LINK_INFO(VISIT2)
 80  
 81  #undef VISIT1
 82  #undef VISIT2
 83  
 84          m_metadata->forEach<OpIteratorNext>([&] (auto& metadata) {
 85              func(metadata.m_iterableProfile);
 86          });
 87      }
 88  }
 89  
 90  template<typename Functor>
 91  void CodeBlock::forEachArrayAllocationProfile(const Functor& func)
 92  {
 93      if (m_metadata) {
 94  #define VISIT(__op) \
 95      m_metadata->forEach<__op>([&] (auto& metadata) { func(metadata.m_arrayAllocationProfile); });
 96  
 97          FOR_EACH_OPCODE_WITH_ARRAY_ALLOCATION_PROFILE(VISIT)
 98  
 99  #undef VISIT
100      }
101  }
102  
103  template<typename Functor>
104  void CodeBlock::forEachObjectAllocationProfile(const Functor& func)
105  {
106      if (m_metadata) {
107  #define VISIT(__op) \
108      m_metadata->forEach<__op>([&] (auto& metadata) { func(metadata.m_objectAllocationProfile); });
109  
110          FOR_EACH_OPCODE_WITH_OBJECT_ALLOCATION_PROFILE(VISIT)
111  
112  #undef VISIT
113      }
114  }
115  
116  template<typename Functor>
117  void CodeBlock::forEachLLIntCallLinkInfo(const Functor& func)
118  {
119      if (m_metadata) {
120  #define VISIT(__op) \
121      m_metadata->forEach<__op>([&] (auto& metadata) { func(metadata.m_callLinkInfo); });
122  
123          FOR_EACH_OPCODE_WITH_LLINT_CALL_LINK_INFO(VISIT)
124  
125  #undef VISIT
126      }
127  }
128  
129  } // namespace JSC