diff options
Diffstat (limited to 'chromium/v8/src/collection.js')
-rw-r--r-- | chromium/v8/src/collection.js | 321 |
1 files changed, 70 insertions, 251 deletions
diff --git a/chromium/v8/src/collection.js b/chromium/v8/src/collection.js index 01537e87b09..0d8dd77f7bd 100644 --- a/chromium/v8/src/collection.js +++ b/chromium/v8/src/collection.js @@ -1,29 +1,6 @@ // Copyright 2012 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. "use strict"; @@ -33,12 +10,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. -var undefined_sentinel = {}; // ------------------------------------------------------------------- // Harmony Set @@ -52,48 +24,34 @@ function SetConstructor() { } -function SetAdd(key) { +function SetAddJS(key) { if (!IS_SET(this)) { throw MakeTypeError('incompatible_method_receiver', ['Set.prototype.add', this]); } - if (IS_UNDEFINED(key)) { - key = undefined_sentinel; - } return %SetAdd(this, key); } -function SetHas(key) { +function SetHasJS(key) { if (!IS_SET(this)) { throw MakeTypeError('incompatible_method_receiver', ['Set.prototype.has', this]); } - if (IS_UNDEFINED(key)) { - key = undefined_sentinel; - } return %SetHas(this, key); } -function SetDelete(key) { +function SetDeleteJS(key) { if (!IS_SET(this)) { throw MakeTypeError('incompatible_method_receiver', ['Set.prototype.delete', this]); } - if (IS_UNDEFINED(key)) { - key = undefined_sentinel; - } - if (%SetHas(this, key)) { - %SetDelete(this, key); - return true; - } else { - return false; - } + return %SetDelete(this, key); } -function SetGetSize() { +function SetGetSizeJS() { if (!IS_SET(this)) { throw MakeTypeError('incompatible_method_receiver', ['Set.prototype.size', this]); @@ -102,13 +60,32 @@ function SetGetSize() { } -function SetClear() { +function SetClearJS() { if (!IS_SET(this)) { throw MakeTypeError('incompatible_method_receiver', ['Set.prototype.clear', this]); } - // Replace the internal table with a new empty table. - %SetInitialize(this); + %SetClear(this); +} + + +function SetForEach(f, receiver) { + if (!IS_SET(this)) { + throw MakeTypeError('incompatible_method_receiver', + ['Set.prototype.forEach', this]); + } + + if (!IS_SPEC_FUNCTION(f)) { + throw MakeTypeError('called_non_callable', [f]); + } + + var iterator = new SetIterator(this, ITERATOR_KIND_VALUES); + var entry; + var stepping = %_DebugCallbackSupportsStepping(f); + while (!(entry = %SetIteratorNext(iterator)).done) { + if (stepping) %DebugPrepareStepInIfStepping(f); + %_CallFunction(receiver, entry.value, entry.value, this, f); + } } @@ -121,13 +98,16 @@ function SetUpSet() { %FunctionSetPrototype($Set, new $Object()); %SetProperty($Set.prototype, "constructor", $Set, DONT_ENUM); + %FunctionSetLength(SetForEach, 1); + // Set up the non-enumerable functions on the Set prototype object. - InstallGetter($Set.prototype, "size", SetGetSize); + InstallGetter($Set.prototype, "size", SetGetSizeJS); InstallFunctions($Set.prototype, DONT_ENUM, $Array( - "add", SetAdd, - "has", SetHas, - "delete", SetDelete, - "clear", SetClear + "add", SetAddJS, + "has", SetHasJS, + "delete", SetDeleteJS, + "clear", SetClearJS, + "forEach", SetForEach )); } @@ -146,55 +126,43 @@ function MapConstructor() { } -function MapGet(key) { +function MapGetJS(key) { if (!IS_MAP(this)) { throw MakeTypeError('incompatible_method_receiver', ['Map.prototype.get', this]); } - if (IS_UNDEFINED(key)) { - key = undefined_sentinel; - } return %MapGet(this, key); } -function MapSet(key, value) { +function MapSetJS(key, value) { if (!IS_MAP(this)) { throw MakeTypeError('incompatible_method_receiver', ['Map.prototype.set', this]); } - if (IS_UNDEFINED(key)) { - key = undefined_sentinel; - } return %MapSet(this, key, value); } -function MapHas(key) { +function MapHasJS(key) { if (!IS_MAP(this)) { throw MakeTypeError('incompatible_method_receiver', ['Map.prototype.has', this]); } - if (IS_UNDEFINED(key)) { - key = undefined_sentinel; - } return %MapHas(this, key); } -function MapDelete(key) { +function MapDeleteJS(key) { if (!IS_MAP(this)) { throw MakeTypeError('incompatible_method_receiver', ['Map.prototype.delete', this]); } - if (IS_UNDEFINED(key)) { - key = undefined_sentinel; - } return %MapDelete(this, key); } -function MapGetSize() { +function MapGetSizeJS() { if (!IS_MAP(this)) { throw MakeTypeError('incompatible_method_receiver', ['Map.prototype.size', this]); @@ -203,205 +171,56 @@ function MapGetSize() { } -function MapClear() { +function MapClearJS() { if (!IS_MAP(this)) { throw MakeTypeError('incompatible_method_receiver', ['Map.prototype.clear', this]); } - // Replace the internal table with a new empty table. - %MapInitialize(this); -} - - -// ------------------------------------------------------------------- - -function SetUpMap() { - %CheckIsBootstrapping(); - - %SetCode($Map, MapConstructor); - %FunctionSetPrototype($Map, new $Object()); - %SetProperty($Map.prototype, "constructor", $Map, DONT_ENUM); - - // Set up the non-enumerable functions on the Map prototype object. - InstallGetter($Map.prototype, "size", MapGetSize); - InstallFunctions($Map.prototype, DONT_ENUM, $Array( - "get", MapGet, - "set", MapSet, - "has", MapHas, - "delete", MapDelete, - "clear", MapClear - )); -} - -SetUpMap(); - - -// ------------------------------------------------------------------- -// Harmony WeakMap - -function WeakMapConstructor() { - if (%_IsConstructCall()) { - %WeakCollectionInitialize(this); - } else { - throw MakeTypeError('constructor_not_function', ['WeakMap']); - } -} - - -function WeakMapGet(key) { - if (!IS_WEAKMAP(this)) { - throw MakeTypeError('incompatible_method_receiver', - ['WeakMap.prototype.get', this]); - } - if (!(IS_SPEC_OBJECT(key) || IS_SYMBOL(key))) { - throw %MakeTypeError('invalid_weakmap_key', [this, key]); - } - return %WeakCollectionGet(this, key); -} - - -function WeakMapSet(key, value) { - if (!IS_WEAKMAP(this)) { - throw MakeTypeError('incompatible_method_receiver', - ['WeakMap.prototype.set', this]); - } - if (!(IS_SPEC_OBJECT(key) || IS_SYMBOL(key))) { - throw %MakeTypeError('invalid_weakmap_key', [this, key]); - } - return %WeakCollectionSet(this, key, value); + %MapClear(this); } -function WeakMapHas(key) { - if (!IS_WEAKMAP(this)) { +function MapForEach(f, receiver) { + if (!IS_MAP(this)) { throw MakeTypeError('incompatible_method_receiver', - ['WeakMap.prototype.has', this]); + ['Map.prototype.forEach', this]); } - if (!(IS_SPEC_OBJECT(key) || IS_SYMBOL(key))) { - throw %MakeTypeError('invalid_weakmap_key', [this, key]); - } - return %WeakCollectionHas(this, key); -} - -function WeakMapDelete(key) { - if (!IS_WEAKMAP(this)) { - throw MakeTypeError('incompatible_method_receiver', - ['WeakMap.prototype.delete', this]); - } - if (!(IS_SPEC_OBJECT(key) || IS_SYMBOL(key))) { - throw %MakeTypeError('invalid_weakmap_key', [this, key]); + if (!IS_SPEC_FUNCTION(f)) { + throw MakeTypeError('called_non_callable', [f]); } - return %WeakCollectionDelete(this, key); -} - -function WeakMapClear() { - if (!IS_WEAKMAP(this)) { - throw MakeTypeError('incompatible_method_receiver', - ['WeakMap.prototype.clear', this]); + var iterator = new MapIterator(this, ITERATOR_KIND_ENTRIES); + var entry; + var stepping = %_DebugCallbackSupportsStepping(f); + while (!(entry = %MapIteratorNext(iterator)).done) { + if (stepping) %DebugPrepareStepInIfStepping(f); + %_CallFunction(receiver, entry.value[1], entry.value[0], this, f); } - // Replace the internal table with a new empty table. - %WeakCollectionInitialize(this); } // ------------------------------------------------------------------- -function SetUpWeakMap() { +function SetUpMap() { %CheckIsBootstrapping(); - %SetCode($WeakMap, WeakMapConstructor); - %FunctionSetPrototype($WeakMap, new $Object()); - %SetProperty($WeakMap.prototype, "constructor", $WeakMap, DONT_ENUM); - - // Set up the non-enumerable functions on the WeakMap prototype object. - InstallFunctions($WeakMap.prototype, DONT_ENUM, $Array( - "get", WeakMapGet, - "set", WeakMapSet, - "has", WeakMapHas, - "delete", WeakMapDelete, - "clear", WeakMapClear - )); -} - -SetUpWeakMap(); - - -// ------------------------------------------------------------------- -// Harmony WeakSet - -function WeakSetConstructor() { - if (%_IsConstructCall()) { - %WeakCollectionInitialize(this); - } else { - throw MakeTypeError('constructor_not_function', ['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($Map, MapConstructor); + %FunctionSetPrototype($Map, new $Object()); + %SetProperty($Map.prototype, "constructor", $Map, DONT_ENUM); - %SetCode($WeakSet, WeakSetConstructor); - %FunctionSetPrototype($WeakSet, new $Object()); - %SetProperty($WeakSet.prototype, "constructor", $WeakSet, DONT_ENUM); + %FunctionSetLength(MapForEach, 1); - // 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 + // Set up the non-enumerable functions on the Map prototype object. + InstallGetter($Map.prototype, "size", MapGetSizeJS); + InstallFunctions($Map.prototype, DONT_ENUM, $Array( + "get", MapGetJS, + "set", MapSetJS, + "has", MapHasJS, + "delete", MapDeleteJS, + "clear", MapClearJS, + "forEach", MapForEach )); } -SetUpWeakSet(); +SetUpMap(); |