| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 1129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1140 } | 1140 } |
| 1141 if (IS_NULL_OR_UNDEFINED(receiver)) { | 1141 if (IS_NULL_OR_UNDEFINED(receiver)) { |
| 1142 receiver = %GetDefaultReceiver(f) || receiver; | 1142 receiver = %GetDefaultReceiver(f) || receiver; |
| 1143 } else if (!IS_SPEC_OBJECT(receiver) && %IsSloppyModeFunction(f)) { | 1143 } else if (!IS_SPEC_OBJECT(receiver) && %IsSloppyModeFunction(f)) { |
| 1144 receiver = ToObject(receiver); | 1144 receiver = ToObject(receiver); |
| 1145 } | 1145 } |
| 1146 | 1146 |
| 1147 var result = new $Array(); | 1147 var result = new $Array(); |
| 1148 var accumulator = new InternalArray(); | 1148 var accumulator = new InternalArray(); |
| 1149 var accumulator_length = 0; | 1149 var accumulator_length = 0; |
| 1150 if (%DebugCallbackSupportsStepping(f)) { | 1150 var stepping = %_DebugCallbackSupportsStepping(f); |
| 1151 for (var i = 0; i < length; i++) { | 1151 for (var i = 0; i < length; i++) { |
| 1152 if (i in array) { | 1152 if (i in array) { |
| 1153 var element = array[i]; | 1153 var element = array[i]; |
| 1154 // Prepare break slots for debugger step in. | 1154 // Prepare break slots for debugger step in. |
| 1155 %DebugPrepareStepInIfStepping(f); | 1155 if (stepping) %DebugPrepareStepInIfStepping(f); |
| 1156 if (%_CallFunction(receiver, element, i, array, f)) { | 1156 if (%_CallFunction(receiver, element, i, array, f)) { |
| 1157 accumulator[accumulator_length++] = element; | 1157 accumulator[accumulator_length++] = element; |
| 1158 } | |
| 1159 } | 1158 } |
| 1160 } | 1159 } |
| 1161 } else { | |
| 1162 // This is a duplicate of the previous loop sans debug stepping. | |
| 1163 for (var i = 0; i < length; i++) { | |
| 1164 if (i in array) { | |
| 1165 var element = array[i]; | |
| 1166 if (%_CallFunction(receiver, element, i, array, f)) { | |
| 1167 accumulator[accumulator_length++] = element; | |
| 1168 } | |
| 1169 } | |
| 1170 } | |
| 1171 // End of duplicate. | |
| 1172 } | 1160 } |
| 1173 %MoveArrayContents(accumulator, result); | 1161 %MoveArrayContents(accumulator, result); |
| 1174 return result; | 1162 return result; |
| 1175 } | 1163 } |
| 1176 | 1164 |
| 1177 | 1165 |
| 1178 function ArrayForEach(f, receiver) { | 1166 function ArrayForEach(f, receiver) { |
| 1179 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.forEach"); | 1167 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.forEach"); |
| 1180 | 1168 |
| 1181 // Pull out the length so that modifications to the length in the | 1169 // Pull out the length so that modifications to the length in the |
| 1182 // loop will not affect the looping and side effects are visible. | 1170 // loop will not affect the looping and side effects are visible. |
| 1183 var array = ToObject(this); | 1171 var array = ToObject(this); |
| 1184 var length = TO_UINT32(array.length); | 1172 var length = TO_UINT32(array.length); |
| 1185 | 1173 |
| 1186 if (!IS_SPEC_FUNCTION(f)) { | 1174 if (!IS_SPEC_FUNCTION(f)) { |
| 1187 throw MakeTypeError('called_non_callable', [ f ]); | 1175 throw MakeTypeError('called_non_callable', [ f ]); |
| 1188 } | 1176 } |
| 1189 if (IS_NULL_OR_UNDEFINED(receiver)) { | 1177 if (IS_NULL_OR_UNDEFINED(receiver)) { |
| 1190 receiver = %GetDefaultReceiver(f) || receiver; | 1178 receiver = %GetDefaultReceiver(f) || receiver; |
| 1191 } else if (!IS_SPEC_OBJECT(receiver) && %IsSloppyModeFunction(f)) { | 1179 } else if (!IS_SPEC_OBJECT(receiver) && %IsSloppyModeFunction(f)) { |
| 1192 receiver = ToObject(receiver); | 1180 receiver = ToObject(receiver); |
| 1193 } | 1181 } |
| 1194 | 1182 |
| 1195 if (%DebugCallbackSupportsStepping(f)) { | 1183 var stepping = %_DebugCallbackSupportsStepping(f); |
| 1196 for (var i = 0; i < length; i++) { | 1184 for (var i = 0; i < length; i++) { |
| 1197 if (i in array) { | 1185 if (i in array) { |
| 1198 var element = array[i]; | 1186 var element = array[i]; |
| 1199 // Prepare break slots for debugger step in. | 1187 // Prepare break slots for debugger step in. |
| 1200 %DebugPrepareStepInIfStepping(f); | 1188 if (stepping) %DebugPrepareStepInIfStepping(f); |
| 1201 %_CallFunction(receiver, element, i, array, f); | 1189 %_CallFunction(receiver, element, i, array, f); |
| 1202 } | |
| 1203 } | 1190 } |
| 1204 } else { | |
| 1205 // This is a duplicate of the previous loop sans debug stepping. | |
| 1206 for (var i = 0; i < length; i++) { | |
| 1207 if (i in array) { | |
| 1208 var element = array[i]; | |
| 1209 %_CallFunction(receiver, element, i, array, f); | |
| 1210 } | |
| 1211 } | |
| 1212 // End of duplicate. | |
| 1213 } | 1191 } |
| 1214 } | 1192 } |
| 1215 | 1193 |
| 1216 | 1194 |
| 1217 // Executes the function once for each element present in the | 1195 // Executes the function once for each element present in the |
| 1218 // array until it finds one where callback returns true. | 1196 // array until it finds one where callback returns true. |
| 1219 function ArraySome(f, receiver) { | 1197 function ArraySome(f, receiver) { |
| 1220 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.some"); | 1198 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.some"); |
| 1221 | 1199 |
| 1222 // Pull out the length so that modifications to the length in the | 1200 // Pull out the length so that modifications to the length in the |
| 1223 // loop will not affect the looping and side effects are visible. | 1201 // loop will not affect the looping and side effects are visible. |
| 1224 var array = ToObject(this); | 1202 var array = ToObject(this); |
| 1225 var length = TO_UINT32(array.length); | 1203 var length = TO_UINT32(array.length); |
| 1226 | 1204 |
| 1227 if (!IS_SPEC_FUNCTION(f)) { | 1205 if (!IS_SPEC_FUNCTION(f)) { |
| 1228 throw MakeTypeError('called_non_callable', [ f ]); | 1206 throw MakeTypeError('called_non_callable', [ f ]); |
| 1229 } | 1207 } |
| 1230 if (IS_NULL_OR_UNDEFINED(receiver)) { | 1208 if (IS_NULL_OR_UNDEFINED(receiver)) { |
| 1231 receiver = %GetDefaultReceiver(f) || receiver; | 1209 receiver = %GetDefaultReceiver(f) || receiver; |
| 1232 } else if (!IS_SPEC_OBJECT(receiver) && %IsSloppyModeFunction(f)) { | 1210 } else if (!IS_SPEC_OBJECT(receiver) && %IsSloppyModeFunction(f)) { |
| 1233 receiver = ToObject(receiver); | 1211 receiver = ToObject(receiver); |
| 1234 } | 1212 } |
| 1235 | 1213 |
| 1236 if (%DebugCallbackSupportsStepping(f)) { | 1214 var stepping = %_DebugCallbackSupportsStepping(f); |
| 1237 for (var i = 0; i < length; i++) { | 1215 for (var i = 0; i < length; i++) { |
| 1238 if (i in array) { | 1216 if (i in array) { |
| 1239 var element = array[i]; | 1217 var element = array[i]; |
| 1240 // Prepare break slots for debugger step in. | 1218 // Prepare break slots for debugger step in. |
| 1241 %DebugPrepareStepInIfStepping(f); | 1219 if (stepping) %DebugPrepareStepInIfStepping(f); |
| 1242 if (%_CallFunction(receiver, element, i, array, f)) return true; | 1220 if (%_CallFunction(receiver, element, i, array, f)) return true; |
| 1243 } | |
| 1244 } | 1221 } |
| 1245 } else { | |
| 1246 // This is a duplicate of the previous loop sans debug stepping. | |
| 1247 for (var i = 0; i < length; i++) { | |
| 1248 if (i in array) { | |
| 1249 var element = array[i]; | |
| 1250 if (%_CallFunction(receiver, element, i, array, f)) return true; | |
| 1251 } | |
| 1252 } | |
| 1253 // End of duplicate. | |
| 1254 } | 1222 } |
| 1255 return false; | 1223 return false; |
| 1256 } | 1224 } |
| 1257 | 1225 |
| 1258 | 1226 |
| 1259 function ArrayEvery(f, receiver) { | 1227 function ArrayEvery(f, receiver) { |
| 1260 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.every"); | 1228 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.every"); |
| 1261 | 1229 |
| 1262 // Pull out the length so that modifications to the length in the | 1230 // Pull out the length so that modifications to the length in the |
| 1263 // loop will not affect the looping and side effects are visible. | 1231 // loop will not affect the looping and side effects are visible. |
| 1264 var array = ToObject(this); | 1232 var array = ToObject(this); |
| 1265 var length = TO_UINT32(array.length); | 1233 var length = TO_UINT32(array.length); |
| 1266 | 1234 |
| 1267 if (!IS_SPEC_FUNCTION(f)) { | 1235 if (!IS_SPEC_FUNCTION(f)) { |
| 1268 throw MakeTypeError('called_non_callable', [ f ]); | 1236 throw MakeTypeError('called_non_callable', [ f ]); |
| 1269 } | 1237 } |
| 1270 if (IS_NULL_OR_UNDEFINED(receiver)) { | 1238 if (IS_NULL_OR_UNDEFINED(receiver)) { |
| 1271 receiver = %GetDefaultReceiver(f) || receiver; | 1239 receiver = %GetDefaultReceiver(f) || receiver; |
| 1272 } else if (!IS_SPEC_OBJECT(receiver) && %IsSloppyModeFunction(f)) { | 1240 } else if (!IS_SPEC_OBJECT(receiver) && %IsSloppyModeFunction(f)) { |
| 1273 receiver = ToObject(receiver); | 1241 receiver = ToObject(receiver); |
| 1274 } | 1242 } |
| 1275 | 1243 |
| 1276 if (%DebugCallbackSupportsStepping(f)) { | 1244 var stepping = %_DebugCallbackSupportsStepping(f); |
| 1277 for (var i = 0; i < length; i++) { | 1245 for (var i = 0; i < length; i++) { |
| 1278 if (i in array) { | 1246 if (i in array) { |
| 1279 var element = array[i]; | 1247 var element = array[i]; |
| 1280 // Prepare break slots for debugger step in. | 1248 // Prepare break slots for debugger step in. |
| 1281 %DebugPrepareStepInIfStepping(f); | 1249 if (stepping) %DebugPrepareStepInIfStepping(f); |
| 1282 if (!%_CallFunction(receiver, element, i, array, f)) return false; | 1250 if (!%_CallFunction(receiver, element, i, array, f)) return false; |
| 1283 } | |
| 1284 } | 1251 } |
| 1285 } else { | |
| 1286 // This is a duplicate of the previous loop sans debug stepping. | |
| 1287 for (var i = 0; i < length; i++) { | |
| 1288 if (i in array) { | |
| 1289 var element = array[i]; | |
| 1290 if (!%_CallFunction(receiver, element, i, array, f)) return false; | |
| 1291 } | |
| 1292 } | |
| 1293 // End of duplicate. | |
| 1294 } | 1252 } |
| 1295 return true; | 1253 return true; |
| 1296 } | 1254 } |
| 1297 | 1255 |
| 1298 function ArrayMap(f, receiver) { | 1256 function ArrayMap(f, receiver) { |
| 1299 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.map"); | 1257 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.map"); |
| 1300 | 1258 |
| 1301 // Pull out the length so that modifications to the length in the | 1259 // Pull out the length so that modifications to the length in the |
| 1302 // loop will not affect the looping and side effects are visible. | 1260 // loop will not affect the looping and side effects are visible. |
| 1303 var array = ToObject(this); | 1261 var array = ToObject(this); |
| 1304 var length = TO_UINT32(array.length); | 1262 var length = TO_UINT32(array.length); |
| 1305 | 1263 |
| 1306 if (!IS_SPEC_FUNCTION(f)) { | 1264 if (!IS_SPEC_FUNCTION(f)) { |
| 1307 throw MakeTypeError('called_non_callable', [ f ]); | 1265 throw MakeTypeError('called_non_callable', [ f ]); |
| 1308 } | 1266 } |
| 1309 if (IS_NULL_OR_UNDEFINED(receiver)) { | 1267 if (IS_NULL_OR_UNDEFINED(receiver)) { |
| 1310 receiver = %GetDefaultReceiver(f) || receiver; | 1268 receiver = %GetDefaultReceiver(f) || receiver; |
| 1311 } else if (!IS_SPEC_OBJECT(receiver) && %IsSloppyModeFunction(f)) { | 1269 } else if (!IS_SPEC_OBJECT(receiver) && %IsSloppyModeFunction(f)) { |
| 1312 receiver = ToObject(receiver); | 1270 receiver = ToObject(receiver); |
| 1313 } | 1271 } |
| 1314 | 1272 |
| 1315 var result = new $Array(); | 1273 var result = new $Array(); |
| 1316 var accumulator = new InternalArray(length); | 1274 var accumulator = new InternalArray(length); |
| 1317 if (%DebugCallbackSupportsStepping(f)) { | 1275 var stepping = %_DebugCallbackSupportsStepping(f); |
| 1318 for (var i = 0; i < length; i++) { | 1276 for (var i = 0; i < length; i++) { |
| 1319 if (i in array) { | 1277 if (i in array) { |
| 1320 var element = array[i]; | 1278 var element = array[i]; |
| 1321 // Prepare break slots for debugger step in. | 1279 // Prepare break slots for debugger step in. |
| 1322 %DebugPrepareStepInIfStepping(f); | 1280 if (stepping) %DebugPrepareStepInIfStepping(f); |
| 1323 accumulator[i] = %_CallFunction(receiver, element, i, array, f); | 1281 accumulator[i] = %_CallFunction(receiver, element, i, array, f); |
| 1324 } | |
| 1325 } | 1282 } |
| 1326 } else { | |
| 1327 // This is a duplicate of the previous loop sans debug stepping. | |
| 1328 for (var i = 0; i < length; i++) { | |
| 1329 if (i in array) { | |
| 1330 var element = array[i]; | |
| 1331 accumulator[i] = %_CallFunction(receiver, element, i, array, f); | |
| 1332 } | |
| 1333 } | |
| 1334 // End of duplicate. | |
| 1335 } | 1283 } |
| 1336 %MoveArrayContents(accumulator, result); | 1284 %MoveArrayContents(accumulator, result); |
| 1337 return result; | 1285 return result; |
| 1338 } | 1286 } |
| 1339 | 1287 |
| 1340 | 1288 |
| 1341 function ArrayIndexOf(element, index) { | 1289 function ArrayIndexOf(element, index) { |
| 1342 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.indexOf"); | 1290 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.indexOf"); |
| 1343 | 1291 |
| 1344 var length = TO_UINT32(this.length); | 1292 var length = TO_UINT32(this.length); |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1464 current = array[i]; | 1412 current = array[i]; |
| 1465 if (!IS_UNDEFINED(current) || i in array) { | 1413 if (!IS_UNDEFINED(current) || i in array) { |
| 1466 i++; | 1414 i++; |
| 1467 break find_initial; | 1415 break find_initial; |
| 1468 } | 1416 } |
| 1469 } | 1417 } |
| 1470 throw MakeTypeError('reduce_no_initial', []); | 1418 throw MakeTypeError('reduce_no_initial', []); |
| 1471 } | 1419 } |
| 1472 | 1420 |
| 1473 var receiver = %GetDefaultReceiver(callback); | 1421 var receiver = %GetDefaultReceiver(callback); |
| 1474 | 1422 var stepping = %_DebugCallbackSupportsStepping(callback); |
| 1475 if (%DebugCallbackSupportsStepping(callback)) { | 1423 for (; i < length; i++) { |
| 1476 for (; i < length; i++) { | 1424 if (i in array) { |
| 1477 if (i in array) { | 1425 var element = array[i]; |
| 1478 var element = array[i]; | 1426 // Prepare break slots for debugger step in. |
| 1479 // Prepare break slots for debugger step in. | 1427 if (stepping) %DebugPrepareStepInIfStepping(callback); |
| 1480 %DebugPrepareStepInIfStepping(callback); | 1428 current = %_CallFunction(receiver, current, element, i, array, callback); |
| 1481 current = | |
| 1482 %_CallFunction(receiver, current, element, i, array, callback); | |
| 1483 } | |
| 1484 } | 1429 } |
| 1485 } else { | |
| 1486 // This is a duplicate of the previous loop sans debug stepping. | |
| 1487 for (; i < length; i++) { | |
| 1488 if (i in array) { | |
| 1489 var element = array[i]; | |
| 1490 current = | |
| 1491 %_CallFunction(receiver, current, element, i, array, callback); | |
| 1492 } | |
| 1493 } | |
| 1494 // End of duplicate. | |
| 1495 } | 1430 } |
| 1496 return current; | 1431 return current; |
| 1497 } | 1432 } |
| 1498 | 1433 |
| 1499 function ArrayReduceRight(callback, current) { | 1434 function ArrayReduceRight(callback, current) { |
| 1500 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reduceRight"); | 1435 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reduceRight"); |
| 1501 | 1436 |
| 1502 // Pull out the length so that side effects are visible before the | 1437 // Pull out the length so that side effects are visible before the |
| 1503 // callback function is checked. | 1438 // callback function is checked. |
| 1504 var array = ToObject(this); | 1439 var array = ToObject(this); |
| 1505 var length = ToUint32(array.length); | 1440 var length = ToUint32(array.length); |
| 1506 | 1441 |
| 1507 if (!IS_SPEC_FUNCTION(callback)) { | 1442 if (!IS_SPEC_FUNCTION(callback)) { |
| 1508 throw MakeTypeError('called_non_callable', [callback]); | 1443 throw MakeTypeError('called_non_callable', [callback]); |
| 1509 } | 1444 } |
| 1510 | 1445 |
| 1511 var i = length - 1; | 1446 var i = length - 1; |
| 1512 find_initial: if (%_ArgumentsLength() < 2) { | 1447 find_initial: if (%_ArgumentsLength() < 2) { |
| 1513 for (; i >= 0; i--) { | 1448 for (; i >= 0; i--) { |
| 1514 current = array[i]; | 1449 current = array[i]; |
| 1515 if (!IS_UNDEFINED(current) || i in array) { | 1450 if (!IS_UNDEFINED(current) || i in array) { |
| 1516 i--; | 1451 i--; |
| 1517 break find_initial; | 1452 break find_initial; |
| 1518 } | 1453 } |
| 1519 } | 1454 } |
| 1520 throw MakeTypeError('reduce_no_initial', []); | 1455 throw MakeTypeError('reduce_no_initial', []); |
| 1521 } | 1456 } |
| 1522 | 1457 |
| 1523 var receiver = %GetDefaultReceiver(callback); | 1458 var receiver = %GetDefaultReceiver(callback); |
| 1524 | 1459 var stepping = %_DebugCallbackSupportsStepping(callback); |
| 1525 if (%DebugCallbackSupportsStepping(callback)) { | 1460 for (; i >= 0; i--) { |
| 1526 for (; i >= 0; i--) { | 1461 if (i in array) { |
| 1527 if (i in array) { | 1462 var element = array[i]; |
| 1528 var element = array[i]; | 1463 // Prepare break slots for debugger step in. |
| 1529 // Prepare break slots for debugger step in. | 1464 if (stepping) %DebugPrepareStepInIfStepping(callback); |
| 1530 %DebugPrepareStepInIfStepping(callback); | 1465 current = %_CallFunction(receiver, current, element, i, array, callback); |
| 1531 current = | |
| 1532 %_CallFunction(receiver, current, element, i, array, callback); | |
| 1533 } | |
| 1534 } | 1466 } |
| 1535 } else { | |
| 1536 // This is a duplicate of the previous loop sans debug stepping. | |
| 1537 for (; i >= 0; i--) { | |
| 1538 if (i in array) { | |
| 1539 var element = array[i]; | |
| 1540 current = | |
| 1541 %_CallFunction(receiver, current, element, i, array, callback); | |
| 1542 } | |
| 1543 } | |
| 1544 // End of duplicate. | |
| 1545 } | 1467 } |
| 1546 return current; | 1468 return current; |
| 1547 } | 1469 } |
| 1548 | 1470 |
| 1549 // ES5, 15.4.3.2 | 1471 // ES5, 15.4.3.2 |
| 1550 function ArrayIsArray(obj) { | 1472 function ArrayIsArray(obj) { |
| 1551 return IS_ARRAY(obj); | 1473 return IS_ARRAY(obj); |
| 1552 } | 1474 } |
| 1553 | 1475 |
| 1554 | 1476 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1622 )); | 1544 )); |
| 1623 | 1545 |
| 1624 SetUpLockedPrototype(InternalPackedArray, $Array(), $Array( | 1546 SetUpLockedPrototype(InternalPackedArray, $Array(), $Array( |
| 1625 "join", getFunction("join", ArrayJoin), | 1547 "join", getFunction("join", ArrayJoin), |
| 1626 "pop", getFunction("pop", ArrayPop), | 1548 "pop", getFunction("pop", ArrayPop), |
| 1627 "push", getFunction("push", ArrayPush) | 1549 "push", getFunction("push", ArrayPush) |
| 1628 )); | 1550 )); |
| 1629 } | 1551 } |
| 1630 | 1552 |
| 1631 SetUpArray(); | 1553 SetUpArray(); |
| OLD | NEW |