Index: src/array.js |
=================================================================== |
--- src/array.js (revision 9808) |
+++ src/array.js (working copy) |
@@ -1013,18 +1013,22 @@ |
} |
if (IS_NULL_OR_UNDEFINED(receiver)) { |
receiver = %GetDefaultReceiver(f) || receiver; |
+ } else if (!IS_SPEC_OBJECT(receiver)) { |
+ receiver = ToObject(receiver); |
} |
- var result = []; |
- var result_length = 0; |
+ var result = new $Array(); |
+ var accumulator = new InternalArray(); |
+ var accumulator_length = 0; |
for (var i = 0; i < length; i++) { |
var current = array[i]; |
if (!IS_UNDEFINED(current) || i in array) { |
if (%_CallFunction(receiver, current, i, array, f)) { |
- result[result_length++] = current; |
+ accumulator[accumulator_length++] = current; |
} |
} |
} |
+ %MoveArrayContents(accumulator, result); |
return result; |
} |
@@ -1045,6 +1049,8 @@ |
} |
if (IS_NULL_OR_UNDEFINED(receiver)) { |
receiver = %GetDefaultReceiver(f) || receiver; |
+ } else if (!IS_SPEC_OBJECT(receiver)) { |
+ receiver = ToObject(receiver); |
} |
for (var i = 0; i < length; i++) { |
@@ -1074,6 +1080,8 @@ |
} |
if (IS_NULL_OR_UNDEFINED(receiver)) { |
receiver = %GetDefaultReceiver(f) || receiver; |
+ } else if (!IS_SPEC_OBJECT(receiver)) { |
+ receiver = ToObject(receiver); |
} |
for (var i = 0; i < length; i++) { |
@@ -1102,6 +1110,8 @@ |
} |
if (IS_NULL_OR_UNDEFINED(receiver)) { |
receiver = %GetDefaultReceiver(f) || receiver; |
+ } else if (!IS_SPEC_OBJECT(receiver)) { |
+ receiver = ToObject(receiver); |
} |
for (var i = 0; i < length; i++) { |
@@ -1129,6 +1139,8 @@ |
} |
if (IS_NULL_OR_UNDEFINED(receiver)) { |
receiver = %GetDefaultReceiver(f) || receiver; |
+ } else if (!IS_SPEC_OBJECT(receiver)) { |
+ receiver = ToObject(receiver); |
} |
var result = new $Array(); |