@@ -38,6 +38,8 @@ using v8::Number;
3838using v8::Object;
3939using v8::ObjectTemplate;
4040using v8::String;
41+ using v8::Symbol;
42+ using v8::TryCatch;
4143using v8::Uint8Array;
4244using 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+
477513void 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
487525void 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