Fix Harmony sets and maps to allow undefined as keys.

This uses a global sentinel as a replacement for undefined keys, which
are not supported internally but required for Harmony sets and maps.

R=rossberg@chromium.org
BUG=v8:1622
TEST=mjsunit/harmony/collections

Review URL: http://codereview.chromium.org/8439069

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@9873 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent ea185392
...@@ -32,6 +32,11 @@ const $WeakMap = global.WeakMap; ...@@ -32,6 +32,11 @@ const $WeakMap = global.WeakMap;
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Global sentinel to be used instead of undefined keys, which are not
// supported internally but required for Harmony sets and maps.
var undefined_sentinel = {};
function SetConstructor() { function SetConstructor() {
if (%_IsConstructCall()) { if (%_IsConstructCall()) {
%SetInitialize(this); %SetInitialize(this);
...@@ -42,16 +47,25 @@ function SetConstructor() { ...@@ -42,16 +47,25 @@ function SetConstructor() {
function SetAdd(key) { function SetAdd(key) {
if (IS_UNDEFINED(key)) {
key = undefined_sentinel;
}
return %SetAdd(this, key); return %SetAdd(this, key);
} }
function SetHas(key) { function SetHas(key) {
if (IS_UNDEFINED(key)) {
key = undefined_sentinel;
}
return %SetHas(this, key); return %SetHas(this, key);
} }
function SetDelete(key) { function SetDelete(key) {
if (IS_UNDEFINED(key)) {
key = undefined_sentinel;
}
return %SetDelete(this, key); return %SetDelete(this, key);
} }
...@@ -66,21 +80,33 @@ function MapConstructor() { ...@@ -66,21 +80,33 @@ function MapConstructor() {
function MapGet(key) { function MapGet(key) {
if (IS_UNDEFINED(key)) {
key = undefined_sentinel;
}
return %MapGet(this, key); return %MapGet(this, key);
} }
function MapSet(key, value) { function MapSet(key, value) {
if (IS_UNDEFINED(key)) {
key = undefined_sentinel;
}
return %MapSet(this, key, value); return %MapSet(this, key, value);
} }
function MapHas(key) { function MapHas(key) {
if (IS_UNDEFINED(key)) {
key = undefined_sentinel;
}
return !IS_UNDEFINED(%MapGet(this, key)); return !IS_UNDEFINED(%MapGet(this, key));
} }
function MapDelete(key) { function MapDelete(key) {
if (IS_UNDEFINED(key)) {
key = undefined_sentinel;
}
if (!IS_UNDEFINED(%MapGet(this, key))) { if (!IS_UNDEFINED(%MapGet(this, key))) {
%MapSet(this, key, void 0); %MapSet(this, key, void 0);
return true; return true;
......
...@@ -73,10 +73,15 @@ function TestSet(set, key) { ...@@ -73,10 +73,15 @@ function TestSet(set, key) {
function TestSetBehavior(set) { function TestSetBehavior(set) {
for (var i = 0; i < 20; i++) { for (var i = 0; i < 20; i++) {
TestSet(set, new Object); TestSet(set, new Object);
TestSet(set, i);
TestSet(set, i / 100);
TestSet(set, 'key-' + i);
}
var keys = [ +0, -0, +Infinity, -Infinity, true, false, null, undefined ];
for (var i = 0; i < keys.length; i++) {
TestSet(set, keys[i]);
} }
} }
TestSet(new Set, 23);
TestSet(new Set, 'foo');
TestSetBehavior(new Set); TestSetBehavior(new Set);
...@@ -101,7 +106,7 @@ function TestMapBehavior2(m) { ...@@ -101,7 +106,7 @@ 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 ]; var keys = [ +0, -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);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment