[V8] Introduce a QML compilation mode
[profile/ivi/qtjsbackend.git] / src / 3rdparty / v8 / src / heap-profiler.cc
1 // Copyright 2009-2010 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
4 // met:
5 //
6 //     * Redistributions of source code must retain the above copyright
7 //       notice, this list of conditions and the following disclaimer.
8 //     * Redistributions in binary form must reproduce the above
9 //       copyright notice, this list of conditions and the following
10 //       disclaimer in the documentation and/or other materials provided
11 //       with the distribution.
12 //     * Neither the name of Google Inc. nor the names of its
13 //       contributors may be used to endorse or promote products derived
14 //       from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28 #include "v8.h"
29
30 #include "heap-profiler.h"
31 #include "profile-generator.h"
32
33 namespace v8 {
34 namespace internal {
35
36 HeapProfiler::HeapProfiler()
37     : snapshots_(new HeapSnapshotsCollection()),
38       next_snapshot_uid_(1) {
39 }
40
41
42 HeapProfiler::~HeapProfiler() {
43   delete snapshots_;
44 }
45
46
47 void HeapProfiler::ResetSnapshots() {
48   delete snapshots_;
49   snapshots_ = new HeapSnapshotsCollection();
50 }
51
52
53 void HeapProfiler::SetUp() {
54   Isolate* isolate = Isolate::Current();
55   if (isolate->heap_profiler() == NULL) {
56     isolate->set_heap_profiler(new HeapProfiler());
57   }
58 }
59
60
61 void HeapProfiler::TearDown() {
62   Isolate* isolate = Isolate::Current();
63   delete isolate->heap_profiler();
64   isolate->set_heap_profiler(NULL);
65 }
66
67
68 HeapSnapshot* HeapProfiler::TakeSnapshot(const char* name,
69                                          int type,
70                                          v8::ActivityControl* control) {
71   ASSERT(Isolate::Current()->heap_profiler() != NULL);
72   return Isolate::Current()->heap_profiler()->TakeSnapshotImpl(name,
73                                                                type,
74                                                                control);
75 }
76
77
78 HeapSnapshot* HeapProfiler::TakeSnapshot(String* name,
79                                          int type,
80                                          v8::ActivityControl* control) {
81   ASSERT(Isolate::Current()->heap_profiler() != NULL);
82   return Isolate::Current()->heap_profiler()->TakeSnapshotImpl(name,
83                                                                type,
84                                                                control);
85 }
86
87
88 void HeapProfiler::StartHeapObjectsTracking() {
89   ASSERT(Isolate::Current()->heap_profiler() != NULL);
90   Isolate::Current()->heap_profiler()->StartHeapObjectsTrackingImpl();
91 }
92
93
94 void HeapProfiler::StopHeapObjectsTracking() {
95   ASSERT(Isolate::Current()->heap_profiler() != NULL);
96   Isolate::Current()->heap_profiler()->StopHeapObjectsTrackingImpl();
97 }
98
99
100 void HeapProfiler::PushHeapObjectsStats(v8::OutputStream* stream) {
101   ASSERT(Isolate::Current()->heap_profiler() != NULL);
102   return Isolate::Current()->heap_profiler()->PushHeapObjectsStatsImpl(stream);
103 }
104
105
106 void HeapProfiler::DefineWrapperClass(
107     uint16_t class_id, v8::HeapProfiler::WrapperInfoCallback callback) {
108   ASSERT(class_id != v8::HeapProfiler::kPersistentHandleNoClassId);
109   if (wrapper_callbacks_.length() <= class_id) {
110     wrapper_callbacks_.AddBlock(
111         NULL, class_id - wrapper_callbacks_.length() + 1);
112   }
113   wrapper_callbacks_[class_id] = callback;
114 }
115
116
117 v8::RetainedObjectInfo* HeapProfiler::ExecuteWrapperClassCallback(
118     uint16_t class_id, Object** wrapper) {
119   if (wrapper_callbacks_.length() <= class_id) return NULL;
120   return wrapper_callbacks_[class_id](
121       class_id, Utils::ToLocal(Handle<Object>(wrapper)));
122 }
123
124
125 HeapSnapshot* HeapProfiler::TakeSnapshotImpl(const char* name,
126                                              int type,
127                                              v8::ActivityControl* control) {
128   HeapSnapshot::Type s_type = static_cast<HeapSnapshot::Type>(type);
129   HeapSnapshot* result =
130       snapshots_->NewSnapshot(s_type, name, next_snapshot_uid_++);
131   bool generation_completed = true;
132   switch (s_type) {
133     case HeapSnapshot::kFull: {
134       HeapSnapshotGenerator generator(result, control);
135       generation_completed = generator.GenerateSnapshot();
136       break;
137     }
138     default:
139       UNREACHABLE();
140   }
141   if (!generation_completed) {
142     delete result;
143     result = NULL;
144   }
145   snapshots_->SnapshotGenerationFinished(result);
146   return result;
147 }
148
149
150 HeapSnapshot* HeapProfiler::TakeSnapshotImpl(String* name,
151                                              int type,
152                                              v8::ActivityControl* control) {
153   return TakeSnapshotImpl(snapshots_->names()->GetName(name), type, control);
154 }
155
156 void HeapProfiler::StartHeapObjectsTrackingImpl() {
157   snapshots_->StartHeapObjectsTracking();
158 }
159
160
161 void HeapProfiler::PushHeapObjectsStatsImpl(OutputStream* stream) {
162   snapshots_->PushHeapObjectsStats(stream);
163 }
164
165
166 void HeapProfiler::StopHeapObjectsTrackingImpl() {
167   snapshots_->StopHeapObjectsTracking();
168 }
169
170
171 int HeapProfiler::GetSnapshotsCount() {
172   HeapProfiler* profiler = Isolate::Current()->heap_profiler();
173   ASSERT(profiler != NULL);
174   return profiler->snapshots_->snapshots()->length();
175 }
176
177
178 HeapSnapshot* HeapProfiler::GetSnapshot(int index) {
179   HeapProfiler* profiler = Isolate::Current()->heap_profiler();
180   ASSERT(profiler != NULL);
181   return profiler->snapshots_->snapshots()->at(index);
182 }
183
184
185 HeapSnapshot* HeapProfiler::FindSnapshot(unsigned uid) {
186   HeapProfiler* profiler = Isolate::Current()->heap_profiler();
187   ASSERT(profiler != NULL);
188   return profiler->snapshots_->GetSnapshot(uid);
189 }
190
191
192 SnapshotObjectId HeapProfiler::GetSnapshotObjectId(Handle<Object> obj) {
193   if (!obj->IsHeapObject())
194     return v8::HeapProfiler::kUnknownObjectId;
195   HeapProfiler* profiler = Isolate::Current()->heap_profiler();
196   ASSERT(profiler != NULL);
197   return profiler->snapshots_->FindObjectId(HeapObject::cast(*obj)->address());
198 }
199
200
201 void HeapProfiler::DeleteAllSnapshots() {
202   HeapProfiler* profiler = Isolate::Current()->heap_profiler();
203   ASSERT(profiler != NULL);
204   profiler->ResetSnapshots();
205 }
206
207
208 void HeapProfiler::ObjectMoveEvent(Address from, Address to) {
209   snapshots_->ObjectMoveEvent(from, to);
210 }
211
212
213 } }  // namespace v8::internal