diff options
author | Joyee Cheung <joyeec9h3@gmail.com> | 2018-08-03 19:43:40 +0800 |
---|---|---|
committer | Joyee Cheung <joyeec9h3@gmail.com> | 2018-08-19 00:52:41 +0800 |
commit | 54c87f37f44742588d0f8e0a778444e0890d7842 (patch) | |
tree | 36f836f637ce1f0bf787f3d141a2861b1dc75083 /deps/v8/test | |
parent | 44d04a8c01dba1d7e4a9c9d9a4415eeacc580bf4 (diff) | |
download | android-node-v8-54c87f37f44742588d0f8e0a778444e0890d7842.tar.gz android-node-v8-54c87f37f44742588d0f8e0a778444e0890d7842.tar.bz2 android-node-v8-54c87f37f44742588d0f8e0a778444e0890d7842.zip |
deps: cherry-pick 6ee8345 from upstream V8
Original commit message:
[heap-profiler] Allow embedder to specify edge names
This patch adds a variant of EmbedderGraph::AddEdge() which
allows the embedder to specify the name of an edge. The edges
added without name are element edges with auto-incremented indexes
while the edges added with names will be internal edges with
the specified names for more meaningful output in the heap
snapshot.
Refs: https://github.com/nodejs/node/pull/21741
Bug: v8:7938
Cq-Include-Trybots: luci.chromium.try:linux_chromium_rel_ng
Change-Id: I8feefa2cf6911743e24b3b2024e0e849b0c65cd3
Reviewed-on: https://chromium-review.googlesource.com/1133299
Commit-Queue: Ulan Degenbaev <ulan@chromium.org>
Reviewed-by: Ulan Degenbaev <ulan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#54412}
Refs: https://github.com/v8/v8/commit/6ee834532d6f924f6057584085fa79b4777c396a
PR-URL: https://github.com/nodejs/node/pull/22106
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'deps/v8/test')
-rw-r--r-- | deps/v8/test/cctest/test-heap-profiler.cc | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/deps/v8/test/cctest/test-heap-profiler.cc b/deps/v8/test/cctest/test-heap-profiler.cc index 70dc07d3dc..f164355bf8 100644 --- a/deps/v8/test/cctest/test-heap-profiler.cc +++ b/deps/v8/test/cctest/test-heap-profiler.cc @@ -112,6 +112,12 @@ static const char* GetName(const v8::HeapGraphNode* node) { ->name(); } +static const char* GetName(const v8::HeapGraphEdge* edge) { + return const_cast<i::HeapGraphEdge*>( + reinterpret_cast<const i::HeapGraphEdge*>(edge)) + ->name(); +} + static size_t GetSize(const v8::HeapGraphNode* node) { return const_cast<i::HeapEntry*>(reinterpret_cast<const i::HeapEntry*>(node)) ->self_size(); @@ -128,6 +134,18 @@ static const v8::HeapGraphNode* GetChildByName(const v8::HeapGraphNode* node, return nullptr; } +static const v8::HeapGraphEdge* GetEdgeByChildName( + const v8::HeapGraphNode* node, const char* name) { + for (int i = 0, count = node->GetChildrenCount(); i < count; ++i) { + const v8::HeapGraphEdge* edge = node->GetChild(i); + const v8::HeapGraphNode* child = edge->GetToNode(); + if (!strcmp(name, GetName(child))) { + return edge; + } + } + return nullptr; +} + static const v8::HeapGraphNode* GetRootChild(const v8::HeapSnapshot* snapshot, const char* name) { return GetChildByName(snapshot->GetRoot(), name); @@ -2986,6 +3004,71 @@ TEST(EmbedderGraph) { CheckEmbedderGraphSnapshot(env->GetIsolate(), snapshot); } +void BuildEmbedderGraphWithNamedEdges(v8::Isolate* v8_isolate, + v8::EmbedderGraph* graph, void* data) { + using Node = v8::EmbedderGraph::Node; + Node* global_node = graph->V8Node(*global_object_pointer); + Node* embedder_node_A = graph->AddNode( + std::unique_ptr<Node>(new EmbedderNode("EmbedderNodeA", 10))); + Node* embedder_node_B = graph->AddNode( + std::unique_ptr<Node>(new EmbedderNode("EmbedderNodeB", 20))); + Node* embedder_node_C = graph->AddNode( + std::unique_ptr<Node>(new EmbedderNode("EmbedderNodeC", 30))); + graph->AddEdge(global_node, embedder_node_A, "global_to_a"); + graph->AddEdge(embedder_node_A, embedder_node_B, "a_to_b"); + graph->AddEdge(embedder_node_B, embedder_node_C); +} + +void CheckEmbedderGraphWithNamedEdges(v8::Isolate* isolate, + const v8::HeapSnapshot* snapshot) { + const v8::HeapGraphNode* global = GetGlobalObject(snapshot); + const v8::HeapGraphEdge* global_to_a = + GetEdgeByChildName(global, "EmbedderNodeA"); + CHECK(global_to_a); + CHECK_EQ(v8::HeapGraphEdge::kInternal, global_to_a->GetType()); + CHECK(global_to_a->GetName()->IsString()); + CHECK_EQ(0, strcmp("global_to_a", GetName(global_to_a))); + const v8::HeapGraphNode* embedder_node_A = global_to_a->GetToNode(); + CHECK_EQ(0, strcmp("EmbedderNodeA", GetName(embedder_node_A))); + CHECK_EQ(10, GetSize(embedder_node_A)); + + const v8::HeapGraphEdge* a_to_b = + GetEdgeByChildName(embedder_node_A, "EmbedderNodeB"); + CHECK(a_to_b); + CHECK(a_to_b->GetName()->IsString()); + CHECK_EQ(0, strcmp("a_to_b", GetName(a_to_b))); + CHECK_EQ(v8::HeapGraphEdge::kInternal, a_to_b->GetType()); + const v8::HeapGraphNode* embedder_node_B = a_to_b->GetToNode(); + CHECK_EQ(0, strcmp("EmbedderNodeB", GetName(embedder_node_B))); + CHECK_EQ(20, GetSize(embedder_node_B)); + + const v8::HeapGraphEdge* b_to_c = + GetEdgeByChildName(embedder_node_B, "EmbedderNodeC"); + CHECK(b_to_c); + CHECK(b_to_c->GetName()->IsNumber()); + CHECK_EQ(v8::HeapGraphEdge::kElement, b_to_c->GetType()); + const v8::HeapGraphNode* embedder_node_C = b_to_c->GetToNode(); + CHECK_EQ(0, strcmp("EmbedderNodeC", GetName(embedder_node_C))); + CHECK_EQ(30, GetSize(embedder_node_C)); +} + +TEST(EmbedderGraphWithNamedEdges) { + i::FLAG_heap_profiler_use_embedder_graph = true; + LocalContext env; + v8::HandleScope scope(env->GetIsolate()); + i::Isolate* isolate = reinterpret_cast<i::Isolate*>(env->GetIsolate()); + v8::Local<v8::Value> global_object = + v8::Utils::ToLocal(i::Handle<i::JSObject>( + (isolate->context()->native_context()->global_object()), isolate)); + global_object_pointer = &global_object; + v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); + heap_profiler->AddBuildEmbedderGraphCallback(BuildEmbedderGraphWithNamedEdges, + nullptr); + const v8::HeapSnapshot* snapshot = heap_profiler->TakeHeapSnapshot(); + CHECK(ValidateSnapshot(snapshot)); + CheckEmbedderGraphWithNamedEdges(env->GetIsolate(), snapshot); +} + struct GraphBuildingContext { int counter = 0; }; |