Array.prototype.reverse should call [[HasProperty]] on elements before [[Get]]
authorlittledan <littledan@chromium.org>
Thu, 16 Jul 2015 23:12:06 +0000 (16:12 -0700)
committerCommit bot <commit-bot@chromium.org>
Thu, 16 Jul 2015 23:12:23 +0000 (23:12 +0000)
commitf76dfee9dfa56a0a3ca3c95d17c244cd5cc6753d
treea344d42fba5c25bab9fca1c68d12ab47c85957e7
parent1f61ac50338cc2ef1a54735206351f9798687248
Array.prototype.reverse should call [[HasProperty]] on elements before [[Get]]

This is a change from ES5 to ES6: When reversing an array, first it is checked
whether the element exists, before the element is looked up. The order in ES6
is

[[HasElement]] lower
[[Get]] lower (if present)
[[HasElement]] upper
[[Get]] upper (if present)

In ES5, on the other hand, the order was

[[Get]] lower
[[Get]] upper
[[HasElement]] lower
[[HasElement]] upper

To mitigate the performance impact, this patch implements a new, third copy
of reversing arrays if %_HasPackedElements. This allows us to skip all
membership tests, and a quick and dirty benchmark shows that the new version
is faster:

Over 4 runs, the slowest for the new version:
d8> var start = Date.now(); for (var i = 0; i < 100000000; i++) [1, 2, 3, 4, 5].reverse(); Date.now() - start
4658

Over 3 runs, the fastest for the old version:
d8> var start = Date.now(); for (var i = 0; i < 100000000; i++) [1, 2, 3, 4, 5].reverse(); Date.now() - start
5176

BUG=v8:4223
R=adamk
LOG=Y

Review URL: https://codereview.chromium.org/1238593003

Cr-Commit-Position: refs/heads/master@{#29716}
src/array.js
src/harmony-typedarray.js
test/mjsunit/es6/array-reverse-order.js [new file with mode: 0644]