9adb1e71c6e9560e29dd140a74eedc5a64486c8a
[WebKit.git] / Source / JavaScriptCore / heap / SlotVisitorInlines.h
1 /*
2  * Copyright (C) 2012, 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. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include "SlotVisitor.h"
29 #include "Weak.h"
30 #include "WeakInlines.h"
31
32 namespace JSC {
33
34 template<typename T>
35 inline void SlotVisitor::appendUnbarrieredPointer(T** slot)
36 {
37     ASSERT(slot);
38     append(*slot);
39 }
40
41 template<typename T>
42 inline void SlotVisitor::appendUnbarrieredReadOnlyPointer(T* cell)
43 {
44     append(cell);
45 }
46
47 inline void SlotVisitor::appendUnbarrieredValue(JSValue* slot)
48 {
49     ASSERT(slot);
50     append(*slot);
51 }
52
53 inline void SlotVisitor::appendUnbarrieredReadOnlyValue(JSValue value)
54 {
55     append(value);
56 }
57
58 template<typename T>
59 inline void SlotVisitor::appendUnbarrieredWeak(Weak<T>* weak)
60 {
61     ASSERT(weak);
62     append(weak->get());
63 }
64
65 template<typename T>
66 inline void SlotVisitor::append(WriteBarrierBase<T>* slot)
67 {
68     append(slot->get());
69 }
70
71 template<typename T>
72 inline void SlotVisitor::appendHidden(WriteBarrierBase<T>* slot)
73 {
74     appendHidden(slot->get());
75 }
76
77 template<typename Iterator>
78 inline void SlotVisitor::append(Iterator begin, Iterator end)
79 {
80     for (auto it = begin; it != end; ++it)
81         append(&*it);
82 }
83
84 inline void SlotVisitor::appendValues(WriteBarrierBase<Unknown>* barriers, size_t count)
85 {
86     for (size_t i = 0; i < count; ++i)
87         append(&barriers[i]);
88 }
89
90 inline void SlotVisitor::appendValuesHidden(WriteBarrierBase<Unknown>* barriers, size_t count)
91 {
92     for (size_t i = 0; i < count; ++i)
93         appendHidden(&barriers[i]);
94 }
95
96 inline void SlotVisitor::reportExtraMemoryVisited(size_t size)
97 {
98     if (m_isFirstVisit)
99         heap()->reportExtraMemoryVisited(size);
100 }
101
102 #if ENABLE(RESOURCE_USAGE)
103 inline void SlotVisitor::reportExternalMemoryVisited(size_t size)
104 {
105     if (m_isFirstVisit)
106         heap()->reportExternalMemoryVisited(size);
107 }
108 #endif
109
110 inline Heap* SlotVisitor::heap() const
111 {
112     return &m_heap;
113 }
114
115 inline VM& SlotVisitor::vm()
116 {
117     return *m_heap.m_vm;
118 }
119
120 inline const VM& SlotVisitor::vm() const
121 {
122     return *m_heap.m_vm;
123 }
124
125 inline void SlotVisitor::didNotRace(const VisitRaceKey& race)
126 {
127     if (ASSERT_DISABLED)
128         return;
129     
130     if (m_isFirstVisit) {
131         // This is the first visit so we don't need to remove anything.
132         return;
133     }
134     
135     auto locker = holdLock(heap()->m_visitRaceLock);
136     heap()->m_visitRaces.remove(race);
137 }
138
139 } // namespace JSC