Index: src/array.js |
diff --git a/src/array.js b/src/array.js |
index b69554c21494c73ef8b2822f0a00adfbeb82c8da..e9cd9c02247e2a6d829d23e29500b5c6a77c7351 100644 |
--- a/src/array.js |
+++ b/src/array.js |
@@ -2,11 +2,22 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+var $arrayConcat; |
+var $arrayJoin; |
+var $arrayPush; |
+var $arrayPop; |
+var $arrayShift; |
+var $arraySlice; |
+var $arraySplice; |
+var $arrayUnshift; |
+ |
+(function() { |
+ |
"use strict"; |
-// This file relies on the fact that the following declarations have been made |
-// in runtime.js: |
-// var $Array = global.Array; |
+%CheckIsBootstrapping(); |
+ |
+var GlobalArray = global.Array; |
// ------------------------------------------------------------------- |
@@ -418,6 +429,7 @@ function ObservedArrayPop(n) { |
return value; |
} |
+ |
// Removes the last element from the array and returns it. See |
// ECMA-262, section 15.4.4.6. |
function ArrayPop() { |
@@ -460,6 +472,7 @@ function ObservedArrayPush() { |
return new_length; |
} |
+ |
// 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() { |
@@ -595,6 +608,7 @@ function ObservedArrayShift(len) { |
return first; |
} |
+ |
function ArrayShift() { |
CHECK_OBJECT_COERCIBLE(this, "Array.prototype.shift"); |
@@ -627,6 +641,7 @@ function ArrayShift() { |
return first; |
} |
+ |
function ObservedArrayUnshift() { |
var len = TO_UINT32(this.length); |
var num_arguments = %_ArgumentsLength(); |
@@ -647,6 +662,7 @@ function ObservedArrayUnshift() { |
return new_length; |
} |
+ |
function ArrayUnshift(arg1) { // length == 1 |
CHECK_OBJECT_COERCIBLE(this, "Array.prototype.unshift"); |
@@ -1150,7 +1166,7 @@ function ArrayFilter(f, receiver) { |
needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver); |
} |
- var result = new $Array(); |
+ var result = new GlobalArray(); |
var accumulator = new InternalArray(); |
var accumulator_length = 0; |
var is_array = IS_ARRAY(array); |
@@ -1264,6 +1280,7 @@ function ArrayEvery(f, receiver) { |
return true; |
} |
+ |
function ArrayMap(f, receiver) { |
CHECK_OBJECT_COERCIBLE(this, "Array.prototype.map"); |
@@ -1280,7 +1297,7 @@ function ArrayMap(f, receiver) { |
needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver); |
} |
- var result = new $Array(); |
+ var result = new GlobalArray(); |
var accumulator = new InternalArray(length); |
var is_array = IS_ARRAY(array); |
var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); |
@@ -1445,6 +1462,7 @@ function ArrayReduce(callback, current) { |
return current; |
} |
+ |
function ArrayReduceRight(callback, current) { |
CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reduceRight"); |
@@ -1490,91 +1508,98 @@ function ArrayIsArray(obj) { |
// ------------------------------------------------------------------- |
-function SetUpArray() { |
- %CheckIsBootstrapping(); |
- |
- // Set up non-enumerable constructor property on the Array.prototype |
- // object. |
- %AddNamedProperty($Array.prototype, "constructor", $Array, DONT_ENUM); |
- |
- // Set up unscopable properties on the Array.prototype object. |
- var unscopables = { |
- __proto__: null, |
- copyWithin: true, |
- entries: true, |
- fill: true, |
- find: true, |
- findIndex: true, |
- keys: true, |
- }; |
- %AddNamedProperty($Array.prototype, symbolUnscopables, unscopables, |
- DONT_ENUM | READ_ONLY); |
- |
- // Set up non-enumerable functions on the Array object. |
- InstallFunctions($Array, DONT_ENUM, [ |
- "isArray", ArrayIsArray |
- ]); |
- |
- var specialFunctions = %SpecialArrayFunctions(); |
- |
- var getFunction = function(name, jsBuiltin, len) { |
- var f = jsBuiltin; |
- if (specialFunctions.hasOwnProperty(name)) { |
- f = specialFunctions[name]; |
- } |
- if (!IS_UNDEFINED(len)) { |
- %FunctionSetLength(f, len); |
- } |
- return f; |
- }; |
- |
- // 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. |
- InstallFunctions($Array.prototype, DONT_ENUM, [ |
- "toString", getFunction("toString", ArrayToString), |
- "toLocaleString", getFunction("toLocaleString", ArrayToLocaleString), |
- "join", getFunction("join", ArrayJoin), |
- "pop", getFunction("pop", ArrayPop), |
- "push", getFunction("push", ArrayPush, 1), |
- "concat", getFunction("concat", ArrayConcatJS, 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), |
- "filter", getFunction("filter", ArrayFilter, 1), |
- "forEach", getFunction("forEach", ArrayForEach, 1), |
- "some", getFunction("some", ArraySome, 1), |
- "every", getFunction("every", ArrayEvery, 1), |
- "map", getFunction("map", ArrayMap, 1), |
- "indexOf", getFunction("indexOf", ArrayIndexOf, 1), |
- "lastIndexOf", getFunction("lastIndexOf", ArrayLastIndexOf, 1), |
- "reduce", getFunction("reduce", ArrayReduce, 1), |
- "reduceRight", getFunction("reduceRight", ArrayReduceRight, 1) |
- ]); |
- |
- %FinishArrayPrototypeSetup($Array.prototype); |
- |
- // 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. |
- SetUpLockedPrototype(InternalArray, $Array(), [ |
- "concat", getFunction("concat", ArrayConcatJS), |
- "indexOf", getFunction("indexOf", ArrayIndexOf), |
- "join", getFunction("join", ArrayJoin), |
- "pop", getFunction("pop", ArrayPop), |
- "push", getFunction("push", ArrayPush), |
- "splice", getFunction("splice", ArraySplice) |
- ]); |
- |
- SetUpLockedPrototype(InternalPackedArray, $Array(), [ |
- "join", getFunction("join", ArrayJoin), |
- "pop", getFunction("pop", ArrayPop), |
- "push", getFunction("push", ArrayPush) |
- ]); |
-} |
- |
-SetUpArray(); |
+// 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, |
+ copyWithin: true, |
+ entries: true, |
+ fill: true, |
+ find: true, |
+ findIndex: true, |
+ keys: true, |
+}; |
+ |
+%AddNamedProperty(GlobalArray.prototype, symbolUnscopables, unscopables, |
+ DONT_ENUM | READ_ONLY); |
+ |
+// Set up non-enumerable functions on the Array object. |
+InstallFunctions(GlobalArray, DONT_ENUM, [ |
+ "isArray", ArrayIsArray |
+]); |
+ |
+var specialFunctions = %SpecialArrayFunctions(); |
+ |
+var getFunction = function(name, jsBuiltin, len) { |
+ var f = jsBuiltin; |
+ if (specialFunctions.hasOwnProperty(name)) { |
+ f = specialFunctions[name]; |
+ } |
+ if (!IS_UNDEFINED(len)) { |
+ %FunctionSetLength(f, len); |
+ } |
+ return f; |
+}; |
+ |
+// 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. |
+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), |
+ "concat", getFunction("concat", ArrayConcatJS, 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), |
+ "filter", getFunction("filter", ArrayFilter, 1), |
+ "forEach", getFunction("forEach", ArrayForEach, 1), |
+ "some", getFunction("some", ArraySome, 1), |
+ "every", getFunction("every", ArrayEvery, 1), |
+ "map", getFunction("map", ArrayMap, 1), |
+ "indexOf", getFunction("indexOf", ArrayIndexOf, 1), |
+ "lastIndexOf", getFunction("lastIndexOf", ArrayLastIndexOf, 1), |
+ "reduce", getFunction("reduce", ArrayReduce, 1), |
+ "reduceRight", getFunction("reduceRight", ArrayReduceRight, 1) |
+]); |
+ |
+%FinishArrayPrototypeSetup(GlobalArray.prototype); |
+ |
+// 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. |
+SetUpLockedPrototype(InternalArray, GlobalArray(), [ |
+ "concat", getFunction("concat", ArrayConcatJS), |
+ "indexOf", getFunction("indexOf", ArrayIndexOf), |
+ "join", getFunction("join", ArrayJoin), |
+ "pop", getFunction("pop", ArrayPop), |
+ "push", getFunction("push", ArrayPush), |
+ "splice", getFunction("splice", ArraySplice) |
+]); |
+ |
+SetUpLockedPrototype(InternalPackedArray, GlobalArray(), [ |
+ "join", getFunction("join", ArrayJoin), |
+ "pop", getFunction("pop", ArrayPop), |
+ "push", getFunction("push", ArrayPush) |
+]); |
+ |
+$arrayConcat = ArrayConcatJS; |
+$arrayJoin = ArrayJoin; |
+$arrayPush = ArrayPush; |
+$arrayPop = ArrayPop; |
+$arrayShift = ArrayShift; |
+$arraySlice = ArraySlice; |
+$arraySplice = ArraySplice; |
+$arrayUnshift = ArrayUnshift; |
+ |
+})(); |