741bc16eeb516dd4a28d8abd76ace78a1d9f8e98
[WebKit-https.git] / Source / JavaScriptCore / dfg / DFGCommonData.cpp
1 /*
2  * Copyright (C) 2013, 2015 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 "DFGCommonData.h"
28
29 #if ENABLE(DFG_JIT)
30
31 #include "CodeBlock.h"
32 #include "DFGNode.h"
33 #include "DFGPlan.h"
34 #include "InlineCallFrame.h"
35 #include "JSCInlines.h"
36 #include "TrackedReferences.h"
37 #include "VM.h"
38
39 namespace JSC { namespace DFG {
40
41 void CommonData::notifyCompilingStructureTransition(Plan& plan, CodeBlock* codeBlock, Node* node)
42 {
43     plan.transitions.addLazily(
44         codeBlock,
45         node->origin.semantic.codeOriginOwner(),
46         node->transition()->previous,
47         node->transition()->next);
48 }
49
50 CallSiteIndex CommonData::addCodeOrigin(CodeOrigin codeOrigin)
51 {
52     if (codeOrigins.isEmpty()
53         || codeOrigins.last() != codeOrigin)
54         codeOrigins.append(codeOrigin);
55     unsigned index = codeOrigins.size() - 1;
56     ASSERT(codeOrigins[index] == codeOrigin);
57     return CallSiteIndex(index);
58 }
59
60 CallSiteIndex CommonData::lastCallSite() const
61 {
62     RELEASE_ASSERT(codeOrigins.size());
63     return CallSiteIndex(codeOrigins.size() - 1);
64 }
65
66 void CommonData::shrinkToFit()
67 {
68     codeOrigins.shrinkToFit();
69     weakReferences.shrinkToFit();
70     transitions.shrinkToFit();
71 }
72
73 bool CommonData::invalidate()
74 {
75     if (!isStillValid)
76         return false;
77     for (unsigned i = jumpReplacements.size(); i--;)
78         jumpReplacements[i].fire();
79     isStillValid = false;
80     return true;
81 }
82
83 void CommonData::validateReferences(const TrackedReferences& trackedReferences)
84 {
85     if (InlineCallFrameSet* set = inlineCallFrames.get()) {
86         for (InlineCallFrame* inlineCallFrame : *set) {
87             for (ValueRecovery& recovery : inlineCallFrame->arguments) {
88                 if (recovery.isConstant())
89                     trackedReferences.check(recovery.constant());
90             }
91             
92             if (CodeBlock* baselineCodeBlock = inlineCallFrame->baselineCodeBlock.get())
93                 trackedReferences.check(baselineCodeBlock);
94             
95             if (inlineCallFrame->calleeRecovery.isConstant())
96                 trackedReferences.check(inlineCallFrame->calleeRecovery.constant());
97         }
98     }
99     
100     for (AdaptiveStructureWatchpoint* watchpoint : adaptiveStructureWatchpoints)
101         watchpoint->key().validateReferences(trackedReferences);
102 }
103
104 } } // namespace JSC::DFG
105
106 #endif // ENABLE(DFG_JIT)
107