| 'use strict'; |
| |
| function shouldBe(actual, expected) { |
| if (actual !== expected) |
| throw new Error('bad value: ' + actual); |
| } |
| |
| var object = { a: 10 }; |
| Object.defineProperties(object, { |
| "0": { |
| get: function() { return this.a; }, |
| set: function(x) { this.a = x; }, |
| }, |
| }); |
| |
| var array = [ 0, 1, 2, 3, 4, 5 ]; |
| ensureArrayStorage(array); |
| |
| function testOutOfBound() |
| { |
| var results = 0; |
| for (var i = 0; i < 1e5; ++i) { |
| for (var j = 0; j < 7; ++j) { |
| var value = array[j]; |
| if (value !== undefined) |
| results += value; |
| } |
| } |
| return results; |
| } |
| noInline(testOutOfBound); |
| |
| function testInBound() |
| { |
| var results = 0; |
| for (var i = 0; i < 1e5; ++i) { |
| for (var j = 0; j < 6; ++j) |
| results += array[j]; |
| } |
| return results; |
| } |
| noInline(testInBound); |
| |
| var slowPutArray = [ 0, 1, 2, 3, 4, 5 ]; |
| ensureArrayStorage(slowPutArray); |
| slowPutArray.__proto__ = object; |
| |
| function testSlowPutOutOfBound() |
| { |
| var results = 0; |
| for (var i = 0; i < 1e5; ++i) { |
| for (var j = 0; j < 7; ++j) { |
| var value = slowPutArray[j]; |
| if (value !== undefined) |
| results += value; |
| } |
| } |
| return results; |
| } |
| noInline(testSlowPutOutOfBound); |
| |
| function testSlowPutInBound() |
| { |
| var results = 0; |
| for (var i = 0; i < 1e5; ++i) { |
| for (var j = 0; j < 6; ++j) |
| results += slowPutArray[j]; |
| } |
| return results; |
| } |
| noInline(testSlowPutInBound); |
| |
| shouldBe(testOutOfBound(), 1500000); |
| shouldBe(testInBound(), 1500000); |
| shouldBe(testSlowPutOutOfBound(), 1500000); |
| shouldBe(testSlowPutInBound(), 1500000); |