| // Copyright 2014 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Flags: --allow-natives-syntax |
| |
| var v = 0; |
| var my_array_proto = {}; |
| my_array_proto.__proto__ = [].__proto__; |
| Object.defineProperty(my_array_proto, "0", { |
| get: function() { return "get " + v; }, |
| set: function(value) { v += value; } |
| }); |
| |
| |
| // Test that element accessors are called in standard push cases. |
| array = []; |
| array.__proto__ = my_array_proto; |
| |
| array[0] = 10; |
| assertEquals(0, array.length); |
| assertEquals(10, v); |
| assertEquals("get 10", array[0]); |
| |
| Array.prototype.push.call(array, 100); |
| assertEquals(1, array.length); |
| assertEquals(110, v); |
| assertEquals("get 110", array[0]); |
| |
| array = []; |
| array.__proto__ = my_array_proto; |
| |
| assertEquals(0, array.length); |
| array.push(110); |
| assertEquals(1, array.length); |
| assertEquals(220, v); |
| assertEquals("get 220", array[0]); |
| |
| // Test that elements setters/getters on prototype chain are property detected |
| // and don't lead to overzealous optimization. |
| v = 0; |
| function push_wrapper_1(array, value) { |
| array.push(value); |
| } |
| array = []; |
| array.__proto__ = my_array_proto; |
| push_wrapper_1(array, 100); |
| assertEquals(1, array.length); |
| assertEquals(100, v); |
| push_wrapper_1(array, 100); |
| assertEquals(2, array.length); |
| assertEquals(100, v); |
| assertEquals("get 100", array[0]); |
| %OptimizeFunctionOnNextCall(push_wrapper_1); |
| array = []; |
| array.__proto__ = my_array_proto; |
| push_wrapper_1(array, 100); |
| assertEquals(1, array.length); |
| assertEquals(200, v); |
| assertEquals("get 200", array[0]); |