Skip to content

Commit 86c7783

Browse files
committed
src: implement countObjectsWithPrototype
1 parent ca63e76 commit 86c7783

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

src/heap_utils.cc

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ using v8::Number;
3838
using v8::Object;
3939
using v8::ObjectTemplate;
4040
using v8::String;
41+
using v8::Symbol;
42+
using v8::TryCatch;
4143
using v8::Uint8Array;
4244
using v8::Value;
4345

@@ -474,6 +476,40 @@ void TriggerHeapSnapshot(const FunctionCallbackInfo<Value>& args) {
474476
return args.GetReturnValue().Set(filename_v);
475477
}
476478

479+
class PrototypeChainHas : public v8::QueryObjectPredicate {
480+
public:
481+
PrototypeChainHas(Local<Context> context, Local<Object> search)
482+
: context_(context),
483+
search_(search) {}
484+
485+
// What we can do in the filter can be quite limited, but looking up
486+
// the prototype chain is something that the inspector console API
487+
// queryObject() does so it is supported.
488+
bool Filter(Local<Object> object) override {
489+
for (Local<Value> proto = object->GetPrototype(); proto->IsObject();
490+
proto = proto.As<Object>()->GetPrototype()) {
491+
if (search_ == proto) return true;
492+
}
493+
return false;
494+
}
495+
496+
private:
497+
Local<Context> context_;
498+
Local<Object> search_;
499+
};
500+
501+
void CountObjectsWithPrototype(const FunctionCallbackInfo<Value>& args) {
502+
CHECK_EQ(args.Length(), 1);
503+
CHECK(args[0]->IsObject());
504+
Local<Object> proto = args[0].As<Object>();
505+
Isolate* isolate = args.GetIsolate();
506+
Local<Context> context = isolate->GetCurrentContext();
507+
PrototypeChainHas prototype_chain_has(context, proto);
508+
std::vector<Global<Object>> out;
509+
isolate->GetHeapProfiler()->QueryObjects(context, &prototype_chain_has, &out);
510+
args.GetReturnValue().Set(static_cast<uint32_t>(out.size()));
511+
}
512+
477513
void Initialize(Local<Object> target,
478514
Local<Value> unused,
479515
Local<Context> context,
@@ -482,12 +518,15 @@ void Initialize(Local<Object> target,
482518
SetMethod(context, target, "triggerHeapSnapshot", TriggerHeapSnapshot);
483519
SetMethod(
484520
context, target, "createHeapSnapshotStream", CreateHeapSnapshotStream);
521+
SetMethod(
522+
context, target, "countObjectsWithPrototype", CountObjectsWithPrototype);
485523
}
486524

487525
void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
488526
registry->Register(BuildEmbedderGraph);
489527
registry->Register(TriggerHeapSnapshot);
490528
registry->Register(CreateHeapSnapshotStream);
529+
registry->Register(CountObjectsWithPrototype);
491530
}
492531

493532
} // namespace heap

0 commit comments

Comments
 (0)