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

Reply via email to