/ runtime / FunctionRareData.cpp
FunctionRareData.cpp
  1  /*
  2   * Copyright (C) 2015-2019 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 "FunctionRareData.h"
 28  
 29  #include "JSCInlines.h"
 30  #include "ObjectAllocationProfileInlines.h"
 31  
 32  namespace JSC {
 33  
 34  const ClassInfo FunctionRareData::s_info = { "FunctionRareData", nullptr, nullptr, nullptr, CREATE_METHOD_TABLE(FunctionRareData) };
 35  
 36  FunctionRareData* FunctionRareData::create(VM& vm, ExecutableBase* executable)
 37  {
 38      FunctionRareData* rareData = new (NotNull, allocateCell<FunctionRareData>(vm.heap)) FunctionRareData(vm, executable);
 39      rareData->finishCreation(vm);
 40      return rareData;
 41  }
 42  
 43  void FunctionRareData::destroy(JSCell* cell)
 44  {
 45      FunctionRareData* rareData = static_cast<FunctionRareData*>(cell);
 46      rareData->FunctionRareData::~FunctionRareData();
 47  }
 48  
 49  Structure* FunctionRareData::createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)
 50  {
 51      return Structure::create(vm, globalObject, prototype, TypeInfo(CellType, StructureFlags), info());
 52  }
 53  
 54  void FunctionRareData::visitChildren(JSCell* cell, SlotVisitor& visitor)
 55  {
 56      FunctionRareData* rareData = jsCast<FunctionRareData*>(cell);
 57      ASSERT_GC_OBJECT_INHERITS(cell, info());
 58      Base::visitChildren(cell, visitor);
 59  
 60      rareData->m_objectAllocationProfile.visitAggregate(visitor);
 61      rareData->m_internalFunctionAllocationProfile.visitAggregate(visitor);
 62      visitor.append(rareData->m_boundFunctionStructure);
 63      visitor.append(rareData->m_executable);
 64  }
 65  
 66  FunctionRareData::FunctionRareData(VM& vm, ExecutableBase* executable)
 67      : Base(vm, vm.functionRareDataStructure.get())
 68      , m_objectAllocationProfile()
 69      // We initialize blind so that changes to the prototype after function creation but before
 70      // the first allocation don't disable optimizations. This isn't super important, since the
 71      // function is unlikely to allocate a rare data until the first allocation anyway.
 72      , m_allocationProfileWatchpointSet(ClearWatchpoint)
 73      , m_executable(vm, this, executable)
 74      , m_hasReifiedLength(false)
 75      , m_hasReifiedName(false)
 76      , m_hasModifiedLengthForNonHostFunction(false)
 77      , m_hasModifiedNameForNonHostFunction(false)
 78  {
 79  }
 80  
 81  FunctionRareData::~FunctionRareData()
 82  {
 83  }
 84  
 85  void FunctionRareData::initializeObjectAllocationProfile(VM& vm, JSGlobalObject* globalObject, JSObject* prototype, size_t inlineCapacity, JSFunction* constructor)
 86  {
 87      initializeAllocationProfileWatchpointSet();
 88      m_objectAllocationProfile.initializeProfile(vm, globalObject, this, prototype, inlineCapacity, constructor, this);
 89  }
 90  
 91  void FunctionRareData::clear(const char* reason)
 92  {
 93      m_objectAllocationProfile.clear();
 94      m_internalFunctionAllocationProfile.clear();
 95      m_allocationProfileWatchpointSet.fireAll(vm(), reason);
 96  }
 97  
 98  void FunctionRareData::AllocationProfileClearingWatchpoint::fireInternal(VM&, const FireDetail&)
 99  {
100      m_rareData->clear("AllocationProfileClearingWatchpoint fired.");
101  }
102  
103  }