Revision: 18926
Author: [email protected]
Date: Wed Jan 29 17:03:13 2014 UTC
Log: Do not overwrite builtin code names in heap profiler
Make sure builtin code objects get their builtin tags
first. Otherwise a particular JSFunction object could set
its custom name to a generic builtin.
LOG=N
[email protected], [email protected]
Review URL: https://codereview.chromium.org/145973006
http://code.google.com/p/v8/source/detail?r=18926
Modified:
/branches/bleeding_edge/src/heap-snapshot-generator.cc
/branches/bleeding_edge/src/heap-snapshot-generator.h
/branches/bleeding_edge/test/cctest/test-heap-profiler.cc
=======================================
--- /branches/bleeding_edge/src/heap-snapshot-generator.cc Wed Jan 29
13:45:41 2014 UTC
+++ /branches/bleeding_edge/src/heap-snapshot-generator.cc Wed Jan 29
17:03:13 2014 UTC
@@ -1366,8 +1366,8 @@
}
-void V8HeapExplorer::TagCodeObject(Code* code, const char* external_name) {
- TagObject(code, names_->GetFormatted("(%s code)", external_name));
+void V8HeapExplorer::TagBuiltinCodeObject(Code* code, const char* name) {
+ TagObject(code, names_->GetFormatted("(%s builtin)", name));
}
@@ -1663,24 +1663,20 @@
}
int strong_index = 0, all_index = 0, tags_index = 0, builtin_index = 0;
while (all_index < all_references_.length()) {
- if (strong_index < strong_references_.length() &&
- strong_references_[strong_index] == all_references_[all_index]) {
- explorer->SetGcSubrootReference(reference_tags_[tags_index].tag,
- false,
- all_references_[all_index]);
- ++strong_index;
- } else {
- explorer->SetGcSubrootReference(reference_tags_[tags_index].tag,
- true,
- all_references_[all_index]);
- }
+ bool is_strong = strong_index < strong_references_.length()
+ && strong_references_[strong_index] ==
all_references_[all_index];
+ explorer->SetGcSubrootReference(reference_tags_[tags_index].tag,
+ !is_strong,
+ all_references_[all_index]);
if (reference_tags_[tags_index].tag ==
VisitorSynchronization::kBuiltins) {
ASSERT(all_references_[all_index]->IsCode());
- explorer->TagCodeObject(Code::cast(all_references_[all_index]),
+ explorer->TagBuiltinCodeObject(
+ Code::cast(all_references_[all_index]),
builtins->name(builtin_index++));
}
++all_index;
+ if (is_strong) ++strong_index;
if (reference_tags_[tags_index].index == all_index) ++tags_index;
}
}
@@ -1705,11 +1701,21 @@
bool V8HeapExplorer::IterateAndExtractReferences(
SnapshotFillerInterface* filler) {
- HeapIterator iterator(heap_, HeapIterator::kFilterUnreachable);
+ filler_ = filler;
+
+ // Make sure builtin code objects get their builtin tags
+ // first. Otherwise a particular JSFunction object could set
+ // its custom name to a generic builtin.
+ SetRootGcRootsReference();
+ RootsReferencesExtractor extractor(heap_);
+ heap_->IterateRoots(&extractor, VISIT_ONLY_STRONG);
+ extractor.SetCollectingAllReferences();
+ heap_->IterateRoots(&extractor, VISIT_ALL);
+ extractor.FillReferences(this);
- filler_ = filler;
+ // Now iterate the whole heap.
bool interrupted = false;
-
+ HeapIterator iterator(heap_, HeapIterator::kFilterUnreachable);
// Heap iteration with filtering must be finished in any case.
for (HeapObject* obj = iterator.next();
obj != NULL;
@@ -1724,12 +1730,6 @@
return false;
}
- SetRootGcRootsReference();
- RootsReferencesExtractor extractor(heap_);
- heap_->IterateRoots(&extractor, VISIT_ONLY_STRONG);
- extractor.SetCollectingAllReferences();
- heap_->IterateRoots(&extractor, VISIT_ALL);
- extractor.FillReferences(this);
filler_ = NULL;
return progress_->ProgressReport(true);
}
=======================================
--- /branches/bleeding_edge/src/heap-snapshot-generator.h Mon Jan 27
09:37:02 2014 UTC
+++ /branches/bleeding_edge/src/heap-snapshot-generator.h Wed Jan 29
17:03:13 2014 UTC
@@ -385,7 +385,7 @@
bool IterateAndExtractReferences(SnapshotFillerInterface* filler);
void TagGlobalObjects();
void TagCodeObject(Code* code);
- void TagCodeObject(Code* code, const char* external_name);
+ void TagBuiltinCodeObject(Code* code, const char* name);
static String* GetConstructorName(JSObject* object);
=======================================
--- /branches/bleeding_edge/test/cctest/test-heap-profiler.cc Wed Jan 29
13:45:41 2014 UTC
+++ /branches/bleeding_edge/test/cctest/test-heap-profiler.cc Wed Jan 29
17:03:13 2014 UTC
@@ -2122,13 +2122,23 @@
stub_path, ARRAY_SIZE(stub_path));
CHECK_NE(NULL, node);
- const char* builtin_path[] = {
+ const char* builtin_path1[] = {
"::(GC roots)",
"::(Builtins)",
- "::(KeyedLoadIC_Generic code)"
+ "::(KeyedLoadIC_Generic builtin)"
};
- node = GetNodeByPath(snapshot, builtin_path, ARRAY_SIZE(builtin_path));
+ node = GetNodeByPath(snapshot, builtin_path1, ARRAY_SIZE(builtin_path1));
CHECK_NE(NULL, node);
+
+ const char* builtin_path2[] = {
+ "::(GC roots)",
+ "::(Builtins)",
+ "::(CompileUnoptimized builtin)"
+ };
+ node = GetNodeByPath(snapshot, builtin_path2, ARRAY_SIZE(builtin_path2));
+ CHECK_NE(NULL, node);
+ v8::String::Utf8Value node_name(node->GetName());
+ CHECK_EQ("(CompileUnoptimized builtin)", *node_name);
}
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.