]> git.saurik.com Git - apple/javascriptcore.git/blame - bytecode/DFGExitProfile.cpp
JavaScriptCore-1218.tar.gz
[apple/javascriptcore.git] / bytecode / DFGExitProfile.cpp
CommitLineData
ba379fdc 1/*
14957cd0 2 * Copyright (C) 2011 Apple Inc. All rights reserved.
ba379fdc
A
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
6fe7ccc8
A
26#include "config.h"
27#include "DFGExitProfile.h"
ba379fdc 28
6fe7ccc8 29#include <wtf/PassOwnPtr.h>
ba379fdc 30
6fe7ccc8 31namespace JSC { namespace DFG {
ba379fdc 32
6fe7ccc8
A
33ExitProfile::ExitProfile() { }
34ExitProfile::~ExitProfile() { }
ba379fdc 35
6fe7ccc8
A
36bool ExitProfile::add(const FrequentExitSite& site)
37{
38 // If we've never seen any frequent exits then create the list and put this site
39 // into it.
40 if (!m_frequentExitSites) {
41 m_frequentExitSites = adoptPtr(new Vector<FrequentExitSite>());
42 m_frequentExitSites->append(site);
43 return true;
44 }
14957cd0 45
6fe7ccc8
A
46 // Don't add it if it's already there. This is O(n), but that's OK, because we
47 // know that the total number of places where code exits tends to not be large,
48 // and this code is only used when recompilation is triggered.
49 for (unsigned i = 0; i < m_frequentExitSites->size(); ++i) {
50 if (m_frequentExitSites->at(i) == site)
51 return false;
52 }
53
54 m_frequentExitSites->append(site);
55 return true;
56}
ba379fdc 57
93a37866
A
58Vector<FrequentExitSite> ExitProfile::exitSitesFor(unsigned bytecodeIndex)
59{
60 Vector<FrequentExitSite> result;
61
62 if (!m_frequentExitSites)
63 return result;
64
65 for (unsigned i = 0; i < m_frequentExitSites->size(); ++i) {
66 if (m_frequentExitSites->at(i).bytecodeOffset() == bytecodeIndex)
67 result.append(m_frequentExitSites->at(i));
68 }
69
70 return result;
71}
72
73bool ExitProfile::hasExitSite(const FrequentExitSite& site) const
74{
75 if (!m_frequentExitSites)
76 return false;
77
78 for (unsigned i = m_frequentExitSites->size(); i--;) {
79 if (m_frequentExitSites->at(i) == site)
80 return true;
81 }
82 return false;
83}
84
6fe7ccc8
A
85QueryableExitProfile::QueryableExitProfile(const ExitProfile& profile)
86{
87 if (!profile.m_frequentExitSites)
88 return;
89
90 for (unsigned i = 0; i < profile.m_frequentExitSites->size(); ++i)
91 m_frequentExitSites.add(profile.m_frequentExitSites->at(i));
92}
ba379fdc 93
6fe7ccc8 94QueryableExitProfile::~QueryableExitProfile() { }
14957cd0 95
6fe7ccc8 96} } // namespace JSC::DFG