static JSBool WeakMap_get(JSContext *cx, uintN argc, Value *vp) { CallArgs args = CallArgsFromVp(argc, vp); bool ok; JSObject *obj = NonGenericMethodGuard(cx, args, WeakMap_get, &WeakMapClass, &ok); if (!obj) return ok; if (args.length() < 1) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_MORE_ARGS_NEEDED, "WeakMap.get", "0", "s"); return false; } JSObject *key = NonNullObject(cx, &args[0]); if (!key) return false; ObjectValueMap *map = GetObjectMap(obj); if (map) { ObjectValueMap::Ptr ptr = map->lookup(key); if (ptr) { args.rval() = ptr->value; return true; } } args.rval() = (args.length() > 1) ? args[1] : UndefinedValue(); return true; }
static JSBool WeakMap_delete(JSContext *cx, unsigned argc, Value *vp) { CallArgs args = CallArgsFromVp(argc, vp); bool ok; JSObject *obj = NonGenericMethodGuard(cx, args, WeakMap_delete, &WeakMapClass, &ok); if (!obj) return ok; if (args.length() < 1) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_MORE_ARGS_NEEDED, "WeakMap.delete", "0", "s"); return false; } JSObject *key = GetKeyArg(cx, args); if (!key) return false; ObjectValueMap *map = GetObjectMap(obj); if (map) { ObjectValueMap::Ptr ptr = map->lookup(key); if (ptr) { map->remove(ptr); args.rval() = BooleanValue(true); return true; } } args.rval() = BooleanValue(false); return true; }
JS::GetWeakMapEntry(JSContext *cx, HandleObject mapObj, HandleObject key, MutableHandleValue rval) { CHECK_REQUEST(cx); assertSameCompartment(cx, key); rval.setUndefined(); ObjectValueMap *map = mapObj->as<WeakMapObject>().getMap(); if (!map) return true; if (ObjectValueMap::Ptr ptr = map->lookup(key)) { // Read barrier to prevent an incorrectly gray value from escaping the // weak map. See the comment before UnmarkGrayChildren in gc/Marking.cpp ExposeValueToActiveJS(ptr->value().get()); rval.set(ptr->value()); } return true; }