Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: src/array.js

Issue 553413002: Array.prototype.{every, filter, find, findIndex, forEach, map, some}: Use fresh primitive wrapper f… (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fixed nits from last patch. Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/collection.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 "use strict"; 5 "use strict";
6 6
7 // This file relies on the fact that the following declarations have been made 7 // This file relies on the fact that the following declarations have been made
8 // in runtime.js: 8 // in runtime.js:
9 // var $Array = global.Array; 9 // var $Array = global.Array;
10 10
(...skipping 1107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1118 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.filter"); 1118 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.filter");
1119 1119
1120 // Pull out the length so that modifications to the length in the 1120 // Pull out the length so that modifications to the length in the
1121 // loop will not affect the looping and side effects are visible. 1121 // loop will not affect the looping and side effects are visible.
1122 var array = ToObject(this); 1122 var array = ToObject(this);
1123 var length = ToUint32(array.length); 1123 var length = ToUint32(array.length);
1124 1124
1125 if (!IS_SPEC_FUNCTION(f)) { 1125 if (!IS_SPEC_FUNCTION(f)) {
1126 throw MakeTypeError('called_non_callable', [ f ]); 1126 throw MakeTypeError('called_non_callable', [ f ]);
1127 } 1127 }
1128 var needs_wrapper = false;
1128 if (IS_NULL_OR_UNDEFINED(receiver)) { 1129 if (IS_NULL_OR_UNDEFINED(receiver)) {
1129 receiver = %GetDefaultReceiver(f) || receiver; 1130 receiver = %GetDefaultReceiver(f) || receiver;
1130 } else if (!IS_SPEC_OBJECT(receiver) && %IsSloppyModeFunction(f)) { 1131 } else {
1131 receiver = ToObject(receiver); 1132 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver);
1132 } 1133 }
1133 1134
1134 var result = new $Array(); 1135 var result = new $Array();
1135 var accumulator = new InternalArray(); 1136 var accumulator = new InternalArray();
1136 var accumulator_length = 0; 1137 var accumulator_length = 0;
1137 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); 1138 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
1138 for (var i = 0; i < length; i++) { 1139 for (var i = 0; i < length; i++) {
1139 if (i in array) { 1140 if (i in array) {
1140 var element = array[i]; 1141 var element = array[i];
1141 // Prepare break slots for debugger step in. 1142 // Prepare break slots for debugger step in.
1142 if (stepping) %DebugPrepareStepInIfStepping(f); 1143 if (stepping) %DebugPrepareStepInIfStepping(f);
1143 if (%_CallFunction(receiver, element, i, array, f)) { 1144 var new_receiver = needs_wrapper ? ToObject(receiver) : receiver;
1145 if (%_CallFunction(new_receiver, element, i, array, f)) {
1144 accumulator[accumulator_length++] = element; 1146 accumulator[accumulator_length++] = element;
1145 } 1147 }
1146 } 1148 }
1147 } 1149 }
1148 %MoveArrayContents(accumulator, result); 1150 %MoveArrayContents(accumulator, result);
1149 return result; 1151 return result;
1150 } 1152 }
1151 1153
1152 1154
1153 function ArrayForEach(f, receiver) { 1155 function ArrayForEach(f, receiver) {
1154 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.forEach"); 1156 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.forEach");
1155 1157
1156 // Pull out the length so that modifications to the length in the 1158 // Pull out the length so that modifications to the length in the
1157 // loop will not affect the looping and side effects are visible. 1159 // loop will not affect the looping and side effects are visible.
1158 var array = ToObject(this); 1160 var array = ToObject(this);
1159 var length = TO_UINT32(array.length); 1161 var length = TO_UINT32(array.length);
1160 1162
1161 if (!IS_SPEC_FUNCTION(f)) { 1163 if (!IS_SPEC_FUNCTION(f)) {
1162 throw MakeTypeError('called_non_callable', [ f ]); 1164 throw MakeTypeError('called_non_callable', [ f ]);
1163 } 1165 }
1166 var needs_wrapper = false;
1164 if (IS_NULL_OR_UNDEFINED(receiver)) { 1167 if (IS_NULL_OR_UNDEFINED(receiver)) {
1165 receiver = %GetDefaultReceiver(f) || receiver; 1168 receiver = %GetDefaultReceiver(f) || receiver;
1166 } else if (!IS_SPEC_OBJECT(receiver) && %IsSloppyModeFunction(f)) { 1169 } else {
1167 receiver = ToObject(receiver); 1170 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver);
1168 } 1171 }
1169 1172
1170 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); 1173 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
1171 for (var i = 0; i < length; i++) { 1174 for (var i = 0; i < length; i++) {
1172 if (i in array) { 1175 if (i in array) {
1173 var element = array[i]; 1176 var element = array[i];
1174 // Prepare break slots for debugger step in. 1177 // Prepare break slots for debugger step in.
1175 if (stepping) %DebugPrepareStepInIfStepping(f); 1178 if (stepping) %DebugPrepareStepInIfStepping(f);
1176 %_CallFunction(receiver, element, i, array, f); 1179 var new_receiver = needs_wrapper ? ToObject(receiver) : receiver;
1180 %_CallFunction(new_receiver, element, i, array, f);
1177 } 1181 }
1178 } 1182 }
1179 } 1183 }
1180 1184
1181 1185
1182 // Executes the function once for each element present in the 1186 // Executes the function once for each element present in the
1183 // array until it finds one where callback returns true. 1187 // array until it finds one where callback returns true.
1184 function ArraySome(f, receiver) { 1188 function ArraySome(f, receiver) {
1185 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.some"); 1189 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.some");
1186 1190
1187 // Pull out the length so that modifications to the length in the 1191 // Pull out the length so that modifications to the length in the
1188 // loop will not affect the looping and side effects are visible. 1192 // loop will not affect the looping and side effects are visible.
1189 var array = ToObject(this); 1193 var array = ToObject(this);
1190 var length = TO_UINT32(array.length); 1194 var length = TO_UINT32(array.length);
1191 1195
1192 if (!IS_SPEC_FUNCTION(f)) { 1196 if (!IS_SPEC_FUNCTION(f)) {
1193 throw MakeTypeError('called_non_callable', [ f ]); 1197 throw MakeTypeError('called_non_callable', [ f ]);
1194 } 1198 }
1199 var needs_wrapper = false;
1195 if (IS_NULL_OR_UNDEFINED(receiver)) { 1200 if (IS_NULL_OR_UNDEFINED(receiver)) {
1196 receiver = %GetDefaultReceiver(f) || receiver; 1201 receiver = %GetDefaultReceiver(f) || receiver;
1197 } else if (!IS_SPEC_OBJECT(receiver) && %IsSloppyModeFunction(f)) { 1202 } else {
1198 receiver = ToObject(receiver); 1203 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver);
1199 } 1204 }
1200 1205
1201 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); 1206 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
1202 for (var i = 0; i < length; i++) { 1207 for (var i = 0; i < length; i++) {
1203 if (i in array) { 1208 if (i in array) {
1204 var element = array[i]; 1209 var element = array[i];
1205 // Prepare break slots for debugger step in. 1210 // Prepare break slots for debugger step in.
1206 if (stepping) %DebugPrepareStepInIfStepping(f); 1211 if (stepping) %DebugPrepareStepInIfStepping(f);
1207 if (%_CallFunction(receiver, element, i, array, f)) return true; 1212 var new_receiver = needs_wrapper ? ToObject(receiver) : receiver;
1213 if (%_CallFunction(new_receiver, element, i, array, f)) return true;
1208 } 1214 }
1209 } 1215 }
1210 return false; 1216 return false;
1211 } 1217 }
1212 1218
1213 1219
1214 function ArrayEvery(f, receiver) { 1220 function ArrayEvery(f, receiver) {
1215 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.every"); 1221 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.every");
1216 1222
1217 // Pull out the length so that modifications to the length in the 1223 // Pull out the length so that modifications to the length in the
1218 // loop will not affect the looping and side effects are visible. 1224 // loop will not affect the looping and side effects are visible.
1219 var array = ToObject(this); 1225 var array = ToObject(this);
1220 var length = TO_UINT32(array.length); 1226 var length = TO_UINT32(array.length);
1221 1227
1222 if (!IS_SPEC_FUNCTION(f)) { 1228 if (!IS_SPEC_FUNCTION(f)) {
1223 throw MakeTypeError('called_non_callable', [ f ]); 1229 throw MakeTypeError('called_non_callable', [ f ]);
1224 } 1230 }
1231 var needs_wrapper = false;
1225 if (IS_NULL_OR_UNDEFINED(receiver)) { 1232 if (IS_NULL_OR_UNDEFINED(receiver)) {
1226 receiver = %GetDefaultReceiver(f) || receiver; 1233 receiver = %GetDefaultReceiver(f) || receiver;
1227 } else if (!IS_SPEC_OBJECT(receiver) && %IsSloppyModeFunction(f)) { 1234 } else {
1228 receiver = ToObject(receiver); 1235 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver);
1229 } 1236 }
1230 1237
1231 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); 1238 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
1232 for (var i = 0; i < length; i++) { 1239 for (var i = 0; i < length; i++) {
1233 if (i in array) { 1240 if (i in array) {
1234 var element = array[i]; 1241 var element = array[i];
1235 // Prepare break slots for debugger step in. 1242 // Prepare break slots for debugger step in.
1236 if (stepping) %DebugPrepareStepInIfStepping(f); 1243 if (stepping) %DebugPrepareStepInIfStepping(f);
1237 if (!%_CallFunction(receiver, element, i, array, f)) return false; 1244 var new_receiver = needs_wrapper ? ToObject(receiver) : receiver;
1245 if (!%_CallFunction(new_receiver, element, i, array, f)) return false;
1238 } 1246 }
1239 } 1247 }
1240 return true; 1248 return true;
1241 } 1249 }
1242 1250
1243 function ArrayMap(f, receiver) { 1251 function ArrayMap(f, receiver) {
1244 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.map"); 1252 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.map");
1245 1253
1246 // Pull out the length so that modifications to the length in the 1254 // Pull out the length so that modifications to the length in the
1247 // loop will not affect the looping and side effects are visible. 1255 // loop will not affect the looping and side effects are visible.
1248 var array = ToObject(this); 1256 var array = ToObject(this);
1249 var length = TO_UINT32(array.length); 1257 var length = TO_UINT32(array.length);
1250 1258
1251 if (!IS_SPEC_FUNCTION(f)) { 1259 if (!IS_SPEC_FUNCTION(f)) {
1252 throw MakeTypeError('called_non_callable', [ f ]); 1260 throw MakeTypeError('called_non_callable', [ f ]);
1253 } 1261 }
1262 var needs_wrapper = false;
1254 if (IS_NULL_OR_UNDEFINED(receiver)) { 1263 if (IS_NULL_OR_UNDEFINED(receiver)) {
1255 receiver = %GetDefaultReceiver(f) || receiver; 1264 receiver = %GetDefaultReceiver(f) || receiver;
1256 } else if (!IS_SPEC_OBJECT(receiver) && %IsSloppyModeFunction(f)) { 1265 } else {
1257 receiver = ToObject(receiver); 1266 needs_wrapper = SHOULD_CREATE_WRAPPER(f, receiver);
1258 } 1267 }
1259 1268
1260 var result = new $Array(); 1269 var result = new $Array();
1261 var accumulator = new InternalArray(length); 1270 var accumulator = new InternalArray(length);
1262 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f); 1271 var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
1263 for (var i = 0; i < length; i++) { 1272 for (var i = 0; i < length; i++) {
1264 if (i in array) { 1273 if (i in array) {
1265 var element = array[i]; 1274 var element = array[i];
1266 // Prepare break slots for debugger step in. 1275 // Prepare break slots for debugger step in.
1267 if (stepping) %DebugPrepareStepInIfStepping(f); 1276 if (stepping) %DebugPrepareStepInIfStepping(f);
1268 accumulator[i] = %_CallFunction(receiver, element, i, array, f); 1277 var new_receiver = needs_wrapper ? ToObject(receiver) : receiver;
1278 accumulator[i] = %_CallFunction(new_receiver, element, i, array, f);
1269 } 1279 }
1270 } 1280 }
1271 %MoveArrayContents(accumulator, result); 1281 %MoveArrayContents(accumulator, result);
1272 return result; 1282 return result;
1273 } 1283 }
1274 1284
1275 1285
1276 function ArrayIndexOf(element, index) { 1286 function ArrayIndexOf(element, index) {
1277 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.indexOf"); 1287 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.indexOf");
1278 1288
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
1547 )); 1557 ));
1548 1558
1549 SetUpLockedPrototype(InternalPackedArray, $Array(), $Array( 1559 SetUpLockedPrototype(InternalPackedArray, $Array(), $Array(
1550 "join", getFunction("join", ArrayJoin), 1560 "join", getFunction("join", ArrayJoin),
1551 "pop", getFunction("pop", ArrayPop), 1561 "pop", getFunction("pop", ArrayPop),
1552 "push", getFunction("push", ArrayPush) 1562 "push", getFunction("push", ArrayPush)
1553 )); 1563 ));
1554 } 1564 }
1555 1565
1556 SetUpArray(); 1566 SetUpArray();
OLDNEW
« no previous file with comments | « no previous file | src/collection.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698