| Index: src/collection.js
|
| diff --git a/src/collection.js b/src/collection.js
|
| index 01537e87b0973cee8a65fc759c17fad43fbf7387..1f7aef4f0da6b02cf88974dd551992afe07105fc 100644
|
| --- a/src/collection.js
|
| +++ b/src/collection.js
|
| @@ -40,6 +40,22 @@ var $WeakSet = global.WeakSet;
|
| // supported internally but required for Harmony sets and maps.
|
| var undefined_sentinel = {};
|
|
|
| +
|
| +// Map and Set uses SameValueZero which means that +0 and -0 should be treated
|
| +// as the same value.
|
| +function NormalizeKey(key) {
|
| + if (IS_UNDEFINED(key)) {
|
| + return undefined_sentinel;
|
| + }
|
| +
|
| + if (key === 0) {
|
| + return 0;
|
| + }
|
| +
|
| + return key;
|
| +}
|
| +
|
| +
|
| // -------------------------------------------------------------------
|
| // Harmony Set
|
|
|
| @@ -57,10 +73,7 @@ function SetAdd(key) {
|
| throw MakeTypeError('incompatible_method_receiver',
|
| ['Set.prototype.add', this]);
|
| }
|
| - if (IS_UNDEFINED(key)) {
|
| - key = undefined_sentinel;
|
| - }
|
| - return %SetAdd(this, key);
|
| + return %SetAdd(this, NormalizeKey(key));
|
| }
|
|
|
|
|
| @@ -69,10 +82,7 @@ function SetHas(key) {
|
| throw MakeTypeError('incompatible_method_receiver',
|
| ['Set.prototype.has', this]);
|
| }
|
| - if (IS_UNDEFINED(key)) {
|
| - key = undefined_sentinel;
|
| - }
|
| - return %SetHas(this, key);
|
| + return %SetHas(this, NormalizeKey(key));
|
| }
|
|
|
|
|
| @@ -81,9 +91,7 @@ function SetDelete(key) {
|
| throw MakeTypeError('incompatible_method_receiver',
|
| ['Set.prototype.delete', this]);
|
| }
|
| - if (IS_UNDEFINED(key)) {
|
| - key = undefined_sentinel;
|
| - }
|
| + key = NormalizeKey(key);
|
| if (%SetHas(this, key)) {
|
| %SetDelete(this, key);
|
| return true;
|
| @@ -151,10 +159,7 @@ function MapGet(key) {
|
| throw MakeTypeError('incompatible_method_receiver',
|
| ['Map.prototype.get', this]);
|
| }
|
| - if (IS_UNDEFINED(key)) {
|
| - key = undefined_sentinel;
|
| - }
|
| - return %MapGet(this, key);
|
| + return %MapGet(this, NormalizeKey(key));
|
| }
|
|
|
|
|
| @@ -163,10 +168,7 @@ function MapSet(key, value) {
|
| throw MakeTypeError('incompatible_method_receiver',
|
| ['Map.prototype.set', this]);
|
| }
|
| - if (IS_UNDEFINED(key)) {
|
| - key = undefined_sentinel;
|
| - }
|
| - return %MapSet(this, key, value);
|
| + return %MapSet(this, NormalizeKey(key), value);
|
| }
|
|
|
|
|
| @@ -175,10 +177,7 @@ function MapHas(key) {
|
| throw MakeTypeError('incompatible_method_receiver',
|
| ['Map.prototype.has', this]);
|
| }
|
| - if (IS_UNDEFINED(key)) {
|
| - key = undefined_sentinel;
|
| - }
|
| - return %MapHas(this, key);
|
| + return %MapHas(this, NormalizeKey(key));
|
| }
|
|
|
|
|
| @@ -187,10 +186,7 @@ function MapDelete(key) {
|
| throw MakeTypeError('incompatible_method_receiver',
|
| ['Map.prototype.delete', this]);
|
| }
|
| - if (IS_UNDEFINED(key)) {
|
| - key = undefined_sentinel;
|
| - }
|
| - return %MapDelete(this, key);
|
| + return %MapDelete(this, NormalizeKey(key));
|
| }
|
|
|
|
|
|
|