diff --git a/include/v8.h b/include/v8.h index 573e80176d..bb77987f14 100644 --- a/include/v8.h +++ b/include/v8.h @@ -3544,6 +3549,17 @@ class V8_EXPORT Object : public Value { */ Isolate* GetIsolate(); + /** + * If this object is a Set, Map, WeakSet or WeakMap, this returns a + * representation of the elements of this object as an array. + * If this object is a SetIterator or MapIterator, this returns all + * elements of the underlying collection, starting at the iterator's current + * position. + * For other types, this will return an empty MaybeLocal (without + * scheduling an exception). + */ + MaybeLocal PreviewEntries(bool* is_key_value); + static Local New(Isolate* isolate); V8_INLINE static Object* Cast(Value* obj); diff --git a/src/api.cc b/src/api.cc index e65f114edb..4302b6c604 100644 --- a/src/api.cc +++ b/src/api.cc @@ -9543,21 +9543,20 @@ int debug::EstimatedValueSize(Isolate* v8_isolate, v8::Local value) { return i::Handle::cast(object)->Size(); } -v8::MaybeLocal debug::EntriesPreview(Isolate* v8_isolate, - v8::Local value, - bool* is_key_value) { - i::Isolate* isolate = reinterpret_cast(v8_isolate); - ENTER_V8_NO_SCRIPT_NO_EXCEPTION(isolate); - if (value->IsMap()) { +v8::MaybeLocal v8::Object::PreviewEntries(bool* is_key_value) { + if (IsMap()) { *is_key_value = true; - return value.As()->AsArray(); + return Map::Cast(this)->AsArray(); } - if (value->IsSet()) { + if (IsSet()) { *is_key_value = false; - return value.As()->AsArray(); + return Set::Cast(this)->AsArray(); } - i::Handle object = Utils::OpenHandle(*value); + i::Handle object = Utils::OpenHandle(this); + i::Isolate* isolate = object->GetIsolate(); + Isolate* v8_isolate = reinterpret_cast(isolate); + ENTER_V8_NO_SCRIPT_NO_EXCEPTION(isolate); if (object->IsJSWeakCollection()) { *is_key_value = object->IsJSWeakMap(); return Utils::ToLocal(i::JSWeakCollection::GetEntries( diff --git a/src/debug/debug-interface.h b/src/debug/debug-interface.h index 01124bf7fc..2210b4e87f 100644 --- a/src/debug/debug-interface.h +++ b/src/debug/debug-interface.h @@ -212,10 +212,6 @@ void ResetBlackboxedStateCache(Isolate* isolate, int EstimatedValueSize(Isolate* isolate, v8::Local value); -v8::MaybeLocal EntriesPreview(Isolate* isolate, - v8::Local value, - bool* is_key_value); - enum Builtin { kObjectKeys, kObjectGetPrototypeOf, diff --git a/src/inspector/v8-debugger.cc b/src/inspector/v8-debugger.cc index 5dee98853b..28212a1993 100644 --- a/src/inspector/v8-debugger.cc +++ b/src/inspector/v8-debugger.cc @@ -29,8 +29,10 @@ v8::MaybeLocal collectionsEntries(v8::Local context, v8::Isolate* isolate = context->GetIsolate(); v8::Local entries; bool isKeyValue = false; - if (!v8::debug::EntriesPreview(isolate, value, &isKeyValue).ToLocal(&entries)) + if (!value->IsObject() || + !value.As()->PreviewEntries(&isKeyValue).ToLocal(&entries)) { return v8::MaybeLocal(); + } v8::Local wrappedEntries = v8::Array::New(isolate); CHECK(!isKeyValue || wrappedEntries->Length() % 2 == 0);