2 * Copyright (C) 2015 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
27 #include "FunctionRareData.h"
29 #include "JSCInlines.h"
33 const ClassInfo
FunctionRareData::s_info
= { "FunctionRareData", 0, 0, CREATE_METHOD_TABLE(FunctionRareData
) };
35 FunctionRareData
* FunctionRareData::create(VM
& vm
, JSObject
* prototype
, size_t inlineCapacity
)
37 FunctionRareData
* rareData
= new (NotNull
, allocateCell
<FunctionRareData
>(vm
.heap
)) FunctionRareData(vm
);
38 rareData
->finishCreation(vm
, prototype
, inlineCapacity
);
42 void FunctionRareData::destroy(JSCell
* cell
)
44 FunctionRareData
* rareData
= static_cast<FunctionRareData
*>(cell
);
45 rareData
->FunctionRareData::~FunctionRareData();
48 Structure
* FunctionRareData::createStructure(VM
& vm
, JSGlobalObject
* globalObject
, JSValue prototype
)
50 return Structure::create(vm
, globalObject
, prototype
, TypeInfo(CellType
, StructureFlags
), info());
53 void FunctionRareData::visitChildren(JSCell
* cell
, SlotVisitor
& visitor
)
55 FunctionRareData
* rareData
= jsCast
<FunctionRareData
*>(cell
);
57 rareData
->m_allocationProfile
.visitAggregate(visitor
);
60 FunctionRareData::FunctionRareData(VM
& vm
)
61 : Base(vm
, vm
.functionRareDataStructure
.get())
62 , m_allocationProfile()
63 // We initialize blind so that changes to the prototype after function creation but before
64 // the optimizer kicks in don't disable optimizations. Once the optimizer kicks in, the
65 // watchpoint will start watching and any changes will both force deoptimization and disable
66 // future attempts to optimize. This is necessary because we are guaranteed that the
67 // allocation profile is changed exactly once prior to optimizations kicking in. We could be
68 // smarter and count the number of times the prototype is clobbered and only optimize if it
69 // was clobbered exactly once, but that seems like overkill. In almost all cases it will be
70 // clobbered once, and if it's clobbered more than once, that will probably only occur
71 // before we started optimizing, anyway.
72 , m_allocationProfileWatchpoint(ClearWatchpoint
)
76 FunctionRareData::~FunctionRareData()
80 void FunctionRareData::finishCreation(VM
& vm
, JSObject
* prototype
, size_t inlineCapacity
)
82 Base::finishCreation(vm
);
83 initialize(vm
, prototype
, inlineCapacity
);
86 void FunctionRareData::initialize(VM
& vm
, JSObject
* prototype
, size_t inlineCapacity
)
88 m_allocationProfile
.initialize(vm
, this, prototype
, inlineCapacity
);
91 void FunctionRareData::clear(const char* reason
)
93 m_allocationProfile
.clear();
94 m_allocationProfileWatchpoint
.fireAll(reason
);