]> git.saurik.com Git - apple/javascriptcore.git/blob - heap/HeapVerifier.h
JavaScriptCore-7601.1.46.3.tar.gz
[apple/javascriptcore.git] / heap / HeapVerifier.h
1 /*
2 * Copyright (C) 2014 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 #ifndef HeapVerifier_h
27 #define HeapVerifier_h
28
29 #include "Heap.h"
30 #include <wtf/Vector.h>
31
32 namespace JSC {
33
34 class JSObject;
35 class MarkedBlock;
36
37 struct LiveObjectData {
38 LiveObjectData(JSObject* obj, bool isConfirmedDead = false)
39 : obj(obj)
40 , isConfirmedDead(isConfirmedDead)
41 {
42 }
43
44 JSObject* obj;
45 bool isConfirmedDead;
46 };
47
48 struct LiveObjectList {
49 LiveObjectList(const char* name)
50 : name(name)
51 , hasLiveObjects(true)
52 {
53 }
54
55 void reset()
56 {
57 liveObjects.clear();
58 hasLiveObjects = true; // Presume to have live objects until the list is trimmed.
59 }
60
61 LiveObjectData* findObject(JSObject*);
62
63 const char* name;
64 Vector<LiveObjectData> liveObjects;
65 bool hasLiveObjects;
66 };
67
68 class HeapVerifier {
69 public:
70 enum class Phase {
71 BeforeGC,
72 BeforeMarking,
73 AfterMarking,
74 AfterGC
75 };
76
77 HeapVerifier(Heap*, unsigned numberOfGCCyclesToRecord);
78
79 void initializeGCCycle();
80 void gatherLiveObjects(Phase);
81 void trimDeadObjects();
82 void verify(Phase);
83
84 // Scans all previously recorded LiveObjectLists and checks if the specified
85 // object was in any of those lists.
86 JS_EXPORT_PRIVATE void checkIfRecorded(JSObject*);
87
88 static const char* collectionTypeName(HeapOperation);
89 static const char* phaseName(Phase);
90
91 private:
92 struct GCCycle {
93 GCCycle()
94 : before("Before Marking")
95 , after("After Marking")
96 {
97 }
98
99 HeapOperation collectionType;
100 LiveObjectList before;
101 LiveObjectList after;
102
103 const char* collectionTypeName() const
104 {
105 return HeapVerifier::collectionTypeName(collectionType);
106 }
107 };
108
109 void incrementCycle() { m_currentCycle = (m_currentCycle + 1) % m_numberOfCycles; }
110 GCCycle& currentCycle() { return m_cycles[m_currentCycle]; }
111 GCCycle& cycleForIndex(int cycleIndex)
112 {
113 ASSERT(cycleIndex <= 0 && cycleIndex > -m_numberOfCycles);
114 cycleIndex += m_currentCycle;
115 if (cycleIndex < 0)
116 cycleIndex += m_numberOfCycles;
117 ASSERT(cycleIndex < m_numberOfCycles);
118 return m_cycles[cycleIndex];
119 }
120
121 LiveObjectList* liveObjectListForGathering(Phase);
122 bool verifyButterflyIsInStorageSpace(Phase, LiveObjectList&);
123
124 static void reportObject(LiveObjectData&, int cycleIndex, HeapVerifier::GCCycle&, LiveObjectList&);
125
126 Heap* m_heap;
127 int m_currentCycle;
128 int m_numberOfCycles;
129 std::unique_ptr<GCCycle[]> m_cycles;
130 };
131
132 } // namespace JSC
133
134 #endif // HeapVerifier