1// Copyright 2014 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// Flags: --allow-natives-syntax 6 7var v = 0; 8var my_array_proto = {}; 9my_array_proto.__proto__ = [].__proto__; 10Object.defineProperty(my_array_proto, "0", { 11get: function() { return "get " + v; }, 12set: function(value) { v += value; } 13}); 14 15 16// Test that element accessors are called in standard push cases. 17array = []; 18array.__proto__ = my_array_proto; 19 20array[0] = 10; 21assertEquals(0, array.length); 22assertEquals(10, v); 23assertEquals("get 10", array[0]); 24 25Array.prototype.push.call(array, 100); 26assertEquals(1, array.length); 27assertEquals(110, v); 28assertEquals("get 110", array[0]); 29 30array = []; 31array.__proto__ = my_array_proto; 32 33assertEquals(0, array.length); 34array.push(110); 35assertEquals(1, array.length); 36assertEquals(220, v); 37assertEquals("get 220", array[0]); 38 39// Test that elements setters/getters on prototype chain are property detected 40// and don't lead to overzealous optimization. 41v = 0; 42function push_wrapper_1(array, value) { 43 array.push(value); 44} 45array = []; 46array.__proto__ = my_array_proto; 47push_wrapper_1(array, 100); 48assertEquals(1, array.length); 49assertEquals(100, v); 50push_wrapper_1(array, 100); 51assertEquals(2, array.length); 52assertEquals(100, v); 53assertEquals("get 100", array[0]); 54%OptimizeFunctionOnNextCall(push_wrapper_1); 55array = []; 56array.__proto__ = my_array_proto; 57push_wrapper_1(array, 100); 58assertEquals(1, array.length); 59assertEquals(200, v); 60assertEquals("get 200", array[0]); 61