Revision: 15575
Author: [email protected]
Date: Tue Jul 9 07:16:59 2013
Log: Bugfix: AllocationSite objects need to be walkable by the heap
snapshot
generator.
BUG=
[email protected]
Review URL: https://codereview.chromium.org/18584007
http://code.google.com/p/v8/source/detail?r=15575
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 Sat Jul 6
02:12:09 2013
+++ /branches/bleeding_edge/src/heap-snapshot-generator.cc Tue Jul 9
07:16:59 2013
@@ -955,9 +955,10 @@
ExtractCellReferences(entry, Cell::cast(obj));
extract_indexed_refs = false;
} else if (obj->IsPropertyCell()) {
- ExtractPropertyCellReferences(
- entry, PropertyCell::cast(obj));
+ ExtractPropertyCellReferences(entry, PropertyCell::cast(obj));
extract_indexed_refs = false;
+ } else if (obj->IsAllocationSite()) {
+ ExtractAllocationSiteReferences(entry, AllocationSite::cast(obj));
}
if (extract_indexed_refs) {
SetInternalReference(obj, entry, "map", obj->map(),
HeapObject::kMapOffset);
@@ -1262,6 +1263,13 @@
SetInternalReference(cell, entry, "value", cell->value());
SetInternalReference(cell, entry, "type", cell->type());
}
+
+
+void V8HeapExplorer::ExtractAllocationSiteReferences(int entry,
+ AllocationSite* site)
{
+ SetInternalReference(site, entry, "transition_info",
site->transition_info(),
+ AllocationSite::kTransitionInfoOffset);
+}
void V8HeapExplorer::ExtractClosureReferences(JSObject* js_obj, int entry)
{
=======================================
--- /branches/bleeding_edge/src/heap-snapshot-generator.h Sat Jul 6
02:12:09 2013
+++ /branches/bleeding_edge/src/heap-snapshot-generator.h Tue Jul 9
07:16:59 2013
@@ -460,6 +460,7 @@
void ExtractCodeReferences(int entry, Code* code);
void ExtractCellReferences(int entry, Cell* cell);
void ExtractPropertyCellReferences(int entry, PropertyCell* cell);
+ void ExtractAllocationSiteReferences(int entry, AllocationSite* site);
void ExtractClosureReferences(JSObject* js_obj, int entry);
void ExtractPropertyReferences(JSObject* js_obj, int entry);
bool ExtractAccessorPairProperty(JSObject* js_obj, int entry,
=======================================
--- /branches/bleeding_edge/test/cctest/test-heap-profiler.cc Fri Jul 5
02:52:11 2013
+++ /branches/bleeding_edge/test/cctest/test-heap-profiler.cc Tue Jul 9
07:16:59 2013
@@ -1832,3 +1832,53 @@
CHECK_NE(NULL, f_object);
}
}
+
+
+TEST(AllocationSitesAreVisible) {
+ LocalContext env;
+ v8::HandleScope scope(env->GetIsolate());
+ v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
+ CompileRun(
+ "fun = function () { var a = [3, 2, 1]; return a; }\n"
+ "fun();");
+ const v8::HeapSnapshot* snapshot =
+ heap_profiler->TakeHeapSnapshot(v8_str("snapshot"));
+
+ const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
+ CHECK_NE(NULL, global);
+ const v8::HeapGraphNode* fun_code =
+ GetProperty(global, v8::HeapGraphEdge::kProperty, "fun");
+ CHECK_NE(NULL, fun_code);
+ const v8::HeapGraphNode* literals =
+ GetProperty(fun_code, v8::HeapGraphEdge::kInternal, "literals");
+ CHECK_NE(NULL, literals);
+ CHECK_EQ(v8::HeapGraphNode::kArray, literals->GetType());
+ CHECK_EQ(2, literals->GetChildrenCount());
+
+ // The second value in the literals array should be the boilerplate,
+ // after an AllocationSite.
+ const v8::HeapGraphEdge* prop = literals->GetChild(1);
+ const v8::HeapGraphNode* allocation_site = prop->GetToNode();
+ v8::String::Utf8Value name(allocation_site->GetName());
+ CHECK_EQ("system / AllocationSite", *name);
+ const v8::HeapGraphNode* transition_info =
+ GetProperty(allocation_site, v8::HeapGraphEdge::kInternal,
+ "transition_info");
+ CHECK_NE(NULL, transition_info);
+
+ const v8::HeapGraphNode* elements =
+ GetProperty(transition_info, v8::HeapGraphEdge::kInternal,
+ "elements");
+ CHECK_NE(NULL, elements);
+ CHECK_EQ(v8::HeapGraphNode::kArray, elements->GetType());
+ CHECK_EQ(v8::internal::FixedArray::SizeFor(3), elements->GetSelfSize());
+
+ CHECK(transition_info->GetHeapValue()->IsArray());
+ v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(
+ transition_info->GetHeapValue());
+ // Verify the array is "a" in the code above.
+ CHECK_EQ(3, array->Length());
+ CHECK_EQ(v8::Integer::New(3), array->Get(v8::Integer::New(0)));
+ CHECK_EQ(v8::Integer::New(2), array->Get(v8::Integer::New(1)));
+ CHECK_EQ(v8::Integer::New(1), array->Get(v8::Integer::New(2)));
+}
--
--
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.