# HG changeset patch # User Till Schneidereit # Parent 52f2a044130d5d8a7e35ce5d94241a6f3192770d Bug 1101817 - Part 6: Remove Weak{Map,Set}.prototype.clear. r=evilpie diff --git a/js/src/builtin/WeakMapObject.cpp b/js/src/builtin/WeakMapObject.cpp --- a/js/src/builtin/WeakMapObject.cpp +++ b/js/src/builtin/WeakMapObject.cpp @@ -47,37 +47,16 @@ WeakMap_has_impl(JSContext* cx, const Ca bool js::WeakMap_has(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); return CallNonGenericMethod(cx, args); } MOZ_ALWAYS_INLINE bool -WeakMap_clear_impl(JSContext* cx, const CallArgs& args) -{ - MOZ_ASSERT(IsWeakMap(args.thisv())); - - // We can't js_delete the weakmap because the data gathered during GC is - // used by the Cycle Collector. - if (ObjectValueMap* map = args.thisv().toObject().as().getMap()) - map->clear(); - - args.rval().setUndefined(); - return true; -} - -bool -js::WeakMap_clear(JSContext* cx, unsigned argc, Value* vp) -{ - CallArgs args = CallArgsFromVp(argc, vp); - return CallNonGenericMethod(cx, args); -} - -MOZ_ALWAYS_INLINE bool WeakMap_get_impl(JSContext* cx, const CallArgs& args) { MOZ_ASSERT(IsWeakMap(args.thisv())); if (!args.get(0).isObject()) { args.rval().setUndefined(); return true; } @@ -425,17 +404,16 @@ const Class WeakMapObject::class_ = { WeakMap_mark }; static const JSFunctionSpec weak_map_methods[] = { JS_FN("has", WeakMap_has, 1, 0), JS_FN("get", WeakMap_get, 1, 0), JS_FN("delete", WeakMap_delete, 1, 0), JS_FN("set", WeakMap_set, 2, 0), - JS_FN("clear", WeakMap_clear, 0, 0), JS_FS_END }; static JSObject* InitWeakMapClass(JSContext* cx, HandleObject obj, bool defineMembers) { MOZ_ASSERT(obj->isNative()); diff --git a/js/src/builtin/WeakSet.js b/js/src/builtin/WeakSet.js --- a/js/src/builtin/WeakSet.js +++ b/js/src/builtin/WeakSet.js @@ -20,36 +20,17 @@ function WeakSet_add(value) { // Steps 7-8. callFunction(std_WeakMap_set, entries, value, true); // Step 8. return S; } -// 23.4.3.2 -function WeakSet_clear() { - // Step 1-3. - var S = this; - if (!IsObject(S) || !IsWeakSet(S)) - return callFunction(CallWeakSetMethodIfWrapped, this, "WeakSet_clear"); - - // Step 4. - let entries = UnsafeGetReservedSlot(this, WEAKSET_MAP_SLOT); - if (!entries) - ThrowTypeError(JSMSG_INCOMPATIBLE_PROTO, "WeakSet", "clear", typeof S); - - // Step 5. - callFunction(std_WeakMap_clear, entries); - - // Step 6. - return undefined; -} - -// 23.4.3.4 +// 23.4.3.3 function WeakSet_delete(value) { // Steps 1-3. var S = this; if (!IsObject(S) || !IsWeakSet(S)) return callFunction(CallWeakSetMethodIfWrapped, this, value, "WeakSet_delete"); // Step 4.,6. let entries = UnsafeGetReservedSlot(this, WEAKSET_MAP_SLOT); @@ -59,17 +40,17 @@ function WeakSet_delete(value) { // Step 5. if (!IsObject(value)) return false; // Steps 7-8. return callFunction(std_WeakMap_delete, entries, value); } -// 23.4.3.5 +// 23.4.3.4 function WeakSet_has(value) { // Steps 1-3. var S = this; if (!IsObject(S) || !IsWeakSet(S)) return callFunction(CallWeakSetMethodIfWrapped, this, value, "WeakSet_has"); // Step 4-5. let entries = UnsafeGetReservedSlot(this, WEAKSET_MAP_SLOT); diff --git a/js/src/builtin/WeakSetObject.cpp b/js/src/builtin/WeakSetObject.cpp --- a/js/src/builtin/WeakSetObject.cpp +++ b/js/src/builtin/WeakSetObject.cpp @@ -31,17 +31,16 @@ const Class WeakSetObject::class_ = { }; const JSPropertySpec WeakSetObject::properties[] = { JS_PS_END }; const JSFunctionSpec WeakSetObject::methods[] = { JS_SELF_HOSTED_FN("add", "WeakSet_add", 1, 0), - JS_SELF_HOSTED_FN("clear", "WeakSet_clear", 0, 0), JS_SELF_HOSTED_FN("delete", "WeakSet_delete", 1, 0), JS_SELF_HOSTED_FN("has", "WeakSet_has", 1, 0), JS_FS_END }; JSObject* WeakSetObject::initClass(JSContext* cx, JSObject* obj) { diff --git a/js/src/jit-test/tests/collections/WeakMap-clear.js b/js/src/jit-test/tests/collections/WeakMap-clear.js deleted file mode 100644 --- a/js/src/jit-test/tests/collections/WeakMap-clear.js +++ /dev/null @@ -1,42 +0,0 @@ -var key = {}; -var wm = new WeakMap(); - -assertEq(wm.has(key), false); -// Clearing an already empty WeakMap -wm.clear(); -assertEq(wm.has(key), false); - -// Clearing a WeakMap with a live key -wm.set(key, 42); -assertEq(wm.has(key), true); -wm.clear(); -assertEq(wm.has(key), false); - -// Clearing a WeakMap with keys turned to garbage -wm.set(key, {}); -for (var i = 0; i < 10; i++) - wm.set({}, {}); -assertEq(wm.has(key), true); -wm.clear(); -assertEq(wm.has(key), false); - -// Clearing a WeakMap with keys turned to garbage and after doing a GC -wm.set(key, {}); -for (var i = 0; i < 10; i++) - wm.set({}, {}); -assertEq(wm.has(key), true); -gc(); -assertEq(wm.has(key), true); -wm.clear(); -assertEq(wm.has(key), false); - -// More testing when the key is no longer live -wm.set(key, {}); -key = null; -wm.clear(); -gc(); -var key2 = {}; -wm.set(key2, {}); -key2 = null; -gc(); -wm.clear(); diff --git a/js/src/jit-test/tests/collections/WeakMap-surfaces.js b/js/src/jit-test/tests/collections/WeakMap-surfaces.js --- a/js/src/jit-test/tests/collections/WeakMap-surfaces.js +++ b/js/src/jit-test/tests/collections/WeakMap-surfaces.js @@ -25,9 +25,8 @@ function checkMethod(name, arity) { assertEq(desc.value.name, name); assertEq(desc.value.length, arity); } checkMethod("get", 1); checkMethod("has", 1); checkMethod("set", 2); checkMethod("delete", 1); -checkMethod("clear", 0); diff --git a/js/src/jit-test/tests/collections/WeakSet-clear.js b/js/src/jit-test/tests/collections/WeakSet-clear.js deleted file mode 100644 --- a/js/src/jit-test/tests/collections/WeakSet-clear.js +++ /dev/null @@ -1,50 +0,0 @@ -var value = {}; -var ws = new WeakSet(); - -assertEq(ws.has(value), false); -// Clearing an already empty WeakSet -assertEq(ws.clear(), undefined); -assertEq(ws.has(value), false); - -// Clearing a WeakSet with a live value -ws.add(value); -assertEq(ws.has(value), true); -ws.clear(); -assertEq(ws.has(value), false); - -// Clearing a WeakSet with values turned to garbage -ws.add(value); -for (var i = 0; i < 10; i++) - ws.add({}); -assertEq(ws.has(value), true); -ws.clear(); -assertEq(ws.has(value), false); - -// Clearing a WeakSet with values turned to garbage and after doing a GC -ws.add(value); -for (var i = 0; i < 10; i++) - ws.add({}); -assertEq(ws.has(value), true); -gc(); -assertEq(ws.has(value), true); -ws.clear(); -assertEq(ws.has(value), false); - -// More testing when the value is no longer live -ws.add(value); -value = null; -ws.clear(); -gc(); -var value2 = {}; -ws.add(value2); -value2 = null; -gc(); -ws.clear(); - -// Clearing a cross-compartment WeakSet with a live value -ws = new (newGlobal().WeakSet); -value = {}; -WeakSet.prototype.add.call(ws, value); -assertEq(WeakSet.prototype.has.call(ws, value), true); -WeakSet.prototype.clear.call(ws); -assertEq(WeakSet.prototype.has.call(ws, value), false); diff --git a/js/src/jit-test/tests/collections/WeakSet-delete.js b/js/src/jit-test/tests/collections/WeakSet-delete.js --- a/js/src/jit-test/tests/collections/WeakSet-delete.js +++ b/js/src/jit-test/tests/collections/WeakSet-delete.js @@ -5,23 +5,16 @@ assertEq(ws.delete({}), false); // Delete existing var value = {}; ws.add(value); assertEq(ws.has(value), true); assertEq(ws.delete(value), true); assertEq(ws.has(value), false); -// Delete after clear -ws.add(value); -assertEq(ws.has(value), true); -ws.clear(); -assertEq(ws.delete(value), false); -assertEq(ws.has(value), false); - // Delete non-empty for (var i = 0; i < 10; i++) ws.add({}); assertEq(ws.add(value), ws); assertEq(ws.has(value), true); assertEq(ws.delete(value), true); assertEq(ws.has(value), false); assertEq(ws.delete(value), false); diff --git a/js/src/jit-test/tests/collections/WeakSet-surface.js b/js/src/jit-test/tests/collections/WeakSet-surface.js --- a/js/src/jit-test/tests/collections/WeakSet-surface.js +++ b/js/src/jit-test/tests/collections/WeakSet-surface.js @@ -24,9 +24,8 @@ function checkMethod(name, arity) { assertEq(typeof desc.value, 'function'); assertEq(desc.value.name, name); assertEq(desc.value.length, arity); } checkMethod("has", 1); checkMethod("add", 1); checkMethod("delete", 1); -checkMethod("clear", 0); diff --git a/js/src/jsweakmap.h b/js/src/jsweakmap.h --- a/js/src/jsweakmap.h +++ b/js/src/jsweakmap.h @@ -363,19 +363,16 @@ extern bool WeakMap_get(JSContext* cx, unsigned argc, Value* vp); extern bool WeakMap_set(JSContext* cx, unsigned argc, Value* vp); extern bool WeakMap_delete(JSContext* cx, unsigned argc, Value* vp); -extern bool -WeakMap_clear(JSContext* cx, unsigned argc, Value* vp); - extern JSObject* InitWeakMapClass(JSContext* cx, HandleObject obj); class ObjectValueMap : public WeakMap> { public: diff --git a/js/src/vm/SelfHosting.cpp b/js/src/vm/SelfHosting.cpp --- a/js/src/vm/SelfHosting.cpp +++ b/js/src/vm/SelfHosting.cpp @@ -1484,17 +1484,16 @@ static const JSFunctionSpec intrinsic_fu JS_FN("std_String_startsWith", str_startsWith, 1,0), JS_FN("std_String_toLowerCase", str_toLowerCase, 0,0), JS_FN("std_String_toUpperCase", str_toUpperCase, 0,0), JS_FN("std_WeakMap_has", WeakMap_has, 1,0), JS_FN("std_WeakMap_get", WeakMap_get, 2,0), JS_FN("std_WeakMap_set", WeakMap_set, 2,0), JS_FN("std_WeakMap_delete", WeakMap_delete, 1,0), - JS_FN("std_WeakMap_clear", WeakMap_clear, 0,0), JS_FN("std_SIMD_Int8x16_extractLane", simd_int8x16_extractLane, 2,0), JS_FN("std_SIMD_Int16x8_extractLane", simd_int16x8_extractLane, 2,0), JS_INLINABLE_FN("std_SIMD_Int32x4_extractLane", simd_int32x4_extractLane, 2,0, SimdInt32x4), JS_FN("std_SIMD_Uint8x16_extractLane", simd_uint8x16_extractLane, 2,0), JS_FN("std_SIMD_Uint16x8_extractLane", simd_uint16x8_extractLane, 2,0), JS_FN("std_SIMD_Uint32x4_extractLane", simd_uint32x4_extractLane, 2,0), JS_INLINABLE_FN("std_SIMD_Float32x4_extractLane", simd_float32x4_extractLane,2,0, SimdFloat32x4),