Reviewers: Vyacheslav Egorov, alexeif, Mikhail Naganov (Chromium), loislo,
Description:
Report "hidden properties" in heap profiler for properties case
BUG=2212
TEST=cctest/test-heap-profiler/HiddenPropertiesFastCase
Please review this at http://codereview.chromium.org/10692058/
SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/
Affected files:
M src/profile-generator.cc
M test/cctest/test-heap-profiler.cc
Index: src/profile-generator.cc
===================================================================
--- src/profile-generator.cc (revision 11964)
+++ src/profile-generator.cc (working copy)
@@ -2182,16 +2182,33 @@
switch (descs->GetType(i)) {
case FIELD: {
int index = descs->GetFieldIndex(i);
+
+ String* k = descs->GetKey(i);
if (index < js_obj->map()->inobject_properties()) {
- SetPropertyReference(
- js_obj, entry,
- descs->GetKey(i), js_obj->InObjectPropertyAt(index),
- NULL,
- js_obj->GetInObjectPropertyOffset(index));
+ Object* value = js_obj->InObjectPropertyAt(index);
+ if (k->length() > 0) {
+ SetPropertyReference(
+ js_obj, entry,
+ k, value,
+ NULL,
+ js_obj->GetInObjectPropertyOffset(index));
+ } else {
+ OS::Print("Empty name for fast property 1\n");
+ TagObject(value, "(hidden properties)");
+ SetInternalReference(
+ js_obj, entry,
+ "hidden_properties", value,
+ js_obj->GetInObjectPropertyOffset(index));
+ }
} else {
- SetPropertyReference(
- js_obj, entry,
- descs->GetKey(i), js_obj->FastPropertyAt(index));
+ Object* value = js_obj->FastPropertyAt(index);
+ if (k->length() > 0) {
+ SetPropertyReference(js_obj, entry, k, value);
+ } else {
+ OS::Print("Empty name for fast property 2\n");
+ TagObject(value, "(hidden properties)");
+ SetInternalReference(js_obj, entry, "hidden_properties",
value);
+ }
}
break;
}
Index: test/cctest/test-heap-profiler.cc
===================================================================
--- test/cctest/test-heap-profiler.cc (revision 11964)
+++ test/cctest/test-heap-profiler.cc (working copy)
@@ -1449,7 +1449,35 @@
CHECK_NE(NULL, setterFunction);
}
+TEST(HiddenPropertiesFastCase) {
+ v8::HandleScope scope;
+ LocalContext env;
+ CompileRun(
+ "function C(x) { this.a = this; this.b = x; }\n"
+ "c = new C(2012);\n");
+ const v8::HeapSnapshot* snapshot =
+ v8::HeapProfiler::TakeSnapshot(v8_str("HiddenPropertiesFastCase1"));
+ const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
+ const v8::HeapGraphNode* c =
+ GetProperty(global, v8::HeapGraphEdge::kProperty, "c");
+ CHECK_NE(NULL, c);
+ const v8::HeapGraphNode* hidden_props =
+ GetProperty(c, v8::HeapGraphEdge::kInternal, "hidden_properties");
+ CHECK_EQ(NULL, hidden_props);
+
+ v8::Handle<v8::Value> cHandle = env->Global()->Get(v8::String::New("c"));
+ CHECK(!cHandle.IsEmpty() && cHandle->IsObject());
+ cHandle->ToObject()->GetIdentityHash();
+
+ snapshot =
v8::HeapProfiler::TakeSnapshot(v8_str("HiddenPropertiesFastCase2"));
+ global = GetGlobalObject(snapshot);
+ c = GetProperty(global, v8::HeapGraphEdge::kProperty, "c");
+ CHECK_NE(NULL, c);
+ hidden_props = GetProperty(c,
v8::HeapGraphEdge::kInternal, "hidden_properties");
+ CHECK_NE(NULL, hidden_props);
+}
+
bool HasWeakEdge(const v8::HeapGraphNode* node) {
for (int i = 0; i < node->GetChildrenCount(); ++i) {
const v8::HeapGraphEdge* handle_edge = node->GetChild(i);
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev