| 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 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 248 "function myFunction(a, b) { this.a = a; this.b = b; }\n" | 248 "function myFunction(a, b) { this.a = a; this.b = b; }\n" |
| 249 "function AAAAA() {}\n" | 249 "function AAAAA() {}\n" |
| 250 "boundFunction = myFunction.bind(new AAAAA(), 20, new Number(12)); \n"); | 250 "boundFunction = myFunction.bind(new AAAAA(), 20, new Number(12)); \n"); |
| 251 const v8::HeapSnapshot* snapshot = | 251 const v8::HeapSnapshot* snapshot = |
| 252 heap_profiler->TakeHeapSnapshot(v8_str("sizes")); | 252 heap_profiler->TakeHeapSnapshot(v8_str("sizes")); |
| 253 CHECK(ValidateSnapshot(snapshot)); | 253 CHECK(ValidateSnapshot(snapshot)); |
| 254 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); | 254 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); |
| 255 const v8::HeapGraphNode* f = | 255 const v8::HeapGraphNode* f = |
| 256 GetProperty(global, v8::HeapGraphEdge::kProperty, "boundFunction"); | 256 GetProperty(global, v8::HeapGraphEdge::kProperty, "boundFunction"); |
| 257 CHECK(f); | 257 CHECK(f); |
| 258 CHECK_EQ(v8::String::New("native_bind"), f->GetName()); | 258 CHECK_EQ(v8::String::NewFromUtf8(env->GetIsolate(), "native_bind"), |
| 259 f->GetName()); |
| 259 const v8::HeapGraphNode* bindings = | 260 const v8::HeapGraphNode* bindings = |
| 260 GetProperty(f, v8::HeapGraphEdge::kInternal, "bindings"); | 261 GetProperty(f, v8::HeapGraphEdge::kInternal, "bindings"); |
| 261 CHECK_NE(NULL, bindings); | 262 CHECK_NE(NULL, bindings); |
| 262 CHECK_EQ(v8::HeapGraphNode::kArray, bindings->GetType()); | 263 CHECK_EQ(v8::HeapGraphNode::kArray, bindings->GetType()); |
| 263 CHECK_EQ(4, bindings->GetChildrenCount()); | 264 CHECK_EQ(4, bindings->GetChildrenCount()); |
| 264 | 265 |
| 265 const v8::HeapGraphNode* bound_this = GetProperty( | 266 const v8::HeapGraphNode* bound_this = GetProperty( |
| 266 f, v8::HeapGraphEdge::kShortcut, "bound_this"); | 267 f, v8::HeapGraphEdge::kShortcut, "bound_this"); |
| 267 CHECK(bound_this); | 268 CHECK(bound_this); |
| 268 CHECK_EQ(v8::HeapGraphNode::kObject, bound_this->GetType()); | 269 CHECK_EQ(v8::HeapGraphNode::kObject, bound_this->GetType()); |
| (...skipping 807 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1076 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); | 1077 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); |
| 1077 CompileRun("globalObject = {};\n"); | 1078 CompileRun("globalObject = {};\n"); |
| 1078 const v8::HeapSnapshot* snapshot = | 1079 const v8::HeapSnapshot* snapshot = |
| 1079 heap_profiler->TakeHeapSnapshot(v8_str("get_snapshot_object_id")); | 1080 heap_profiler->TakeHeapSnapshot(v8_str("get_snapshot_object_id")); |
| 1080 CHECK(ValidateSnapshot(snapshot)); | 1081 CHECK(ValidateSnapshot(snapshot)); |
| 1081 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); | 1082 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); |
| 1082 const v8::HeapGraphNode* global_object = | 1083 const v8::HeapGraphNode* global_object = |
| 1083 GetProperty(global, v8::HeapGraphEdge::kProperty, "globalObject"); | 1084 GetProperty(global, v8::HeapGraphEdge::kProperty, "globalObject"); |
| 1084 CHECK(global_object); | 1085 CHECK(global_object); |
| 1085 | 1086 |
| 1086 v8::Local<v8::Value> globalObjectHandle = | 1087 v8::Local<v8::Value> globalObjectHandle = env->Global()->Get( |
| 1087 env->Global()->Get(v8::String::New("globalObject")); | 1088 v8::String::NewFromUtf8(env->GetIsolate(), "globalObject")); |
| 1088 CHECK(!globalObjectHandle.IsEmpty()); | 1089 CHECK(!globalObjectHandle.IsEmpty()); |
| 1089 CHECK(globalObjectHandle->IsObject()); | 1090 CHECK(globalObjectHandle->IsObject()); |
| 1090 | 1091 |
| 1091 v8::SnapshotObjectId id = heap_profiler->GetObjectId(globalObjectHandle); | 1092 v8::SnapshotObjectId id = heap_profiler->GetObjectId(globalObjectHandle); |
| 1092 CHECK_NE(static_cast<int>(v8::HeapProfiler::kUnknownObjectId), | 1093 CHECK_NE(static_cast<int>(v8::HeapProfiler::kUnknownObjectId), |
| 1093 id); | 1094 id); |
| 1094 CHECK_EQ(static_cast<int>(id), global_object->GetId()); | 1095 CHECK_EQ(static_cast<int>(id), global_object->GetId()); |
| 1095 } | 1096 } |
| 1096 | 1097 |
| 1097 | 1098 |
| (...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1712 heap_profiler->TakeHeapSnapshot(v8_str("HiddenPropertiesFastCase1")); | 1713 heap_profiler->TakeHeapSnapshot(v8_str("HiddenPropertiesFastCase1")); |
| 1713 CHECK(ValidateSnapshot(snapshot)); | 1714 CHECK(ValidateSnapshot(snapshot)); |
| 1714 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); | 1715 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); |
| 1715 const v8::HeapGraphNode* c = | 1716 const v8::HeapGraphNode* c = |
| 1716 GetProperty(global, v8::HeapGraphEdge::kProperty, "c"); | 1717 GetProperty(global, v8::HeapGraphEdge::kProperty, "c"); |
| 1717 CHECK_NE(NULL, c); | 1718 CHECK_NE(NULL, c); |
| 1718 const v8::HeapGraphNode* hidden_props = | 1719 const v8::HeapGraphNode* hidden_props = |
| 1719 GetProperty(c, v8::HeapGraphEdge::kInternal, "hidden_properties"); | 1720 GetProperty(c, v8::HeapGraphEdge::kInternal, "hidden_properties"); |
| 1720 CHECK_EQ(NULL, hidden_props); | 1721 CHECK_EQ(NULL, hidden_props); |
| 1721 | 1722 |
| 1722 v8::Handle<v8::Value> cHandle = env->Global()->Get(v8::String::New("c")); | 1723 v8::Handle<v8::Value> cHandle = |
| 1724 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "c")); |
| 1723 CHECK(!cHandle.IsEmpty() && cHandle->IsObject()); | 1725 CHECK(!cHandle.IsEmpty() && cHandle->IsObject()); |
| 1724 cHandle->ToObject()->SetHiddenValue(v8_str("key"), v8_str("val")); | 1726 cHandle->ToObject()->SetHiddenValue(v8_str("key"), v8_str("val")); |
| 1725 | 1727 |
| 1726 snapshot = heap_profiler->TakeHeapSnapshot( | 1728 snapshot = heap_profiler->TakeHeapSnapshot( |
| 1727 v8_str("HiddenPropertiesFastCase2")); | 1729 v8_str("HiddenPropertiesFastCase2")); |
| 1728 CHECK(ValidateSnapshot(snapshot)); | 1730 CHECK(ValidateSnapshot(snapshot)); |
| 1729 global = GetGlobalObject(snapshot); | 1731 global = GetGlobalObject(snapshot); |
| 1730 c = GetProperty(global, v8::HeapGraphEdge::kProperty, "c"); | 1732 c = GetProperty(global, v8::HeapGraphEdge::kProperty, "c"); |
| 1731 CHECK_NE(NULL, c); | 1733 CHECK_NE(NULL, c); |
| 1732 hidden_props = GetProperty(c, v8::HeapGraphEdge::kInternal, | 1734 hidden_props = GetProperty(c, v8::HeapGraphEdge::kInternal, |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1756 const v8::HeapGraphNode* global_handles = GetNode( | 1758 const v8::HeapGraphNode* global_handles = GetNode( |
| 1757 gc_roots, v8::HeapGraphNode::kSynthetic, "(Global handles)"); | 1759 gc_roots, v8::HeapGraphNode::kSynthetic, "(Global handles)"); |
| 1758 CHECK_NE(NULL, global_handles); | 1760 CHECK_NE(NULL, global_handles); |
| 1759 return HasWeakEdge(global_handles); | 1761 return HasWeakEdge(global_handles); |
| 1760 } | 1762 } |
| 1761 | 1763 |
| 1762 | 1764 |
| 1763 static void PersistentHandleCallback(v8::Isolate* isolate, | 1765 static void PersistentHandleCallback(v8::Isolate* isolate, |
| 1764 v8::Persistent<v8::Value>* handle, | 1766 v8::Persistent<v8::Value>* handle, |
| 1765 void*) { | 1767 void*) { |
| 1766 handle->Dispose(); | 1768 handle->Reset(); |
| 1767 } | 1769 } |
| 1768 | 1770 |
| 1769 | 1771 |
| 1770 TEST(WeakGlobalHandle) { | 1772 TEST(WeakGlobalHandle) { |
| 1771 LocalContext env; | 1773 LocalContext env; |
| 1772 v8::HandleScope scope(env->GetIsolate()); | 1774 v8::HandleScope scope(env->GetIsolate()); |
| 1773 | 1775 |
| 1774 CHECK(!HasWeakGlobalHandle()); | 1776 CHECK(!HasWeakGlobalHandle()); |
| 1775 | 1777 |
| 1776 v8::Persistent<v8::Object> handle(env->GetIsolate(), v8::Object::New()); | 1778 v8::Persistent<v8::Object> handle(env->GetIsolate(), v8::Object::New()); |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2029 | 2031 |
| 2030 const char* HeapProfilerExtension::kName = "v8/heap-profiler"; | 2032 const char* HeapProfilerExtension::kName = "v8/heap-profiler"; |
| 2031 | 2033 |
| 2032 | 2034 |
| 2033 const char* HeapProfilerExtension::kSource = | 2035 const char* HeapProfilerExtension::kSource = |
| 2034 "native function findUntrackedObjects();"; | 2036 "native function findUntrackedObjects();"; |
| 2035 | 2037 |
| 2036 | 2038 |
| 2037 v8::Handle<v8::FunctionTemplate> HeapProfilerExtension::GetNativeFunction( | 2039 v8::Handle<v8::FunctionTemplate> HeapProfilerExtension::GetNativeFunction( |
| 2038 v8::Handle<v8::String> name) { | 2040 v8::Handle<v8::String> name) { |
| 2039 if (name->Equals(v8::String::New("findUntrackedObjects"))) { | 2041 if (name->Equals(v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), |
| 2042 "findUntrackedObjects"))) { |
| 2040 return v8::FunctionTemplate::New( | 2043 return v8::FunctionTemplate::New( |
| 2041 HeapProfilerExtension::FindUntrackedObjects); | 2044 HeapProfilerExtension::FindUntrackedObjects); |
| 2042 } else { | 2045 } else { |
| 2043 CHECK(false); | 2046 CHECK(false); |
| 2044 return v8::Handle<v8::FunctionTemplate>(); | 2047 return v8::Handle<v8::FunctionTemplate>(); |
| 2045 } | 2048 } |
| 2046 } | 2049 } |
| 2047 | 2050 |
| 2048 | 2051 |
| 2049 void HeapProfilerExtension::FindUntrackedObjects( | 2052 void HeapProfilerExtension::FindUntrackedObjects( |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2205 TEST(TrackHeapAllocations) { | 2208 TEST(TrackHeapAllocations) { |
| 2206 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 2209 v8::HandleScope scope(v8::Isolate::GetCurrent()); |
| 2207 LocalContext env; | 2210 LocalContext env; |
| 2208 | 2211 |
| 2209 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); | 2212 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); |
| 2210 heap_profiler->StartRecordingHeapAllocations(); | 2213 heap_profiler->StartRecordingHeapAllocations(); |
| 2211 | 2214 |
| 2212 CompileRun(record_trace_tree_source); | 2215 CompileRun(record_trace_tree_source); |
| 2213 | 2216 |
| 2214 const v8::HeapSnapshot* snapshot = heap_profiler->TakeHeapSnapshot( | 2217 const v8::HeapSnapshot* snapshot = heap_profiler->TakeHeapSnapshot( |
| 2215 v8::String::New("Test")); | 2218 v8::String::NewFromUtf8(env->GetIsolate(), "Test")); |
| 2216 i::HeapSnapshotsCollection* collection = ToInternal(snapshot)->collection(); | 2219 i::HeapSnapshotsCollection* collection = ToInternal(snapshot)->collection(); |
| 2217 AllocationTracker* tracker = collection->allocation_tracker(); | 2220 AllocationTracker* tracker = collection->allocation_tracker(); |
| 2218 CHECK_NE(NULL, tracker); | 2221 CHECK_NE(NULL, tracker); |
| 2219 // Resolve all function locations. | 2222 // Resolve all function locations. |
| 2220 tracker->PrepareForSerialization(); | 2223 tracker->PrepareForSerialization(); |
| 2221 // Print for better diagnostics in case of failure. | 2224 // Print for better diagnostics in case of failure. |
| 2222 tracker->trace_tree()->Print(tracker); | 2225 tracker->trace_tree()->Print(tracker); |
| 2223 | 2226 |
| 2224 const char* names[] = | 2227 const char* names[] = |
| 2225 { "(anonymous function)", "start", "f_0_0", "f_0_1", "f_0_2" }; | 2228 { "(anonymous function)", "start", "f_0_0", "f_0_1", "f_0_2" }; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2258 | 2261 |
| 2259 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); | 2262 v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); |
| 2260 const char* names[] = { "(anonymous function)", "start", "f_0", "f_1" }; | 2263 const char* names[] = { "(anonymous function)", "start", "f_0", "f_1" }; |
| 2261 // First check that normally all allocations are recorded. | 2264 // First check that normally all allocations are recorded. |
| 2262 { | 2265 { |
| 2263 heap_profiler->StartRecordingHeapAllocations(); | 2266 heap_profiler->StartRecordingHeapAllocations(); |
| 2264 | 2267 |
| 2265 CompileRun(inline_heap_allocation_source); | 2268 CompileRun(inline_heap_allocation_source); |
| 2266 | 2269 |
| 2267 const v8::HeapSnapshot* snapshot = heap_profiler->TakeHeapSnapshot( | 2270 const v8::HeapSnapshot* snapshot = heap_profiler->TakeHeapSnapshot( |
| 2268 v8::String::New("Test2")); | 2271 v8::String::NewFromUtf8(env->GetIsolate(), "Test2")); |
| 2269 i::HeapSnapshotsCollection* collection = ToInternal(snapshot)->collection(); | 2272 i::HeapSnapshotsCollection* collection = ToInternal(snapshot)->collection(); |
| 2270 AllocationTracker* tracker = collection->allocation_tracker(); | 2273 AllocationTracker* tracker = collection->allocation_tracker(); |
| 2271 CHECK_NE(NULL, tracker); | 2274 CHECK_NE(NULL, tracker); |
| 2272 // Resolve all function locations. | 2275 // Resolve all function locations. |
| 2273 tracker->PrepareForSerialization(); | 2276 tracker->PrepareForSerialization(); |
| 2274 // Print for better diagnostics in case of failure. | 2277 // Print for better diagnostics in case of failure. |
| 2275 tracker->trace_tree()->Print(tracker); | 2278 tracker->trace_tree()->Print(tracker); |
| 2276 | 2279 |
| 2277 AllocationTraceNode* node = | 2280 AllocationTraceNode* node = |
| 2278 FindNode(tracker, Vector<const char*>(names, ARRAY_SIZE(names))); | 2281 FindNode(tracker, Vector<const char*>(names, ARRAY_SIZE(names))); |
| 2279 CHECK_NE(NULL, node); | 2282 CHECK_NE(NULL, node); |
| 2280 CHECK_GE(node->allocation_count(), 100); | 2283 CHECK_GE(node->allocation_count(), 100); |
| 2281 CHECK_GE(node->allocation_size(), 4 * node->allocation_count()); | 2284 CHECK_GE(node->allocation_size(), 4 * node->allocation_count()); |
| 2282 heap_profiler->StopRecordingHeapAllocations(); | 2285 heap_profiler->StopRecordingHeapAllocations(); |
| 2283 } | 2286 } |
| 2284 | 2287 |
| 2285 { | 2288 { |
| 2286 heap_profiler->StartRecordingHeapAllocations(); | 2289 heap_profiler->StartRecordingHeapAllocations(); |
| 2287 | 2290 |
| 2288 // Now check that not all allocations are tracked if we manually reenable | 2291 // Now check that not all allocations are tracked if we manually reenable |
| 2289 // inline allocations. | 2292 // inline allocations. |
| 2290 CHECK(CcTest::heap()->inline_allocation_disabled()); | 2293 CHECK(CcTest::heap()->inline_allocation_disabled()); |
| 2291 CcTest::heap()->EnableInlineAllocation(); | 2294 CcTest::heap()->EnableInlineAllocation(); |
| 2292 | 2295 |
| 2293 CompileRun(inline_heap_allocation_source); | 2296 CompileRun(inline_heap_allocation_source); |
| 2294 | 2297 |
| 2295 const v8::HeapSnapshot* snapshot = heap_profiler->TakeHeapSnapshot( | 2298 const v8::HeapSnapshot* snapshot = heap_profiler->TakeHeapSnapshot( |
| 2296 v8::String::New("Test1")); | 2299 v8::String::NewFromUtf8(env->GetIsolate(), "Test1")); |
| 2297 i::HeapSnapshotsCollection* collection = ToInternal(snapshot)->collection(); | 2300 i::HeapSnapshotsCollection* collection = ToInternal(snapshot)->collection(); |
| 2298 AllocationTracker* tracker = collection->allocation_tracker(); | 2301 AllocationTracker* tracker = collection->allocation_tracker(); |
| 2299 CHECK_NE(NULL, tracker); | 2302 CHECK_NE(NULL, tracker); |
| 2300 // Resolve all function locations. | 2303 // Resolve all function locations. |
| 2301 tracker->PrepareForSerialization(); | 2304 tracker->PrepareForSerialization(); |
| 2302 // Print for better diagnostics in case of failure. | 2305 // Print for better diagnostics in case of failure. |
| 2303 tracker->trace_tree()->Print(tracker); | 2306 tracker->trace_tree()->Print(tracker); |
| 2304 | 2307 |
| 2305 AllocationTraceNode* node = | 2308 AllocationTraceNode* node = |
| 2306 FindNode(tracker, Vector<const char*>(names, ARRAY_SIZE(names))); | 2309 FindNode(tracker, Vector<const char*>(names, ARRAY_SIZE(names))); |
| 2307 CHECK_NE(NULL, node); | 2310 CHECK_NE(NULL, node); |
| 2308 CHECK_LT(node->allocation_count(), 100); | 2311 CHECK_LT(node->allocation_count(), 100); |
| 2309 | 2312 |
| 2310 CcTest::heap()->DisableInlineAllocation(); | 2313 CcTest::heap()->DisableInlineAllocation(); |
| 2311 heap_profiler->StopRecordingHeapAllocations(); | 2314 heap_profiler->StopRecordingHeapAllocations(); |
| 2312 } | 2315 } |
| 2313 } | 2316 } |
| OLD | NEW |