Revision: 15320
Author: [email protected]
Date: Tue Jun 25 04:55:33 2013
Log: Handle AccessorPair struct in heap snapshot.
[email protected], [email protected]
Review URL: https://codereview.chromium.org/17616002
http://code.google.com/p/v8/source/detail?r=15320
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 Fri Jun 14
09:06:12 2013
+++ /branches/bleeding_edge/src/heap-snapshot-generator.cc Tue Jun 25
04:55:33 2013
@@ -974,6 +974,8 @@
ExtractSharedFunctionInfoReferences(entry,
SharedFunctionInfo::cast(obj));
} else if (obj->IsScript()) {
ExtractScriptReferences(entry, Script::cast(obj));
+ } else if (obj->IsAccessorPair()) {
+ ExtractAccessorPairReferences(entry, AccessorPair::cast(obj));
} else if (obj->IsCodeCache()) {
ExtractCodeCacheReferences(entry, CodeCache::cast(obj));
} else if (obj->IsCode()) {
@@ -1240,6 +1242,15 @@
"line_ends", script->line_ends(),
Script::kLineEndsOffset);
}
+
+
+void V8HeapExplorer::ExtractAccessorPairReferences(
+ int entry, AccessorPair* accessors) {
+ SetInternalReference(accessors, entry, "getter", accessors->getter(),
+ AccessorPair::kGetterOffset);
+ SetInternalReference(accessors, entry, "setter", accessors->setter(),
+ AccessorPair::kSetterOffset);
+}
void V8HeapExplorer::ExtractCodeCacheReferences(
@@ -1353,21 +1364,11 @@
js_obj, entry,
descs->GetKey(i), descs->GetConstantFunction(i));
break;
- case CALLBACKS: {
- Object* callback_obj = descs->GetValue(i);
- if (callback_obj->IsAccessorPair()) {
- AccessorPair* accessors = AccessorPair::cast(callback_obj);
- if (Object* getter = accessors->getter()) {
- SetPropertyReference(js_obj, entry, descs->GetKey(i),
- getter, "get-%s");
- }
- if (Object* setter = accessors->setter()) {
- SetPropertyReference(js_obj, entry, descs->GetKey(i),
- setter, "set-%s");
- }
- }
+ case CALLBACKS:
+ ExtractAccessorPairProperty(
+ js_obj, entry,
+ descs->GetKey(i), descs->GetValue(i));
break;
- }
case NORMAL: // only in slow mode
case HANDLER: // only in lookup results, not in descriptors
case INTERCEPTOR: // only in lookup results, not in descriptors
@@ -1389,16 +1390,33 @@
Object* value = target->IsPropertyCell()
? PropertyCell::cast(target)->value()
: target;
- if (k != heap_->hidden_string()) {
- SetPropertyReference(js_obj, entry, String::cast(k), value);
- } else {
+ if (k == heap_->hidden_string()) {
TagObject(value, "(hidden properties)");
SetInternalReference(js_obj, entry, "hidden_properties", value);
+ continue;
}
+ if (ExtractAccessorPairProperty(js_obj, entry, k, value)) continue;
+ SetPropertyReference(js_obj, entry, String::cast(k), value);
}
}
}
}
+
+
+bool V8HeapExplorer::ExtractAccessorPairProperty(
+ JSObject* js_obj, int entry, Object* key, Object* callback_obj) {
+ if (!callback_obj->IsAccessorPair()) return false;
+ AccessorPair* accessors = AccessorPair::cast(callback_obj);
+ Object* getter = accessors->getter();
+ if (!getter->IsOddball()) {
+ SetPropertyReference(js_obj, entry, String::cast(key),
getter, "get %s");
+ }
+ Object* setter = accessors->setter();
+ if (!setter->IsOddball()) {
+ SetPropertyReference(js_obj, entry, String::cast(key),
setter, "set %s");
+ }
+ return true;
+}
void V8HeapExplorer::ExtractElementReferences(JSObject* js_obj, int entry)
{
=======================================
--- /branches/bleeding_edge/src/heap-snapshot-generator.h Fri Jun 14
09:06:12 2013
+++ /branches/bleeding_edge/src/heap-snapshot-generator.h Tue Jun 25
04:55:33 2013
@@ -462,12 +462,15 @@
void ExtractSharedFunctionInfoReferences(int entry,
SharedFunctionInfo* shared);
void ExtractScriptReferences(int entry, Script* script);
+ void ExtractAccessorPairReferences(int entry, AccessorPair* accessors);
void ExtractCodeCacheReferences(int entry, CodeCache* code_cache);
void ExtractCodeReferences(int entry, Code* code);
void ExtractCellReferences(int entry, Cell* cell);
void ExtractPropertyCellReferences(int entry, PropertyCell* cell);
void ExtractClosureReferences(JSObject* js_obj, int entry);
void ExtractPropertyReferences(JSObject* js_obj, int entry);
+ bool ExtractAccessorPairProperty(JSObject* js_obj, int entry,
+ Object* key, Object* callback_obj);
void ExtractElementReferences(JSObject* js_obj, int entry);
void ExtractInternalReferences(JSObject* js_obj, int entry);
bool IsEssentialObject(Object* object);
=======================================
--- /branches/bleeding_edge/test/cctest/test-heap-profiler.cc Thu Jun 13
00:23:23 2013
+++ /branches/bleeding_edge/test/cctest/test-heap-profiler.cc Tue Jun 25
04:55:33 2013
@@ -1507,7 +1507,7 @@
}
-TEST(FastCaseGetter) {
+TEST(FastCaseAccessors) {
LocalContext env;
v8::HandleScope scope(env->GetIsolate());
v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
@@ -1520,20 +1520,57 @@
" return this.value_ = value;\n"
"});\n");
const v8::HeapSnapshot* snapshot =
- heap_profiler->TakeHeapSnapshot(v8_str("fastCaseGetter"));
+ heap_profiler->TakeHeapSnapshot(v8_str("fastCaseAccessors"));
const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
CHECK_NE(NULL, global);
const v8::HeapGraphNode* obj1 =
GetProperty(global, v8::HeapGraphEdge::kProperty, "obj1");
CHECK_NE(NULL, obj1);
- const v8::HeapGraphNode* getterFunction =
- GetProperty(obj1,
v8::HeapGraphEdge::kProperty, "get-propWithGetter");
- CHECK_NE(NULL, getterFunction);
- const v8::HeapGraphNode* setterFunction =
- GetProperty(obj1,
v8::HeapGraphEdge::kProperty, "set-propWithSetter");
- CHECK_NE(NULL, setterFunction);
+ const v8::HeapGraphNode* func;
+ func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "get
propWithGetter");
+ CHECK_NE(NULL, func);
+ func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "set
propWithGetter");
+ CHECK_EQ(NULL, func);
+ func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "set
propWithSetter");
+ CHECK_NE(NULL, func);
+ func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "get
propWithSetter");
+ CHECK_EQ(NULL, func);
}
+
+
+TEST(SlowCaseAccessors) {
+ LocalContext env;
+ v8::HandleScope scope(env->GetIsolate());
+ v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
+
+ CompileRun("var obj1 = {};\n"
+ "for (var i = 0; i < 100; ++i) obj1['z' + i] = {};"
+ "obj1.__defineGetter__('propWithGetter', function Y() {\n"
+ " return 42;\n"
+ "});\n"
+ "obj1.__defineSetter__('propWithSetter', function Z(value)
{\n"
+ " return this.value_ = value;\n"
+ "});\n");
+ const v8::HeapSnapshot* snapshot =
+ heap_profiler->TakeHeapSnapshot(v8_str("slowCaseAccessors"));
+
+ const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
+ CHECK_NE(NULL, global);
+ const v8::HeapGraphNode* obj1 =
+ GetProperty(global, v8::HeapGraphEdge::kProperty, "obj1");
+ CHECK_NE(NULL, obj1);
+ const v8::HeapGraphNode* func;
+ func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "get
propWithGetter");
+ CHECK_NE(NULL, func);
+ func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "set
propWithGetter");
+ CHECK_EQ(NULL, func);
+ func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "set
propWithSetter");
+ CHECK_NE(NULL, func);
+ func = GetProperty(obj1, v8::HeapGraphEdge::kProperty, "get
propWithSetter");
+ CHECK_EQ(NULL, func);
+}
+
TEST(HiddenPropertiesFastCase) {
LocalContext env;
--
--
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.