Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(544)

Side by Side Diff: test/cctest/test-heap-profiler.cc

Issue 19397002: Provide named links to code objects in heap snapshot. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Add missing edge type to GetName API. Wondering how it worked before??? Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/heap-snapshot-generator.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 return false; 126 return false;
127 } 127 }
128 128
129 129
130 static bool AddressesMatch(void* key1, void* key2) { 130 static bool AddressesMatch(void* key1, void* key2) {
131 return key1 == key2; 131 return key1 == key2;
132 } 132 }
133 133
134 134
135 // Check that snapshot has no unretained entries except root. 135 // Check that snapshot has no unretained entries except root.
136 static bool ValidateSnapshot(const v8::HeapSnapshot* snapshot, int depth) { 136 static bool ValidateSnapshot(const v8::HeapSnapshot* snapshot, int depth = 3) {
137 i::HeapSnapshot* heap_snapshot = const_cast<i::HeapSnapshot*>( 137 i::HeapSnapshot* heap_snapshot = const_cast<i::HeapSnapshot*>(
138 reinterpret_cast<const i::HeapSnapshot*>(snapshot)); 138 reinterpret_cast<const i::HeapSnapshot*>(snapshot));
139 139
140 i::HashMap visited(AddressesMatch); 140 i::HashMap visited(AddressesMatch);
141 i::List<i::HeapGraphEdge>& edges = heap_snapshot->edges(); 141 i::List<i::HeapGraphEdge>& edges = heap_snapshot->edges();
142 for (int i = 0; i < edges.length(); ++i) { 142 for (int i = 0; i < edges.length(); ++i) {
143 i::HashMap::Entry* entry = visited.Lookup( 143 i::HashMap::Entry* entry = visited.Lookup(
144 reinterpret_cast<void*>(edges[i].to()), 144 reinterpret_cast<void*>(edges[i].to()),
145 static_cast<uint32_t>(reinterpret_cast<uintptr_t>(edges[i].to())), 145 static_cast<uint32_t>(reinterpret_cast<uintptr_t>(edges[i].to())),
146 true); 146 true);
(...skipping 24 matching lines...) Expand all
171 171
172 CompileRun( 172 CompileRun(
173 "function A2() {}\n" 173 "function A2() {}\n"
174 "function B2(x) { return function() { return typeof x; }; }\n" 174 "function B2(x) { return function() { return typeof x; }; }\n"
175 "function C2(x) { this.x1 = x; this.x2 = x; this[1] = x; }\n" 175 "function C2(x) { this.x1 = x; this.x2 = x; this[1] = x; }\n"
176 "var a2 = new A2();\n" 176 "var a2 = new A2();\n"
177 "var b2_1 = new B2(a2), b2_2 = new B2(a2);\n" 177 "var b2_1 = new B2(a2), b2_2 = new B2(a2);\n"
178 "var c2 = new C2(a2);"); 178 "var c2 = new C2(a2);");
179 const v8::HeapSnapshot* snapshot_env2 = 179 const v8::HeapSnapshot* snapshot_env2 =
180 heap_profiler->TakeHeapSnapshot(v8_str("env2")); 180 heap_profiler->TakeHeapSnapshot(v8_str("env2"));
181 CHECK(ValidateSnapshot(snapshot_env2, 3)); 181 CHECK(ValidateSnapshot(snapshot_env2));
182 const v8::HeapGraphNode* global_env2 = GetGlobalObject(snapshot_env2); 182 const v8::HeapGraphNode* global_env2 = GetGlobalObject(snapshot_env2);
183 183
184 // Verify, that JS global object of env2 has '..2' properties. 184 // Verify, that JS global object of env2 has '..2' properties.
185 const v8::HeapGraphNode* a2_node = 185 const v8::HeapGraphNode* a2_node =
186 GetProperty(global_env2, v8::HeapGraphEdge::kProperty, "a2"); 186 GetProperty(global_env2, v8::HeapGraphEdge::kProperty, "a2");
187 CHECK_NE(NULL, a2_node); 187 CHECK_NE(NULL, a2_node);
188 CHECK_NE( 188 CHECK_NE(
189 NULL, GetProperty(global_env2, v8::HeapGraphEdge::kProperty, "b2_1")); 189 NULL, GetProperty(global_env2, v8::HeapGraphEdge::kProperty, "b2_1"));
190 CHECK_NE( 190 CHECK_NE(
191 NULL, GetProperty(global_env2, v8::HeapGraphEdge::kProperty, "b2_2")); 191 NULL, GetProperty(global_env2, v8::HeapGraphEdge::kProperty, "b2_2"));
(...skipping 15 matching lines...) Expand all
207 207
208 // -a-> X1 --a 208 // -a-> X1 --a
209 // x -b-> X2 <-| 209 // x -b-> X2 <-|
210 CompileRun( 210 CompileRun(
211 "function X(a, b) { this.a = a; this.b = b; }\n" 211 "function X(a, b) { this.a = a; this.b = b; }\n"
212 "x = new X(new X(), new X());\n" 212 "x = new X(new X(), new X());\n"
213 "dummy = new X();\n" 213 "dummy = new X();\n"
214 "(function() { x.a.a = x.b; })();"); 214 "(function() { x.a.a = x.b; })();");
215 const v8::HeapSnapshot* snapshot = 215 const v8::HeapSnapshot* snapshot =
216 heap_profiler->TakeHeapSnapshot(v8_str("sizes")); 216 heap_profiler->TakeHeapSnapshot(v8_str("sizes"));
217 CHECK(ValidateSnapshot(snapshot, 3)); 217 CHECK(ValidateSnapshot(snapshot));
218 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 218 const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
219 const v8::HeapGraphNode* x = 219 const v8::HeapGraphNode* x =
220 GetProperty(global, v8::HeapGraphEdge::kProperty, "x"); 220 GetProperty(global, v8::HeapGraphEdge::kProperty, "x");
221 CHECK_NE(NULL, x); 221 CHECK_NE(NULL, x);
222 const v8::HeapGraphNode* x1 = 222 const v8::HeapGraphNode* x1 =
223 GetProperty(x, v8::HeapGraphEdge::kProperty, "a"); 223 GetProperty(x, v8::HeapGraphEdge::kProperty, "a");
224 CHECK_NE(NULL, x1); 224 CHECK_NE(NULL, x1);
225 const v8::HeapGraphNode* x2 = 225 const v8::HeapGraphNode* x2 =
226 GetProperty(x, v8::HeapGraphEdge::kProperty, "b"); 226 GetProperty(x, v8::HeapGraphEdge::kProperty, "b");
227 CHECK_NE(NULL, x2); 227 CHECK_NE(NULL, x2);
228 228
229 // Test sizes. 229 // Test sizes.
230 CHECK_NE(0, x->GetSelfSize()); 230 CHECK_NE(0, x->GetSelfSize());
231 CHECK_NE(0, x1->GetSelfSize()); 231 CHECK_NE(0, x1->GetSelfSize());
232 CHECK_NE(0, x2->GetSelfSize()); 232 CHECK_NE(0, x2->GetSelfSize());
233 } 233 }
234 234
235 235
236 TEST(BoundFunctionInSnapshot) { 236 TEST(BoundFunctionInSnapshot) {
237 LocalContext env; 237 LocalContext env;
238 v8::HandleScope scope(env->GetIsolate()); 238 v8::HandleScope scope(env->GetIsolate());
239 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 239 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
240 CompileRun( 240 CompileRun(
241 "function myFunction(a, b) { this.a = a; this.b = b; }\n" 241 "function myFunction(a, b) { this.a = a; this.b = b; }\n"
242 "function AAAAA() {}\n" 242 "function AAAAA() {}\n"
243 "boundFunction = myFunction.bind(new AAAAA(), 20, new Number(12)); \n"); 243 "boundFunction = myFunction.bind(new AAAAA(), 20, new Number(12)); \n");
244 const v8::HeapSnapshot* snapshot = 244 const v8::HeapSnapshot* snapshot =
245 heap_profiler->TakeHeapSnapshot(v8_str("sizes")); 245 heap_profiler->TakeHeapSnapshot(v8_str("sizes"));
246 CHECK(ValidateSnapshot(snapshot, 3)); 246 CHECK(ValidateSnapshot(snapshot));
247 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 247 const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
248 const v8::HeapGraphNode* f = 248 const v8::HeapGraphNode* f =
249 GetProperty(global, v8::HeapGraphEdge::kProperty, "boundFunction"); 249 GetProperty(global, v8::HeapGraphEdge::kProperty, "boundFunction");
250 CHECK(f); 250 CHECK(f);
251 CHECK_EQ(v8::String::New("native_bind"), f->GetName()); 251 CHECK_EQ(v8::String::New("native_bind"), f->GetName());
252 const v8::HeapGraphNode* bindings = 252 const v8::HeapGraphNode* bindings =
253 GetProperty(f, v8::HeapGraphEdge::kInternal, "bindings"); 253 GetProperty(f, v8::HeapGraphEdge::kInternal, "bindings");
254 CHECK_NE(NULL, bindings); 254 CHECK_NE(NULL, bindings);
255 CHECK_EQ(v8::HeapGraphNode::kArray, bindings->GetType()); 255 CHECK_EQ(v8::HeapGraphNode::kArray, bindings->GetType());
256 CHECK_EQ(4, bindings->GetChildrenCount()); 256 CHECK_EQ(4, bindings->GetChildrenCount());
(...skipping 18 matching lines...) Expand all
275 TEST(HeapSnapshotEntryChildren) { 275 TEST(HeapSnapshotEntryChildren) {
276 LocalContext env; 276 LocalContext env;
277 v8::HandleScope scope(env->GetIsolate()); 277 v8::HandleScope scope(env->GetIsolate());
278 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 278 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
279 279
280 CompileRun( 280 CompileRun(
281 "function A() { }\n" 281 "function A() { }\n"
282 "a = new A;"); 282 "a = new A;");
283 const v8::HeapSnapshot* snapshot = 283 const v8::HeapSnapshot* snapshot =
284 heap_profiler->TakeHeapSnapshot(v8_str("children")); 284 heap_profiler->TakeHeapSnapshot(v8_str("children"));
285 CHECK(ValidateSnapshot(snapshot, 3)); 285 CHECK(ValidateSnapshot(snapshot));
286 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 286 const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
287 for (int i = 0, count = global->GetChildrenCount(); i < count; ++i) { 287 for (int i = 0, count = global->GetChildrenCount(); i < count; ++i) {
288 const v8::HeapGraphEdge* prop = global->GetChild(i); 288 const v8::HeapGraphEdge* prop = global->GetChild(i);
289 CHECK_EQ(global, prop->GetFromNode()); 289 CHECK_EQ(global, prop->GetFromNode());
290 } 290 }
291 const v8::HeapGraphNode* a = 291 const v8::HeapGraphNode* a =
292 GetProperty(global, v8::HeapGraphEdge::kProperty, "a"); 292 GetProperty(global, v8::HeapGraphEdge::kProperty, "a");
293 CHECK_NE(NULL, a); 293 CHECK_NE(NULL, a);
294 for (int i = 0, count = a->GetChildrenCount(); i < count; ++i) { 294 for (int i = 0, count = a->GetChildrenCount(); i < count; ++i) {
295 const v8::HeapGraphEdge* prop = a->GetChild(i); 295 const v8::HeapGraphEdge* prop = a->GetChild(i);
296 CHECK_EQ(a, prop->GetFromNode()); 296 CHECK_EQ(a, prop->GetFromNode());
297 } 297 }
298 } 298 }
299 299
300 300
301 TEST(HeapSnapshotCodeObjects) { 301 TEST(HeapSnapshotCodeObjects) {
302 LocalContext env; 302 LocalContext env;
303 v8::HandleScope scope(env->GetIsolate()); 303 v8::HandleScope scope(env->GetIsolate());
304 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 304 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
305 305
306 CompileRun( 306 CompileRun(
307 "function lazy(x) { return x - 1; }\n" 307 "function lazy(x) { return x - 1; }\n"
308 "function compiled(x) { return x + 1; }\n" 308 "function compiled(x) { return x + 1; }\n"
309 "var anonymous = (function() { return function() { return 0; } })();\n" 309 "var anonymous = (function() { return function() { return 0; } })();\n"
310 "compiled(1)"); 310 "compiled(1)");
311 const v8::HeapSnapshot* snapshot = 311 const v8::HeapSnapshot* snapshot =
312 heap_profiler->TakeHeapSnapshot(v8_str("code")); 312 heap_profiler->TakeHeapSnapshot(v8_str("code"));
313 CHECK(ValidateSnapshot(snapshot, 3)); 313 CHECK(ValidateSnapshot(snapshot));
314 314
315 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 315 const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
316 const v8::HeapGraphNode* compiled = 316 const v8::HeapGraphNode* compiled =
317 GetProperty(global, v8::HeapGraphEdge::kProperty, "compiled"); 317 GetProperty(global, v8::HeapGraphEdge::kProperty, "compiled");
318 CHECK_NE(NULL, compiled); 318 CHECK_NE(NULL, compiled);
319 CHECK_EQ(v8::HeapGraphNode::kClosure, compiled->GetType()); 319 CHECK_EQ(v8::HeapGraphNode::kClosure, compiled->GetType());
320 const v8::HeapGraphNode* lazy = 320 const v8::HeapGraphNode* lazy =
321 GetProperty(global, v8::HeapGraphEdge::kProperty, "lazy"); 321 GetProperty(global, v8::HeapGraphEdge::kProperty, "lazy");
322 CHECK_NE(NULL, lazy); 322 CHECK_NE(NULL, lazy);
323 CHECK_EQ(v8::HeapGraphNode::kClosure, lazy->GetType()); 323 CHECK_EQ(v8::HeapGraphNode::kClosure, lazy->GetType());
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 367
368 TEST(HeapSnapshotHeapNumbers) { 368 TEST(HeapSnapshotHeapNumbers) {
369 LocalContext env; 369 LocalContext env;
370 v8::HandleScope scope(env->GetIsolate()); 370 v8::HandleScope scope(env->GetIsolate());
371 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 371 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
372 CompileRun( 372 CompileRun(
373 "a = 1; // a is Smi\n" 373 "a = 1; // a is Smi\n"
374 "b = 2.5; // b is HeapNumber"); 374 "b = 2.5; // b is HeapNumber");
375 const v8::HeapSnapshot* snapshot = 375 const v8::HeapSnapshot* snapshot =
376 heap_profiler->TakeHeapSnapshot(v8_str("numbers")); 376 heap_profiler->TakeHeapSnapshot(v8_str("numbers"));
377 CHECK(ValidateSnapshot(snapshot, 3)); 377 CHECK(ValidateSnapshot(snapshot));
378 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 378 const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
379 CHECK_EQ(NULL, GetProperty(global, v8::HeapGraphEdge::kProperty, "a")); 379 CHECK_EQ(NULL, GetProperty(global, v8::HeapGraphEdge::kProperty, "a"));
380 const v8::HeapGraphNode* b = 380 const v8::HeapGraphNode* b =
381 GetProperty(global, v8::HeapGraphEdge::kProperty, "b"); 381 GetProperty(global, v8::HeapGraphEdge::kProperty, "b");
382 CHECK_NE(NULL, b); 382 CHECK_NE(NULL, b);
383 CHECK_EQ(v8::HeapGraphNode::kHeapNumber, b->GetType()); 383 CHECK_EQ(v8::HeapGraphNode::kHeapNumber, b->GetType());
384 } 384 }
385 385
386 386
387 TEST(HeapSnapshotSlicedString) { 387 TEST(HeapSnapshotSlicedString) {
388 LocalContext env; 388 LocalContext env;
389 v8::HandleScope scope(env->GetIsolate()); 389 v8::HandleScope scope(env->GetIsolate());
390 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 390 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
391 CompileRun( 391 CompileRun(
392 "parent_string = \"123456789.123456789.123456789.123456789.123456789." 392 "parent_string = \"123456789.123456789.123456789.123456789.123456789."
393 "123456789.123456789.123456789.123456789.123456789." 393 "123456789.123456789.123456789.123456789.123456789."
394 "123456789.123456789.123456789.123456789.123456789." 394 "123456789.123456789.123456789.123456789.123456789."
395 "123456789.123456789.123456789.123456789.123456789.\";" 395 "123456789.123456789.123456789.123456789.123456789.\";"
396 "child_string = parent_string.slice(100);"); 396 "child_string = parent_string.slice(100);");
397 const v8::HeapSnapshot* snapshot = 397 const v8::HeapSnapshot* snapshot =
398 heap_profiler->TakeHeapSnapshot(v8_str("strings")); 398 heap_profiler->TakeHeapSnapshot(v8_str("strings"));
399 CHECK(ValidateSnapshot(snapshot, 3)); 399 CHECK(ValidateSnapshot(snapshot));
400 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 400 const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
401 const v8::HeapGraphNode* parent_string = 401 const v8::HeapGraphNode* parent_string =
402 GetProperty(global, v8::HeapGraphEdge::kProperty, "parent_string"); 402 GetProperty(global, v8::HeapGraphEdge::kProperty, "parent_string");
403 CHECK_NE(NULL, parent_string); 403 CHECK_NE(NULL, parent_string);
404 const v8::HeapGraphNode* child_string = 404 const v8::HeapGraphNode* child_string =
405 GetProperty(global, v8::HeapGraphEdge::kProperty, "child_string"); 405 GetProperty(global, v8::HeapGraphEdge::kProperty, "child_string");
406 CHECK_NE(NULL, child_string); 406 CHECK_NE(NULL, child_string);
407 const v8::HeapGraphNode* parent = 407 const v8::HeapGraphNode* parent =
408 GetProperty(child_string, v8::HeapGraphEdge::kInternal, "parent"); 408 GetProperty(child_string, v8::HeapGraphEdge::kInternal, "parent");
409 CHECK_EQ(parent_string, parent); 409 CHECK_EQ(parent_string, parent);
410 } 410 }
411 411
412 412
413 TEST(HeapSnapshotInternalReferences) { 413 TEST(HeapSnapshotInternalReferences) {
414 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 414 v8::Isolate* isolate = v8::Isolate::GetCurrent();
415 v8::HandleScope scope(isolate); 415 v8::HandleScope scope(isolate);
416 v8::Local<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 416 v8::Local<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New();
417 global_template->SetInternalFieldCount(2); 417 global_template->SetInternalFieldCount(2);
418 LocalContext env(NULL, global_template); 418 LocalContext env(NULL, global_template);
419 v8::Handle<v8::Object> global_proxy = env->Global(); 419 v8::Handle<v8::Object> global_proxy = env->Global();
420 v8::Handle<v8::Object> global = global_proxy->GetPrototype().As<v8::Object>(); 420 v8::Handle<v8::Object> global = global_proxy->GetPrototype().As<v8::Object>();
421 CHECK_EQ(2, global->InternalFieldCount()); 421 CHECK_EQ(2, global->InternalFieldCount());
422 v8::Local<v8::Object> obj = v8::Object::New(); 422 v8::Local<v8::Object> obj = v8::Object::New();
423 global->SetInternalField(0, v8_num(17)); 423 global->SetInternalField(0, v8_num(17));
424 global->SetInternalField(1, obj); 424 global->SetInternalField(1, obj);
425 v8::HeapProfiler* heap_profiler = isolate->GetHeapProfiler(); 425 v8::HeapProfiler* heap_profiler = isolate->GetHeapProfiler();
426 const v8::HeapSnapshot* snapshot = 426 const v8::HeapSnapshot* snapshot =
427 heap_profiler->TakeHeapSnapshot(v8_str("internals")); 427 heap_profiler->TakeHeapSnapshot(v8_str("internals"));
428 CHECK(ValidateSnapshot(snapshot, 3)); 428 CHECK(ValidateSnapshot(snapshot));
429 const v8::HeapGraphNode* global_node = GetGlobalObject(snapshot); 429 const v8::HeapGraphNode* global_node = GetGlobalObject(snapshot);
430 // The first reference will not present, because it's a Smi. 430 // The first reference will not present, because it's a Smi.
431 CHECK_EQ(NULL, GetProperty(global_node, v8::HeapGraphEdge::kInternal, "0")); 431 CHECK_EQ(NULL, GetProperty(global_node, v8::HeapGraphEdge::kInternal, "0"));
432 // The second reference is to an object. 432 // The second reference is to an object.
433 CHECK_NE(NULL, GetProperty(global_node, v8::HeapGraphEdge::kInternal, "1")); 433 CHECK_NE(NULL, GetProperty(global_node, v8::HeapGraphEdge::kInternal, "1"));
434 } 434 }
435 435
436 436
437 // Trying to introduce a check helper for uint32_t causes many 437 // Trying to introduce a check helper for uint32_t causes many
438 // overloading ambiguities, so it seems easier just to cast 438 // overloading ambiguities, so it seems easier just to cast
439 // them to a signed type. 439 // them to a signed type.
440 #define CHECK_EQ_SNAPSHOT_OBJECT_ID(a, b) \ 440 #define CHECK_EQ_SNAPSHOT_OBJECT_ID(a, b) \
441 CHECK_EQ(static_cast<int32_t>(a), static_cast<int32_t>(b)) 441 CHECK_EQ(static_cast<int32_t>(a), static_cast<int32_t>(b))
442 #define CHECK_NE_SNAPSHOT_OBJECT_ID(a, b) \ 442 #define CHECK_NE_SNAPSHOT_OBJECT_ID(a, b) \
443 CHECK((a) != (b)) // NOLINT 443 CHECK((a) != (b)) // NOLINT
444 444
445 TEST(HeapSnapshotAddressReuse) { 445 TEST(HeapSnapshotAddressReuse) {
446 LocalContext env; 446 LocalContext env;
447 v8::HandleScope scope(env->GetIsolate()); 447 v8::HandleScope scope(env->GetIsolate());
448 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 448 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
449 449
450 CompileRun( 450 CompileRun(
451 "function A() {}\n" 451 "function A() {}\n"
452 "var a = [];\n" 452 "var a = [];\n"
453 "for (var i = 0; i < 10000; ++i)\n" 453 "for (var i = 0; i < 10000; ++i)\n"
454 " a[i] = new A();\n"); 454 " a[i] = new A();\n");
455 const v8::HeapSnapshot* snapshot1 = 455 const v8::HeapSnapshot* snapshot1 =
456 heap_profiler->TakeHeapSnapshot(v8_str("snapshot1")); 456 heap_profiler->TakeHeapSnapshot(v8_str("snapshot1"));
457 CHECK(ValidateSnapshot(snapshot1, 3)); 457 CHECK(ValidateSnapshot(snapshot1));
458 v8::SnapshotObjectId maxId1 = snapshot1->GetMaxSnapshotJSObjectId(); 458 v8::SnapshotObjectId maxId1 = snapshot1->GetMaxSnapshotJSObjectId();
459 459
460 CompileRun( 460 CompileRun(
461 "for (var i = 0; i < 10000; ++i)\n" 461 "for (var i = 0; i < 10000; ++i)\n"
462 " a[i] = new A();\n"); 462 " a[i] = new A();\n");
463 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); 463 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
464 464
465 const v8::HeapSnapshot* snapshot2 = 465 const v8::HeapSnapshot* snapshot2 =
466 heap_profiler->TakeHeapSnapshot(v8_str("snapshot2")); 466 heap_profiler->TakeHeapSnapshot(v8_str("snapshot2"));
467 CHECK(ValidateSnapshot(snapshot2, 3)); 467 CHECK(ValidateSnapshot(snapshot2));
468 const v8::HeapGraphNode* global2 = GetGlobalObject(snapshot2); 468 const v8::HeapGraphNode* global2 = GetGlobalObject(snapshot2);
469 469
470 const v8::HeapGraphNode* array_node = 470 const v8::HeapGraphNode* array_node =
471 GetProperty(global2, v8::HeapGraphEdge::kProperty, "a"); 471 GetProperty(global2, v8::HeapGraphEdge::kProperty, "a");
472 CHECK_NE(NULL, array_node); 472 CHECK_NE(NULL, array_node);
473 int wrong_count = 0; 473 int wrong_count = 0;
474 for (int i = 0, count = array_node->GetChildrenCount(); i < count; ++i) { 474 for (int i = 0, count = array_node->GetChildrenCount(); i < count; ++i) {
475 const v8::HeapGraphEdge* prop = array_node->GetChild(i); 475 const v8::HeapGraphEdge* prop = array_node->GetChild(i);
476 if (prop->GetType() != v8::HeapGraphEdge::kElement) 476 if (prop->GetType() != v8::HeapGraphEdge::kElement)
477 continue; 477 continue;
(...skipping 13 matching lines...) Expand all
491 CompileRun( 491 CompileRun(
492 "function AnObject() {\n" 492 "function AnObject() {\n"
493 " this.first = 'first';\n" 493 " this.first = 'first';\n"
494 " this.second = 'second';\n" 494 " this.second = 'second';\n"
495 "}\n" 495 "}\n"
496 "var a = new Array();\n" 496 "var a = new Array();\n"
497 "for (var i = 0; i < 10; ++i)\n" 497 "for (var i = 0; i < 10; ++i)\n"
498 " a.push(new AnObject());\n"); 498 " a.push(new AnObject());\n");
499 const v8::HeapSnapshot* snapshot1 = 499 const v8::HeapSnapshot* snapshot1 =
500 heap_profiler->TakeHeapSnapshot(v8_str("s1")); 500 heap_profiler->TakeHeapSnapshot(v8_str("s1"));
501 CHECK(ValidateSnapshot(snapshot1, 3)); 501 CHECK(ValidateSnapshot(snapshot1));
502 502
503 CompileRun( 503 CompileRun(
504 "for (var i = 0; i < 1; ++i)\n" 504 "for (var i = 0; i < 1; ++i)\n"
505 " a.shift();\n"); 505 " a.shift();\n");
506 506
507 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); 507 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
508 508
509 const v8::HeapSnapshot* snapshot2 = 509 const v8::HeapSnapshot* snapshot2 =
510 heap_profiler->TakeHeapSnapshot(v8_str("s2")); 510 heap_profiler->TakeHeapSnapshot(v8_str("s2"));
511 CHECK(ValidateSnapshot(snapshot2, 3)); 511 CHECK(ValidateSnapshot(snapshot2));
512 512
513 const v8::HeapGraphNode* global1 = GetGlobalObject(snapshot1); 513 const v8::HeapGraphNode* global1 = GetGlobalObject(snapshot1);
514 const v8::HeapGraphNode* global2 = GetGlobalObject(snapshot2); 514 const v8::HeapGraphNode* global2 = GetGlobalObject(snapshot2);
515 CHECK_NE_SNAPSHOT_OBJECT_ID(0, global1->GetId()); 515 CHECK_NE_SNAPSHOT_OBJECT_ID(0, global1->GetId());
516 CHECK_EQ_SNAPSHOT_OBJECT_ID(global1->GetId(), global2->GetId()); 516 CHECK_EQ_SNAPSHOT_OBJECT_ID(global1->GetId(), global2->GetId());
517 517
518 const v8::HeapGraphNode* a1 = 518 const v8::HeapGraphNode* a1 =
519 GetProperty(global1, v8::HeapGraphEdge::kProperty, "a"); 519 GetProperty(global1, v8::HeapGraphEdge::kProperty, "a");
520 CHECK_NE(NULL, a1); 520 CHECK_NE(NULL, a1);
521 const v8::HeapGraphNode* k1 = 521 const v8::HeapGraphNode* k1 =
(...skipping 18 matching lines...) Expand all
540 540
541 CompileRun( 541 CompileRun(
542 "function A() {}\n" 542 "function A() {}\n"
543 "function B(x) { this.x = x; }\n" 543 "function B(x) { this.x = x; }\n"
544 "var a = new A();\n" 544 "var a = new A();\n"
545 "var b = new B(a);"); 545 "var b = new B(a);");
546 v8::Local<v8::String> s1_str = v8_str("s1"); 546 v8::Local<v8::String> s1_str = v8_str("s1");
547 v8::Local<v8::String> s2_str = v8_str("s2"); 547 v8::Local<v8::String> s2_str = v8_str("s2");
548 const v8::HeapSnapshot* snapshot1 = 548 const v8::HeapSnapshot* snapshot1 =
549 heap_profiler->TakeHeapSnapshot(s1_str); 549 heap_profiler->TakeHeapSnapshot(s1_str);
550 CHECK(ValidateSnapshot(snapshot1, 3)); 550 CHECK(ValidateSnapshot(snapshot1));
551 551
552 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); 552 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
553 553
554 const v8::HeapSnapshot* snapshot2 = 554 const v8::HeapSnapshot* snapshot2 =
555 heap_profiler->TakeHeapSnapshot(s2_str); 555 heap_profiler->TakeHeapSnapshot(s2_str);
556 CHECK(ValidateSnapshot(snapshot2, 3)); 556 CHECK(ValidateSnapshot(snapshot2));
557 557
558 CHECK_GT(snapshot1->GetMaxSnapshotJSObjectId(), 7000); 558 CHECK_GT(snapshot1->GetMaxSnapshotJSObjectId(), 7000);
559 CHECK(snapshot1->GetMaxSnapshotJSObjectId() <= 559 CHECK(snapshot1->GetMaxSnapshotJSObjectId() <=
560 snapshot2->GetMaxSnapshotJSObjectId()); 560 snapshot2->GetMaxSnapshotJSObjectId());
561 561
562 const v8::HeapGraphNode* global1 = GetGlobalObject(snapshot1); 562 const v8::HeapGraphNode* global1 = GetGlobalObject(snapshot1);
563 const v8::HeapGraphNode* global2 = GetGlobalObject(snapshot2); 563 const v8::HeapGraphNode* global2 = GetGlobalObject(snapshot2);
564 CHECK_NE_SNAPSHOT_OBJECT_ID(0, global1->GetId()); 564 CHECK_NE_SNAPSHOT_OBJECT_ID(0, global1->GetId());
565 CHECK_EQ_SNAPSHOT_OBJECT_ID(global1->GetId(), global2->GetId()); 565 CHECK_EQ_SNAPSHOT_OBJECT_ID(global1->GetId(), global2->GetId());
566 const v8::HeapGraphNode* A1 = 566 const v8::HeapGraphNode* A1 =
(...skipping 30 matching lines...) Expand all
597 CHECK_EQ_SNAPSHOT_OBJECT_ID(b1->GetId(), b2->GetId()); 597 CHECK_EQ_SNAPSHOT_OBJECT_ID(b1->GetId(), b2->GetId());
598 } 598 }
599 599
600 600
601 TEST(HeapSnapshotRootPreservedAfterSorting) { 601 TEST(HeapSnapshotRootPreservedAfterSorting) {
602 LocalContext env; 602 LocalContext env;
603 v8::HandleScope scope(env->GetIsolate()); 603 v8::HandleScope scope(env->GetIsolate());
604 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 604 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
605 const v8::HeapSnapshot* snapshot = 605 const v8::HeapSnapshot* snapshot =
606 heap_profiler->TakeHeapSnapshot(v8_str("s")); 606 heap_profiler->TakeHeapSnapshot(v8_str("s"));
607 CHECK(ValidateSnapshot(snapshot, 3)); 607 CHECK(ValidateSnapshot(snapshot));
608 const v8::HeapGraphNode* root1 = snapshot->GetRoot(); 608 const v8::HeapGraphNode* root1 = snapshot->GetRoot();
609 const_cast<i::HeapSnapshot*>(reinterpret_cast<const i::HeapSnapshot*>( 609 const_cast<i::HeapSnapshot*>(reinterpret_cast<const i::HeapSnapshot*>(
610 snapshot))->GetSortedEntriesList(); 610 snapshot))->GetSortedEntriesList();
611 const v8::HeapGraphNode* root2 = snapshot->GetRoot(); 611 const v8::HeapGraphNode* root2 = snapshot->GetRoot();
612 CHECK_EQ(root1, root2); 612 CHECK_EQ(root1, root2);
613 } 613 }
614 614
615 615
616 namespace { 616 namespace {
617 617
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
665 665
666 #define STRING_LITERAL_FOR_TEST \ 666 #define STRING_LITERAL_FOR_TEST \
667 "\"String \\n\\r\\u0008\\u0081\\u0101\\u0801\\u8001\"" 667 "\"String \\n\\r\\u0008\\u0081\\u0101\\u0801\\u8001\""
668 CompileRun( 668 CompileRun(
669 "function A(s) { this.s = s; }\n" 669 "function A(s) { this.s = s; }\n"
670 "function B(x) { this.x = x; }\n" 670 "function B(x) { this.x = x; }\n"
671 "var a = new A(" STRING_LITERAL_FOR_TEST ");\n" 671 "var a = new A(" STRING_LITERAL_FOR_TEST ");\n"
672 "var b = new B(a);"); 672 "var b = new B(a);");
673 const v8::HeapSnapshot* snapshot = 673 const v8::HeapSnapshot* snapshot =
674 heap_profiler->TakeHeapSnapshot(v8_str("json")); 674 heap_profiler->TakeHeapSnapshot(v8_str("json"));
675 CHECK(ValidateSnapshot(snapshot, 3)); 675 CHECK(ValidateSnapshot(snapshot));
676 676
677 TestJSONStream stream; 677 TestJSONStream stream;
678 snapshot->Serialize(&stream, v8::HeapSnapshot::kJSON); 678 snapshot->Serialize(&stream, v8::HeapSnapshot::kJSON);
679 CHECK_GT(stream.size(), 0); 679 CHECK_GT(stream.size(), 0);
680 CHECK_EQ(1, stream.eos_signaled()); 680 CHECK_EQ(1, stream.eos_signaled());
681 i::ScopedVector<char> json(stream.size()); 681 i::ScopedVector<char> json(stream.size());
682 stream.WriteTo(json); 682 stream.WriteTo(json);
683 683
684 // Verify that snapshot string is valid JSON. 684 // Verify that snapshot string is valid JSON.
685 AsciiResource json_res(json); 685 AsciiResource json_res(json);
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
763 *v8::String::Utf8Value(string)); 763 *v8::String::Utf8Value(string));
764 } 764 }
765 765
766 766
767 TEST(HeapSnapshotJSONSerializationAborting) { 767 TEST(HeapSnapshotJSONSerializationAborting) {
768 LocalContext env; 768 LocalContext env;
769 v8::HandleScope scope(env->GetIsolate()); 769 v8::HandleScope scope(env->GetIsolate());
770 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 770 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
771 const v8::HeapSnapshot* snapshot = 771 const v8::HeapSnapshot* snapshot =
772 heap_profiler->TakeHeapSnapshot(v8_str("abort")); 772 heap_profiler->TakeHeapSnapshot(v8_str("abort"));
773 CHECK(ValidateSnapshot(snapshot, 3)); 773 CHECK(ValidateSnapshot(snapshot));
774 TestJSONStream stream(5); 774 TestJSONStream stream(5);
775 snapshot->Serialize(&stream, v8::HeapSnapshot::kJSON); 775 snapshot->Serialize(&stream, v8::HeapSnapshot::kJSON);
776 CHECK_GT(stream.size(), 0); 776 CHECK_GT(stream.size(), 0);
777 CHECK_EQ(0, stream.eos_signaled()); 777 CHECK_EQ(0, stream.eos_signaled());
778 } 778 }
779 779
780 namespace { 780 namespace {
781 781
782 class TestStatsStream : public v8::OutputStream { 782 class TestStatsStream : public v8::OutputStream {
783 public: 783 public:
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
1003 } 1003 }
1004 1004
1005 1005
1006 TEST(HeapSnapshotGetNodeById) { 1006 TEST(HeapSnapshotGetNodeById) {
1007 LocalContext env; 1007 LocalContext env;
1008 v8::HandleScope scope(env->GetIsolate()); 1008 v8::HandleScope scope(env->GetIsolate());
1009 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1009 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
1010 1010
1011 const v8::HeapSnapshot* snapshot = 1011 const v8::HeapSnapshot* snapshot =
1012 heap_profiler->TakeHeapSnapshot(v8_str("id")); 1012 heap_profiler->TakeHeapSnapshot(v8_str("id"));
1013 CHECK(ValidateSnapshot(snapshot, 3)); 1013 CHECK(ValidateSnapshot(snapshot));
1014 const v8::HeapGraphNode* root = snapshot->GetRoot(); 1014 const v8::HeapGraphNode* root = snapshot->GetRoot();
1015 CheckChildrenIds(snapshot, root, 0, 3); 1015 CheckChildrenIds(snapshot, root, 0, 3);
1016 // Check a big id, which should not exist yet. 1016 // Check a big id, which should not exist yet.
1017 CHECK_EQ(NULL, snapshot->GetNodeById(0x1000000UL)); 1017 CHECK_EQ(NULL, snapshot->GetNodeById(0x1000000UL));
1018 } 1018 }
1019 1019
1020 1020
1021 TEST(HeapSnapshotGetSnapshotObjectId) { 1021 TEST(HeapSnapshotGetSnapshotObjectId) {
1022 LocalContext env; 1022 LocalContext env;
1023 v8::HandleScope scope(env->GetIsolate()); 1023 v8::HandleScope scope(env->GetIsolate());
1024 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1024 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
1025 CompileRun("globalObject = {};\n"); 1025 CompileRun("globalObject = {};\n");
1026 const v8::HeapSnapshot* snapshot = 1026 const v8::HeapSnapshot* snapshot =
1027 heap_profiler->TakeHeapSnapshot(v8_str("get_snapshot_object_id")); 1027 heap_profiler->TakeHeapSnapshot(v8_str("get_snapshot_object_id"));
1028 CHECK(ValidateSnapshot(snapshot, 3)); 1028 CHECK(ValidateSnapshot(snapshot));
1029 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 1029 const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
1030 const v8::HeapGraphNode* global_object = 1030 const v8::HeapGraphNode* global_object =
1031 GetProperty(global, v8::HeapGraphEdge::kProperty, "globalObject"); 1031 GetProperty(global, v8::HeapGraphEdge::kProperty, "globalObject");
1032 CHECK(global_object); 1032 CHECK(global_object);
1033 1033
1034 v8::Local<v8::Value> globalObjectHandle = 1034 v8::Local<v8::Value> globalObjectHandle =
1035 env->Global()->Get(v8::String::New("globalObject")); 1035 env->Global()->Get(v8::String::New("globalObject"));
1036 CHECK(!globalObjectHandle.IsEmpty()); 1036 CHECK(!globalObjectHandle.IsEmpty());
1037 CHECK(globalObjectHandle->IsObject()); 1037 CHECK(globalObjectHandle->IsObject());
1038 1038
1039 v8::SnapshotObjectId id = heap_profiler->GetObjectId(globalObjectHandle); 1039 v8::SnapshotObjectId id = heap_profiler->GetObjectId(globalObjectHandle);
1040 CHECK_NE(static_cast<int>(v8::HeapProfiler::kUnknownObjectId), 1040 CHECK_NE(static_cast<int>(v8::HeapProfiler::kUnknownObjectId),
1041 id); 1041 id);
1042 CHECK_EQ(static_cast<int>(id), global_object->GetId()); 1042 CHECK_EQ(static_cast<int>(id), global_object->GetId());
1043 } 1043 }
1044 1044
1045 1045
1046 TEST(HeapSnapshotUnknownSnapshotObjectId) { 1046 TEST(HeapSnapshotUnknownSnapshotObjectId) {
1047 LocalContext env; 1047 LocalContext env;
1048 v8::HandleScope scope(env->GetIsolate()); 1048 v8::HandleScope scope(env->GetIsolate());
1049 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1049 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
1050 CompileRun("globalObject = {};\n"); 1050 CompileRun("globalObject = {};\n");
1051 const v8::HeapSnapshot* snapshot = 1051 const v8::HeapSnapshot* snapshot =
1052 heap_profiler->TakeHeapSnapshot(v8_str("unknown_object_id")); 1052 heap_profiler->TakeHeapSnapshot(v8_str("unknown_object_id"));
1053 CHECK(ValidateSnapshot(snapshot, 3)); 1053 CHECK(ValidateSnapshot(snapshot));
1054 const v8::HeapGraphNode* node = 1054 const v8::HeapGraphNode* node =
1055 snapshot->GetNodeById(v8::HeapProfiler::kUnknownObjectId); 1055 snapshot->GetNodeById(v8::HeapProfiler::kUnknownObjectId);
1056 CHECK_EQ(NULL, node); 1056 CHECK_EQ(NULL, node);
1057 } 1057 }
1058 1058
1059 1059
1060 namespace { 1060 namespace {
1061 1061
1062 class TestActivityControl : public v8::ActivityControl { 1062 class TestActivityControl : public v8::ActivityControl {
1063 public: 1063 public:
(...skipping 26 matching lines...) Expand all
1090 heap_profiler->TakeHeapSnapshot(v8_str("abort"), 1090 heap_profiler->TakeHeapSnapshot(v8_str("abort"),
1091 &aborting_control); 1091 &aborting_control);
1092 CHECK_EQ(NULL, no_snapshot); 1092 CHECK_EQ(NULL, no_snapshot);
1093 CHECK_EQ(snapshots_count, heap_profiler->GetSnapshotCount()); 1093 CHECK_EQ(snapshots_count, heap_profiler->GetSnapshotCount());
1094 CHECK_GT(aborting_control.total(), aborting_control.done()); 1094 CHECK_GT(aborting_control.total(), aborting_control.done());
1095 1095
1096 TestActivityControl control(-1); // Don't abort. 1096 TestActivityControl control(-1); // Don't abort.
1097 const v8::HeapSnapshot* snapshot = 1097 const v8::HeapSnapshot* snapshot =
1098 heap_profiler->TakeHeapSnapshot(v8_str("full"), 1098 heap_profiler->TakeHeapSnapshot(v8_str("full"),
1099 &control); 1099 &control);
1100 CHECK(ValidateSnapshot(snapshot, 3)); 1100 CHECK(ValidateSnapshot(snapshot));
1101 1101
1102 CHECK_NE(NULL, snapshot); 1102 CHECK_NE(NULL, snapshot);
1103 CHECK_EQ(snapshots_count + 1, heap_profiler->GetSnapshotCount()); 1103 CHECK_EQ(snapshots_count + 1, heap_profiler->GetSnapshotCount());
1104 CHECK_EQ(control.total(), control.done()); 1104 CHECK_EQ(control.total(), control.done());
1105 CHECK_GT(control.total(), 0); 1105 CHECK_GT(control.total(), 0);
1106 } 1106 }
1107 1107
1108 1108
1109 namespace { 1109 namespace {
1110 1110
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
1202 2, TestRetainedObjectInfo::WrapperInfoCallback); 1202 2, TestRetainedObjectInfo::WrapperInfoCallback);
1203 v8::Persistent<v8::String> p_AAA(isolate, v8_str("AAA")); 1203 v8::Persistent<v8::String> p_AAA(isolate, v8_str("AAA"));
1204 p_AAA.SetWrapperClassId(isolate, 1); 1204 p_AAA.SetWrapperClassId(isolate, 1);
1205 v8::Persistent<v8::String> p_BBB(isolate, v8_str("BBB")); 1205 v8::Persistent<v8::String> p_BBB(isolate, v8_str("BBB"));
1206 p_BBB.SetWrapperClassId(isolate, 1); 1206 p_BBB.SetWrapperClassId(isolate, 1);
1207 v8::Persistent<v8::String> p_CCC(isolate, v8_str("CCC")); 1207 v8::Persistent<v8::String> p_CCC(isolate, v8_str("CCC"));
1208 p_CCC.SetWrapperClassId(isolate, 2); 1208 p_CCC.SetWrapperClassId(isolate, 2);
1209 CHECK_EQ(0, TestRetainedObjectInfo::instances.length()); 1209 CHECK_EQ(0, TestRetainedObjectInfo::instances.length());
1210 const v8::HeapSnapshot* snapshot = 1210 const v8::HeapSnapshot* snapshot =
1211 heap_profiler->TakeHeapSnapshot(v8_str("retained")); 1211 heap_profiler->TakeHeapSnapshot(v8_str("retained"));
1212 CHECK(ValidateSnapshot(snapshot, 3)); 1212 CHECK(ValidateSnapshot(snapshot));
1213 1213
1214 CHECK_EQ(3, TestRetainedObjectInfo::instances.length()); 1214 CHECK_EQ(3, TestRetainedObjectInfo::instances.length());
1215 for (int i = 0; i < TestRetainedObjectInfo::instances.length(); ++i) { 1215 for (int i = 0; i < TestRetainedObjectInfo::instances.length(); ++i) {
1216 CHECK(TestRetainedObjectInfo::instances[i]->disposed()); 1216 CHECK(TestRetainedObjectInfo::instances[i]->disposed());
1217 delete TestRetainedObjectInfo::instances[i]; 1217 delete TestRetainedObjectInfo::instances[i];
1218 } 1218 }
1219 1219
1220 const v8::HeapGraphNode* native_group_aaa = GetNode( 1220 const v8::HeapGraphNode* native_group_aaa = GetNode(
1221 snapshot->GetRoot(), v8::HeapGraphNode::kSynthetic, "aaa-group"); 1221 snapshot->GetRoot(), v8::HeapGraphNode::kSynthetic, "aaa-group");
1222 CHECK_NE(NULL, native_group_aaa); 1222 CHECK_NE(NULL, native_group_aaa);
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
1295 TEST(HeapSnapshotImplicitReferences) { 1295 TEST(HeapSnapshotImplicitReferences) {
1296 LocalContext env; 1296 LocalContext env;
1297 v8::HandleScope scope(env->GetIsolate()); 1297 v8::HandleScope scope(env->GetIsolate());
1298 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1298 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
1299 1299
1300 GraphWithImplicitRefs graph(&env); 1300 GraphWithImplicitRefs graph(&env);
1301 v8::V8::AddGCPrologueCallback(&GraphWithImplicitRefs::gcPrologue); 1301 v8::V8::AddGCPrologueCallback(&GraphWithImplicitRefs::gcPrologue);
1302 1302
1303 const v8::HeapSnapshot* snapshot = 1303 const v8::HeapSnapshot* snapshot =
1304 heap_profiler->TakeHeapSnapshot(v8_str("implicit_refs")); 1304 heap_profiler->TakeHeapSnapshot(v8_str("implicit_refs"));
1305 CHECK(ValidateSnapshot(snapshot, 3)); 1305 CHECK(ValidateSnapshot(snapshot));
1306 1306
1307 const v8::HeapGraphNode* global_object = GetGlobalObject(snapshot); 1307 const v8::HeapGraphNode* global_object = GetGlobalObject(snapshot);
1308 const v8::HeapGraphNode* obj0 = GetProperty( 1308 const v8::HeapGraphNode* obj0 = GetProperty(
1309 global_object, v8::HeapGraphEdge::kProperty, "root_object"); 1309 global_object, v8::HeapGraphEdge::kProperty, "root_object");
1310 CHECK(obj0); 1310 CHECK(obj0);
1311 CHECK_EQ(v8::HeapGraphNode::kObject, obj0->GetType()); 1311 CHECK_EQ(v8::HeapGraphNode::kObject, obj0->GetType());
1312 const v8::HeapGraphNode* obj1 = GetProperty( 1312 const v8::HeapGraphNode* obj1 = GetProperty(
1313 obj0, v8::HeapGraphEdge::kInternal, "native"); 1313 obj0, v8::HeapGraphEdge::kInternal, "native");
1314 CHECK(obj1); 1314 CHECK(obj1);
1315 int implicit_targets_count = 0; 1315 int implicit_targets_count = 0;
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
1413 v8::HandleScope scope(env->GetIsolate()); 1413 v8::HandleScope scope(env->GetIsolate());
1414 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1414 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
1415 1415
1416 CompileRun("document = { URL:\"abcdefgh\" };"); 1416 CompileRun("document = { URL:\"abcdefgh\" };");
1417 1417
1418 NameResolver name_resolver; 1418 NameResolver name_resolver;
1419 const v8::HeapSnapshot* snapshot = 1419 const v8::HeapSnapshot* snapshot =
1420 heap_profiler->TakeHeapSnapshot(v8_str("document"), 1420 heap_profiler->TakeHeapSnapshot(v8_str("document"),
1421 NULL, 1421 NULL,
1422 &name_resolver); 1422 &name_resolver);
1423 CHECK(ValidateSnapshot(snapshot, 3)); 1423 CHECK(ValidateSnapshot(snapshot));
1424 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 1424 const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
1425 CHECK_NE(NULL, global); 1425 CHECK_NE(NULL, global);
1426 CHECK_EQ("Object / Global object name" , 1426 CHECK_EQ("Object / Global object name" ,
1427 const_cast<i::HeapEntry*>( 1427 const_cast<i::HeapEntry*>(
1428 reinterpret_cast<const i::HeapEntry*>(global))->name()); 1428 reinterpret_cast<const i::HeapEntry*>(global))->name());
1429 } 1429 }
1430 1430
1431 1431
1432 TEST(NoHandleLeaks) { 1432 TEST(NoHandleLeaks) {
1433 LocalContext env; 1433 LocalContext env;
(...skipping 10 matching lines...) Expand all
1444 CHECK_EQ(count_before, count_after); 1444 CHECK_EQ(count_before, count_after);
1445 } 1445 }
1446 1446
1447 1447
1448 TEST(NodesIteration) { 1448 TEST(NodesIteration) {
1449 LocalContext env; 1449 LocalContext env;
1450 v8::HandleScope scope(env->GetIsolate()); 1450 v8::HandleScope scope(env->GetIsolate());
1451 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1451 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
1452 const v8::HeapSnapshot* snapshot = 1452 const v8::HeapSnapshot* snapshot =
1453 heap_profiler->TakeHeapSnapshot(v8_str("iteration")); 1453 heap_profiler->TakeHeapSnapshot(v8_str("iteration"));
1454 CHECK(ValidateSnapshot(snapshot, 3)); 1454 CHECK(ValidateSnapshot(snapshot));
1455 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 1455 const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
1456 CHECK_NE(NULL, global); 1456 CHECK_NE(NULL, global);
1457 // Verify that we can find this object by iteration. 1457 // Verify that we can find this object by iteration.
1458 const int nodes_count = snapshot->GetNodesCount(); 1458 const int nodes_count = snapshot->GetNodesCount();
1459 int count = 0; 1459 int count = 0;
1460 for (int i = 0; i < nodes_count; ++i) { 1460 for (int i = 0; i < nodes_count; ++i) {
1461 if (snapshot->GetNode(i) == global) 1461 if (snapshot->GetNode(i) == global)
1462 ++count; 1462 ++count;
1463 } 1463 }
1464 CHECK_EQ(1, count); 1464 CHECK_EQ(1, count);
1465 } 1465 }
1466 1466
1467 1467
1468 TEST(GetHeapValue) { 1468 TEST(GetHeapValue) {
1469 LocalContext env; 1469 LocalContext env;
1470 v8::HandleScope scope(env->GetIsolate()); 1470 v8::HandleScope scope(env->GetIsolate());
1471 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1471 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
1472 1472
1473 CompileRun("a = { s_prop: \'value\', n_prop: 0.1 };"); 1473 CompileRun("a = { s_prop: \'value\', n_prop: 0.1 };");
1474 const v8::HeapSnapshot* snapshot = 1474 const v8::HeapSnapshot* snapshot =
1475 heap_profiler->TakeHeapSnapshot(v8_str("value")); 1475 heap_profiler->TakeHeapSnapshot(v8_str("value"));
1476 CHECK(ValidateSnapshot(snapshot, 3)); 1476 CHECK(ValidateSnapshot(snapshot));
1477 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 1477 const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
1478 CHECK(global->GetHeapValue()->IsObject()); 1478 CHECK(global->GetHeapValue()->IsObject());
1479 v8::Local<v8::Object> js_global = 1479 v8::Local<v8::Object> js_global =
1480 env->Global()->GetPrototype().As<v8::Object>(); 1480 env->Global()->GetPrototype().As<v8::Object>();
1481 CHECK(js_global == global->GetHeapValue()); 1481 CHECK(js_global == global->GetHeapValue());
1482 const v8::HeapGraphNode* obj = GetProperty( 1482 const v8::HeapGraphNode* obj = GetProperty(
1483 global, v8::HeapGraphEdge::kProperty, "a"); 1483 global, v8::HeapGraphEdge::kProperty, "a");
1484 CHECK(obj->GetHeapValue()->IsObject()); 1484 CHECK(obj->GetHeapValue()->IsObject());
1485 v8::Local<v8::Object> js_obj = js_global->Get(v8_str("a")).As<v8::Object>(); 1485 v8::Local<v8::Object> js_obj = js_global->Get(v8_str("a")).As<v8::Object>();
1486 CHECK(js_obj == obj->GetHeapValue()); 1486 CHECK(js_obj == obj->GetHeapValue());
(...skipping 14 matching lines...) Expand all
1501 LocalContext env; 1501 LocalContext env;
1502 v8::HandleScope scope(env->GetIsolate()); 1502 v8::HandleScope scope(env->GetIsolate());
1503 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1503 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
1504 1504
1505 // It is impossible to delete a global property, so we are about to delete a 1505 // It is impossible to delete a global property, so we are about to delete a
1506 // property of the "a" object. Also, the "p" object can't be an empty one 1506 // property of the "a" object. Also, the "p" object can't be an empty one
1507 // because the empty object is static and isn't actually deleted. 1507 // because the empty object is static and isn't actually deleted.
1508 CompileRun("a = { p: { r: {} } };"); 1508 CompileRun("a = { p: { r: {} } };");
1509 const v8::HeapSnapshot* snapshot = 1509 const v8::HeapSnapshot* snapshot =
1510 heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); 1510 heap_profiler->TakeHeapSnapshot(v8_str("snapshot"));
1511 CHECK(ValidateSnapshot(snapshot, 3)); 1511 CHECK(ValidateSnapshot(snapshot));
1512 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 1512 const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
1513 const v8::HeapGraphNode* obj = GetProperty( 1513 const v8::HeapGraphNode* obj = GetProperty(
1514 global, v8::HeapGraphEdge::kProperty, "a"); 1514 global, v8::HeapGraphEdge::kProperty, "a");
1515 const v8::HeapGraphNode* prop = GetProperty( 1515 const v8::HeapGraphNode* prop = GetProperty(
1516 obj, v8::HeapGraphEdge::kProperty, "p"); 1516 obj, v8::HeapGraphEdge::kProperty, "p");
1517 { 1517 {
1518 // Perform the check inside a nested local scope to avoid creating a 1518 // Perform the check inside a nested local scope to avoid creating a
1519 // reference to the object we are deleting. 1519 // reference to the object we are deleting.
1520 v8::HandleScope scope(env->GetIsolate()); 1520 v8::HandleScope scope(env->GetIsolate());
1521 CHECK(prop->GetHeapValue()->IsObject()); 1521 CHECK(prop->GetHeapValue()->IsObject());
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1588 1588
1589 CompileRun("var obj1 = {};\n" 1589 CompileRun("var obj1 = {};\n"
1590 "obj1.__defineGetter__('propWithGetter', function Y() {\n" 1590 "obj1.__defineGetter__('propWithGetter', function Y() {\n"
1591 " return 42;\n" 1591 " return 42;\n"
1592 "});\n" 1592 "});\n"
1593 "obj1.__defineSetter__('propWithSetter', function Z(value) {\n" 1593 "obj1.__defineSetter__('propWithSetter', function Z(value) {\n"
1594 " return this.value_ = value;\n" 1594 " return this.value_ = value;\n"
1595 "});\n"); 1595 "});\n");
1596 const v8::HeapSnapshot* snapshot = 1596 const v8::HeapSnapshot* snapshot =
1597 heap_profiler->TakeHeapSnapshot(v8_str("fastCaseAccessors")); 1597 heap_profiler->TakeHeapSnapshot(v8_str("fastCaseAccessors"));
1598 CHECK(ValidateSnapshot(snapshot, 3)); 1598 CHECK(ValidateSnapshot(snapshot));
1599 1599
1600 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 1600 const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
1601 CHECK_NE(NULL, global); 1601 CHECK_NE(NULL, global);
1602 const v8::HeapGraphNode* obj1 = 1602 const v8::HeapGraphNode* obj1 =
1603 GetProperty(global, v8::HeapGraphEdge::kProperty, "obj1"); 1603 GetProperty(global, v8::HeapGraphEdge::kProperty, "obj1");
1604 CHECK_NE(NULL, obj1); 1604 CHECK_NE(NULL, obj1);
1605 const v8::HeapGraphNode* func; 1605 const v8::HeapGraphNode* func;
1606 func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "get propWithGetter"); 1606 func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "get propWithGetter");
1607 CHECK_NE(NULL, func); 1607 CHECK_NE(NULL, func);
1608 func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "set propWithGetter"); 1608 func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "set propWithGetter");
(...skipping 13 matching lines...) Expand all
1622 CompileRun("var obj1 = {};\n" 1622 CompileRun("var obj1 = {};\n"
1623 "for (var i = 0; i < 100; ++i) obj1['z' + i] = {};" 1623 "for (var i = 0; i < 100; ++i) obj1['z' + i] = {};"
1624 "obj1.__defineGetter__('propWithGetter', function Y() {\n" 1624 "obj1.__defineGetter__('propWithGetter', function Y() {\n"
1625 " return 42;\n" 1625 " return 42;\n"
1626 "});\n" 1626 "});\n"
1627 "obj1.__defineSetter__('propWithSetter', function Z(value) {\n" 1627 "obj1.__defineSetter__('propWithSetter', function Z(value) {\n"
1628 " return this.value_ = value;\n" 1628 " return this.value_ = value;\n"
1629 "});\n"); 1629 "});\n");
1630 const v8::HeapSnapshot* snapshot = 1630 const v8::HeapSnapshot* snapshot =
1631 heap_profiler->TakeHeapSnapshot(v8_str("slowCaseAccessors")); 1631 heap_profiler->TakeHeapSnapshot(v8_str("slowCaseAccessors"));
1632 CHECK(ValidateSnapshot(snapshot, 3)); 1632 CHECK(ValidateSnapshot(snapshot));
1633 1633
1634 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 1634 const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
1635 CHECK_NE(NULL, global); 1635 CHECK_NE(NULL, global);
1636 const v8::HeapGraphNode* obj1 = 1636 const v8::HeapGraphNode* obj1 =
1637 GetProperty(global, v8::HeapGraphEdge::kProperty, "obj1"); 1637 GetProperty(global, v8::HeapGraphEdge::kProperty, "obj1");
1638 CHECK_NE(NULL, obj1); 1638 CHECK_NE(NULL, obj1);
1639 const v8::HeapGraphNode* func; 1639 const v8::HeapGraphNode* func;
1640 func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "get propWithGetter"); 1640 func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "get propWithGetter");
1641 CHECK_NE(NULL, func); 1641 CHECK_NE(NULL, func);
1642 func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "set propWithGetter"); 1642 func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "set propWithGetter");
1643 CHECK_EQ(NULL, func); 1643 CHECK_EQ(NULL, func);
1644 func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "set propWithSetter"); 1644 func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "set propWithSetter");
1645 CHECK_NE(NULL, func); 1645 CHECK_NE(NULL, func);
1646 func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "get propWithSetter"); 1646 func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "get propWithSetter");
1647 CHECK_EQ(NULL, func); 1647 CHECK_EQ(NULL, func);
1648 } 1648 }
1649 1649
1650 1650
1651 TEST(HiddenPropertiesFastCase) { 1651 TEST(HiddenPropertiesFastCase) {
1652 LocalContext env; 1652 LocalContext env;
1653 v8::HandleScope scope(env->GetIsolate()); 1653 v8::HandleScope scope(env->GetIsolate());
1654 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1654 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
1655 1655
1656 CompileRun( 1656 CompileRun(
1657 "function C(x) { this.a = this; this.b = x; }\n" 1657 "function C(x) { this.a = this; this.b = x; }\n"
1658 "c = new C(2012);\n"); 1658 "c = new C(2012);\n");
1659 const v8::HeapSnapshot* snapshot = 1659 const v8::HeapSnapshot* snapshot =
1660 heap_profiler->TakeHeapSnapshot(v8_str("HiddenPropertiesFastCase1")); 1660 heap_profiler->TakeHeapSnapshot(v8_str("HiddenPropertiesFastCase1"));
1661 CHECK(ValidateSnapshot(snapshot, 3)); 1661 CHECK(ValidateSnapshot(snapshot));
1662 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 1662 const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
1663 const v8::HeapGraphNode* c = 1663 const v8::HeapGraphNode* c =
1664 GetProperty(global, v8::HeapGraphEdge::kProperty, "c"); 1664 GetProperty(global, v8::HeapGraphEdge::kProperty, "c");
1665 CHECK_NE(NULL, c); 1665 CHECK_NE(NULL, c);
1666 const v8::HeapGraphNode* hidden_props = 1666 const v8::HeapGraphNode* hidden_props =
1667 GetProperty(c, v8::HeapGraphEdge::kInternal, "hidden_properties"); 1667 GetProperty(c, v8::HeapGraphEdge::kInternal, "hidden_properties");
1668 CHECK_EQ(NULL, hidden_props); 1668 CHECK_EQ(NULL, hidden_props);
1669 1669
1670 v8::Handle<v8::Value> cHandle = env->Global()->Get(v8::String::New("c")); 1670 v8::Handle<v8::Value> cHandle = env->Global()->Get(v8::String::New("c"));
1671 CHECK(!cHandle.IsEmpty() && cHandle->IsObject()); 1671 CHECK(!cHandle.IsEmpty() && cHandle->IsObject());
1672 cHandle->ToObject()->SetHiddenValue(v8_str("key"), v8_str("val")); 1672 cHandle->ToObject()->SetHiddenValue(v8_str("key"), v8_str("val"));
1673 1673
1674 snapshot = heap_profiler->TakeHeapSnapshot( 1674 snapshot = heap_profiler->TakeHeapSnapshot(
1675 v8_str("HiddenPropertiesFastCase2")); 1675 v8_str("HiddenPropertiesFastCase2"));
1676 CHECK(ValidateSnapshot(snapshot, 3)); 1676 CHECK(ValidateSnapshot(snapshot));
1677 global = GetGlobalObject(snapshot); 1677 global = GetGlobalObject(snapshot);
1678 c = GetProperty(global, v8::HeapGraphEdge::kProperty, "c"); 1678 c = GetProperty(global, v8::HeapGraphEdge::kProperty, "c");
1679 CHECK_NE(NULL, c); 1679 CHECK_NE(NULL, c);
1680 hidden_props = GetProperty(c, v8::HeapGraphEdge::kInternal, 1680 hidden_props = GetProperty(c, v8::HeapGraphEdge::kInternal,
1681 "hidden_properties"); 1681 "hidden_properties");
1682 CHECK_NE(NULL, hidden_props); 1682 CHECK_NE(NULL, hidden_props);
1683 } 1683 }
1684 1684
1685 1685
1686 bool HasWeakEdge(const v8::HeapGraphNode* node) { 1686 bool HasWeakEdge(const v8::HeapGraphNode* node) {
1687 for (int i = 0; i < node->GetChildrenCount(); ++i) { 1687 for (int i = 0; i < node->GetChildrenCount(); ++i) {
1688 const v8::HeapGraphEdge* handle_edge = node->GetChild(i); 1688 const v8::HeapGraphEdge* handle_edge = node->GetChild(i);
1689 if (handle_edge->GetType() == v8::HeapGraphEdge::kWeak) return true; 1689 if (handle_edge->GetType() == v8::HeapGraphEdge::kWeak) return true;
1690 } 1690 }
1691 return false; 1691 return false;
1692 } 1692 }
1693 1693
1694 1694
1695 bool HasWeakGlobalHandle() { 1695 bool HasWeakGlobalHandle() {
1696 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 1696 v8::Isolate* isolate = v8::Isolate::GetCurrent();
1697 v8::HeapProfiler* heap_profiler = isolate->GetHeapProfiler(); 1697 v8::HeapProfiler* heap_profiler = isolate->GetHeapProfiler();
1698 const v8::HeapSnapshot* snapshot = 1698 const v8::HeapSnapshot* snapshot =
1699 heap_profiler->TakeHeapSnapshot(v8_str("weaks")); 1699 heap_profiler->TakeHeapSnapshot(v8_str("weaks"));
1700 CHECK(ValidateSnapshot(snapshot, 3)); 1700 CHECK(ValidateSnapshot(snapshot));
1701 const v8::HeapGraphNode* gc_roots = GetNode( 1701 const v8::HeapGraphNode* gc_roots = GetNode(
1702 snapshot->GetRoot(), v8::HeapGraphNode::kSynthetic, "(GC roots)"); 1702 snapshot->GetRoot(), v8::HeapGraphNode::kSynthetic, "(GC roots)");
1703 CHECK_NE(NULL, gc_roots); 1703 CHECK_NE(NULL, gc_roots);
1704 const v8::HeapGraphNode* global_handles = GetNode( 1704 const v8::HeapGraphNode* global_handles = GetNode(
1705 gc_roots, v8::HeapGraphNode::kSynthetic, "(Global handles)"); 1705 gc_roots, v8::HeapGraphNode::kSynthetic, "(Global handles)");
1706 CHECK_NE(NULL, global_handles); 1706 CHECK_NE(NULL, global_handles);
1707 return HasWeakEdge(global_handles); 1707 return HasWeakEdge(global_handles);
1708 } 1708 }
1709 1709
1710 1710
(...skipping 17 matching lines...) Expand all
1728 } 1728 }
1729 1729
1730 1730
1731 TEST(WeakNativeContextRefs) { 1731 TEST(WeakNativeContextRefs) {
1732 LocalContext env; 1732 LocalContext env;
1733 v8::HandleScope scope(env->GetIsolate()); 1733 v8::HandleScope scope(env->GetIsolate());
1734 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1734 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
1735 1735
1736 const v8::HeapSnapshot* snapshot = 1736 const v8::HeapSnapshot* snapshot =
1737 heap_profiler->TakeHeapSnapshot(v8_str("weaks")); 1737 heap_profiler->TakeHeapSnapshot(v8_str("weaks"));
1738 CHECK(ValidateSnapshot(snapshot, 3)); 1738 CHECK(ValidateSnapshot(snapshot));
1739 const v8::HeapGraphNode* gc_roots = GetNode( 1739 const v8::HeapGraphNode* gc_roots = GetNode(
1740 snapshot->GetRoot(), v8::HeapGraphNode::kSynthetic, "(GC roots)"); 1740 snapshot->GetRoot(), v8::HeapGraphNode::kSynthetic, "(GC roots)");
1741 CHECK_NE(NULL, gc_roots); 1741 CHECK_NE(NULL, gc_roots);
1742 const v8::HeapGraphNode* global_handles = GetNode( 1742 const v8::HeapGraphNode* global_handles = GetNode(
1743 gc_roots, v8::HeapGraphNode::kSynthetic, "(Global handles)"); 1743 gc_roots, v8::HeapGraphNode::kSynthetic, "(Global handles)");
1744 CHECK_NE(NULL, global_handles); 1744 CHECK_NE(NULL, global_handles);
1745 const v8::HeapGraphNode* native_context = GetNode( 1745 const v8::HeapGraphNode* native_context = GetNode(
1746 global_handles, v8::HeapGraphNode::kHidden, "system / NativeContext"); 1746 global_handles, v8::HeapGraphNode::kHidden, "system / NativeContext");
1747 CHECK_NE(NULL, native_context); 1747 CHECK_NE(NULL, native_context);
1748 CHECK(HasWeakEdge(native_context)); 1748 CHECK(HasWeakEdge(native_context));
1749 } 1749 }
1750 1750
1751 1751
1752 TEST(SfiAndJsFunctionWeakRefs) { 1752 TEST(SfiAndJsFunctionWeakRefs) {
1753 LocalContext env; 1753 LocalContext env;
1754 v8::HandleScope scope(env->GetIsolate()); 1754 v8::HandleScope scope(env->GetIsolate());
1755 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1755 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
1756 1756
1757 CompileRun( 1757 CompileRun(
1758 "fun = (function (x) { return function () { return x + 1; } })(1);"); 1758 "fun = (function (x) { return function () { return x + 1; } })(1);");
1759 const v8::HeapSnapshot* snapshot = 1759 const v8::HeapSnapshot* snapshot =
1760 heap_profiler->TakeHeapSnapshot(v8_str("fun")); 1760 heap_profiler->TakeHeapSnapshot(v8_str("fun"));
1761 CHECK(ValidateSnapshot(snapshot, 3)); 1761 CHECK(ValidateSnapshot(snapshot));
1762 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 1762 const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
1763 CHECK_NE(NULL, global); 1763 CHECK_NE(NULL, global);
1764 const v8::HeapGraphNode* fun = 1764 const v8::HeapGraphNode* fun =
1765 GetProperty(global, v8::HeapGraphEdge::kProperty, "fun"); 1765 GetProperty(global, v8::HeapGraphEdge::kProperty, "fun");
1766 CHECK(HasWeakEdge(fun)); 1766 CHECK(HasWeakEdge(fun));
1767 const v8::HeapGraphNode* shared = 1767 const v8::HeapGraphNode* shared =
1768 GetProperty(fun, v8::HeapGraphEdge::kInternal, "shared"); 1768 GetProperty(fun, v8::HeapGraphEdge::kInternal, "shared");
1769 CHECK(HasWeakEdge(shared)); 1769 CHECK(HasWeakEdge(shared));
1770 } 1770 }
1771 1771
1772 1772
1773 #ifdef ENABLE_DEBUGGER_SUPPORT 1773 #ifdef ENABLE_DEBUGGER_SUPPORT
1774 TEST(NoDebugObjectInSnapshot) { 1774 TEST(NoDebugObjectInSnapshot) {
1775 LocalContext env; 1775 LocalContext env;
1776 v8::HandleScope scope(env->GetIsolate()); 1776 v8::HandleScope scope(env->GetIsolate());
1777 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1777 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
1778 1778
1779 v8::internal::Isolate::Current()->debug()->Load(); 1779 v8::internal::Isolate::Current()->debug()->Load();
1780 CompileRun("foo = {};"); 1780 CompileRun("foo = {};");
1781 const v8::HeapSnapshot* snapshot = 1781 const v8::HeapSnapshot* snapshot =
1782 heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); 1782 heap_profiler->TakeHeapSnapshot(v8_str("snapshot"));
1783 CHECK(ValidateSnapshot(snapshot, 3)); 1783 CHECK(ValidateSnapshot(snapshot));
1784 const v8::HeapGraphNode* root = snapshot->GetRoot(); 1784 const v8::HeapGraphNode* root = snapshot->GetRoot();
1785 int globals_count = 0; 1785 int globals_count = 0;
1786 for (int i = 0; i < root->GetChildrenCount(); ++i) { 1786 for (int i = 0; i < root->GetChildrenCount(); ++i) {
1787 const v8::HeapGraphEdge* edge = root->GetChild(i); 1787 const v8::HeapGraphEdge* edge = root->GetChild(i);
1788 if (edge->GetType() == v8::HeapGraphEdge::kShortcut) { 1788 if (edge->GetType() == v8::HeapGraphEdge::kShortcut) {
1789 ++globals_count; 1789 ++globals_count;
1790 const v8::HeapGraphNode* global = edge->GetToNode(); 1790 const v8::HeapGraphNode* global = edge->GetToNode();
1791 const v8::HeapGraphNode* foo = 1791 const v8::HeapGraphNode* foo =
1792 GetProperty(global, v8::HeapGraphEdge::kProperty, "foo"); 1792 GetProperty(global, v8::HeapGraphEdge::kProperty, "foo");
1793 CHECK_NE(NULL, foo); 1793 CHECK_NE(NULL, foo);
1794 } 1794 }
1795 } 1795 }
1796 CHECK_EQ(1, globals_count); 1796 CHECK_EQ(1, globals_count);
1797 } 1797 }
1798 #endif // ENABLE_DEBUGGER_SUPPORT 1798 #endif // ENABLE_DEBUGGER_SUPPORT
1799 1799
1800 1800
1801 TEST(AllStrongGcRootsHaveNames) { 1801 TEST(AllStrongGcRootsHaveNames) {
1802 LocalContext env; 1802 LocalContext env;
1803 v8::HandleScope scope(env->GetIsolate()); 1803 v8::HandleScope scope(env->GetIsolate());
1804 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1804 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
1805 1805
1806 CompileRun("foo = {};"); 1806 CompileRun("foo = {};");
1807 const v8::HeapSnapshot* snapshot = 1807 const v8::HeapSnapshot* snapshot =
1808 heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); 1808 heap_profiler->TakeHeapSnapshot(v8_str("snapshot"));
1809 CHECK(ValidateSnapshot(snapshot, 3)); 1809 CHECK(ValidateSnapshot(snapshot));
1810 const v8::HeapGraphNode* gc_roots = GetNode( 1810 const v8::HeapGraphNode* gc_roots = GetNode(
1811 snapshot->GetRoot(), v8::HeapGraphNode::kSynthetic, "(GC roots)"); 1811 snapshot->GetRoot(), v8::HeapGraphNode::kSynthetic, "(GC roots)");
1812 CHECK_NE(NULL, gc_roots); 1812 CHECK_NE(NULL, gc_roots);
1813 const v8::HeapGraphNode* strong_roots = GetNode( 1813 const v8::HeapGraphNode* strong_roots = GetNode(
1814 gc_roots, v8::HeapGraphNode::kSynthetic, "(Strong roots)"); 1814 gc_roots, v8::HeapGraphNode::kSynthetic, "(Strong roots)");
1815 CHECK_NE(NULL, strong_roots); 1815 CHECK_NE(NULL, strong_roots);
1816 for (int i = 0; i < strong_roots->GetChildrenCount(); ++i) { 1816 for (int i = 0; i < strong_roots->GetChildrenCount(); ++i) {
1817 const v8::HeapGraphEdge* edge = strong_roots->GetChild(i); 1817 const v8::HeapGraphEdge* edge = strong_roots->GetChild(i);
1818 CHECK_EQ(v8::HeapGraphEdge::kInternal, edge->GetType()); 1818 CHECK_EQ(v8::HeapGraphEdge::kInternal, edge->GetType());
1819 v8::String::Utf8Value name(edge->GetName()); 1819 v8::String::Utf8Value name(edge->GetName());
1820 CHECK(isalpha(**name)); 1820 CHECK(isalpha(**name));
1821 } 1821 }
1822 } 1822 }
1823 1823
1824 1824
1825 TEST(NoRefsToNonEssentialEntries) { 1825 TEST(NoRefsToNonEssentialEntries) {
1826 LocalContext env; 1826 LocalContext env;
1827 v8::HandleScope scope(env->GetIsolate()); 1827 v8::HandleScope scope(env->GetIsolate());
1828 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1828 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
1829 CompileRun("global_object = {};\n"); 1829 CompileRun("global_object = {};\n");
1830 const v8::HeapSnapshot* snapshot = 1830 const v8::HeapSnapshot* snapshot =
1831 heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); 1831 heap_profiler->TakeHeapSnapshot(v8_str("snapshot"));
1832 CHECK(ValidateSnapshot(snapshot, 3)); 1832 CHECK(ValidateSnapshot(snapshot));
1833 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 1833 const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
1834 const v8::HeapGraphNode* global_object = 1834 const v8::HeapGraphNode* global_object =
1835 GetProperty(global, v8::HeapGraphEdge::kProperty, "global_object"); 1835 GetProperty(global, v8::HeapGraphEdge::kProperty, "global_object");
1836 CHECK_NE(NULL, global_object); 1836 CHECK_NE(NULL, global_object);
1837 const v8::HeapGraphNode* properties = 1837 const v8::HeapGraphNode* properties =
1838 GetProperty(global_object, v8::HeapGraphEdge::kInternal, "properties"); 1838 GetProperty(global_object, v8::HeapGraphEdge::kInternal, "properties");
1839 CHECK_EQ(NULL, properties); 1839 CHECK_EQ(NULL, properties);
1840 const v8::HeapGraphNode* elements = 1840 const v8::HeapGraphNode* elements =
1841 GetProperty(global_object, v8::HeapGraphEdge::kInternal, "elements"); 1841 GetProperty(global_object, v8::HeapGraphEdge::kInternal, "elements");
1842 CHECK_EQ(NULL, elements); 1842 CHECK_EQ(NULL, elements);
1843 } 1843 }
1844 1844
1845 1845
1846 TEST(MapHasDescriptorsAndTransitions) { 1846 TEST(MapHasDescriptorsAndTransitions) {
1847 LocalContext env; 1847 LocalContext env;
1848 v8::HandleScope scope(env->GetIsolate()); 1848 v8::HandleScope scope(env->GetIsolate());
1849 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1849 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
1850 CompileRun("obj = { a: 10 };\n"); 1850 CompileRun("obj = { a: 10 };\n");
1851 const v8::HeapSnapshot* snapshot = 1851 const v8::HeapSnapshot* snapshot =
1852 heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); 1852 heap_profiler->TakeHeapSnapshot(v8_str("snapshot"));
1853 CHECK(ValidateSnapshot(snapshot, 3)); 1853 CHECK(ValidateSnapshot(snapshot));
1854 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 1854 const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
1855 const v8::HeapGraphNode* global_object = 1855 const v8::HeapGraphNode* global_object =
1856 GetProperty(global, v8::HeapGraphEdge::kProperty, "obj"); 1856 GetProperty(global, v8::HeapGraphEdge::kProperty, "obj");
1857 CHECK_NE(NULL, global_object); 1857 CHECK_NE(NULL, global_object);
1858 1858
1859 const v8::HeapGraphNode* map = 1859 const v8::HeapGraphNode* map =
1860 GetProperty(global_object, v8::HeapGraphEdge::kInternal, "map"); 1860 GetProperty(global_object, v8::HeapGraphEdge::kInternal, "map");
1861 CHECK_NE(NULL, map); 1861 CHECK_NE(NULL, map);
1862 const v8::HeapGraphNode* own_descriptors = GetProperty( 1862 const v8::HeapGraphNode* own_descriptors = GetProperty(
1863 map, v8::HeapGraphEdge::kInternal, "descriptors"); 1863 map, v8::HeapGraphEdge::kInternal, "descriptors");
(...skipping 18 matching lines...) Expand all
1882 " if (i > 0)" 1882 " if (i > 0)"
1883 " f += 'f_' + (i - 1) + '();';" 1883 " f += 'f_' + (i - 1) + '();';"
1884 " f += ' }';" 1884 " f += ' }';"
1885 " result.push(f);" 1885 " result.push(f);"
1886 "}" 1886 "}"
1887 "result.push('return f_' + (n - 1) + ';');" 1887 "result.push('return f_' + (n - 1) + ';');"
1888 "result.push('})()');" 1888 "result.push('})()');"
1889 "var ok = eval(result.join('\\n'));"); 1889 "var ok = eval(result.join('\\n'));");
1890 const v8::HeapSnapshot* snapshot = 1890 const v8::HeapSnapshot* snapshot =
1891 heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); 1891 heap_profiler->TakeHeapSnapshot(v8_str("snapshot"));
1892 CHECK(ValidateSnapshot(snapshot, 3)); 1892 CHECK(ValidateSnapshot(snapshot));
1893 1893
1894 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 1894 const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
1895 CHECK_NE(NULL, global); 1895 CHECK_NE(NULL, global);
1896 const v8::HeapGraphNode* ok_object = 1896 const v8::HeapGraphNode* ok_object =
1897 GetProperty(global, v8::HeapGraphEdge::kProperty, "ok"); 1897 GetProperty(global, v8::HeapGraphEdge::kProperty, "ok");
1898 CHECK_NE(NULL, ok_object); 1898 CHECK_NE(NULL, ok_object);
1899 const v8::HeapGraphNode* context_object = 1899 const v8::HeapGraphNode* context_object =
1900 GetProperty(ok_object, v8::HeapGraphEdge::kInternal, "context"); 1900 GetProperty(ok_object, v8::HeapGraphEdge::kInternal, "context");
1901 CHECK_NE(NULL, context_object); 1901 CHECK_NE(NULL, context_object);
1902 // Check the objects are not duplicated in the context. 1902 // Check the objects are not duplicated in the context.
(...skipping 13 matching lines...) Expand all
1916 1916
1917 TEST(AllocationSitesAreVisible) { 1917 TEST(AllocationSitesAreVisible) {
1918 LocalContext env; 1918 LocalContext env;
1919 v8::HandleScope scope(env->GetIsolate()); 1919 v8::HandleScope scope(env->GetIsolate());
1920 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); 1920 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
1921 CompileRun( 1921 CompileRun(
1922 "fun = function () { var a = [3, 2, 1]; return a; }\n" 1922 "fun = function () { var a = [3, 2, 1]; return a; }\n"
1923 "fun();"); 1923 "fun();");
1924 const v8::HeapSnapshot* snapshot = 1924 const v8::HeapSnapshot* snapshot =
1925 heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); 1925 heap_profiler->TakeHeapSnapshot(v8_str("snapshot"));
1926 CHECK(ValidateSnapshot(snapshot, 3)); 1926 CHECK(ValidateSnapshot(snapshot));
1927 1927
1928 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 1928 const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
1929 CHECK_NE(NULL, global); 1929 CHECK_NE(NULL, global);
1930 const v8::HeapGraphNode* fun_code = 1930 const v8::HeapGraphNode* fun_code =
1931 GetProperty(global, v8::HeapGraphEdge::kProperty, "fun"); 1931 GetProperty(global, v8::HeapGraphEdge::kProperty, "fun");
1932 CHECK_NE(NULL, fun_code); 1932 CHECK_NE(NULL, fun_code);
1933 const v8::HeapGraphNode* literals = 1933 const v8::HeapGraphNode* literals =
1934 GetProperty(fun_code, v8::HeapGraphEdge::kInternal, "literals"); 1934 GetProperty(fun_code, v8::HeapGraphEdge::kInternal, "literals");
1935 CHECK_NE(NULL, literals); 1935 CHECK_NE(NULL, literals);
1936 CHECK_EQ(v8::HeapGraphNode::kArray, literals->GetType()); 1936 CHECK_EQ(v8::HeapGraphNode::kArray, literals->GetType());
(...skipping 19 matching lines...) Expand all
1956 1956
1957 CHECK(transition_info->GetHeapValue()->IsArray()); 1957 CHECK(transition_info->GetHeapValue()->IsArray());
1958 v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast( 1958 v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(
1959 transition_info->GetHeapValue()); 1959 transition_info->GetHeapValue());
1960 // Verify the array is "a" in the code above. 1960 // Verify the array is "a" in the code above.
1961 CHECK_EQ(3, array->Length()); 1961 CHECK_EQ(3, array->Length());
1962 CHECK_EQ(v8::Integer::New(3), array->Get(v8::Integer::New(0))); 1962 CHECK_EQ(v8::Integer::New(3), array->Get(v8::Integer::New(0)));
1963 CHECK_EQ(v8::Integer::New(2), array->Get(v8::Integer::New(1))); 1963 CHECK_EQ(v8::Integer::New(2), array->Get(v8::Integer::New(1)));
1964 CHECK_EQ(v8::Integer::New(1), array->Get(v8::Integer::New(2))); 1964 CHECK_EQ(v8::Integer::New(1), array->Get(v8::Integer::New(2)));
1965 } 1965 }
1966
1967
1968 TEST(JSFunctionHasCodeLink) {
1969 LocalContext env;
1970 v8::HandleScope scope(env->GetIsolate());
1971 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
1972 CompileRun("function foo(x, y) { return x + y; }\n");
1973 const v8::HeapSnapshot* snapshot =
1974 heap_profiler->TakeHeapSnapshot(v8_str("snapshot"));
1975 CHECK(ValidateSnapshot(snapshot));
1976 const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
1977 const v8::HeapGraphNode* foo_func =
1978 GetProperty(global, v8::HeapGraphEdge::kProperty, "foo");
1979 CHECK_NE(NULL, foo_func);
1980 const v8::HeapGraphNode* code =
1981 GetProperty(foo_func, v8::HeapGraphEdge::kInternal, "code");
1982 CHECK_NE(NULL, code);
1983 }
OLDNEW
« no previous file with comments | « src/heap-snapshot-generator.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698