ES6: Make sure we do not store -0 as the key in Map/Set
BUG=v8:3515 LOG=Y R=adamk@chromium.org, dslomov@chromium.org Review URL: https://codereview.chromium.org/478683002 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@23204 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
eb7fcad7c5
commit
8d189e84b4
@ -49,6 +49,13 @@ function SetAddJS(key) {
|
|||||||
throw MakeTypeError('incompatible_method_receiver',
|
throw MakeTypeError('incompatible_method_receiver',
|
||||||
['Set.prototype.add', this]);
|
['Set.prototype.add', this]);
|
||||||
}
|
}
|
||||||
|
// Normalize -0 to +0 as required by the spec.
|
||||||
|
// Even though we use SameValueZero as the comparison for the keys we don't
|
||||||
|
// want to ever store -0 as the key since the key is directly exposed when
|
||||||
|
// doing iteration.
|
||||||
|
if (key === 0) {
|
||||||
|
key = 0;
|
||||||
|
}
|
||||||
return %SetAdd(this, key);
|
return %SetAdd(this, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -186,6 +193,13 @@ function MapSetJS(key, value) {
|
|||||||
throw MakeTypeError('incompatible_method_receiver',
|
throw MakeTypeError('incompatible_method_receiver',
|
||||||
['Map.prototype.set', this]);
|
['Map.prototype.set', this]);
|
||||||
}
|
}
|
||||||
|
// Normalize -0 to +0 as required by the spec.
|
||||||
|
// Even though we use SameValueZero as the comparison for the keys we don't
|
||||||
|
// want to ever store -0 as the key since the key is directly exposed when
|
||||||
|
// doing iteration.
|
||||||
|
if (key === 0) {
|
||||||
|
key = 0;
|
||||||
|
}
|
||||||
return %MapSet(this, key, value);
|
return %MapSet(this, key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,7 +117,8 @@ function TestMapBehavior2(m) {
|
|||||||
TestMapping(m, i / 10, new Object);
|
TestMapping(m, i / 10, new Object);
|
||||||
TestMapping(m, 'key-' + i, new Object);
|
TestMapping(m, 'key-' + i, new Object);
|
||||||
}
|
}
|
||||||
var keys = [ +0, -0, +Infinity, -Infinity, true, false, null, undefined ];
|
// -0 is handled in TestMinusZeroMap
|
||||||
|
var keys = [ 0, +Infinity, -Infinity, true, false, null, undefined ];
|
||||||
for (var i = 0; i < keys.length; i++) {
|
for (var i = 0; i < keys.length; i++) {
|
||||||
TestMapping(m, keys[i], new Object);
|
TestMapping(m, keys[i], new Object);
|
||||||
}
|
}
|
||||||
@ -495,24 +496,26 @@ for (var i = 9; i >= 0; i--) {
|
|||||||
|
|
||||||
|
|
||||||
(function TestMinusZeroSet() {
|
(function TestMinusZeroSet() {
|
||||||
var m = new Set();
|
var s = new Set();
|
||||||
m.add(0);
|
s.add(-0);
|
||||||
m.add(-0);
|
assertSame(0, s.values().next().value);
|
||||||
assertEquals(1, m.size);
|
s.add(0);
|
||||||
assertTrue(m.has(0));
|
assertEquals(1, s.size);
|
||||||
assertTrue(m.has(-0));
|
assertTrue(s.has(0));
|
||||||
|
assertTrue(s.has(-0));
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
(function TestMinusZeroMap() {
|
(function TestMinusZeroMap() {
|
||||||
var m = new Map();
|
var m = new Map();
|
||||||
m.set(0, 'plus');
|
|
||||||
m.set(-0, 'minus');
|
m.set(-0, 'minus');
|
||||||
|
assertSame(0, m.keys().next().value);
|
||||||
|
m.set(0, 'plus');
|
||||||
assertEquals(1, m.size);
|
assertEquals(1, m.size);
|
||||||
assertTrue(m.has(0));
|
assertTrue(m.has(0));
|
||||||
assertTrue(m.has(-0));
|
assertTrue(m.has(-0));
|
||||||
assertEquals('minus', m.get(0));
|
assertEquals('plus', m.get(0));
|
||||||
assertEquals('minus', m.get(-0));
|
assertEquals('plus', m.get(-0));
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user