Index: src/collection.js |
diff --git a/src/collection.js b/src/collection.js |
index c5604ab30f359b1287a664ed22d3656d8843b075..63ddbbb966b523257f04c622beabaf9b277f5e5f 100644 |
--- a/src/collection.js |
+++ b/src/collection.js |
@@ -34,6 +34,7 @@ |
var $Set = global.Set; |
var $Map = global.Map; |
var $WeakMap = global.WeakMap; |
+var $WeakSet = global.WeakSet; |
// Global sentinel to be used instead of undefined keys, which are not |
// supported internally but required for Harmony sets and maps. |
@@ -240,7 +241,7 @@ SetUpMap(); |
function WeakMapConstructor() { |
if (%_IsConstructCall()) { |
- %WeakMapInitialize(this); |
+ %WeakCollectionInitialize(this); |
} else { |
return new $WeakMap(); |
} |
@@ -255,7 +256,7 @@ function WeakMapGet(key) { |
if (!(IS_SPEC_OBJECT(key) || IS_SYMBOL(key))) { |
throw %MakeTypeError('invalid_weakmap_key', [this, key]); |
} |
- return %WeakMapGet(this, key); |
+ return %WeakCollectionGet(this, key); |
} |
@@ -267,7 +268,7 @@ function WeakMapSet(key, value) { |
if (!(IS_SPEC_OBJECT(key) || IS_SYMBOL(key))) { |
throw %MakeTypeError('invalid_weakmap_key', [this, key]); |
} |
- return %WeakMapSet(this, key, value); |
+ return %WeakCollectionSet(this, key, value); |
} |
@@ -279,7 +280,7 @@ function WeakMapHas(key) { |
if (!(IS_SPEC_OBJECT(key) || IS_SYMBOL(key))) { |
throw %MakeTypeError('invalid_weakmap_key', [this, key]); |
} |
- return %WeakMapHas(this, key); |
+ return %WeakCollectionHas(this, key); |
} |
@@ -291,7 +292,7 @@ function WeakMapDelete(key) { |
if (!(IS_SPEC_OBJECT(key) || IS_SYMBOL(key))) { |
throw %MakeTypeError('invalid_weakmap_key', [this, key]); |
} |
- return %WeakMapDelete(this, key); |
+ return %WeakCollectionDelete(this, key); |
} |
@@ -301,7 +302,7 @@ function WeakMapClear() { |
['WeakMap.prototype.clear', this]); |
} |
// Replace the internal table with a new empty table. |
- %WeakMapInitialize(this); |
+ %WeakCollectionInitialize(this); |
} |
@@ -325,3 +326,82 @@ function SetUpWeakMap() { |
} |
SetUpWeakMap(); |
+ |
+ |
+// ------------------------------------------------------------------- |
+// Harmony WeakSet |
+ |
+function WeakSetConstructor() { |
+ if (%_IsConstructCall()) { |
+ %WeakCollectionInitialize(this); |
+ } else { |
+ return new $WeakSet(); |
+ } |
+} |
+ |
+ |
+function WeakSetAdd(value) { |
+ if (!IS_WEAKSET(this)) { |
+ throw MakeTypeError('incompatible_method_receiver', |
+ ['WeakSet.prototype.add', this]); |
+ } |
+ if (!(IS_SPEC_OBJECT(value) || IS_SYMBOL(value))) { |
+ throw %MakeTypeError('invalid_weakset_value', [this, value]); |
+ } |
+ return %WeakCollectionSet(this, value, true); |
+} |
+ |
+ |
+function WeakSetHas(value) { |
+ if (!IS_WEAKSET(this)) { |
+ throw MakeTypeError('incompatible_method_receiver', |
+ ['WeakSet.prototype.has', this]); |
+ } |
+ if (!(IS_SPEC_OBJECT(value) || IS_SYMBOL(value))) { |
+ throw %MakeTypeError('invalid_weakset_value', [this, value]); |
+ } |
+ return %WeakCollectionHas(this, value); |
+} |
+ |
+ |
+function WeakSetDelete(value) { |
+ if (!IS_WEAKSET(this)) { |
+ throw MakeTypeError('incompatible_method_receiver', |
+ ['WeakSet.prototype.delete', this]); |
+ } |
+ if (!(IS_SPEC_OBJECT(value) || IS_SYMBOL(value))) { |
+ throw %MakeTypeError('invalid_weakset_value', [this, value]); |
+ } |
+ return %WeakCollectionDelete(this, value); |
+} |
+ |
+ |
+function WeakSetClear() { |
+ if (!IS_WEAKSET(this)) { |
+ throw MakeTypeError('incompatible_method_receiver', |
+ ['WeakSet.prototype.clear', this]); |
+ } |
+ // Replace the internal table with a new empty table. |
+ %WeakCollectionInitialize(this); |
+} |
+ |
+ |
+// ------------------------------------------------------------------- |
+ |
+function SetUpWeakSet() { |
+ %CheckIsBootstrapping(); |
+ |
+ %SetCode($WeakSet, WeakSetConstructor); |
+ %FunctionSetPrototype($WeakSet, new $Object()); |
+ %SetProperty($WeakSet.prototype, "constructor", $WeakSet, DONT_ENUM); |
+ |
+ // Set up the non-enumerable functions on the WeakSet prototype object. |
+ InstallFunctions($WeakSet.prototype, DONT_ENUM, $Array( |
+ "add", WeakSetAdd, |
+ "has", WeakSetHas, |
+ "delete", WeakSetDelete, |
+ "clear", WeakSetClear |
+ )); |
+} |
+ |
+SetUpWeakSet(); |