JS_NondeterministicGetWeakMapKeys(JSContext *cx, HandleObject objArg, MutableHandleObject ret) { RootedObject obj(cx, objArg); obj = UncheckedUnwrap(obj); if (!obj || !obj->is<WeakMapObject>()) { ret.set(nullptr); return true; } RootedObject arr(cx, NewDenseEmptyArray(cx)); if (!arr) return false; ObjectValueMap *map = obj->as<WeakMapObject>().getMap(); if (map) { // Prevent GC from mutating the weakmap while iterating. gc::AutoSuppressGC suppress(cx); for (ObjectValueMap::Base::Range r = map->all(); !r.empty(); r.popFront()) { RootedObject key(cx, r.front().key()); if (!cx->compartment()->wrap(cx, &key)) return false; if (!NewbornArrayPush(cx, arr, ObjectValue(*key))) return false; } } ret.set(arr); return true; }
JS_NondeterministicGetWeakMapKeys(JSContext *cx, JSObject *objArg, JSObject **ret) { RootedObject obj(cx, objArg); obj = UncheckedUnwrap(obj); if (!obj || !obj->is<WeakMapObject>()) { *ret = NULL; return true; } RootedObject arr(cx, NewDenseEmptyArray(cx)); if (!arr) return false; ObjectValueMap *map = obj->as<WeakMapObject>().getMap(); if (map) { // Prevent GC from mutating the weakmap while iterating. gc::AutoSuppressGC suppress(cx); for (ObjectValueMap::Base::Range r = map->all(); !r.empty(); r.popFront()) { RootedObject key(cx, r.front().key); if (!JS_WrapObject(cx, key.address())) return false; if (!js_NewbornArrayPush(cx, arr, ObjectValue(*key))) return false; } } *ret = arr; return true; }
JS_NondeterministicGetWeakMapKeys(JSContext *cx, JSObject *obj, JSObject **ret) { if (!obj || !obj->isWeakMap()) { *ret = NULL; return true; } RootedObject arr(cx, NewDenseEmptyArray(cx)); if (!arr) return false; ObjectValueMap *map = GetObjectMap(obj); if (map) { for (ObjectValueMap::Base::Range r = map->all(); !r.empty(); r.popFront()) { if (!js_NewbornArrayPush(cx, arr, ObjectValue(*r.front().key))) return false; } } *ret = arr; return true; }
bool WeakCollectionObject::nondeterministicGetKeys(JSContext* cx, Handle<WeakCollectionObject*> obj, MutableHandleObject ret) { RootedObject arr(cx, NewDenseEmptyArray(cx)); if (!arr) return false; if (ObjectValueMap* map = obj->getMap()) { // Prevent GC from mutating the weakmap while iterating. AutoSuppressGC suppress(cx); for (ObjectValueMap::Base::Range r = map->all(); !r.empty(); r.popFront()) { JS::ExposeObjectToActiveJS(r.front().key()); RootedObject key(cx, r.front().key()); if (!cx->compartment()->wrap(cx, &key)) return false; if (!NewbornArrayPush(cx, arr, ObjectValue(*key))) return false; } } ret.set(arr); return true; }