| OLD | NEW |
| 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 2293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2304 heap_profiler->TakeHeapSnapshot(v8_str("CheckCodeNames")); | 2304 heap_profiler->TakeHeapSnapshot(v8_str("CheckCodeNames")); |
| 2305 CHECK(ValidateSnapshot(snapshot)); | 2305 CHECK(ValidateSnapshot(snapshot)); |
| 2306 | 2306 |
| 2307 const char* stub_path[] = { | 2307 const char* stub_path[] = { |
| 2308 "::(GC roots)", | 2308 "::(GC roots)", |
| 2309 "::(Strong roots)", | 2309 "::(Strong roots)", |
| 2310 "code_stubs::", | 2310 "code_stubs::", |
| 2311 "::(ArraySingleArgumentConstructorStub code)" | 2311 "::(ArraySingleArgumentConstructorStub code)" |
| 2312 }; | 2312 }; |
| 2313 const v8::HeapGraphNode* node = GetNodeByPath(snapshot, | 2313 const v8::HeapGraphNode* node = GetNodeByPath(snapshot, |
| 2314 stub_path, ARRAY_SIZE(stub_path)); | 2314 stub_path, arraysize(stub_path)); |
| 2315 CHECK_NE(NULL, node); | 2315 CHECK_NE(NULL, node); |
| 2316 | 2316 |
| 2317 const char* builtin_path1[] = { | 2317 const char* builtin_path1[] = { |
| 2318 "::(GC roots)", | 2318 "::(GC roots)", |
| 2319 "::(Builtins)", | 2319 "::(Builtins)", |
| 2320 "::(KeyedLoadIC_Generic builtin)" | 2320 "::(KeyedLoadIC_Generic builtin)" |
| 2321 }; | 2321 }; |
| 2322 node = GetNodeByPath(snapshot, builtin_path1, ARRAY_SIZE(builtin_path1)); | 2322 node = GetNodeByPath(snapshot, builtin_path1, arraysize(builtin_path1)); |
| 2323 CHECK_NE(NULL, node); | 2323 CHECK_NE(NULL, node); |
| 2324 | 2324 |
| 2325 const char* builtin_path2[] = { | 2325 const char* builtin_path2[] = { |
| 2326 "::(GC roots)", | 2326 "::(GC roots)", |
| 2327 "::(Builtins)", | 2327 "::(Builtins)", |
| 2328 "::(CompileUnoptimized builtin)" | 2328 "::(CompileUnoptimized builtin)" |
| 2329 }; | 2329 }; |
| 2330 node = GetNodeByPath(snapshot, builtin_path2, ARRAY_SIZE(builtin_path2)); | 2330 node = GetNodeByPath(snapshot, builtin_path2, arraysize(builtin_path2)); |
| 2331 CHECK_NE(NULL, node); | 2331 CHECK_NE(NULL, node); |
| 2332 v8::String::Utf8Value node_name(node->GetName()); | 2332 v8::String::Utf8Value node_name(node->GetName()); |
| 2333 CHECK_EQ("(CompileUnoptimized builtin)", *node_name); | 2333 CHECK_EQ("(CompileUnoptimized builtin)", *node_name); |
| 2334 } | 2334 } |
| 2335 | 2335 |
| 2336 | 2336 |
| 2337 static const char* record_trace_tree_source = | 2337 static const char* record_trace_tree_source = |
| 2338 "var topFunctions = [];\n" | 2338 "var topFunctions = [];\n" |
| 2339 "var global = this;\n" | 2339 "var global = this;\n" |
| 2340 "function generateFunctions(width, depth) {\n" | 2340 "function generateFunctions(width, depth) {\n" |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2413 const char* names[] = {""}; | 2413 const char* names[] = {""}; |
| 2414 AllocationTracker* tracker = | 2414 AllocationTracker* tracker = |
| 2415 reinterpret_cast<i::HeapProfiler*>(heap_profiler)->allocation_tracker(); | 2415 reinterpret_cast<i::HeapProfiler*>(heap_profiler)->allocation_tracker(); |
| 2416 CHECK_NE(NULL, tracker); | 2416 CHECK_NE(NULL, tracker); |
| 2417 // Resolve all function locations. | 2417 // Resolve all function locations. |
| 2418 tracker->PrepareForSerialization(); | 2418 tracker->PrepareForSerialization(); |
| 2419 // Print for better diagnostics in case of failure. | 2419 // Print for better diagnostics in case of failure. |
| 2420 tracker->trace_tree()->Print(tracker); | 2420 tracker->trace_tree()->Print(tracker); |
| 2421 | 2421 |
| 2422 AllocationTraceNode* node = | 2422 AllocationTraceNode* node = |
| 2423 FindNode(tracker, Vector<const char*>(names, ARRAY_SIZE(names))); | 2423 FindNode(tracker, Vector<const char*>(names, arraysize(names))); |
| 2424 CHECK_NE(NULL, node); | 2424 CHECK_NE(NULL, node); |
| 2425 CHECK_GE(node->allocation_count(), 2); | 2425 CHECK_GE(node->allocation_count(), 2); |
| 2426 CHECK_GE(node->allocation_size(), 4 * 5); | 2426 CHECK_GE(node->allocation_size(), 4 * 5); |
| 2427 heap_profiler->StopTrackingHeapObjects(); | 2427 heap_profiler->StopTrackingHeapObjects(); |
| 2428 } | 2428 } |
| 2429 | 2429 |
| 2430 | 2430 |
| 2431 TEST(TrackHeapAllocations) { | 2431 TEST(TrackHeapAllocations) { |
| 2432 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 2432 v8::HandleScope scope(v8::Isolate::GetCurrent()); |
| 2433 LocalContext env; | 2433 LocalContext env; |
| 2434 | 2434 |
| 2435 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); | 2435 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); |
| 2436 heap_profiler->StartTrackingHeapObjects(true); | 2436 heap_profiler->StartTrackingHeapObjects(true); |
| 2437 | 2437 |
| 2438 CompileRun(record_trace_tree_source); | 2438 CompileRun(record_trace_tree_source); |
| 2439 | 2439 |
| 2440 AllocationTracker* tracker = | 2440 AllocationTracker* tracker = |
| 2441 reinterpret_cast<i::HeapProfiler*>(heap_profiler)->allocation_tracker(); | 2441 reinterpret_cast<i::HeapProfiler*>(heap_profiler)->allocation_tracker(); |
| 2442 CHECK_NE(NULL, tracker); | 2442 CHECK_NE(NULL, tracker); |
| 2443 // Resolve all function locations. | 2443 // Resolve all function locations. |
| 2444 tracker->PrepareForSerialization(); | 2444 tracker->PrepareForSerialization(); |
| 2445 // Print for better diagnostics in case of failure. | 2445 // Print for better diagnostics in case of failure. |
| 2446 tracker->trace_tree()->Print(tracker); | 2446 tracker->trace_tree()->Print(tracker); |
| 2447 | 2447 |
| 2448 const char* names[] = {"", "start", "f_0_0", "f_0_1", "f_0_2"}; | 2448 const char* names[] = {"", "start", "f_0_0", "f_0_1", "f_0_2"}; |
| 2449 AllocationTraceNode* node = | 2449 AllocationTraceNode* node = |
| 2450 FindNode(tracker, Vector<const char*>(names, ARRAY_SIZE(names))); | 2450 FindNode(tracker, Vector<const char*>(names, arraysize(names))); |
| 2451 CHECK_NE(NULL, node); | 2451 CHECK_NE(NULL, node); |
| 2452 CHECK_GE(node->allocation_count(), 100); | 2452 CHECK_GE(node->allocation_count(), 100); |
| 2453 CHECK_GE(node->allocation_size(), 4 * node->allocation_count()); | 2453 CHECK_GE(node->allocation_size(), 4 * node->allocation_count()); |
| 2454 heap_profiler->StopTrackingHeapObjects(); | 2454 heap_profiler->StopTrackingHeapObjects(); |
| 2455 } | 2455 } |
| 2456 | 2456 |
| 2457 | 2457 |
| 2458 static const char* inline_heap_allocation_source = | 2458 static const char* inline_heap_allocation_source = |
| 2459 "function f_0(x) {\n" | 2459 "function f_0(x) {\n" |
| 2460 " return f_1(x+1);\n" | 2460 " return f_1(x+1);\n" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 2489 | 2489 |
| 2490 AllocationTracker* tracker = | 2490 AllocationTracker* tracker = |
| 2491 reinterpret_cast<i::HeapProfiler*>(heap_profiler)->allocation_tracker(); | 2491 reinterpret_cast<i::HeapProfiler*>(heap_profiler)->allocation_tracker(); |
| 2492 CHECK_NE(NULL, tracker); | 2492 CHECK_NE(NULL, tracker); |
| 2493 // Resolve all function locations. | 2493 // Resolve all function locations. |
| 2494 tracker->PrepareForSerialization(); | 2494 tracker->PrepareForSerialization(); |
| 2495 // Print for better diagnostics in case of failure. | 2495 // Print for better diagnostics in case of failure. |
| 2496 tracker->trace_tree()->Print(tracker); | 2496 tracker->trace_tree()->Print(tracker); |
| 2497 | 2497 |
| 2498 AllocationTraceNode* node = | 2498 AllocationTraceNode* node = |
| 2499 FindNode(tracker, Vector<const char*>(names, ARRAY_SIZE(names))); | 2499 FindNode(tracker, Vector<const char*>(names, arraysize(names))); |
| 2500 CHECK_NE(NULL, node); | 2500 CHECK_NE(NULL, node); |
| 2501 CHECK_GE(node->allocation_count(), 100); | 2501 CHECK_GE(node->allocation_count(), 100); |
| 2502 CHECK_GE(node->allocation_size(), 4 * node->allocation_count()); | 2502 CHECK_GE(node->allocation_size(), 4 * node->allocation_count()); |
| 2503 heap_profiler->StopTrackingHeapObjects(); | 2503 heap_profiler->StopTrackingHeapObjects(); |
| 2504 } | 2504 } |
| 2505 | 2505 |
| 2506 { | 2506 { |
| 2507 heap_profiler->StartTrackingHeapObjects(true); | 2507 heap_profiler->StartTrackingHeapObjects(true); |
| 2508 | 2508 |
| 2509 // Now check that not all allocations are tracked if we manually reenable | 2509 // Now check that not all allocations are tracked if we manually reenable |
| 2510 // inline allocations. | 2510 // inline allocations. |
| 2511 CHECK(CcTest::heap()->inline_allocation_disabled()); | 2511 CHECK(CcTest::heap()->inline_allocation_disabled()); |
| 2512 CcTest::heap()->EnableInlineAllocation(); | 2512 CcTest::heap()->EnableInlineAllocation(); |
| 2513 | 2513 |
| 2514 CompileRun(inline_heap_allocation_source); | 2514 CompileRun(inline_heap_allocation_source); |
| 2515 | 2515 |
| 2516 AllocationTracker* tracker = | 2516 AllocationTracker* tracker = |
| 2517 reinterpret_cast<i::HeapProfiler*>(heap_profiler)->allocation_tracker(); | 2517 reinterpret_cast<i::HeapProfiler*>(heap_profiler)->allocation_tracker(); |
| 2518 CHECK_NE(NULL, tracker); | 2518 CHECK_NE(NULL, tracker); |
| 2519 // Resolve all function locations. | 2519 // Resolve all function locations. |
| 2520 tracker->PrepareForSerialization(); | 2520 tracker->PrepareForSerialization(); |
| 2521 // Print for better diagnostics in case of failure. | 2521 // Print for better diagnostics in case of failure. |
| 2522 tracker->trace_tree()->Print(tracker); | 2522 tracker->trace_tree()->Print(tracker); |
| 2523 | 2523 |
| 2524 AllocationTraceNode* node = | 2524 AllocationTraceNode* node = |
| 2525 FindNode(tracker, Vector<const char*>(names, ARRAY_SIZE(names))); | 2525 FindNode(tracker, Vector<const char*>(names, arraysize(names))); |
| 2526 CHECK_NE(NULL, node); | 2526 CHECK_NE(NULL, node); |
| 2527 CHECK_LT(node->allocation_count(), 100); | 2527 CHECK_LT(node->allocation_count(), 100); |
| 2528 | 2528 |
| 2529 CcTest::heap()->DisableInlineAllocation(); | 2529 CcTest::heap()->DisableInlineAllocation(); |
| 2530 heap_profiler->StopTrackingHeapObjects(); | 2530 heap_profiler->StopTrackingHeapObjects(); |
| 2531 } | 2531 } |
| 2532 } | 2532 } |
| 2533 | 2533 |
| 2534 | 2534 |
| 2535 TEST(TrackV8ApiAllocation) { | 2535 TEST(TrackV8ApiAllocation) { |
| 2536 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 2536 v8::HandleScope scope(v8::Isolate::GetCurrent()); |
| 2537 LocalContext env; | 2537 LocalContext env; |
| 2538 | 2538 |
| 2539 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); | 2539 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); |
| 2540 const char* names[] = { "(V8 API)" }; | 2540 const char* names[] = { "(V8 API)" }; |
| 2541 heap_profiler->StartTrackingHeapObjects(true); | 2541 heap_profiler->StartTrackingHeapObjects(true); |
| 2542 | 2542 |
| 2543 v8::Handle<v8::Object> o1 = v8::Object::New(env->GetIsolate()); | 2543 v8::Handle<v8::Object> o1 = v8::Object::New(env->GetIsolate()); |
| 2544 o1->Clone(); | 2544 o1->Clone(); |
| 2545 | 2545 |
| 2546 AllocationTracker* tracker = | 2546 AllocationTracker* tracker = |
| 2547 reinterpret_cast<i::HeapProfiler*>(heap_profiler)->allocation_tracker(); | 2547 reinterpret_cast<i::HeapProfiler*>(heap_profiler)->allocation_tracker(); |
| 2548 CHECK_NE(NULL, tracker); | 2548 CHECK_NE(NULL, tracker); |
| 2549 // Resolve all function locations. | 2549 // Resolve all function locations. |
| 2550 tracker->PrepareForSerialization(); | 2550 tracker->PrepareForSerialization(); |
| 2551 // Print for better diagnostics in case of failure. | 2551 // Print for better diagnostics in case of failure. |
| 2552 tracker->trace_tree()->Print(tracker); | 2552 tracker->trace_tree()->Print(tracker); |
| 2553 | 2553 |
| 2554 AllocationTraceNode* node = | 2554 AllocationTraceNode* node = |
| 2555 FindNode(tracker, Vector<const char*>(names, ARRAY_SIZE(names))); | 2555 FindNode(tracker, Vector<const char*>(names, arraysize(names))); |
| 2556 CHECK_NE(NULL, node); | 2556 CHECK_NE(NULL, node); |
| 2557 CHECK_GE(node->allocation_count(), 2); | 2557 CHECK_GE(node->allocation_count(), 2); |
| 2558 CHECK_GE(node->allocation_size(), 4 * node->allocation_count()); | 2558 CHECK_GE(node->allocation_size(), 4 * node->allocation_count()); |
| 2559 heap_profiler->StopTrackingHeapObjects(); | 2559 heap_profiler->StopTrackingHeapObjects(); |
| 2560 } | 2560 } |
| 2561 | 2561 |
| 2562 | 2562 |
| 2563 TEST(ArrayBufferAndArrayBufferView) { | 2563 TEST(ArrayBufferAndArrayBufferView) { |
| 2564 LocalContext env; | 2564 LocalContext env; |
| 2565 v8::HandleScope scope(env->GetIsolate()); | 2565 v8::HandleScope scope(env->GetIsolate()); |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2760 map.AddRange(ToAddress(0x180), 0x80, 6U); | 2760 map.AddRange(ToAddress(0x180), 0x80, 6U); |
| 2761 map.AddRange(ToAddress(0x180), 0x80, 7U); | 2761 map.AddRange(ToAddress(0x180), 0x80, 7U); |
| 2762 CHECK_EQ(7, map.GetTraceNodeId(ToAddress(0x180))); | 2762 CHECK_EQ(7, map.GetTraceNodeId(ToAddress(0x180))); |
| 2763 CHECK_EQ(5, map.GetTraceNodeId(ToAddress(0x200))); | 2763 CHECK_EQ(5, map.GetTraceNodeId(ToAddress(0x200))); |
| 2764 CHECK_EQ(3, static_cast<int>(map.size())); | 2764 CHECK_EQ(3, static_cast<int>(map.size())); |
| 2765 | 2765 |
| 2766 map.Clear(); | 2766 map.Clear(); |
| 2767 CHECK_EQ(0, static_cast<int>(map.size())); | 2767 CHECK_EQ(0, static_cast<int>(map.size())); |
| 2768 CHECK_EQ(0, map.GetTraceNodeId(ToAddress(0x400))); | 2768 CHECK_EQ(0, map.GetTraceNodeId(ToAddress(0x400))); |
| 2769 } | 2769 } |
| OLD | NEW |