// 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); } %PrepareFunctionForOptimization(push_wrapper_1); 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]);