diff options
Diffstat (limited to 'deps/v8/src/js')
-rw-r--r-- | deps/v8/src/js/OWNERS | 3 | ||||
-rw-r--r-- | deps/v8/src/js/array.js | 641 | ||||
-rw-r--r-- | deps/v8/src/js/collection-iterator.js | 178 | ||||
-rw-r--r-- | deps/v8/src/js/collection.js | 460 | ||||
-rw-r--r-- | deps/v8/src/js/intl.js | 175 | ||||
-rw-r--r-- | deps/v8/src/js/macros.py | 63 | ||||
-rw-r--r-- | deps/v8/src/js/max-min.js | 2 | ||||
-rw-r--r-- | deps/v8/src/js/messages.js | 10 | ||||
-rw-r--r-- | deps/v8/src/js/prologue.js | 54 | ||||
-rw-r--r-- | deps/v8/src/js/promise.js | 132 | ||||
-rw-r--r-- | deps/v8/src/js/proxy.js | 17 | ||||
-rw-r--r-- | deps/v8/src/js/spread.js | 2 | ||||
-rw-r--r-- | deps/v8/src/js/string.js | 403 | ||||
-rw-r--r-- | deps/v8/src/js/typedarray.js | 338 | ||||
-rw-r--r-- | deps/v8/src/js/v8natives.js | 41 | ||||
-rw-r--r-- | deps/v8/src/js/weak-collection.js | 147 |
16 files changed, 970 insertions, 1696 deletions
diff --git a/deps/v8/src/js/OWNERS b/deps/v8/src/js/OWNERS index f7002c723b..0108c712e3 100644 --- a/deps/v8/src/js/OWNERS +++ b/deps/v8/src/js/OWNERS @@ -4,8 +4,11 @@ adamk@chromium.org bmeurer@chromium.org cbruni@chromium.org ishell@chromium.org +jgruber@chromium.org jkummerow@chromium.org littledan@chromium.org rossberg@chromium.org verwaest@chromium.org yangguo@chromium.org + +# COMPONENT: Blink>JavaScript>Language diff --git a/deps/v8/src/js/array.js b/deps/v8/src/js/array.js index 2e22a521dc..e1834f758a 100644 --- a/deps/v8/src/js/array.js +++ b/deps/v8/src/js/array.js @@ -327,37 +327,42 @@ function SimpleMove(array, start_i, del_count, len, num_additional_args) { // ------------------------------------------------------------------- - -function ArrayToString() { - var array; - var func; - if (IS_ARRAY(this)) { - func = this.join; - if (func === ArrayJoin) { - return Join(this, this.length, ',', false); +var ArrayJoin; +DEFINE_METHOD( + GlobalArray.prototype, + toString() { + var array; + var func; + if (IS_ARRAY(this)) { + func = this.join; + if (func === ArrayJoin) { + return Join(this, this.length, ',', false); + } + array = this; + } else { + array = TO_OBJECT(this); + func = array.join; } - array = this; - } else { - array = TO_OBJECT(this); - func = array.join; - } - if (!IS_CALLABLE(func)) { - return %_Call(ObjectToString, array); + if (!IS_CALLABLE(func)) { + return %_Call(ObjectToString, array); + } + return %_Call(func, array); } - return %_Call(func, array); -} - +); function InnerArrayToLocaleString(array, length) { return Join(array, TO_LENGTH(length), ',', true); } -function ArrayToLocaleString() { - var array = TO_OBJECT(this); - var arrayLen = array.length; - return InnerArrayToLocaleString(array, arrayLen); -} +DEFINE_METHOD( + GlobalArray.prototype, + toLocaleString() { + var array = TO_OBJECT(this); + var arrayLen = array.length; + return InnerArrayToLocaleString(array, arrayLen); + } +); function InnerArrayJoin(separator, array, length) { @@ -378,19 +383,22 @@ function InnerArrayJoin(separator, array, length) { } -function ArrayJoin(separator) { - CHECK_OBJECT_COERCIBLE(this, "Array.prototype.join"); +DEFINE_METHOD( + GlobalArray.prototype, + join(separator) { + CHECK_OBJECT_COERCIBLE(this, "Array.prototype.join"); - var array = TO_OBJECT(this); - var length = TO_LENGTH(array.length); + var array = TO_OBJECT(this); + var length = TO_LENGTH(array.length); - return InnerArrayJoin(separator, array, length); -} + return InnerArrayJoin(separator, array, length); + } +); // Removes the last element from the array and returns it. See // ECMA-262, section 15.4.4.6. -function ArrayPop() { +function ArrayPopFallback() { CHECK_OBJECT_COERCIBLE(this, "Array.prototype.pop"); var array = TO_OBJECT(this); @@ -410,7 +418,7 @@ function ArrayPop() { // Appends the arguments to the end of the array and returns the new // length of the array. See ECMA-262, section 15.4.4.7. -function ArrayPush() { +function ArrayPushFallback() { CHECK_OBJECT_COERCIBLE(this, "Array.prototype.push"); var array = TO_OBJECT(this); @@ -512,26 +520,29 @@ function GenericArrayReverse(array, len) { } -function ArrayReverse() { - CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reverse"); +DEFINE_METHOD( + GlobalArray.prototype, + reverse() { + CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reverse"); - var array = TO_OBJECT(this); - var len = TO_LENGTH(array.length); - var isArray = IS_ARRAY(array); + var array = TO_OBJECT(this); + var len = TO_LENGTH(array.length); + var isArray = IS_ARRAY(array); - if (UseSparseVariant(array, len, isArray, len)) { - %NormalizeElements(array); - SparseReverse(array, len); - return array; - } else if (isArray && %_HasFastPackedElements(array)) { - return PackedArrayReverse(array, len); - } else { - return GenericArrayReverse(array, len); + if (UseSparseVariant(array, len, isArray, len)) { + %NormalizeElements(array); + SparseReverse(array, len); + return array; + } else if (isArray && %_HasFastPackedElements(array)) { + return PackedArrayReverse(array, len); + } else { + return GenericArrayReverse(array, len); + } } -} +); -function ArrayShift() { +function ArrayShiftFallback() { CHECK_OBJECT_COERCIBLE(this, "Array.prototype.shift"); var array = TO_OBJECT(this); @@ -558,7 +569,7 @@ function ArrayShift() { } -function ArrayUnshift(arg1) { // length == 1 +function ArrayUnshiftFallback(arg1) { // length == 1 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.unshift"); var array = TO_OBJECT(this); @@ -582,7 +593,7 @@ function ArrayUnshift(arg1) { // length == 1 } -function ArraySlice(start, end) { +function ArraySliceFallback(start, end) { CHECK_OBJECT_COERCIBLE(this, "Array.prototype.slice"); var array = TO_OBJECT(this); @@ -655,7 +666,7 @@ function ComputeSpliceDeleteCount(delete_count, num_arguments, len, start_i) { } -function ArraySplice(start, delete_count) { +function ArraySpliceFallback(start, delete_count) { CHECK_OBJECT_COERCIBLE(this, "Array.prototype.splice"); var num_arguments = arguments.length; @@ -992,121 +1003,133 @@ function InnerArraySort(array, length, comparefn) { } -function ArraySort(comparefn) { - CHECK_OBJECT_COERCIBLE(this, "Array.prototype.sort"); +DEFINE_METHOD( + GlobalArray.prototype, + sort(comparefn) { + CHECK_OBJECT_COERCIBLE(this, "Array.prototype.sort"); - var array = TO_OBJECT(this); - var length = TO_LENGTH(array.length); - return InnerArraySort(array, length, comparefn); -} + var array = TO_OBJECT(this); + var length = TO_LENGTH(array.length); + return InnerArraySort(array, length, comparefn); + } +); -function ArrayLastIndexOf(element, index) { - CHECK_OBJECT_COERCIBLE(this, "Array.prototype.lastIndexOf"); +DEFINE_METHOD_LEN( + GlobalArray.prototype, + lastIndexOf(element, index) { + CHECK_OBJECT_COERCIBLE(this, "Array.prototype.lastIndexOf"); - var array = this; - var length = TO_LENGTH(this.length); + var array = this; + var length = TO_LENGTH(this.length); - if (length == 0) return -1; - if (arguments.length < 2) { - index = length - 1; - } else { - index = INVERT_NEG_ZERO(TO_INTEGER(index)); - // If index is negative, index from end of the array. - if (index < 0) index += length; - // If index is still negative, do not search the array. - if (index < 0) return -1; - else if (index >= length) index = length - 1; - } - var min = 0; - var max = index; - if (UseSparseVariant(array, length, IS_ARRAY(array), index)) { - %NormalizeElements(array); - var indices = %GetArrayKeys(array, index + 1); - if (IS_NUMBER(indices)) { - // It's an interval. - max = indices; // Capped by index already. - // Fall through to loop below. + if (length == 0) return -1; + if (arguments.length < 2) { + index = length - 1; } else { - if (indices.length == 0) return -1; - // Get all the keys in sorted order. - var sortedKeys = GetSortedArrayKeys(array, indices); - var i = sortedKeys.length - 1; - while (i >= 0) { - var key = sortedKeys[i]; - if (array[key] === element) return key; - i--; + index = INVERT_NEG_ZERO(TO_INTEGER(index)); + // If index is negative, index from end of the array. + if (index < 0) index += length; + // If index is still negative, do not search the array. + if (index < 0) return -1; + else if (index >= length) index = length - 1; + } + var min = 0; + var max = index; + if (UseSparseVariant(array, length, IS_ARRAY(array), index)) { + %NormalizeElements(array); + var indices = %GetArrayKeys(array, index + 1); + if (IS_NUMBER(indices)) { + // It's an interval. + max = indices; // Capped by index already. + // Fall through to loop below. + } else { + if (indices.length == 0) return -1; + // Get all the keys in sorted order. + var sortedKeys = GetSortedArrayKeys(array, indices); + var i = sortedKeys.length - 1; + while (i >= 0) { + var key = sortedKeys[i]; + if (array[key] === element) return key; + i--; + } + return -1; + } + } + // Lookup through the array. + if (!IS_UNDEFINED(element)) { + for (var i = max; i >= min; i--) { + if (array[i] === element) return i; } return -1; } - } - // Lookup through the array. - if (!IS_UNDEFINED(element)) { for (var i = max; i >= min; i--) { - if (array[i] === element) return i; + if (IS_UNDEFINED(array[i]) && i in array) { + return i; + } } return -1; - } - for (var i = max; i >= min; i--) { - if (IS_UNDEFINED(array[i]) && i in array) { - return i; - } - } - return -1; -} + }, + 1 /* Set function length */ +); + // ES#sec-array.prototype.copywithin // (Array.prototype.copyWithin ( target, start [ , end ] ) -function ArrayCopyWithin(target, start, end) { - CHECK_OBJECT_COERCIBLE(this, "Array.prototype.copyWithin"); - - var array = TO_OBJECT(this); - var length = TO_LENGTH(array.length); - - target = TO_INTEGER(target); - var to; - if (target < 0) { - to = MaxSimple(length + target, 0); - } else { - to = MinSimple(target, length); - } +DEFINE_METHOD_LEN( + GlobalArray.prototype, + copyWithin(target, start, end) { + CHECK_OBJECT_COERCIBLE(this, "Array.prototype.copyWithin"); + + var array = TO_OBJECT(this); + var length = TO_LENGTH(array.length); + + target = TO_INTEGER(target); + var to; + if (target < 0) { + to = MaxSimple(length + target, 0); + } else { + to = MinSimple(target, length); + } - start = TO_INTEGER(start); - var from; - if (start < 0) { - from = MaxSimple(length + start, 0); - } else { - from = MinSimple(start, length); - } + start = TO_INTEGER(start); + var from; + if (start < 0) { + from = MaxSimple(length + start, 0); + } else { + from = MinSimple(start, length); + } - end = IS_UNDEFINED(end) ? length : TO_INTEGER(end); - var final; - if (end < 0) { - final = MaxSimple(length + end, 0); - } else { - final = MinSimple(end, length); - } + end = IS_UNDEFINED(end) ? length : TO_INTEGER(end); + var final; + if (end < 0) { + final = MaxSimple(length + end, 0); + } else { + final = MinSimple(end, length); + } - var count = MinSimple(final - from, length - to); - var direction = 1; - if (from < to && to < (from + count)) { - direction = -1; - from = from + count - 1; - to = to + count - 1; - } + var count = MinSimple(final - from, length - to); + var direction = 1; + if (from < to && to < (from + count)) { + direction = -1; + from = from + count - 1; + to = to + count - 1; + } - while (count > 0) { - if (from in array) { - array[to] = array[from]; - } else { - delete array[to]; + while (count > 0) { + if (from in array) { + array[to] = array[from]; + } else { + delete array[to]; + } + from = from + direction; + to = to + direction; + count--; } - from = from + direction; - to = to + direction; - count--; - } - return array; -} + return array; + }, + 2 /* Set function length */ +); function InnerArrayFind(predicate, thisArg, array, length) { @@ -1126,14 +1149,18 @@ function InnerArrayFind(predicate, thisArg, array, length) { // ES6 draft 07-15-13, section 15.4.3.23 -function ArrayFind(predicate, thisArg) { - CHECK_OBJECT_COERCIBLE(this, "Array.prototype.find"); +DEFINE_METHOD_LEN( + GlobalArray.prototype, + find(predicate, thisArg) { + CHECK_OBJECT_COERCIBLE(this, "Array.prototype.find"); - var array = TO_OBJECT(this); - var length = TO_INTEGER(array.length); + var array = TO_OBJECT(this); + var length = TO_INTEGER(array.length); - return InnerArrayFind(predicate, thisArg, array, length); -} + return InnerArrayFind(predicate, thisArg, array, length); + }, + 1 /* Set function length */ +); function InnerArrayFindIndex(predicate, thisArg, array, length) { @@ -1153,123 +1180,132 @@ function InnerArrayFindIndex(predicate, thisArg, array, length) { // ES6 draft 07-15-13, section 15.4.3.24 -function ArrayFindIndex(predicate, thisArg) { - CHECK_OBJECT_COERCIBLE(this, "Array.prototype.findIndex"); +DEFINE_METHOD_LEN( + GlobalArray.prototype, + findIndex(predicate, thisArg) { + CHECK_OBJECT_COERCIBLE(this, "Array.prototype.findIndex"); - var array = TO_OBJECT(this); - var length = TO_INTEGER(array.length); + var array = TO_OBJECT(this); + var length = TO_INTEGER(array.length); - return InnerArrayFindIndex(predicate, thisArg, array, length); -} + return InnerArrayFindIndex(predicate, thisArg, array, length); + }, + 1 /* Set function length */ +); // ES6, draft 04-05-14, section 22.1.3.6 -function ArrayFill(value, start, end) { - CHECK_OBJECT_COERCIBLE(this, "Array.prototype.fill"); +DEFINE_METHOD_LEN( + GlobalArray.prototype, + fill(value, start, end) { + CHECK_OBJECT_COERCIBLE(this, "Array.prototype.fill"); - var array = TO_OBJECT(this); - var length = TO_LENGTH(array.length); + var array = TO_OBJECT(this); + var length = TO_LENGTH(array.length); - var i = IS_UNDEFINED(start) ? 0 : TO_INTEGER(start); - var end = IS_UNDEFINED(end) ? length : TO_INTEGER(end); + var i = IS_UNDEFINED(start) ? 0 : TO_INTEGER(start); + var end = IS_UNDEFINED(end) ? length : TO_INTEGER(end); - if (i < 0) { - i += length; - if (i < 0) i = 0; - } else { - if (i > length) i = length; - } + if (i < 0) { + i += length; + if (i < 0) i = 0; + } else { + if (i > length) i = length; + } - if (end < 0) { - end += length; - if (end < 0) end = 0; - } else { - if (end > length) end = length; - } + if (end < 0) { + end += length; + if (end < 0) end = 0; + } else { + if (end > length) end = length; + } - if ((end - i) > 0 && %object_is_frozen(array)) { - throw %make_type_error(kArrayFunctionsOnFrozen); - } + if ((end - i) > 0 && %object_is_frozen(array)) { + throw %make_type_error(kArrayFunctionsOnFrozen); + } - for (; i < end; i++) - array[i] = value; - return array; -} + for (; i < end; i++) + array[i] = value; + return array; + }, + 1 /* Set function length */ +); // ES6, draft 10-14-14, section 22.1.2.1 -function ArrayFrom(arrayLike, mapfn, receiver) { - var items = TO_OBJECT(arrayLike); - var mapping = !IS_UNDEFINED(mapfn); - - if (mapping) { - if (!IS_CALLABLE(mapfn)) { - throw %make_type_error(kCalledNonCallable, mapfn); +DEFINE_METHOD_LEN( + GlobalArray, + 'from'(arrayLike, mapfn, receiver) { + var items = TO_OBJECT(arrayLike); + var mapping = !IS_UNDEFINED(mapfn); + + if (mapping) { + if (!IS_CALLABLE(mapfn)) { + throw %make_type_error(kCalledNonCallable, mapfn); + } } - } - var iterable = GetMethod(items, iteratorSymbol); - var k; - var result; - var mappedValue; - var nextValue; + var iterable = GetMethod(items, iteratorSymbol); + var k; + var result; + var mappedValue; + var nextValue; - if (!IS_UNDEFINED(iterable)) { - result = %IsConstructor(this) ? new this() : []; - k = 0; + if (!IS_UNDEFINED(iterable)) { + result = %IsConstructor(this) ? new this() : []; + k = 0; - for (nextValue of - { [iteratorSymbol]() { return GetIterator(items, iterable) } }) { - if (mapping) { - mappedValue = %_Call(mapfn, receiver, nextValue, k); - } else { - mappedValue = nextValue; + for (nextValue of + { [iteratorSymbol]() { return GetIterator(items, iterable) } }) { + if (mapping) { + mappedValue = %_Call(mapfn, receiver, nextValue, k); + } else { + mappedValue = nextValue; + } + %CreateDataProperty(result, k, mappedValue); + k++; } - %CreateDataProperty(result, k, mappedValue); - k++; - } - result.length = k; - return result; - } else { - var len = TO_LENGTH(items.length); - result = %IsConstructor(this) ? new this(len) : new GlobalArray(len); + result.length = k; + return result; + } else { + var len = TO_LENGTH(items.length); + result = %IsConstructor(this) ? new this(len) : new GlobalArray(len); - for (k = 0; k < len; ++k) { - nextValue = items[k]; - if (mapping) { - mappedValue = %_Call(mapfn, receiver, nextValue, k); - } else { - mappedValue = nextValue; + for (k = 0; k < len; ++k) { + nextValue = items[k]; + if (mapping) { + mappedValue = %_Call(mapfn, receiver, nextValue, k); + } else { + mappedValue = nextValue; + } + %CreateDataProperty(result, k, mappedValue); } - %CreateDataProperty(result, k, mappedValue); - } - - result.length = k; - return result; - } -} + result.length = k; + return result; + } + }, + 1 /* Set function length. */ +); // ES6, draft 05-22-14, section 22.1.2.3 -function ArrayOf(...args) { - var length = args.length; - var constructor = this; - // TODO: Implement IsConstructor (ES6 section 7.2.5) - var array = %IsConstructor(constructor) ? new constructor(length) : []; - for (var i = 0; i < length; i++) { - %CreateDataProperty(array, i, args[i]); +DEFINE_METHOD( + GlobalArray, + of(...args) { + var length = args.length; + var constructor = this; + // TODO: Implement IsConstructor (ES6 section 7.2.5) + var array = %IsConstructor(constructor) ? new constructor(length) : []; + for (var i = 0; i < length; i++) { + %CreateDataProperty(array, i, args[i]); + } + array.length = length; + return array; } - array.length = length; - return array; -} +); // ------------------------------------------------------------------- -// Set up non-enumerable constructor property on the Array.prototype -// object. -%AddNamedProperty(GlobalArray.prototype, "constructor", GlobalArray, - DONT_ENUM); - // Set up unscopable properties on the Array.prototype object. var unscopables = { __proto__: null, @@ -1287,107 +1323,64 @@ var unscopables = { %AddNamedProperty(GlobalArray.prototype, unscopablesSymbol, unscopables, DONT_ENUM | READ_ONLY); -%FunctionSetLength(ArrayFrom, 1); - -// Set up non-enumerable functions on the Array object. -utils.InstallFunctions(GlobalArray, DONT_ENUM, [ - "from", ArrayFrom, - "of", ArrayOf -]); - -var specialFunctions = %SpecialArrayFunctions(); - -function getFunction(name, jsBuiltin, len) { - var f = jsBuiltin; - if (specialFunctions.hasOwnProperty(name)) { - f = specialFunctions[name]; - } - if (!IS_UNDEFINED(len)) { - %FunctionSetLength(f, len); - } - return f; -}; +var ArrayIndexOf = GlobalArray.prototype.indexOf; +var ArrayJoin = GlobalArray.prototype.join; +var ArrayPop = GlobalArray.prototype.pop; +var ArrayPush = GlobalArray.prototype.push; +var ArraySlice = GlobalArray.prototype.slice; +var ArrayShift = GlobalArray.prototype.shift; +var ArraySort = GlobalArray.prototype.sort; +var ArraySplice = GlobalArray.prototype.splice; +var ArrayToString = GlobalArray.prototype.toString; +var ArrayUnshift = GlobalArray.prototype.unshift; // Array prototype functions that return iterators. They are exposed to the // public API via Template::SetIntrinsicDataProperty(). -var IteratorFunctions = { - "entries": getFunction("entries", null, 0), - "keys": getFunction("keys", null, 0), - "values": getFunction("values", null, 0) -} - -// Set up non-enumerable functions of the Array.prototype object and -// set their names. -// Manipulate the length of some of the functions to meet -// expectations set by ECMA-262 or Mozilla. -utils.InstallFunctions(GlobalArray.prototype, DONT_ENUM, [ - "toString", getFunction("toString", ArrayToString), - "toLocaleString", getFunction("toLocaleString", ArrayToLocaleString), - "join", getFunction("join", ArrayJoin), - "pop", getFunction("pop", ArrayPop), - "push", getFunction("push", ArrayPush, 1), - "reverse", getFunction("reverse", ArrayReverse), - "shift", getFunction("shift", ArrayShift), - "unshift", getFunction("unshift", ArrayUnshift, 1), - "slice", getFunction("slice", ArraySlice, 2), - "splice", getFunction("splice", ArraySplice, 2), - "sort", getFunction("sort", ArraySort), - "indexOf", getFunction("indexOf", null, 1), - "lastIndexOf", getFunction("lastIndexOf", ArrayLastIndexOf, 1), - "copyWithin", getFunction("copyWithin", ArrayCopyWithin, 2), - "find", getFunction("find", ArrayFind, 1), - "findIndex", getFunction("findIndex", ArrayFindIndex, 1), - "fill", getFunction("fill", ArrayFill, 1), - "includes", getFunction("includes", null, 1), - "entries", IteratorFunctions.entries, - "keys", IteratorFunctions.keys, - iteratorSymbol, IteratorFunctions.values -]); +var ArrayEntries = GlobalArray.prototype.entries; +var ArrayForEach = GlobalArray.prototype.forEach; +var ArrayKeys = GlobalArray.prototype.keys; +var ArrayValues = GlobalArray.prototype[iteratorSymbol]; -%FunctionSetName(IteratorFunctions.entries, "entries"); -%FunctionSetName(IteratorFunctions.keys, "keys"); -%FunctionSetName(IteratorFunctions.values, "values"); // The internal Array prototype doesn't need to be fancy, since it's never // exposed to user code. // Adding only the functions that are actually used. utils.SetUpLockedPrototype(InternalArray, GlobalArray(), [ - "indexOf", getFunction("indexOf", null), - "join", getFunction("join", ArrayJoin), - "pop", getFunction("pop", ArrayPop), - "push", getFunction("push", ArrayPush), - "shift", getFunction("shift", ArrayShift), - "sort", getFunction("sort", ArraySort), - "splice", getFunction("splice", ArraySplice) + "indexOf", ArrayIndexOf, + "join", ArrayJoin, + "pop", ArrayPop, + "push", ArrayPush, + "shift", ArrayShift, + "sort", ArraySort, + "splice", ArraySplice ]); utils.SetUpLockedPrototype(InternalPackedArray, GlobalArray(), [ - "join", getFunction("join", ArrayJoin), - "pop", getFunction("pop", ArrayPop), - "push", getFunction("push", ArrayPush), - "shift", getFunction("shift", ArrayShift) + "join", ArrayJoin, + "pop", ArrayPop, + "push", ArrayPush, + "shift", ArrayShift ]); // V8 extras get a separate copy of InternalPackedArray. We give them the basic // manipulation methods. utils.SetUpLockedPrototype(extrasUtils.InternalPackedArray, GlobalArray(), [ - "push", getFunction("push", ArrayPush), - "pop", getFunction("pop", ArrayPop), - "shift", getFunction("shift", ArrayShift), - "unshift", getFunction("unshift", ArrayUnshift), - "splice", getFunction("splice", ArraySplice), - "slice", getFunction("slice", ArraySlice) + "push", ArrayPush, + "pop", ArrayPop, + "shift", ArrayShift, + "unshift", ArrayUnshift, + "splice", ArraySplice, + "slice", ArraySlice ]); // ------------------------------------------------------------------- // Exports utils.Export(function(to) { - to.ArrayFrom = ArrayFrom; to.ArrayJoin = ArrayJoin; to.ArrayPush = ArrayPush; to.ArrayToString = ArrayToString; - to.ArrayValues = IteratorFunctions.values, + to.ArrayValues = ArrayValues; to.InnerArrayFind = InnerArrayFind; to.InnerArrayFindIndex = InnerArrayFindIndex; to.InnerArrayJoin = InnerArrayJoin; @@ -1396,15 +1389,17 @@ utils.Export(function(to) { }); %InstallToContext([ - "array_entries_iterator", IteratorFunctions.entries, - "array_keys_iterator", IteratorFunctions.keys, - "array_pop", ArrayPop, - "array_push", ArrayPush, - "array_shift", ArrayShift, - "array_splice", ArraySplice, - "array_slice", ArraySlice, - "array_unshift", ArrayUnshift, - "array_values_iterator", IteratorFunctions.values, + "array_entries_iterator", ArrayEntries, + "array_for_each_iterator", ArrayForEach, + "array_keys_iterator", ArrayKeys, + "array_values_iterator", ArrayValues, + // Fallback implementations of Array builtins. + "array_pop", ArrayPopFallback, + "array_push", ArrayPushFallback, + "array_shift", ArrayShiftFallback, + "array_splice", ArraySpliceFallback, + "array_slice", ArraySliceFallback, + "array_unshift", ArrayUnshiftFallback, ]); }); diff --git a/deps/v8/src/js/collection-iterator.js b/deps/v8/src/js/collection-iterator.js deleted file mode 100644 index 173f273f9b..0000000000 --- a/deps/v8/src/js/collection-iterator.js +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright 2014 the V8 project authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -(function(global, utils) { - -"use strict"; - -%CheckIsBootstrapping(); - -// ------------------------------------------------------------------- -// Imports - -var GlobalMap = global.Map; -var GlobalSet = global.Set; -var iteratorSymbol = utils.ImportNow("iterator_symbol"); -var MapIterator = utils.ImportNow("MapIterator"); -var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol"); -var SetIterator = utils.ImportNow("SetIterator"); - -// ------------------------------------------------------------------- - -function SetIteratorConstructor(set, kind) { - %SetIteratorInitialize(this, set, kind); -} - - -function SetIteratorNextJS() { - if (!IS_SET_ITERATOR(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'Set Iterator.prototype.next', this); - } - - var value_array = [UNDEFINED, UNDEFINED]; - var result = %_CreateIterResultObject(value_array, false); - switch (%SetIteratorNext(this, value_array)) { - case 0: - result.value = UNDEFINED; - result.done = true; - break; - case ITERATOR_KIND_VALUES: - result.value = value_array[0]; - break; - case ITERATOR_KIND_ENTRIES: - value_array[1] = value_array[0]; - break; - } - - return result; -} - - -function SetEntries() { - if (!IS_SET(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'Set.prototype.entries', this); - } - return new SetIterator(this, ITERATOR_KIND_ENTRIES); -} - - -function SetValues() { - if (!IS_SET(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'Set.prototype.values', this); - } - return new SetIterator(this, ITERATOR_KIND_VALUES); -} - -// ------------------------------------------------------------------- - -%SetCode(SetIterator, SetIteratorConstructor); -%FunctionSetInstanceClassName(SetIterator, 'Set Iterator'); -utils.InstallFunctions(SetIterator.prototype, DONT_ENUM, [ - 'next', SetIteratorNextJS -]); - -%AddNamedProperty(SetIterator.prototype, toStringTagSymbol, - "Set Iterator", READ_ONLY | DONT_ENUM); - -utils.InstallFunctions(GlobalSet.prototype, DONT_ENUM, [ - 'entries', SetEntries, - 'keys', SetValues, - 'values', SetValues -]); - -%AddNamedProperty(GlobalSet.prototype, iteratorSymbol, SetValues, DONT_ENUM); - -// ------------------------------------------------------------------- - -function MapIteratorConstructor(map, kind) { - %MapIteratorInitialize(this, map, kind); -} - - -function MapIteratorNextJS() { - if (!IS_MAP_ITERATOR(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'Map Iterator.prototype.next', this); - } - - var value_array = [UNDEFINED, UNDEFINED]; - var result = %_CreateIterResultObject(value_array, false); - switch (%MapIteratorNext(this, value_array)) { - case 0: - result.value = UNDEFINED; - result.done = true; - break; - case ITERATOR_KIND_KEYS: - result.value = value_array[0]; - break; - case ITERATOR_KIND_VALUES: - result.value = value_array[1]; - break; - // ITERATOR_KIND_ENTRIES does not need any processing. - } - - return result; -} - - -function MapEntries() { - if (!IS_MAP(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'Map.prototype.entries', this); - } - return new MapIterator(this, ITERATOR_KIND_ENTRIES); -} - - -function MapKeys() { - if (!IS_MAP(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'Map.prototype.keys', this); - } - return new MapIterator(this, ITERATOR_KIND_KEYS); -} - - -function MapValues() { - if (!IS_MAP(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'Map.prototype.values', this); - } - return new MapIterator(this, ITERATOR_KIND_VALUES); -} - -// ------------------------------------------------------------------- - -%SetCode(MapIterator, MapIteratorConstructor); -%FunctionSetInstanceClassName(MapIterator, 'Map Iterator'); -utils.InstallFunctions(MapIterator.prototype, DONT_ENUM, [ - 'next', MapIteratorNextJS -]); - -%AddNamedProperty(MapIterator.prototype, toStringTagSymbol, - "Map Iterator", READ_ONLY | DONT_ENUM); - - -utils.InstallFunctions(GlobalMap.prototype, DONT_ENUM, [ - 'entries', MapEntries, - 'keys', MapKeys, - 'values', MapValues -]); - -%AddNamedProperty(GlobalMap.prototype, iteratorSymbol, MapEntries, DONT_ENUM); - -// ------------------------------------------------------------------- -// Exports - -utils.Export(function(to) { - to.MapEntries = MapEntries; - to.MapIteratorNext = MapIteratorNextJS; - to.SetIteratorNext = SetIteratorNextJS; - to.SetValues = SetValues; -}); - -}) diff --git a/deps/v8/src/js/collection.js b/deps/v8/src/js/collection.js index adb2688618..e06dbb9e3f 100644 --- a/deps/v8/src/js/collection.js +++ b/deps/v8/src/js/collection.js @@ -3,6 +3,7 @@ // found in the LICENSE file. (function(global, utils) { + "use strict"; %CheckIsBootstrapping(); @@ -17,7 +18,6 @@ var hashCodeSymbol = utils.ImportNow("hash_code_symbol"); var MathRandom = global.Math.random; var MapIterator; var SetIterator; -var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol"); utils.Import(function(from) { MapIterator = from.MapIterator; @@ -119,350 +119,158 @@ function GetHash(key) { // ------------------------------------------------------------------- // Harmony Set -function SetConstructor(iterable) { - if (IS_UNDEFINED(new.target)) { - throw %make_type_error(kConstructorNotFunction, "Set"); - } - - %_SetInitialize(this); - - if (!IS_NULL_OR_UNDEFINED(iterable)) { - var adder = this.add; - if (!IS_CALLABLE(adder)) { - throw %make_type_error(kPropertyNotFunction, adder, 'add', this); +//Set up the non-enumerable functions on the Set prototype object. +DEFINE_METHODS( + GlobalSet.prototype, + { + add(key) { + if (!IS_SET(this)) { + throw %make_type_error(kIncompatibleMethodReceiver, '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; + } + var table = %_JSCollectionGetTable(this); + var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); + var hash = GetHash(key); + if (SetFindEntry(table, numBuckets, key, hash) !== NOT_FOUND) return this; + + var nof = ORDERED_HASH_TABLE_ELEMENT_COUNT(table); + var nod = ORDERED_HASH_TABLE_DELETED_COUNT(table); + var capacity = numBuckets << 1; + if ((nof + nod) >= capacity) { + // Need to grow, bail out to runtime. + %SetGrow(this); + // Re-load state from the grown backing store. + table = %_JSCollectionGetTable(this); + numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); + nof = ORDERED_HASH_TABLE_ELEMENT_COUNT(table); + nod = ORDERED_HASH_TABLE_DELETED_COUNT(table); + } + var entry = nof + nod; + var index = ORDERED_HASH_SET_ENTRY_TO_INDEX(entry, numBuckets); + var bucket = ORDERED_HASH_TABLE_HASH_TO_BUCKET(hash, numBuckets); + var chainEntry = ORDERED_HASH_TABLE_BUCKET_AT(table, bucket); + ORDERED_HASH_TABLE_SET_BUCKET_AT(table, bucket, entry); + ORDERED_HASH_TABLE_SET_ELEMENT_COUNT(table, nof + 1); + FIXED_ARRAY_SET(table, index, key); + FIXED_ARRAY_SET_SMI(table, index + 1, chainEntry); + return this; } - for (var value of iterable) { - %_Call(adder, this, value); + delete(key) { + if (!IS_SET(this)) { + throw %make_type_error(kIncompatibleMethodReceiver, + 'Set.prototype.delete', this); + } + var table = %_JSCollectionGetTable(this); + var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); + var hash = GetExistingHash(key); + if (IS_UNDEFINED(hash)) return false; + var entry = SetFindEntry(table, numBuckets, key, hash); + if (entry === NOT_FOUND) return false; + + var nof = ORDERED_HASH_TABLE_ELEMENT_COUNT(table) - 1; + var nod = ORDERED_HASH_TABLE_DELETED_COUNT(table) + 1; + var index = ORDERED_HASH_SET_ENTRY_TO_INDEX(entry, numBuckets); + FIXED_ARRAY_SET(table, index, %_TheHole()); + ORDERED_HASH_TABLE_SET_ELEMENT_COUNT(table, nof); + ORDERED_HASH_TABLE_SET_DELETED_COUNT(table, nod); + if (nof < (numBuckets >>> 1)) %SetShrink(this); + return true; } } -} - - -function SetAdd(key) { - if (!IS_SET(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, '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; - } - var table = %_JSCollectionGetTable(this); - var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); - var hash = GetHash(key); - if (SetFindEntry(table, numBuckets, key, hash) !== NOT_FOUND) return this; - - var nof = ORDERED_HASH_TABLE_ELEMENT_COUNT(table); - var nod = ORDERED_HASH_TABLE_DELETED_COUNT(table); - var capacity = numBuckets << 1; - if ((nof + nod) >= capacity) { - // Need to grow, bail out to runtime. - %SetGrow(this); - // Re-load state from the grown backing store. - table = %_JSCollectionGetTable(this); - numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); - nof = ORDERED_HASH_TABLE_ELEMENT_COUNT(table); - nod = ORDERED_HASH_TABLE_DELETED_COUNT(table); - } - var entry = nof + nod; - var index = ORDERED_HASH_SET_ENTRY_TO_INDEX(entry, numBuckets); - var bucket = ORDERED_HASH_TABLE_HASH_TO_BUCKET(hash, numBuckets); - var chainEntry = ORDERED_HASH_TABLE_BUCKET_AT(table, bucket); - ORDERED_HASH_TABLE_SET_BUCKET_AT(table, bucket, entry); - ORDERED_HASH_TABLE_SET_ELEMENT_COUNT(table, nof + 1); - FIXED_ARRAY_SET(table, index, key); - FIXED_ARRAY_SET_SMI(table, index + 1, chainEntry); - return this; -} - - -function SetHas(key) { - if (!IS_SET(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, 'Set.prototype.has', this); - } - var table = %_JSCollectionGetTable(this); - var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); - var hash = GetExistingHash(key); - if (IS_UNDEFINED(hash)) return false; - return SetFindEntry(table, numBuckets, key, hash) !== NOT_FOUND; -} - - -function SetDelete(key) { - if (!IS_SET(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'Set.prototype.delete', this); - } - var table = %_JSCollectionGetTable(this); - var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); - var hash = GetExistingHash(key); - if (IS_UNDEFINED(hash)) return false; - var entry = SetFindEntry(table, numBuckets, key, hash); - if (entry === NOT_FOUND) return false; - - var nof = ORDERED_HASH_TABLE_ELEMENT_COUNT(table) - 1; - var nod = ORDERED_HASH_TABLE_DELETED_COUNT(table) + 1; - var index = ORDERED_HASH_SET_ENTRY_TO_INDEX(entry, numBuckets); - FIXED_ARRAY_SET(table, index, %_TheHole()); - ORDERED_HASH_TABLE_SET_ELEMENT_COUNT(table, nof); - ORDERED_HASH_TABLE_SET_DELETED_COUNT(table, nod); - if (nof < (numBuckets >>> 1)) %SetShrink(this); - return true; -} - - -function SetGetSize() { - if (!IS_SET(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'Set.prototype.size', this); - } - var table = %_JSCollectionGetTable(this); - return ORDERED_HASH_TABLE_ELEMENT_COUNT(table); -} - - -function SetClearJS() { - if (!IS_SET(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'Set.prototype.clear', this); - } - %_SetClear(this); -} - - -function SetForEach(f, receiver) { - if (!IS_SET(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'Set.prototype.forEach', this); - } - - if (!IS_CALLABLE(f)) throw %make_type_error(kCalledNonCallable, f); - - var iterator = new SetIterator(this, ITERATOR_KIND_VALUES); - var key; - var value_array = [UNDEFINED]; - while (%SetIteratorNext(iterator, value_array)) { - key = value_array[0]; - %_Call(f, receiver, key, key, this); - } -} - -// ------------------------------------------------------------------- - -%SetCode(GlobalSet, SetConstructor); -%FunctionSetLength(GlobalSet, 0); -%FunctionSetPrototype(GlobalSet, new GlobalObject()); -%AddNamedProperty(GlobalSet.prototype, "constructor", GlobalSet, DONT_ENUM); -%AddNamedProperty(GlobalSet.prototype, toStringTagSymbol, "Set", - DONT_ENUM | READ_ONLY); - -%FunctionSetLength(SetForEach, 1); - -// Set up the non-enumerable functions on the Set prototype object. -utils.InstallGetter(GlobalSet.prototype, "size", SetGetSize); -utils.InstallFunctions(GlobalSet.prototype, DONT_ENUM, [ - "add", SetAdd, - "has", SetHas, - "delete", SetDelete, - "clear", SetClearJS, - "forEach", SetForEach -]); +); - -// ------------------------------------------------------------------- // Harmony Map -function MapConstructor(iterable) { - if (IS_UNDEFINED(new.target)) { - throw %make_type_error(kConstructorNotFunction, "Map"); - } +//Set up the non-enumerable functions on the Map prototype object. +DEFINE_METHODS( + GlobalMap.prototype, + { + set(key, value) { + if (!IS_MAP(this)) { + throw %make_type_error(kIncompatibleMethodReceiver, + '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; + } - %_MapInitialize(this); + var table = %_JSCollectionGetTable(this); + var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); + var hash = GetHash(key); + var entry = MapFindEntry(table, numBuckets, key, hash); + if (entry !== NOT_FOUND) { + var existingIndex = ORDERED_HASH_MAP_ENTRY_TO_INDEX(entry, numBuckets); + FIXED_ARRAY_SET(table, existingIndex + 1, value); + return this; + } - if (!IS_NULL_OR_UNDEFINED(iterable)) { - var adder = this.set; - if (!IS_CALLABLE(adder)) { - throw %make_type_error(kPropertyNotFunction, adder, 'set', this); + var nof = ORDERED_HASH_TABLE_ELEMENT_COUNT(table); + var nod = ORDERED_HASH_TABLE_DELETED_COUNT(table); + var capacity = numBuckets << 1; + if ((nof + nod) >= capacity) { + // Need to grow, bail out to runtime. + %MapGrow(this); + // Re-load state from the grown backing store. + table = %_JSCollectionGetTable(this); + numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); + nof = ORDERED_HASH_TABLE_ELEMENT_COUNT(table); + nod = ORDERED_HASH_TABLE_DELETED_COUNT(table); + } + entry = nof + nod; + var index = ORDERED_HASH_MAP_ENTRY_TO_INDEX(entry, numBuckets); + var bucket = ORDERED_HASH_TABLE_HASH_TO_BUCKET(hash, numBuckets); + var chainEntry = ORDERED_HASH_TABLE_BUCKET_AT(table, bucket); + ORDERED_HASH_TABLE_SET_BUCKET_AT(table, bucket, entry); + ORDERED_HASH_TABLE_SET_ELEMENT_COUNT(table, nof + 1); + FIXED_ARRAY_SET(table, index, key); + FIXED_ARRAY_SET(table, index + 1, value); + FIXED_ARRAY_SET(table, index + 2, chainEntry); + return this; } - for (var nextItem of iterable) { - if (!IS_RECEIVER(nextItem)) { - throw %make_type_error(kIteratorValueNotAnObject, nextItem); + delete(key) { + if (!IS_MAP(this)) { + throw %make_type_error(kIncompatibleMethodReceiver, + 'Map.prototype.delete', this); } - %_Call(adder, this, nextItem[0], nextItem[1]); + var table = %_JSCollectionGetTable(this); + var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); + var hash = GetHash(key); + var entry = MapFindEntry(table, numBuckets, key, hash); + if (entry === NOT_FOUND) return false; + + var nof = ORDERED_HASH_TABLE_ELEMENT_COUNT(table) - 1; + var nod = ORDERED_HASH_TABLE_DELETED_COUNT(table) + 1; + var index = ORDERED_HASH_MAP_ENTRY_TO_INDEX(entry, numBuckets); + FIXED_ARRAY_SET(table, index, %_TheHole()); + FIXED_ARRAY_SET(table, index + 1, %_TheHole()); + ORDERED_HASH_TABLE_SET_ELEMENT_COUNT(table, nof); + ORDERED_HASH_TABLE_SET_DELETED_COUNT(table, nod); + if (nof < (numBuckets >>> 1)) %MapShrink(this); + return true; } } -} - - -function MapGet(key) { - if (!IS_MAP(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'Map.prototype.get', this); - } - var table = %_JSCollectionGetTable(this); - var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); - var hash = GetExistingHash(key); - if (IS_UNDEFINED(hash)) return UNDEFINED; - var entry = MapFindEntry(table, numBuckets, key, hash); - if (entry === NOT_FOUND) return UNDEFINED; - return ORDERED_HASH_MAP_VALUE_AT(table, entry, numBuckets); -} - - -function MapSet(key, value) { - if (!IS_MAP(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - '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; - } - - var table = %_JSCollectionGetTable(this); - var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); - var hash = GetHash(key); - var entry = MapFindEntry(table, numBuckets, key, hash); - if (entry !== NOT_FOUND) { - var existingIndex = ORDERED_HASH_MAP_ENTRY_TO_INDEX(entry, numBuckets); - FIXED_ARRAY_SET(table, existingIndex + 1, value); - return this; - } - - var nof = ORDERED_HASH_TABLE_ELEMENT_COUNT(table); - var nod = ORDERED_HASH_TABLE_DELETED_COUNT(table); - var capacity = numBuckets << 1; - if ((nof + nod) >= capacity) { - // Need to grow, bail out to runtime. - %MapGrow(this); - // Re-load state from the grown backing store. - table = %_JSCollectionGetTable(this); - numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); - nof = ORDERED_HASH_TABLE_ELEMENT_COUNT(table); - nod = ORDERED_HASH_TABLE_DELETED_COUNT(table); - } - entry = nof + nod; - var index = ORDERED_HASH_MAP_ENTRY_TO_INDEX(entry, numBuckets); - var bucket = ORDERED_HASH_TABLE_HASH_TO_BUCKET(hash, numBuckets); - var chainEntry = ORDERED_HASH_TABLE_BUCKET_AT(table, bucket); - ORDERED_HASH_TABLE_SET_BUCKET_AT(table, bucket, entry); - ORDERED_HASH_TABLE_SET_ELEMENT_COUNT(table, nof + 1); - FIXED_ARRAY_SET(table, index, key); - FIXED_ARRAY_SET(table, index + 1, value); - FIXED_ARRAY_SET(table, index + 2, chainEntry); - return this; -} - - -function MapHas(key) { - if (!IS_MAP(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'Map.prototype.has', this); - } - var table = %_JSCollectionGetTable(this); - var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); - var hash = GetHash(key); - return MapFindEntry(table, numBuckets, key, hash) !== NOT_FOUND; -} - - -function MapDelete(key) { - if (!IS_MAP(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'Map.prototype.delete', this); - } - var table = %_JSCollectionGetTable(this); - var numBuckets = ORDERED_HASH_TABLE_BUCKET_COUNT(table); - var hash = GetHash(key); - var entry = MapFindEntry(table, numBuckets, key, hash); - if (entry === NOT_FOUND) return false; - - var nof = ORDERED_HASH_TABLE_ELEMENT_COUNT(table) - 1; - var nod = ORDERED_HASH_TABLE_DELETED_COUNT(table) + 1; - var index = ORDERED_HASH_MAP_ENTRY_TO_INDEX(entry, numBuckets); - FIXED_ARRAY_SET(table, index, %_TheHole()); - FIXED_ARRAY_SET(table, index + 1, %_TheHole()); - ORDERED_HASH_TABLE_SET_ELEMENT_COUNT(table, nof); - ORDERED_HASH_TABLE_SET_DELETED_COUNT(table, nod); - if (nof < (numBuckets >>> 1)) %MapShrink(this); - return true; -} - - -function MapGetSize() { - if (!IS_MAP(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'Map.prototype.size', this); - } - var table = %_JSCollectionGetTable(this); - return ORDERED_HASH_TABLE_ELEMENT_COUNT(table); -} - - -function MapClearJS() { - if (!IS_MAP(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'Map.prototype.clear', this); - } - %_MapClear(this); -} - - -function MapForEach(f, receiver) { - if (!IS_MAP(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'Map.prototype.forEach', this); - } - - if (!IS_CALLABLE(f)) throw %make_type_error(kCalledNonCallable, f); - - var iterator = new MapIterator(this, ITERATOR_KIND_ENTRIES); - var value_array = [UNDEFINED, UNDEFINED]; - while (%MapIteratorNext(iterator, value_array)) { - %_Call(f, receiver, value_array[1], value_array[0], this); - } -} - -// ------------------------------------------------------------------- - -%SetCode(GlobalMap, MapConstructor); -%FunctionSetLength(GlobalMap, 0); -%FunctionSetPrototype(GlobalMap, new GlobalObject()); -%AddNamedProperty(GlobalMap.prototype, "constructor", GlobalMap, DONT_ENUM); -%AddNamedProperty( - GlobalMap.prototype, toStringTagSymbol, "Map", DONT_ENUM | READ_ONLY); - -%FunctionSetLength(MapForEach, 1); - -// Set up the non-enumerable functions on the Map prototype object. -utils.InstallGetter(GlobalMap.prototype, "size", MapGetSize); -utils.InstallFunctions(GlobalMap.prototype, DONT_ENUM, [ - "get", MapGet, - "set", MapSet, - "has", MapHas, - "delete", MapDelete, - "clear", MapClearJS, - "forEach", MapForEach -]); +); // ----------------------------------------------------------------------- // Exports %InstallToContext([ - "map_get", MapGet, - "map_set", MapSet, - "map_has", MapHas, - "map_delete", MapDelete, - "set_add", SetAdd, - "set_has", SetHas, - "set_delete", SetDelete, + "map_set", GlobalMap.prototype.set, + "map_delete", GlobalMap.prototype.delete, + "set_add", GlobalSet.prototype.add, + "set_delete", GlobalSet.prototype.delete, ]); utils.Export(function(to) { diff --git a/deps/v8/src/js/intl.js b/deps/v8/src/js/intl.js index cb83cfc1f5..1579337fc1 100644 --- a/deps/v8/src/js/intl.js +++ b/deps/v8/src/js/intl.js @@ -29,15 +29,11 @@ var GlobalNumber = global.Number; var GlobalRegExp = global.RegExp; var GlobalString = global.String; var IntlFallbackSymbol = utils.ImportNow("intl_fallback_symbol"); -var InstallFunctions = utils.InstallFunctions; -var InstallGetter = utils.InstallGetter; var InternalArray = utils.InternalArray; var MaxSimple; var ObjectHasOwnProperty = global.Object.prototype.hasOwnProperty; -var OverrideFunction = utils.OverrideFunction; var patternSymbol = utils.ImportNow("intl_pattern_symbol"); var resolvedSymbol = utils.ImportNow("intl_resolved_symbol"); -var SetFunctionName = utils.SetFunctionName; var StringSubstr = GlobalString.prototype.substr; var StringSubstring = GlobalString.prototype.substring; @@ -49,11 +45,6 @@ utils.Import(function(from) { // Utilities for definitions -function InstallFunction(object, name, func) { - InstallFunctions(object, DONT_ENUM, [name, func]); -} - - /** * Adds bound method to the prototype of the given object. */ @@ -61,41 +52,36 @@ function AddBoundMethod(obj, methodName, implementation, length, typename, compat) { %CheckIsBootstrapping(); var internalName = %CreatePrivateSymbol(methodName); - // Making getter an anonymous function will cause - // %DefineGetterPropertyUnchecked to properly set the "name" - // property on each JSFunction instance created here, rather - // than (as utils.InstallGetter would) on the SharedFunctionInfo - // associated with all functions returned from AddBoundMethod. - var getter = ANONYMOUS_FUNCTION(function() { - var receiver = Unwrap(this, typename, obj, methodName, compat); - if (IS_UNDEFINED(receiver[internalName])) { - var boundMethod; - if (IS_UNDEFINED(length) || length === 2) { - boundMethod = - ANONYMOUS_FUNCTION((fst, snd) => implementation(receiver, fst, snd)); - } else if (length === 1) { - boundMethod = ANONYMOUS_FUNCTION(fst => implementation(receiver, fst)); - } else { - boundMethod = ANONYMOUS_FUNCTION((...args) => { - // DateTimeFormat.format needs to be 0 arg method, but can still - // receive an optional dateValue param. If one was provided, pass it - // along. - if (args.length > 0) { - return implementation(receiver, args[0]); - } else { - return implementation(receiver); - } - }); + + DEFINE_METHOD( + obj.prototype, + get [methodName]() { + var receiver = Unwrap(this, typename, obj, methodName, compat); + if (IS_UNDEFINED(receiver[internalName])) { + var boundMethod; + if (IS_UNDEFINED(length) || length === 2) { + boundMethod = + ANONYMOUS_FUNCTION((fst, snd) => implementation(receiver, fst, snd)); + } else if (length === 1) { + boundMethod = ANONYMOUS_FUNCTION(fst => implementation(receiver, fst)); + } else { + boundMethod = ANONYMOUS_FUNCTION((...args) => { + // DateTimeFormat.format needs to be 0 arg method, but can still + // receive an optional dateValue param. If one was provided, pass it + // along. + if (args.length > 0) { + return implementation(receiver, args[0]); + } else { + return implementation(receiver); + } + }); + } + %SetNativeFlag(boundMethod); + receiver[internalName] = boundMethod; } - %SetNativeFlag(boundMethod); - receiver[internalName] = boundMethod; + return receiver[internalName]; } - return receiver[internalName]; - }); - - %FunctionRemovePrototype(getter); - %DefineGetterPropertyUnchecked(obj.prototype, methodName, getter, DONT_ENUM); - %SetNativeFlag(getter); + ); } function IntlConstruct(receiver, constructor, create, newTarget, args, @@ -914,7 +900,9 @@ function BuildLanguageTagREs() { } // ECMA 402 section 8.2.1 -InstallFunction(GlobalIntl, 'getCanonicalLocales', function(locales) { +DEFINE_METHOD( + GlobalIntl, + getCanonicalLocales(locales) { return makeArray(canonicalizeLocaleList(locales)); } ); @@ -1035,7 +1023,9 @@ function CollatorConstructor() { /** * Collator resolvedOptions method. */ -InstallFunction(GlobalIntlCollator.prototype, 'resolvedOptions', function() { +DEFINE_METHOD( + GlobalIntlCollator.prototype, + resolvedOptions() { var coll = Unwrap(this, 'collator', GlobalIntlCollator, 'resolvedOptions', false); return { @@ -1057,7 +1047,9 @@ InstallFunction(GlobalIntlCollator.prototype, 'resolvedOptions', function() { * order in the returned list as in the input list. * Options are optional parameter. */ -InstallFunction(GlobalIntlCollator, 'supportedLocalesOf', function(locales) { +DEFINE_METHOD( + GlobalIntlCollator, + supportedLocalesOf(locales) { return supportedLocalesOf('collator', locales, arguments[1]); } ); @@ -1254,8 +1246,9 @@ function NumberFormatConstructor() { /** * NumberFormat resolvedOptions method. */ -InstallFunction(GlobalIntlNumberFormat.prototype, 'resolvedOptions', - function() { +DEFINE_METHOD( + GlobalIntlNumberFormat.prototype, + resolvedOptions() { var format = Unwrap(this, 'numberformat', GlobalIntlNumberFormat, 'resolvedOptions', true); var result = { @@ -1295,8 +1288,9 @@ InstallFunction(GlobalIntlNumberFormat.prototype, 'resolvedOptions', * order in the returned list as in the input list. * Options are optional parameter. */ -InstallFunction(GlobalIntlNumberFormat, 'supportedLocalesOf', - function(locales) { +DEFINE_METHOD( + GlobalIntlNumberFormat, + supportedLocalesOf(locales) { return supportedLocalesOf('numberformat', locales, arguments[1]); } ); @@ -1614,8 +1608,9 @@ function DateTimeFormatConstructor() { /** * DateTimeFormat resolvedOptions method. */ -InstallFunction(GlobalIntlDateTimeFormat.prototype, 'resolvedOptions', - function() { +DEFINE_METHOD( + GlobalIntlDateTimeFormat.prototype, + resolvedOptions() { var format = Unwrap(this, 'dateformat', GlobalIntlDateTimeFormat, 'resolvedOptions', true); @@ -1666,8 +1661,9 @@ InstallFunction(GlobalIntlDateTimeFormat.prototype, 'resolvedOptions', * order in the returned list as in the input list. * Options are optional parameter. */ -InstallFunction(GlobalIntlDateTimeFormat, 'supportedLocalesOf', - function(locales) { +DEFINE_METHOD( + GlobalIntlDateTimeFormat, + supportedLocalesOf(locales) { return supportedLocalesOf('dateformat', locales, arguments[1]); } ); @@ -1691,8 +1687,9 @@ function formatDate(formatter, dateValue) { return %InternalDateFormat(formatter, new GlobalDate(dateMs)); } -InstallFunction(GlobalIntlDateTimeFormat.prototype, 'formatToParts', - function(dateValue) { +DEFINE_METHOD( + GlobalIntlDateTimeFormat.prototype, + formatToParts(dateValue) { CHECK_OBJECT_COERCIBLE(this, "Intl.DateTimeFormat.prototype.formatToParts"); if (!IS_OBJECT(this)) { throw %make_type_error(kCalledOnNonObject, this); @@ -1810,8 +1807,9 @@ function v8BreakIteratorConstructor() { /** * BreakIterator resolvedOptions method. */ -InstallFunction(GlobalIntlv8BreakIterator.prototype, 'resolvedOptions', - function() { +DEFINE_METHOD( + GlobalIntlv8BreakIterator.prototype, + resolvedOptions() { if (!IS_UNDEFINED(new.target)) { throw %make_type_error(kOrdinaryFunctionCalledAsConstructor); } @@ -1833,8 +1831,9 @@ InstallFunction(GlobalIntlv8BreakIterator.prototype, 'resolvedOptions', * order in the returned list as in the input list. * Options are optional parameter. */ -InstallFunction(GlobalIntlv8BreakIterator, 'supportedLocalesOf', - function(locales) { +DEFINE_METHOD( + GlobalIntlv8BreakIterator, + supportedLocalesOf(locales) { if (!IS_UNDEFINED(new.target)) { throw %make_type_error(kOrdinaryFunctionCalledAsConstructor); } @@ -1976,7 +1975,9 @@ function LocaleConvertCase(s, locales, isToUpper) { * Compares this and that, and returns less than 0, 0 or greater than 0 value. * Overrides the built-in method. */ -OverrideFunction(GlobalString.prototype, 'localeCompare', function(that) { +DEFINE_METHOD( + GlobalString.prototype, + localeCompare(that) { if (IS_NULL_OR_UNDEFINED(this)) { throw %make_type_error(kMethodInvokedOnNullOrUndefined); } @@ -1988,26 +1989,31 @@ OverrideFunction(GlobalString.prototype, 'localeCompare', function(that) { } ); -function ToLocaleLowerCaseIntl(locales) { - CHECK_OBJECT_COERCIBLE(this, "String.prototype.toLocaleLowerCase"); - return LocaleConvertCase(TO_STRING(this), locales, false); -} - -%FunctionSetLength(ToLocaleLowerCaseIntl, 0); - -function ToLocaleUpperCaseIntl(locales) { - CHECK_OBJECT_COERCIBLE(this, "String.prototype.toLocaleUpperCase"); - return LocaleConvertCase(TO_STRING(this), locales, true); -} +var StringPrototypeMethods = {}; +DEFINE_METHODS_LEN( + GlobalString.prototype, + { + toLocaleLowerCase(locales) { + CHECK_OBJECT_COERCIBLE(this, "String.prototype.toLocaleLowerCase"); + return LocaleConvertCase(TO_STRING(this), locales, false); + } -%FunctionSetLength(ToLocaleUpperCaseIntl, 0); + toLocaleUpperCase(locales) { + CHECK_OBJECT_COERCIBLE(this, "String.prototype.toLocaleUpperCase"); + return LocaleConvertCase(TO_STRING(this), locales, true); + } + }, + 0 /* Set function length of both methods. */ +); /** * Formats a Number object (this) using locale and options values. * If locale or options are omitted, defaults are used. */ -OverrideFunction(GlobalNumber.prototype, 'toLocaleString', function() { +DEFINE_METHOD( + GlobalNumber.prototype, + toLocaleString() { if (!(this instanceof GlobalNumber) && typeof(this) !== 'number') { throw %make_type_error(kMethodInvokedOnWrongType, "Number"); } @@ -2045,7 +2051,9 @@ function toLocaleDateTime(date, locales, options, required, defaults, service) { * If locale or options are omitted, defaults are used - both date and time are * present in the output. */ -OverrideFunction(GlobalDate.prototype, 'toLocaleString', function() { +DEFINE_METHOD( + GlobalDate.prototype, + toLocaleString() { var locales = arguments[0]; var options = arguments[1]; return toLocaleDateTime( @@ -2059,7 +2067,9 @@ OverrideFunction(GlobalDate.prototype, 'toLocaleString', function() { * If locale or options are omitted, defaults are used - only date is present * in the output. */ -OverrideFunction(GlobalDate.prototype, 'toLocaleDateString', function() { +DEFINE_METHOD( + GlobalDate.prototype, + toLocaleDateString() { var locales = arguments[0]; var options = arguments[1]; return toLocaleDateTime( @@ -2073,7 +2083,9 @@ OverrideFunction(GlobalDate.prototype, 'toLocaleDateString', function() { * If locale or options are omitted, defaults are used - only time is present * in the output. */ -OverrideFunction(GlobalDate.prototype, 'toLocaleTimeString', function() { +DEFINE_METHOD( + GlobalDate.prototype, + toLocaleTimeString() { var locales = arguments[0]; var options = arguments[1]; return toLocaleDateTime( @@ -2081,15 +2093,4 @@ OverrideFunction(GlobalDate.prototype, 'toLocaleTimeString', function() { } ); -%FunctionRemovePrototype(ToLocaleLowerCaseIntl); -%FunctionRemovePrototype(ToLocaleUpperCaseIntl); - -utils.SetFunctionName(ToLocaleLowerCaseIntl, "toLocaleLowerCase"); -utils.SetFunctionName(ToLocaleUpperCaseIntl, "toLocaleUpperCase"); - -utils.Export(function(to) { - to.ToLocaleLowerCaseIntl = ToLocaleLowerCaseIntl; - to.ToLocaleUpperCaseIntl = ToLocaleUpperCaseIntl; -}); - }) diff --git a/deps/v8/src/js/macros.py b/deps/v8/src/js/macros.py index 08f25b1f26..329b851e4b 100644 --- a/deps/v8/src/js/macros.py +++ b/deps/v8/src/js/macros.py @@ -53,7 +53,7 @@ macro IS_FUNCTION(arg) = (%IsFunction(arg)); macro IS_GENERATOR(arg) = (%_ClassOf(arg) === 'Generator'); macro IS_GLOBAL(arg) = (%_ClassOf(arg) === 'global'); macro IS_MAP(arg) = (%_IsJSMap(arg)); -macro IS_MAP_ITERATOR(arg) = (%_IsJSMapIterator(arg)); +macro IS_MAP_ITERATOR(arg) = (%_ClassOf(arg) === 'Map Iterator'); macro IS_NULL(arg) = (arg === null); macro IS_NULL_OR_UNDEFINED(arg) = (arg == null); macro IS_NUMBER(arg) = (typeof(arg) === 'number'); @@ -61,7 +61,7 @@ macro IS_OBJECT(arg) = (typeof(arg) === 'object'); macro IS_PROXY(arg) = (%_IsJSProxy(arg)); macro IS_SCRIPT(arg) = (%_ClassOf(arg) === 'Script'); macro IS_SET(arg) = (%_IsJSSet(arg)); -macro IS_SET_ITERATOR(arg) = (%_IsJSSetIterator(arg)); +macro IS_SET_ITERATOR(arg) = (%_ClassOf(arg) === 'Set Iterator'); macro IS_SHAREDARRAYBUFFER(arg) = (%_ClassOf(arg) === 'SharedArrayBuffer'); macro IS_STRING(arg) = (typeof(arg) === 'string'); macro IS_SYMBOL(arg) = (typeof(arg) === 'symbol'); @@ -85,8 +85,6 @@ macro NUMBER_IS_NAN(arg) = (%IS_VAR(arg) !== arg); macro NUMBER_IS_FINITE(arg) = (%_IsSmi(%IS_VAR(arg)) || ((arg == arg) && (arg != 1/0) && (arg != -1/0))); macro TO_BOOLEAN(arg) = (!!(arg)); macro TO_INTEGER(arg) = (%_ToInteger(arg)); -macro TO_INT32(arg) = ((arg) | 0); -macro TO_UINT32(arg) = ((arg) >>> 0); macro INVERT_NEG_ZERO(arg) = ((arg) + 0); macro TO_LENGTH(arg) = (%_ToLength(arg)); macro TO_STRING(arg) = (%_ToString(arg)); @@ -95,38 +93,23 @@ macro TO_OBJECT(arg) = (%_ToObject(arg)); macro HAS_OWN_PROPERTY(obj, key) = (%_Call(ObjectHasOwnProperty, obj, key)); # Private names. -macro IS_PRIVATE(sym) = (%SymbolIsPrivate(sym)); -macro HAS_PRIVATE(obj, key) = HAS_OWN_PROPERTY(obj, key); -macro HAS_DEFINED_PRIVATE(obj, sym) = (!IS_UNDEFINED(obj[sym])); macro GET_PRIVATE(obj, sym) = (obj[sym]); macro SET_PRIVATE(obj, sym, val) = (obj[sym] = val); # To avoid ES2015 Function name inference. macro ANONYMOUS_FUNCTION(fn) = (0, (fn)); +macro DEFINE_METHODS_LEN(obj, class_def, len) = %DefineMethodsInternal(obj, class class_def, len); +macro DEFINE_METHOD_LEN(obj, method_def, len) = %DefineMethodsInternal(obj, class { method_def }, len); +macro DEFINE_METHODS(obj, class_def) = DEFINE_METHODS_LEN(obj, class_def, -1); +macro DEFINE_METHOD(obj, method_def) = DEFINE_METHOD_LEN(obj, method_def, -1); + # Constants. The compiler constant folds them. define INFINITY = (1/0); define UNDEFINED = (void 0); -# Macros implemented in Python. -python macro CHAR_CODE(str) = ord(str[1]); - -# For messages.js -# Matches Script::Type from objects.h -define TYPE_NATIVE = 0; -define TYPE_EXTENSION = 1; -define TYPE_NORMAL = 2; - -# Matches Script::CompilationType from objects.h -define COMPILATION_TYPE_HOST = 0; -define COMPILATION_TYPE_EVAL = 1; -define COMPILATION_TYPE_JSON = 2; - # Must match PropertyFilter in property-details.h define PROPERTY_FILTER_NONE = 0; -define PROPERTY_FILTER_ONLY_ENUMERABLE = 2; -define PROPERTY_FILTER_SKIP_STRINGS = 8; -define PROPERTY_FILTER_SKIP_SYMBOLS = 16; # Use for keys, values and entries iterators. define ITERATOR_KIND_KEYS = 1; @@ -162,35 +145,3 @@ define NOT_FOUND = -1; # Check whether debug is active. define DEBUG_IS_ACTIVE = (%_DebugIsActive() != 0); - -# UseCounters from include/v8.h -define kUseAsm = 0; -define kBreakIterator = 1; -define kLegacyConst = 2; -define kMarkDequeOverflow = 3; -define kStoreBufferOverflow = 4; -define kSlotsBufferOverflow = 5; -define kForcedGC = 7; -define kSloppyMode = 8; -define kStrictMode = 9; -define kRegExpPrototypeStickyGetter = 11; -define kRegExpPrototypeToString = 12; -define kRegExpPrototypeUnicodeGetter = 13; -define kIntlV8Parse = 14; -define kIntlPattern = 15; -define kIntlResolved = 16; -define kPromiseChain = 17; -define kPromiseAccept = 18; -define kPromiseDefer = 19; -define kHtmlCommentInExternalScript = 20; -define kHtmlComment = 21; -define kSloppyModeBlockScopedFunctionRedefinition = 22; -define kForInInitializer = 23; -define kArrayProtectorDirtied = 24; -define kArraySpeciesModified = 25; -define kArrayPrototypeConstructorModified = 26; -define kArrayInstanceProtoModified = 27; -define kArrayInstanceConstructorModified = 28; -define kLegacyFunctionDeclaration = 29; -define kRegExpPrototypeSourceGetter = 30; -define kRegExpPrototypeOldFlagGetter = 31; diff --git a/deps/v8/src/js/max-min.js b/deps/v8/src/js/max-min.js index 4b7076ed22..e451c09d1d 100644 --- a/deps/v8/src/js/max-min.js +++ b/deps/v8/src/js/max-min.js @@ -4,6 +4,8 @@ (function(global, utils) { +"use strict"; + %CheckIsBootstrapping(); function MaxSimple(a, b) { diff --git a/deps/v8/src/js/messages.js b/deps/v8/src/js/messages.js index 3ea2bef5ad..aebd37a791 100644 --- a/deps/v8/src/js/messages.js +++ b/deps/v8/src/js/messages.js @@ -6,6 +6,8 @@ (function(global, utils) { +"use strict"; + %CheckIsBootstrapping(); // ------------------------------------------------------------------- @@ -17,14 +19,6 @@ var Script = utils.ImportNow("Script"); // Script /** - * Set up the Script function and constructor. - */ -%FunctionSetInstanceClassName(Script, 'Script'); -%AddNamedProperty(Script.prototype, 'constructor', Script, - DONT_ENUM | DONT_DELETE | READ_ONLY); - - -/** * Get information on a specific source position. * Returns an object with the following following properties: * script : script object for the source diff --git a/deps/v8/src/js/prologue.js b/deps/v8/src/js/prologue.js index 91f36cb573..08ef3ba520 100644 --- a/deps/v8/src/js/prologue.js +++ b/deps/v8/src/js/prologue.js @@ -38,18 +38,6 @@ function ImportNow(name) { } -function SetFunctionName(f, name, prefix) { - if (IS_SYMBOL(name)) { - name = "[" + %SymbolDescription(name) + "]"; - } - if (IS_UNDEFINED(prefix)) { - %FunctionSetName(f, name); - } else { - %FunctionSetName(f, prefix + " " + name); - } -} - - function InstallConstants(object, constants) { %CheckIsBootstrapping(); %OptimizeObjectForAddingMultipleProperties(object, constants.length >> 1); @@ -63,44 +51,6 @@ function InstallConstants(object, constants) { } -function InstallFunctions(object, attributes, functions) { - %CheckIsBootstrapping(); - %OptimizeObjectForAddingMultipleProperties(object, functions.length >> 1); - for (var i = 0; i < functions.length; i += 2) { - var key = functions[i]; - var f = functions[i + 1]; - SetFunctionName(f, key); - %FunctionRemovePrototype(f); - %AddNamedProperty(object, key, f, attributes); - %SetNativeFlag(f); - } - %ToFastProperties(object); -} - - -// Helper function to install a getter-only accessor property. -function InstallGetter(object, name, getter, attributes, prefix) { - %CheckIsBootstrapping(); - if (IS_UNDEFINED(attributes)) attributes = DONT_ENUM; - SetFunctionName(getter, name, IS_UNDEFINED(prefix) ? "get" : prefix); - %FunctionRemovePrototype(getter); - %DefineGetterPropertyUnchecked(object, name, getter, attributes); - %SetNativeFlag(getter); -} - - -function OverrideFunction(object, name, f, afterInitialBootstrap) { - %CheckIsBootstrapping(); - %object_define_property(object, name, { value: f, - writeable: true, - configurable: true, - enumerable: false }); - SetFunctionName(f, name); - if (!afterInitialBootstrap) %FunctionRemovePrototype(f); - %SetNativeFlag(f); -} - - // Prevents changes to the prototype of a built-in function. // The "prototype" property of the function object is made non-configurable, // and the prototype object is made non-extensible. The latter prevents @@ -156,11 +106,7 @@ function PostNatives(utils) { utils.Import = Import; utils.ImportNow = ImportNow; utils.Export = Export; -utils.SetFunctionName = SetFunctionName; utils.InstallConstants = InstallConstants; -utils.InstallFunctions = InstallFunctions; -utils.InstallGetter = InstallGetter; -utils.OverrideFunction = OverrideFunction; utils.SetUpLockedPrototype = SetUpLockedPrototype; utils.PostNatives = PostNatives; diff --git a/deps/v8/src/js/promise.js b/deps/v8/src/js/promise.js deleted file mode 100644 index 27571daabb..0000000000 --- a/deps/v8/src/js/promise.js +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2012 the V8 project authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -(function(global, utils, extrasUtils) { - -"use strict"; - -%CheckIsBootstrapping(); - -// ------------------------------------------------------------------- -// Imports - -var InternalArray = utils.InternalArray; -var promiseHandledBySymbol = - utils.ImportNow("promise_handled_by_symbol"); -var promiseForwardingHandlerSymbol = - utils.ImportNow("promise_forwarding_handler_symbol"); -var GlobalPromise = global.Promise; - -// ------------------------------------------------------------------- -// Define exported functions. - -// Combinators. - -// ES#sec-promise.all -// Promise.all ( iterable ) -function PromiseAll(iterable) { - if (!IS_RECEIVER(this)) { - throw %make_type_error(kCalledOnNonObject, "Promise.all"); - } - - // false debugEvent so that forwarding the rejection through all does not - // trigger redundant ExceptionEvents - var deferred = %new_promise_capability(this, false); - var resolutions = new InternalArray(); - var count; - - // For catch prediction, don't treat the .then calls as handling it; - // instead, recurse outwards. - var instrumenting = DEBUG_IS_ACTIVE; - if (instrumenting) { - SET_PRIVATE(deferred.reject, promiseForwardingHandlerSymbol, true); - } - - function CreateResolveElementFunction(index, values, promiseCapability) { - var alreadyCalled = false; - return (x) => { - if (alreadyCalled === true) return; - alreadyCalled = true; - values[index] = x; - if (--count === 0) { - var valuesArray = []; - %MoveArrayContents(values, valuesArray); - %_Call(promiseCapability.resolve, UNDEFINED, valuesArray); - } - }; - } - - try { - var i = 0; - count = 1; - for (var value of iterable) { - var nextPromise = this.resolve(value); - ++count; - var throwawayPromise = nextPromise.then( - CreateResolveElementFunction(i, resolutions, deferred), - deferred.reject); - // For catch prediction, mark that rejections here are semantically - // handled by the combined Promise. - if (instrumenting && %is_promise(throwawayPromise)) { - SET_PRIVATE(throwawayPromise, promiseHandledBySymbol, deferred.promise); - } - ++i; - } - - // 6.d - if (--count === 0) { - var valuesArray = []; - %MoveArrayContents(resolutions, valuesArray); - %_Call(deferred.resolve, UNDEFINED, valuesArray); - } - - } catch (e) { - %_Call(deferred.reject, UNDEFINED, e); - } - return deferred.promise; -} - -// ES#sec-promise.race -// Promise.race ( iterable ) -function PromiseRace(iterable) { - if (!IS_RECEIVER(this)) { - throw %make_type_error(kCalledOnNonObject, PromiseRace); - } - - // false debugEvent so that forwarding the rejection through race does not - // trigger redundant ExceptionEvents - var deferred = %new_promise_capability(this, false); - - // For catch prediction, don't treat the .then calls as handling it; - // instead, recurse outwards. - var instrumenting = DEBUG_IS_ACTIVE; - if (instrumenting) { - SET_PRIVATE(deferred.reject, promiseForwardingHandlerSymbol, true); - } - - try { - for (var value of iterable) { - var throwawayPromise = this.resolve(value).then(deferred.resolve, - deferred.reject); - // For catch prediction, mark that rejections here are semantically - // handled by the combined Promise. - if (instrumenting && %is_promise(throwawayPromise)) { - SET_PRIVATE(throwawayPromise, promiseHandledBySymbol, deferred.promise); - } - } - } catch (e) { - %_Call(deferred.reject, UNDEFINED, e); - } - return deferred.promise; -} - -// ------------------------------------------------------------------- -// Install exported functions. - -utils.InstallFunctions(GlobalPromise, DONT_ENUM, [ - "all", PromiseAll, - "race", PromiseRace, -]); - -}) diff --git a/deps/v8/src/js/proxy.js b/deps/v8/src/js/proxy.js index a111c09427..4b6255a8ff 100644 --- a/deps/v8/src/js/proxy.js +++ b/deps/v8/src/js/proxy.js @@ -15,16 +15,13 @@ var GlobalProxy = global.Proxy; //---------------------------------------------------------------------------- -function ProxyCreateRevocable(target, handler) { - var p = new GlobalProxy(target, handler); - return {proxy: p, revoke: () => %JSProxyRevoke(p)}; -} - -//------------------------------------------------------------------- - //Set up non-enumerable properties of the Proxy object. -utils.InstallFunctions(GlobalProxy, DONT_ENUM, [ - "revocable", ProxyCreateRevocable -]); +DEFINE_METHOD( + GlobalProxy, + revocable(target, handler) { + var p = new GlobalProxy(target, handler); + return {proxy: p, revoke: () => %JSProxyRevoke(p)}; + } +); }) diff --git a/deps/v8/src/js/spread.js b/deps/v8/src/js/spread.js index 39b12e7a8e..0b56ca7edd 100644 --- a/deps/v8/src/js/spread.js +++ b/deps/v8/src/js/spread.js @@ -4,7 +4,7 @@ (function(global, utils) { -'use strict'; +"use strict"; // ------------------------------------------------------------------- // Imports diff --git a/deps/v8/src/js/string.js b/deps/v8/src/js/string.js index a3a59d5fde..521afc2c42 100644 --- a/deps/v8/src/js/string.js +++ b/deps/v8/src/js/string.js @@ -4,6 +4,8 @@ (function(global, utils) { +"use strict"; + %CheckIsBootstrapping(); // ------------------------------------------------------------------- @@ -15,188 +17,179 @@ var searchSymbol = utils.ImportNow("search_symbol"); //------------------------------------------------------------------- -// ES6 21.1.3.11. -function StringMatchJS(pattern) { - CHECK_OBJECT_COERCIBLE(this, "String.prototype.match"); - - if (!IS_NULL_OR_UNDEFINED(pattern)) { - var matcher = pattern[matchSymbol]; - if (!IS_UNDEFINED(matcher)) { - return %_Call(matcher, pattern, this); - } - } - - var subject = TO_STRING(this); - - // Equivalent to RegExpCreate (ES#sec-regexpcreate) - var regexp = %RegExpCreate(pattern); - return regexp[matchSymbol](subject); -} - -// ES6 21.1.3.15. -function StringSearch(pattern) { - CHECK_OBJECT_COERCIBLE(this, "String.prototype.search"); - - if (!IS_NULL_OR_UNDEFINED(pattern)) { - var searcher = pattern[searchSymbol]; - if (!IS_UNDEFINED(searcher)) { - return %_Call(searcher, pattern, this); - } - } - - var subject = TO_STRING(this); - - // Equivalent to RegExpCreate (ES#sec-regexpcreate) - var regexp = %RegExpCreate(pattern); - return %_Call(regexp[searchSymbol], regexp, subject); -} - - -// ES6 draft, revision 26 (2014-07-18), section B.2.3.2.1 +// ES#sec-createhtml function HtmlEscape(str) { return %RegExpInternalReplace(/"/g, TO_STRING(str), """); } +// Set up the non-enumerable functions on the String prototype object. +DEFINE_METHODS( + GlobalString.prototype, + { + /* ES#sec-string.prototype.match */ + match(pattern) { + CHECK_OBJECT_COERCIBLE(this, "String.prototype.match"); + + if (!IS_NULL_OR_UNDEFINED(pattern)) { + var matcher = pattern[matchSymbol]; + if (!IS_UNDEFINED(matcher)) { + return %_Call(matcher, pattern, this); + } + } + + var subject = TO_STRING(this); + + // Equivalent to RegExpCreate (ES#sec-regexpcreate) + var regexp = %RegExpCreate(pattern); + return regexp[matchSymbol](subject); + } -// ES6 draft, revision 26 (2014-07-18), section B.2.3.2 -function StringAnchor(name) { - CHECK_OBJECT_COERCIBLE(this, "String.prototype.anchor"); - return "<a name=\"" + HtmlEscape(name) + "\">" + TO_STRING(this) + - "</a>"; -} - - -// ES6 draft, revision 26 (2014-07-18), section B.2.3.3 -function StringBig() { - CHECK_OBJECT_COERCIBLE(this, "String.prototype.big"); - return "<big>" + TO_STRING(this) + "</big>"; -} - - -// ES6 draft, revision 26 (2014-07-18), section B.2.3.4 -function StringBlink() { - CHECK_OBJECT_COERCIBLE(this, "String.prototype.blink"); - return "<blink>" + TO_STRING(this) + "</blink>"; -} - - -// ES6 draft, revision 26 (2014-07-18), section B.2.3.5 -function StringBold() { - CHECK_OBJECT_COERCIBLE(this, "String.prototype.bold"); - return "<b>" + TO_STRING(this) + "</b>"; -} - - -// ES6 draft, revision 26 (2014-07-18), section B.2.3.6 -function StringFixed() { - CHECK_OBJECT_COERCIBLE(this, "String.prototype.fixed"); - return "<tt>" + TO_STRING(this) + "</tt>"; -} - + /* ES#sec-string.prototype.search */ + search(pattern) { + CHECK_OBJECT_COERCIBLE(this, "String.prototype.search"); -// ES6 draft, revision 26 (2014-07-18), section B.2.3.7 -function StringFontcolor(color) { - CHECK_OBJECT_COERCIBLE(this, "String.prototype.fontcolor"); - return "<font color=\"" + HtmlEscape(color) + "\">" + TO_STRING(this) + - "</font>"; -} + if (!IS_NULL_OR_UNDEFINED(pattern)) { + var searcher = pattern[searchSymbol]; + if (!IS_UNDEFINED(searcher)) { + return %_Call(searcher, pattern, this); + } + } + var subject = TO_STRING(this); -// ES6 draft, revision 26 (2014-07-18), section B.2.3.8 -function StringFontsize(size) { - CHECK_OBJECT_COERCIBLE(this, "String.prototype.fontsize"); - return "<font size=\"" + HtmlEscape(size) + "\">" + TO_STRING(this) + - "</font>"; -} - + // Equivalent to RegExpCreate (ES#sec-regexpcreate) + var regexp = %RegExpCreate(pattern); + return %_Call(regexp[searchSymbol], regexp, subject); + } -// ES6 draft, revision 26 (2014-07-18), section B.2.3.9 -function StringItalics() { - CHECK_OBJECT_COERCIBLE(this, "String.prototype.italics"); - return "<i>" + TO_STRING(this) + "</i>"; -} + /* ES#sec-string.prototype.anchor */ + anchor(name) { + CHECK_OBJECT_COERCIBLE(this, "String.prototype.anchor"); + return "<a name=\"" + HtmlEscape(name) + "\">" + TO_STRING(this) + + "</a>"; + } + /* ES#sec-string.prototype.big */ + big() { + CHECK_OBJECT_COERCIBLE(this, "String.prototype.big"); + return "<big>" + TO_STRING(this) + "</big>"; + } -// ES6 draft, revision 26 (2014-07-18), section B.2.3.10 -function StringLink(s) { - CHECK_OBJECT_COERCIBLE(this, "String.prototype.link"); - return "<a href=\"" + HtmlEscape(s) + "\">" + TO_STRING(this) + "</a>"; -} + /* ES#sec-string.prototype.blink */ + blink() { + CHECK_OBJECT_COERCIBLE(this, "String.prototype.blink"); + return "<blink>" + TO_STRING(this) + "</blink>"; + } + /* ES#sec-string.prototype.bold */ + bold() { + CHECK_OBJECT_COERCIBLE(this, "String.prototype.bold"); + return "<b>" + TO_STRING(this) + "</b>"; + } -// ES6 draft, revision 26 (2014-07-18), section B.2.3.11 -function StringSmall() { - CHECK_OBJECT_COERCIBLE(this, "String.prototype.small"); - return "<small>" + TO_STRING(this) + "</small>"; -} + /* ES#sec-string.prototype.fixed */ + fixed() { + CHECK_OBJECT_COERCIBLE(this, "String.prototype.fixed"); + return "<tt>" + TO_STRING(this) + "</tt>"; + } + /* ES#sec-string.prototype.fontcolor */ + fontcolor(color) { + CHECK_OBJECT_COERCIBLE(this, "String.prototype.fontcolor"); + return "<font color=\"" + HtmlEscape(color) + "\">" + TO_STRING(this) + + "</font>"; + } -// ES6 draft, revision 26 (2014-07-18), section B.2.3.12 -function StringStrike() { - CHECK_OBJECT_COERCIBLE(this, "String.prototype.strike"); - return "<strike>" + TO_STRING(this) + "</strike>"; -} + /* ES#sec-string.prototype.fontsize */ + fontsize(size) { + CHECK_OBJECT_COERCIBLE(this, "String.prototype.fontsize"); + return "<font size=\"" + HtmlEscape(size) + "\">" + TO_STRING(this) + + "</font>"; + } + /* ES#sec-string.prototype.italics */ + italics() { + CHECK_OBJECT_COERCIBLE(this, "String.prototype.italics"); + return "<i>" + TO_STRING(this) + "</i>"; + } -// ES6 draft, revision 26 (2014-07-18), section B.2.3.13 -function StringSub() { - CHECK_OBJECT_COERCIBLE(this, "String.prototype.sub"); - return "<sub>" + TO_STRING(this) + "</sub>"; -} + /* ES#sec-string.prototype.link */ + link(s) { + CHECK_OBJECT_COERCIBLE(this, "String.prototype.link"); + return "<a href=\"" + HtmlEscape(s) + "\">" + TO_STRING(this) + "</a>"; + } + /* ES#sec-string.prototype.small */ + small() { + CHECK_OBJECT_COERCIBLE(this, "String.prototype.small"); + return "<small>" + TO_STRING(this) + "</small>"; + } -// ES6 draft, revision 26 (2014-07-18), section B.2.3.14 -function StringSup() { - CHECK_OBJECT_COERCIBLE(this, "String.prototype.sup"); - return "<sup>" + TO_STRING(this) + "</sup>"; -} + /* ES#sec-string.prototype.strike */ + strike() { + CHECK_OBJECT_COERCIBLE(this, "String.prototype.strike"); + return "<strike>" + TO_STRING(this) + "</strike>"; + } -// ES6, section 21.1.3.13 -function StringRepeat(count) { - CHECK_OBJECT_COERCIBLE(this, "String.prototype.repeat"); + /* ES#sec-string.prototype.sub */ + sub() { + CHECK_OBJECT_COERCIBLE(this, "String.prototype.sub"); + return "<sub>" + TO_STRING(this) + "</sub>"; + } - var s = TO_STRING(this); - var n = TO_INTEGER(count); + /* ES#sec-string.prototype.sup */ + sup() { + CHECK_OBJECT_COERCIBLE(this, "String.prototype.sup"); + return "<sup>" + TO_STRING(this) + "</sup>"; + } - if (n < 0 || n === INFINITY) throw %make_range_error(kInvalidCountValue); + /* ES#sec-string.prototype.repeat */ + repeat(count) { + CHECK_OBJECT_COERCIBLE(this, "String.prototype.repeat"); - // Early return to allow an arbitrarily-large repeat of the empty string. - if (s.length === 0) return ""; + var s = TO_STRING(this); + var n = TO_INTEGER(count); - // The maximum string length is stored in a smi, so a longer repeat - // must result in a range error. - if (n > %_MaxSmi()) throw %make_range_error(kInvalidStringLength); + if (n < 0 || n === INFINITY) throw %make_range_error(kInvalidCountValue); - var r = ""; - while (true) { - if (n & 1) r += s; - n >>= 1; - if (n === 0) return r; - s += s; - } -} + // Early return to allow an arbitrarily-large repeat of the empty string. + if (s.length === 0) return ""; + // The maximum string length is stored in a smi, so a longer repeat + // must result in a range error. + if (n > %_MaxSmi()) throw %make_range_error(kInvalidStringLength); -// ES6 Draft 05-22-2014, section 21.1.3.3 -function StringCodePointAt(pos) { - CHECK_OBJECT_COERCIBLE(this, "String.prototype.codePointAt"); + var r = ""; + while (true) { + if (n & 1) r += s; + n >>= 1; + if (n === 0) return r; + s += s; + } + } - var string = TO_STRING(this); - var size = string.length; - pos = TO_INTEGER(pos); - if (pos < 0 || pos >= size) { - return UNDEFINED; - } - var first = %_StringCharCodeAt(string, pos); - if (first < 0xD800 || first > 0xDBFF || pos + 1 == size) { - return first; - } - var second = %_StringCharCodeAt(string, pos + 1); - if (second < 0xDC00 || second > 0xDFFF) { - return first; + /* ES#sec-string.prototype.codepointat */ + codePointAt(pos) { + CHECK_OBJECT_COERCIBLE(this, "String.prototype.codePointAt"); + + var string = TO_STRING(this); + var size = string.length; + pos = TO_INTEGER(pos); + if (pos < 0 || pos >= size) { + return UNDEFINED; + } + var first = %_StringCharCodeAt(string, pos); + if (first < 0xD800 || first > 0xDBFF || pos + 1 == size) { + return first; + } + var second = %_StringCharCodeAt(string, pos + 1); + if (second < 0xDC00 || second > 0xDFFF) { + return first; + } + return (first - 0xD800) * 0x400 + second + 0x2400; + } } - return (first - 0xD800) * 0x400 + second + 0x2400; -} +); function StringPad(thisString, maxLength, fillString) { maxLength = TO_LENGTH(maxLength); @@ -233,78 +226,58 @@ function StringPad(thisString, maxLength, fillString) { return filler; } -// ES#sec-string.prototype.padstart -// String.prototype.padStart(maxLength [, fillString]) -function StringPadStart(maxLength, fillString) { - CHECK_OBJECT_COERCIBLE(this, "String.prototype.padStart"); - var thisString = TO_STRING(this); +DEFINE_METHODS_LEN( + GlobalString.prototype, + { + /* ES#sec-string.prototype.padstart */ + /* String.prototype.padStart(maxLength [, fillString]) */ + padStart(maxLength, fillString) { + CHECK_OBJECT_COERCIBLE(this, "String.prototype.padStart"); + var thisString = TO_STRING(this); - return StringPad(thisString, maxLength, fillString) + thisString; -} -%FunctionSetLength(StringPadStart, 1); + return StringPad(thisString, maxLength, fillString) + thisString; + } -// ES#sec-string.prototype.padend -// String.prototype.padEnd(maxLength [, fillString]) -function StringPadEnd(maxLength, fillString) { - CHECK_OBJECT_COERCIBLE(this, "String.prototype.padEnd"); - var thisString = TO_STRING(this); + /* ES#sec-string.prototype.padend */ + /* String.prototype.padEnd(maxLength [, fillString]) */ + padEnd(maxLength, fillString) { + CHECK_OBJECT_COERCIBLE(this, "String.prototype.padEnd"); + var thisString = TO_STRING(this); - return thisString + StringPad(thisString, maxLength, fillString); -} -%FunctionSetLength(StringPadEnd, 1); + return thisString + StringPad(thisString, maxLength, fillString); + } + }, + 1 /* Set functions length */ +); // ------------------------------------------------------------------- // String methods related to templates -// ES6 Draft 03-17-2015, section 21.1.2.4 -function StringRaw(callSite) { - "use strict"; - var numberOfSubstitutions = arguments.length; - var cooked = TO_OBJECT(callSite); - var raw = TO_OBJECT(cooked.raw); - var literalSegments = TO_LENGTH(raw.length); - if (literalSegments <= 0) return ""; - - var result = TO_STRING(raw[0]); - - for (var i = 1; i < literalSegments; ++i) { - if (i < numberOfSubstitutions) { - result += TO_STRING(arguments[i]); +// Set up the non-enumerable functions on the String object. +DEFINE_METHOD( + GlobalString, + + /* ES#sec-string.raw */ + raw(callSite) { + var numberOfSubstitutions = arguments.length; + var cooked = TO_OBJECT(callSite); + var raw = TO_OBJECT(cooked.raw); + var literalSegments = TO_LENGTH(raw.length); + if (literalSegments <= 0) return ""; + + var result = TO_STRING(raw[0]); + + for (var i = 1; i < literalSegments; ++i) { + if (i < numberOfSubstitutions) { + result += TO_STRING(arguments[i]); + } + result += TO_STRING(raw[i]); } - result += TO_STRING(raw[i]); - } - return result; -} + return result; + } +); // ------------------------------------------------------------------- -// Set up the non-enumerable functions on the String object. -utils.InstallFunctions(GlobalString, DONT_ENUM, [ - "raw", StringRaw -]); - -// Set up the non-enumerable functions on the String prototype object. -utils.InstallFunctions(GlobalString.prototype, DONT_ENUM, [ - "codePointAt", StringCodePointAt, - "match", StringMatchJS, - "padEnd", StringPadEnd, - "padStart", StringPadStart, - "repeat", StringRepeat, - "search", StringSearch, - "link", StringLink, - "anchor", StringAnchor, - "fontcolor", StringFontcolor, - "fontsize", StringFontsize, - "big", StringBig, - "blink", StringBlink, - "bold", StringBold, - "fixed", StringFixed, - "italics", StringItalics, - "small", StringSmall, - "strike", StringStrike, - "sub", StringSub, - "sup", StringSup -]); - }) diff --git a/deps/v8/src/js/typedarray.js b/deps/v8/src/js/typedarray.js index 1c65c32dbd..caced99321 100644 --- a/deps/v8/src/js/typedarray.js +++ b/deps/v8/src/js/typedarray.js @@ -233,18 +233,21 @@ endmacro TYPED_ARRAYS(TYPED_ARRAY_CONSTRUCTOR) -function TypedArraySubArray(begin, end) { - switch (%_ClassOf(this)) { +DEFINE_METHOD( + GlobalTypedArray.prototype, + subarray(begin, end) { + switch (%_ClassOf(this)) { macro TYPED_ARRAY_SUBARRAY_CASE(NAME, ELEMENT_SIZE) - case "NAME": - return %_Call(NAMESubArray, this, begin, end); + case "NAME": + return %_Call(NAMESubArray, this, begin, end); endmacro TYPED_ARRAYS(TYPED_ARRAY_SUBARRAY_CASE) + } + throw %make_type_error(kIncompatibleMethodReceiver, + "get %TypedArray%.prototype.subarray", this); } - throw %make_type_error(kIncompatibleMethodReceiver, - "get %TypedArray%.prototype.subarray", this); -} -%SetForceInlineFlag(TypedArraySubArray); +); +%SetForceInlineFlag(GlobalTypedArray.prototype.subarray); @@ -314,87 +317,64 @@ function TypedArraySetFromOverlappingTypedArray(target, source, offset) { } } -function TypedArraySet(obj, offset) { - var intOffset = IS_UNDEFINED(offset) ? 0 : TO_INTEGER(offset); - if (intOffset < 0) throw %make_type_error(kTypedArraySetNegativeOffset); +DEFINE_METHOD_LEN( + GlobalTypedArray.prototype, + set(obj, offset) { + var intOffset = IS_UNDEFINED(offset) ? 0 : TO_INTEGER(offset); + if (intOffset < 0) throw %make_type_error(kTypedArraySetNegativeOffset); - if (intOffset > %_MaxSmi()) { - throw %make_range_error(kTypedArraySetSourceTooLarge); - } + if (intOffset > %_MaxSmi()) { + throw %make_range_error(kTypedArraySetSourceTooLarge); + } - switch (%TypedArraySetFastCases(this, obj, intOffset)) { - // These numbers should be synchronized with runtime.cc. - case 0: // TYPED_ARRAY_SET_TYPED_ARRAY_SAME_TYPE - return; - case 1: // TYPED_ARRAY_SET_TYPED_ARRAY_OVERLAPPING - TypedArraySetFromOverlappingTypedArray(this, obj, intOffset); - return; - case 2: // TYPED_ARRAY_SET_TYPED_ARRAY_NONOVERLAPPING - if (intOffset === 0) { - %TypedArrayCopyElements(this, obj, %_TypedArrayGetLength(obj)); - } else { - TypedArraySetFromArrayLike( - this, obj, %_TypedArrayGetLength(obj), intOffset); - } - return; - case 3: // TYPED_ARRAY_SET_NON_TYPED_ARRAY - var l = obj.length; - if (IS_UNDEFINED(l)) { - if (IS_NUMBER(obj)) { - // For number as a first argument, throw TypeError - // instead of silently ignoring the call, so that - // users know they did something wrong. - // (Consistent with Firefox and Blink/WebKit) - throw %make_type_error(kInvalidArgument); + switch (%TypedArraySetFastCases(this, obj, intOffset)) { + // These numbers should be synchronized with runtime.cc. + case 0: // TYPED_ARRAY_SET_TYPED_ARRAY_SAME_TYPE + return; + case 1: // TYPED_ARRAY_SET_TYPED_ARRAY_OVERLAPPING + TypedArraySetFromOverlappingTypedArray(this, obj, intOffset); + return; + case 2: // TYPED_ARRAY_SET_TYPED_ARRAY_NONOVERLAPPING + if (intOffset === 0) { + %TypedArrayCopyElements(this, obj, %_TypedArrayGetLength(obj)); + } else { + TypedArraySetFromArrayLike( + this, obj, %_TypedArrayGetLength(obj), intOffset); } return; - } - l = TO_LENGTH(l); - if (intOffset + l > %_TypedArrayGetLength(this)) { - throw %make_range_error(kTypedArraySetSourceTooLarge); - } - TypedArraySetFromArrayLike(this, obj, l, intOffset); - return; - } -} -%FunctionSetLength(TypedArraySet, 1); - -function TypedArrayGetToStringTag() { - if (!IS_TYPEDARRAY(this)) return; - var name = %_ClassOf(this); - if (IS_UNDEFINED(name)) return; - return name; -} - -function InnerTypedArrayForEach(f, receiver, array, length) { - if (!IS_CALLABLE(f)) throw %make_type_error(kCalledNonCallable, f); - - if (IS_UNDEFINED(receiver)) { - for (var i = 0; i < length; i++) { - if (i in array) { - var element = array[i]; - f(element, i, array); - } - } - } else { - for (var i = 0; i < length; i++) { - if (i in array) { - var element = array[i]; - %_Call(f, receiver, element, i, array); - } + case 3: // TYPED_ARRAY_SET_NON_TYPED_ARRAY + var l = obj.length; + if (IS_UNDEFINED(l)) { + if (IS_NUMBER(obj)) { + // For number as a first argument, throw TypeError + // instead of silently ignoring the call, so that + // users know they did something wrong. + // (Consistent with Firefox and Blink/WebKit) + throw %make_type_error(kInvalidArgument); + } + return; + } + l = TO_LENGTH(l); + if (intOffset + l > %_TypedArrayGetLength(this)) { + throw %make_range_error(kTypedArraySetSourceTooLarge); + } + TypedArraySetFromArrayLike(this, obj, l, intOffset); + return; } + }, + 1 /* Set function length. */ +); + + +DEFINE_METHOD( + GlobalTypedArray.prototype, + get [toStringTagSymbol]() { + if (!IS_TYPEDARRAY(this)) return; + var name = %_ClassOf(this); + if (IS_UNDEFINED(name)) return; + return name; } -} - -// ES6 draft 08-24-14, section 22.2.3.12 -function TypedArrayForEach(f, receiver) { - ValidateTypedArray(this, "%TypedArray%.prototype.forEach"); - - var length = %_TypedArrayGetLength(this); - - InnerTypedArrayForEach(f, receiver, this, length); -} -%FunctionSetLength(TypedArrayForEach, 1); +); // The following functions cannot be made efficient on sparse arrays while // preserving the semantics, since the calls to the receiver function can add @@ -415,88 +395,109 @@ function InnerTypedArrayFilter(f, receiver, array, length, result) { // ES6 draft 07-15-13, section 22.2.3.9 -function TypedArrayFilter(f, thisArg) { - ValidateTypedArray(this, "%TypeArray%.prototype.filter"); - - var length = %_TypedArrayGetLength(this); - if (!IS_CALLABLE(f)) throw %make_type_error(kCalledNonCallable, f); - var result = new InternalArray(); - InnerTypedArrayFilter(f, thisArg, this, length, result); - var captured = result.length; - var output = TypedArraySpeciesCreate(this, captured); - for (var i = 0; i < captured; i++) { - output[i] = result[i]; - } - return output; -} -%FunctionSetLength(TypedArrayFilter, 1); +DEFINE_METHOD_LEN( + GlobalTypedArray.prototype, + filter(f, thisArg) { + ValidateTypedArray(this, "%TypeArray%.prototype.filter"); + + var length = %_TypedArrayGetLength(this); + if (!IS_CALLABLE(f)) throw %make_type_error(kCalledNonCallable, f); + var result = new InternalArray(); + InnerTypedArrayFilter(f, thisArg, this, length, result); + var captured = result.length; + var output = TypedArraySpeciesCreate(this, captured); + for (var i = 0; i < captured; i++) { + output[i] = result[i]; + } + return output; + }, + 1 /* Set function length. */ +); // ES6 draft 07-15-13, section 22.2.3.10 -function TypedArrayFind(predicate, thisArg) { - ValidateTypedArray(this, "%TypedArray%.prototype.find"); +DEFINE_METHOD_LEN( + GlobalTypedArray.prototype, + find(predicate, thisArg) { + ValidateTypedArray(this, "%TypedArray%.prototype.find"); - var length = %_TypedArrayGetLength(this); + var length = %_TypedArrayGetLength(this); - return InnerArrayFind(predicate, thisArg, this, length); -} -%FunctionSetLength(TypedArrayFind, 1); + return InnerArrayFind(predicate, thisArg, this, length); + }, + 1 /* Set function length. */ +); // ES6 draft 07-15-13, section 22.2.3.11 -function TypedArrayFindIndex(predicate, thisArg) { - ValidateTypedArray(this, "%TypedArray%.prototype.findIndex"); +DEFINE_METHOD_LEN( + GlobalTypedArray.prototype, + findIndex(predicate, thisArg) { + ValidateTypedArray(this, "%TypedArray%.prototype.findIndex"); - var length = %_TypedArrayGetLength(this); + var length = %_TypedArrayGetLength(this); - return InnerArrayFindIndex(predicate, thisArg, this, length); -} -%FunctionSetLength(TypedArrayFindIndex, 1); + return InnerArrayFindIndex(predicate, thisArg, this, length); + }, + 1 /* Set function length. */ +); // ES6 draft 05-18-15, section 22.2.3.25 -function TypedArraySort(comparefn) { - ValidateTypedArray(this, "%TypedArray%.prototype.sort"); +DEFINE_METHOD( + GlobalTypedArray.prototype, + sort(comparefn) { + ValidateTypedArray(this, "%TypedArray%.prototype.sort"); - var length = %_TypedArrayGetLength(this); + var length = %_TypedArrayGetLength(this); - if (IS_UNDEFINED(comparefn)) { - return %TypedArraySortFast(this); - } + if (IS_UNDEFINED(comparefn)) { + return %TypedArraySortFast(this); + } - return InnerArraySort(this, length, comparefn); -} + return InnerArraySort(this, length, comparefn); + } +); // ES6 section 22.2.3.27 -function TypedArrayToLocaleString() { - ValidateTypedArray(this, "%TypedArray%.prototype.toLocaleString"); +DEFINE_METHOD( + GlobalTypedArray.prototype, + toLocaleString() { + ValidateTypedArray(this, "%TypedArray%.prototype.toLocaleString"); - var length = %_TypedArrayGetLength(this); + var length = %_TypedArrayGetLength(this); - return InnerArrayToLocaleString(this, length); -} + return InnerArrayToLocaleString(this, length); + } +); // ES6 section 22.2.3.14 -function TypedArrayJoin(separator) { - ValidateTypedArray(this, "%TypedArray%.prototype.join"); +DEFINE_METHOD( + GlobalTypedArray.prototype, + join(separator) { + ValidateTypedArray(this, "%TypedArray%.prototype.join"); - var length = %_TypedArrayGetLength(this); + var length = %_TypedArrayGetLength(this); - return InnerArrayJoin(separator, this, length); -} + return InnerArrayJoin(separator, this, length); + } +); // ES6 draft 08-24-14, section 22.2.2.2 -function TypedArrayOf() { - var length = arguments.length; - var array = TypedArrayCreate(this, length); - for (var i = 0; i < length; i++) { - array[i] = arguments[i]; +DEFINE_METHOD( + GlobalTypedArray, + of() { + var length = arguments.length; + var array = TypedArrayCreate(this, length); + for (var i = 0; i < length; i++) { + array[i] = arguments[i]; + } + return array; } - return array; -} +); // ES#sec-iterabletoarraylike Runtime Semantics: IterableToArrayLike( items ) @@ -520,31 +521,34 @@ function IterableToArrayLike(items) { // ES#sec-%typedarray%.from // %TypedArray%.from ( source [ , mapfn [ , thisArg ] ] ) -function TypedArrayFrom(source, mapfn, thisArg) { - if (!%IsConstructor(this)) throw %make_type_error(kNotConstructor, this); - var mapping; - if (!IS_UNDEFINED(mapfn)) { - if (!IS_CALLABLE(mapfn)) throw %make_type_error(kCalledNonCallable, this); - mapping = true; - } else { - mapping = false; - } - var arrayLike = IterableToArrayLike(source); - var length = TO_LENGTH(arrayLike.length); - var targetObject = TypedArrayCreate(this, length); - var value, mappedValue; - for (var i = 0; i < length; i++) { - value = arrayLike[i]; - if (mapping) { - mappedValue = %_Call(mapfn, thisArg, value, i); +DEFINE_METHOD_LEN( + GlobalTypedArray, + 'from'(source, mapfn, thisArg) { + if (!%IsConstructor(this)) throw %make_type_error(kNotConstructor, this); + var mapping; + if (!IS_UNDEFINED(mapfn)) { + if (!IS_CALLABLE(mapfn)) throw %make_type_error(kCalledNonCallable, this); + mapping = true; } else { - mappedValue = value; + mapping = false; } - targetObject[i] = mappedValue; - } - return targetObject; -} -%FunctionSetLength(TypedArrayFrom, 1); + var arrayLike = IterableToArrayLike(source); + var length = TO_LENGTH(arrayLike.length); + var targetObject = TypedArrayCreate(this, length); + var value, mappedValue; + for (var i = 0; i < length; i++) { + value = arrayLike[i]; + if (mapping) { + mappedValue = %_Call(mapfn, thisArg, value, i); + } else { + mappedValue = value; + } + targetObject[i] = mappedValue; + } + return targetObject; + }, + 1 /* Set function length. */ +); // TODO(bmeurer): Migrate this to a proper builtin. function TypedArrayConstructor() { @@ -554,23 +558,7 @@ function TypedArrayConstructor() { // ------------------------------------------------------------------- %SetCode(GlobalTypedArray, TypedArrayConstructor); -utils.InstallFunctions(GlobalTypedArray, DONT_ENUM, [ - "from", TypedArrayFrom, - "of", TypedArrayOf -]); -utils.InstallGetter(GlobalTypedArray.prototype, toStringTagSymbol, - TypedArrayGetToStringTag); -utils.InstallFunctions(GlobalTypedArray.prototype, DONT_ENUM, [ - "subarray", TypedArraySubArray, - "set", TypedArraySet, - "filter", TypedArrayFilter, - "find", TypedArrayFind, - "findIndex", TypedArrayFindIndex, - "join", TypedArrayJoin, - "forEach", TypedArrayForEach, - "sort", TypedArraySort, - "toLocaleString", TypedArrayToLocaleString -]); + %AddNamedProperty(GlobalTypedArray.prototype, "toString", ArrayToString, DONT_ENUM); diff --git a/deps/v8/src/js/v8natives.js b/deps/v8/src/js/v8natives.js index 5ae75bae22..5de98a0a09 100644 --- a/deps/v8/src/js/v8natives.js +++ b/deps/v8/src/js/v8natives.js @@ -4,6 +4,8 @@ (function(global, utils) { +"use strict"; + %CheckIsBootstrapping(); // ---------------------------------------------------------------------------- @@ -15,20 +17,15 @@ var iteratorSymbol = utils.ImportNow("iterator_symbol"); // ---------------------------------------------------------------------------- // Object -// ES6 19.1.3.5 Object.prototype.toLocaleString([reserved1 [,reserved2]]) -function ObjectToLocaleString() { - CHECK_OBJECT_COERCIBLE(this, "Object.prototype.toLocaleString"); - return this.toString(); -} - - -// ES6 19.1.3.3 Object.prototype.isPrototypeOf(V) -function ObjectIsPrototypeOf(V) { - if (!IS_RECEIVER(V)) return false; - var O = TO_OBJECT(this); - return %HasInPrototypeChain(V, O); -} - +// Set up non-enumerable functions on the Object.prototype object. +DEFINE_METHOD( + GlobalObject.prototype, + // ES6 19.1.3.5 Object.prototype.toLocaleString([reserved1 [,reserved2]]) + toLocaleString() { + CHECK_OBJECT_COERCIBLE(this, "Object.prototype.toLocaleString"); + return this.toString(); + } +); // ES6 7.3.9 function GetMethod(obj, p) { @@ -54,22 +51,6 @@ function ObjectConstructor(x) { %SetNativeFlag(GlobalObject); %SetCode(GlobalObject, ObjectConstructor); -%AddNamedProperty(GlobalObject.prototype, "constructor", GlobalObject, - DONT_ENUM); - -// Set up non-enumerable functions on the Object.prototype object. -utils.InstallFunctions(GlobalObject.prototype, DONT_ENUM, [ - // toString is added in bootstrapper.cc - "toLocaleString", ObjectToLocaleString, - // valueOf is added in bootstrapper.cc. - "isPrototypeOf", ObjectIsPrototypeOf, - // propertyIsEnumerable is added in bootstrapper.cc. - // __defineGetter__ is added in bootstrapper.cc. - // __lookupGetter__ is added in bootstrapper.cc. - // __defineSetter__ is added in bootstrapper.cc. - // __lookupSetter__ is added in bootstrapper.cc. -]); - // ---------------------------------------------------------------------------- // Iterator related spec functions. diff --git a/deps/v8/src/js/weak-collection.js b/deps/v8/src/js/weak-collection.js index f5092d29f5..30d654b806 100644 --- a/deps/v8/src/js/weak-collection.js +++ b/deps/v8/src/js/weak-collection.js @@ -13,10 +13,8 @@ var GetExistingHash; var GetHash; -var GlobalObject = global.Object; var GlobalWeakMap = global.WeakMap; var GlobalWeakSet = global.WeakSet; -var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol"); utils.Import(function(from) { GetExistingHash = from.GetExistingHash; @@ -48,69 +46,36 @@ function WeakMapConstructor(iterable) { } -function WeakMapGet(key) { - if (!IS_WEAKMAP(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'WeakMap.prototype.get', this); - } - if (!IS_RECEIVER(key)) return UNDEFINED; - var hash = GetExistingHash(key); - if (IS_UNDEFINED(hash)) return UNDEFINED; - return %WeakCollectionGet(this, key, hash); -} - - -function WeakMapSet(key, value) { - if (!IS_WEAKMAP(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'WeakMap.prototype.set', this); - } - if (!IS_RECEIVER(key)) throw %make_type_error(kInvalidWeakMapKey); - return %WeakCollectionSet(this, key, value, GetHash(key)); -} - - -function WeakMapHas(key) { - if (!IS_WEAKMAP(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'WeakMap.prototype.has', this); - } - if (!IS_RECEIVER(key)) return false; - var hash = GetExistingHash(key); - if (IS_UNDEFINED(hash)) return false; - return %WeakCollectionHas(this, key, hash); -} - +// Set up the non-enumerable functions on the WeakMap prototype object. +DEFINE_METHODS( + GlobalWeakMap.prototype, + { + set(key, value) { + if (!IS_WEAKMAP(this)) { + throw %make_type_error(kIncompatibleMethodReceiver, + 'WeakMap.prototype.set', this); + } + if (!IS_RECEIVER(key)) throw %make_type_error(kInvalidWeakMapKey); + return %WeakCollectionSet(this, key, value, GetHash(key)); + } -function WeakMapDelete(key) { - if (!IS_WEAKMAP(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'WeakMap.prototype.delete', this); + delete(key) { + if (!IS_WEAKMAP(this)) { + throw %make_type_error(kIncompatibleMethodReceiver, + 'WeakMap.prototype.delete', this); + } + if (!IS_RECEIVER(key)) return false; + var hash = GetExistingHash(key); + if (IS_UNDEFINED(hash)) return false; + return %WeakCollectionDelete(this, key, hash); + } } - if (!IS_RECEIVER(key)) return false; - var hash = GetExistingHash(key); - if (IS_UNDEFINED(hash)) return false; - return %WeakCollectionDelete(this, key, hash); -} - +); // ------------------------------------------------------------------- %SetCode(GlobalWeakMap, WeakMapConstructor); %FunctionSetLength(GlobalWeakMap, 0); -%FunctionSetPrototype(GlobalWeakMap, new GlobalObject()); -%AddNamedProperty(GlobalWeakMap.prototype, "constructor", GlobalWeakMap, - DONT_ENUM); -%AddNamedProperty(GlobalWeakMap.prototype, toStringTagSymbol, "WeakMap", - DONT_ENUM | READ_ONLY); - -// Set up the non-enumerable functions on the WeakMap prototype object. -utils.InstallFunctions(GlobalWeakMap.prototype, DONT_ENUM, [ - "get", WeakMapGet, - "set", WeakMapSet, - "has", WeakMapHas, - "delete", WeakMapDelete -]); // ------------------------------------------------------------------- // Harmony WeakSet @@ -134,55 +99,35 @@ function WeakSetConstructor(iterable) { } -function WeakSetAdd(value) { - if (!IS_WEAKSET(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'WeakSet.prototype.add', this); - } - if (!IS_RECEIVER(value)) throw %make_type_error(kInvalidWeakSetValue); - return %WeakCollectionSet(this, value, true, GetHash(value)); -} - - -function WeakSetHas(value) { - if (!IS_WEAKSET(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'WeakSet.prototype.has', this); - } - if (!IS_RECEIVER(value)) return false; - var hash = GetExistingHash(value); - if (IS_UNDEFINED(hash)) return false; - return %WeakCollectionHas(this, value, hash); -} - +// Set up the non-enumerable functions on the WeakSet prototype object. +DEFINE_METHODS( + GlobalWeakSet.prototype, + { + add(value) { + if (!IS_WEAKSET(this)) { + throw %make_type_error(kIncompatibleMethodReceiver, + 'WeakSet.prototype.add', this); + } + if (!IS_RECEIVER(value)) throw %make_type_error(kInvalidWeakSetValue); + return %WeakCollectionSet(this, value, true, GetHash(value)); + } -function WeakSetDelete(value) { - if (!IS_WEAKSET(this)) { - throw %make_type_error(kIncompatibleMethodReceiver, - 'WeakSet.prototype.delete', this); + delete(value) { + if (!IS_WEAKSET(this)) { + throw %make_type_error(kIncompatibleMethodReceiver, + 'WeakSet.prototype.delete', this); + } + if (!IS_RECEIVER(value)) return false; + var hash = GetExistingHash(value); + if (IS_UNDEFINED(hash)) return false; + return %WeakCollectionDelete(this, value, hash); + } } - if (!IS_RECEIVER(value)) return false; - var hash = GetExistingHash(value); - if (IS_UNDEFINED(hash)) return false; - return %WeakCollectionDelete(this, value, hash); -} - +); // ------------------------------------------------------------------- %SetCode(GlobalWeakSet, WeakSetConstructor); %FunctionSetLength(GlobalWeakSet, 0); -%FunctionSetPrototype(GlobalWeakSet, new GlobalObject()); -%AddNamedProperty(GlobalWeakSet.prototype, "constructor", GlobalWeakSet, - DONT_ENUM); -%AddNamedProperty(GlobalWeakSet.prototype, toStringTagSymbol, "WeakSet", - DONT_ENUM | READ_ONLY); - -// Set up the non-enumerable functions on the WeakSet prototype object. -utils.InstallFunctions(GlobalWeakSet.prototype, DONT_ENUM, [ - "add", WeakSetAdd, - "has", WeakSetHas, - "delete", WeakSetDelete -]); }) |