ExtractJSGlobalProxyReferences(entry, JSGlobalProxy::cast(obj));
} else if (obj->IsJSArrayBuffer()) {
ExtractJSArrayBufferReferences(entry, JSArrayBuffer::cast(obj));
+ } else if (obj->IsJSWeakSet()) {
+ ExtractJSWeakCollectionReferences(entry, JSWeakSet::cast(obj));
+ } else if (obj->IsJSWeakMap()) {
+ ExtractJSWeakCollectionReferences(entry, JSWeakMap::cast(obj));
} else if (obj->IsJSObject()) {
- if (obj->IsJSWeakSet()) {
- ExtractJSWeakCollectionReferences(entry, JSWeakSet::cast(obj));
- } else if (obj->IsJSWeakMap()) {
- ExtractJSWeakCollectionReferences(entry, JSWeakMap::cast(obj));
- } else if (obj->IsJSSet()) {
- ExtractJSCollectionReferences(entry, JSSet::cast(obj));
- } else if (obj->IsJSMap()) {
- ExtractJSCollectionReferences(entry, JSMap::cast(obj));
- }
ExtractJSObjectReferences(entry, JSObject::cast(obj));
} else if (obj->IsString()) {
ExtractStringReferences(entry, String::cast(obj));
}
-void V8HeapExplorer::ExtractJSCollectionReferences(int entry,
- JSCollection* collection) {
- SetInternalReference(collection, entry, "table", collection->table(),
- JSCollection::kTableOffset);
-}
-
-
void V8HeapExplorer::ExtractJSWeakCollectionReferences(
int entry, JSWeakCollection* collection) {
MarkAsWeakContainer(collection->table());
// - JSArrayBufferView
// - JSTypedArray
// - JSDataView
-// - JSCollection
-// - JSSet
-// - JSMap
+// - JSSet
+// - JSMap
// - JSSetIterator
// - JSMapIterator
// - JSWeakCollection
};
-class JSCollection : public JSObject {
+// The JSSet describes EcmaScript Harmony sets
+class JSSet: public JSObject {
public:
- // [table]: the backing hash table
+ // [set]: the backing hash set containing keys.
DECL_ACCESSORS(table, Object)
- static const int kTableOffset = JSObject::kHeaderSize;
- static const int kSize = kTableOffset + kPointerSize;
-
- private:
- DISALLOW_IMPLICIT_CONSTRUCTORS(JSCollection);
-};
-
-
-// The JSSet describes EcmaScript Harmony sets
-class JSSet : public JSCollection {
- public:
DECLARE_CAST(JSSet)
// Dispatched behavior.
DECLARE_PRINTER(JSSet)
DECLARE_VERIFIER(JSSet)
+ static const int kTableOffset = JSObject::kHeaderSize;
+ static const int kSize = kTableOffset + kPointerSize;
+
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(JSSet);
};
// The JSMap describes EcmaScript Harmony maps
-class JSMap : public JSCollection {
+class JSMap: public JSObject {
public:
+ // [table]: the backing hash table mapping keys to values.
+ DECL_ACCESSORS(table, Object)
+
DECLARE_CAST(JSMap)
// Dispatched behavior.
DECLARE_PRINTER(JSMap)
DECLARE_VERIFIER(JSMap)
+ static const int kTableOffset = JSObject::kHeaderSize;
+ static const int kSize = kTableOffset + kPointerSize;
+
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(JSMap);
};
v8::HandleScope scope(env->GetIsolate());
v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
- CompileRun(
- "k = {}; v = {}; s = 'str';\n"
- "ws = new WeakSet(); ws.add(k); ws.add(v); ws[s] = s;\n"
- "wm = new WeakMap(); wm.set(k, v); wm[s] = s;\n");
+ CompileRun("k = {}; v = {};\n"
+ "ws = new WeakSet(); ws.add(k); ws.add(v);\n"
+ "wm = new WeakMap(); wm.set(k, v);\n");
const v8::HeapSnapshot* snapshot =
heap_profiler->TakeHeapSnapshot(v8_str("WeakCollections"));
CHECK(ValidateSnapshot(snapshot));
const v8::HeapGraphNode* v =
GetProperty(global, v8::HeapGraphEdge::kProperty, "v");
CHECK_NE(NULL, v);
- const v8::HeapGraphNode* s =
- GetProperty(global, v8::HeapGraphEdge::kProperty, "s");
- CHECK_NE(NULL, s);
const v8::HeapGraphNode* ws =
GetProperty(global, v8::HeapGraphEdge::kProperty, "ws");
}
}
CHECK_EQ(1, weak_entries);
- const v8::HeapGraphNode* ws_s =
- GetProperty(ws, v8::HeapGraphEdge::kProperty, "str");
- CHECK_NE(NULL, ws_s);
- CHECK_EQ(static_cast<int>(s->GetId()), static_cast<int>(ws_s->GetId()));
const v8::HeapGraphNode* wm =
GetProperty(global, v8::HeapGraphEdge::kProperty, "wm");
}
}
CHECK_EQ(2, weak_entries);
- const v8::HeapGraphNode* wm_s =
- GetProperty(wm, v8::HeapGraphEdge::kProperty, "str");
- CHECK_NE(NULL, wm_s);
- CHECK_EQ(static_cast<int>(s->GetId()), static_cast<int>(wm_s->GetId()));
-}
-
-
-TEST(HeapSnapshotCollection) {
- i::FLAG_harmony_collections = true;
-
- LocalContext env;
- v8::HandleScope scope(env->GetIsolate());
- v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
-
- CompileRun(
- "k = {}; v = {}; s = 'str';\n"
- "set = new Set(); set.add(k); set.add(v); set[s] = s;\n"
- "map = new Map(); map.set(k, v); map[s] = s;\n");
- const v8::HeapSnapshot* snapshot =
- heap_profiler->TakeHeapSnapshot(v8_str("Collections"));
- CHECK(ValidateSnapshot(snapshot));
- const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
- const v8::HeapGraphNode* k =
- GetProperty(global, v8::HeapGraphEdge::kProperty, "k");
- CHECK_NE(NULL, k);
- const v8::HeapGraphNode* v =
- GetProperty(global, v8::HeapGraphEdge::kProperty, "v");
- CHECK_NE(NULL, v);
- const v8::HeapGraphNode* s =
- GetProperty(global, v8::HeapGraphEdge::kProperty, "s");
- CHECK_NE(NULL, s);
-
- const v8::HeapGraphNode* set =
- GetProperty(global, v8::HeapGraphEdge::kProperty, "set");
- CHECK_NE(NULL, set);
- CHECK_EQ(v8::HeapGraphNode::kObject, set->GetType());
- CHECK_EQ(v8_str("Set"), set->GetName());
-
- const v8::HeapGraphNode* set_table =
- GetProperty(set, v8::HeapGraphEdge::kInternal, "table");
- CHECK_EQ(v8::HeapGraphNode::kArray, set_table->GetType());
- CHECK_GT(set_table->GetChildrenCount(), 0);
- int entries = 0;
- for (int i = 0, count = set_table->GetChildrenCount(); i < count; ++i) {
- const v8::HeapGraphEdge* prop = set_table->GetChild(i);
- const v8::SnapshotObjectId to_node_id = prop->GetToNode()->GetId();
- if (to_node_id == k->GetId() || to_node_id == v->GetId()) {
- ++entries;
- }
- }
- CHECK_EQ(2, entries);
- const v8::HeapGraphNode* set_s =
- GetProperty(set, v8::HeapGraphEdge::kProperty, "str");
- CHECK_NE(NULL, set_s);
- CHECK_EQ(static_cast<int>(s->GetId()), static_cast<int>(set_s->GetId()));
-
- const v8::HeapGraphNode* map =
- GetProperty(global, v8::HeapGraphEdge::kProperty, "map");
- CHECK_NE(NULL, map);
- CHECK_EQ(v8::HeapGraphNode::kObject, map->GetType());
- CHECK_EQ(v8_str("Map"), map->GetName());
-
- const v8::HeapGraphNode* map_table =
- GetProperty(map, v8::HeapGraphEdge::kInternal, "table");
- CHECK_EQ(v8::HeapGraphNode::kArray, map_table->GetType());
- CHECK_GT(map_table->GetChildrenCount(), 0);
- entries = 0;
- for (int i = 0, count = map_table->GetChildrenCount(); i < count; ++i) {
- const v8::HeapGraphEdge* prop = map_table->GetChild(i);
- const v8::SnapshotObjectId to_node_id = prop->GetToNode()->GetId();
- if (to_node_id == k->GetId() || to_node_id == v->GetId()) {
- ++entries;
- }
- }
- CHECK_EQ(2, entries);
- const v8::HeapGraphNode* map_s =
- GetProperty(map, v8::HeapGraphEdge::kProperty, "str");
- CHECK_NE(NULL, map_s);
- CHECK_EQ(static_cast<int>(s->GetId()), static_cast<int>(map_s->GetId()));
}