Index: src/array.js |
diff --git a/src/array.js b/src/array.js |
index a12fdc84bc2a46007160efe4fb1a2b5b4ceb8de7..281c507f5a6d6e83b4dd196e3170a0538950fa33 100644 |
--- a/src/array.js |
+++ b/src/array.js |
@@ -996,6 +996,9 @@ function ArrayFilter(f, receiver) { |
if (!IS_FUNCTION(f)) { |
throw MakeTypeError('called_non_callable', [ f ]); |
} |
+ if (IS_NULL_OR_UNDEFINED(receiver)) { |
+ receiver = %GetDefaultReceiver(f) || receiver; |
+ } |
// Pull out the length so that modifications to the length in the |
// loop will not affect the looping. |
var length = ToUint32(this.length); |
@@ -1004,7 +1007,7 @@ function ArrayFilter(f, receiver) { |
for (var i = 0; i < length; i++) { |
var current = this[i]; |
if (!IS_UNDEFINED(current) || i in this) { |
- if (f.call(receiver, current, i, this)) { |
+ if (%_CallFunction(receiver, current, i, this, f)) { |
result[result_length++] = current; |
} |
} |
@@ -1022,13 +1025,16 @@ function ArrayForEach(f, receiver) { |
if (!IS_FUNCTION(f)) { |
throw MakeTypeError('called_non_callable', [ f ]); |
} |
+ if (IS_NULL_OR_UNDEFINED(receiver)) { |
+ receiver = %GetDefaultReceiver(f) || receiver; |
+ } |
// Pull out the length so that modifications to the length in the |
// loop will not affect the looping. |
var length = TO_UINT32(this.length); |
for (var i = 0; i < length; i++) { |
var current = this[i]; |
if (!IS_UNDEFINED(current) || i in this) { |
- f.call(receiver, current, i, this); |
+ %_CallFunction(receiver, current, i, this, f); |
} |
} |
} |
@@ -1045,13 +1051,16 @@ function ArraySome(f, receiver) { |
if (!IS_FUNCTION(f)) { |
throw MakeTypeError('called_non_callable', [ f ]); |
} |
+ if (IS_NULL_OR_UNDEFINED(receiver)) { |
+ receiver = %GetDefaultReceiver(f) || receiver; |
+ } |
// Pull out the length so that modifications to the length in the |
// loop will not affect the looping. |
var length = TO_UINT32(this.length); |
for (var i = 0; i < length; i++) { |
var current = this[i]; |
if (!IS_UNDEFINED(current) || i in this) { |
- if (f.call(receiver, current, i, this)) return true; |
+ if (%_CallFunction(receiver, current, i, this, f)) return true; |
} |
} |
return false; |
@@ -1067,13 +1076,16 @@ function ArrayEvery(f, receiver) { |
if (!IS_FUNCTION(f)) { |
throw MakeTypeError('called_non_callable', [ f ]); |
} |
+ if (IS_NULL_OR_UNDEFINED(receiver)) { |
+ receiver = %GetDefaultReceiver(f) || receiver; |
+ } |
// Pull out the length so that modifications to the length in the |
// loop will not affect the looping. |
var length = TO_UINT32(this.length); |
for (var i = 0; i < length; i++) { |
var current = this[i]; |
if (!IS_UNDEFINED(current) || i in this) { |
- if (!f.call(receiver, current, i, this)) return false; |
+ if (!%_CallFunction(receiver, current, i, this, f)) return false; |
} |
} |
return true; |
@@ -1088,6 +1100,9 @@ function ArrayMap(f, receiver) { |
if (!IS_FUNCTION(f)) { |
throw MakeTypeError('called_non_callable', [ f ]); |
} |
+ if (IS_NULL_OR_UNDEFINED(receiver)) { |
+ receiver = %GetDefaultReceiver(f) || receiver; |
+ } |
// Pull out the length so that modifications to the length in the |
// loop will not affect the looping. |
var length = TO_UINT32(this.length); |
@@ -1096,7 +1111,7 @@ function ArrayMap(f, receiver) { |
for (var i = 0; i < length; i++) { |
var current = this[i]; |
if (!IS_UNDEFINED(current) || i in this) { |
- accumulator[i] = f.call(receiver, current, i, this); |
+ accumulator[i] = %_CallFunction(receiver, current, i, this, f); |
} |
} |
%MoveArrayContents(accumulator, result); |
@@ -1233,6 +1248,7 @@ function ArrayReduce(callback, current) { |
if (!IS_FUNCTION(callback)) { |
throw MakeTypeError('called_non_callable', [callback]); |
} |
+ |
// Pull out the length so that modifications to the length in the |
// loop will not affect the looping. |
var length = ToUint32(this.length); |
@@ -1249,10 +1265,11 @@ function ArrayReduce(callback, current) { |
throw MakeTypeError('reduce_no_initial', []); |
} |
+ var receiver = %GetDefaultReceiver(callback); |
for (; i < length; i++) { |
var element = this[i]; |
if (!IS_UNDEFINED(element) || i in this) { |
- current = callback.call(void 0, current, element, i, this); |
+ current = %_CallFunction(receiver, current, element, i, this, callback); |
} |
} |
return current; |
@@ -1280,10 +1297,11 @@ function ArrayReduceRight(callback, current) { |
throw MakeTypeError('reduce_no_initial', []); |
} |
+ var receiver = %GetDefaultReceiver(callback); |
for (; i >= 0; i--) { |
var element = this[i]; |
if (!IS_UNDEFINED(element) || i in this) { |
- current = callback.call(void 0, current, element, i, this); |
+ current = %_CallFunction(receiver, current, element, i, this, callback); |
} |
} |
return current; |