1202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved. 2202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 3202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org// found in the LICENSE file. 4202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 5202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org// Flags: --allow-natives-syntax 6202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 7202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgvar v = 0; 8202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgvar my_array_proto = {}; 9202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgmy_array_proto.__proto__ = [].__proto__; 10202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgObject.defineProperty(my_array_proto, "0", { 11202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgget: function() { return "get " + v; }, 12202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgset: function(value) { v += value; } 13202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org}); 14202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 15202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 16202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org// Test that element accessors are called in standard push cases. 17202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgarray = []; 18202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgarray.__proto__ = my_array_proto; 19202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 20202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgarray[0] = 10; 21202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgassertEquals(0, array.length); 22202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgassertEquals(10, v); 23202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgassertEquals("get 10", array[0]); 24202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 25202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgArray.prototype.push.call(array, 100); 26202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgassertEquals(1, array.length); 27202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgassertEquals(110, v); 28202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgassertEquals("get 110", array[0]); 29202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 30202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgarray = []; 31202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgarray.__proto__ = my_array_proto; 32202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 33202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgassertEquals(0, array.length); 34202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgarray.push(110); 35202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgassertEquals(1, array.length); 36202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgassertEquals(220, v); 37202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgassertEquals("get 220", array[0]); 38202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 39202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org// Test that elements setters/getters on prototype chain are property detected 40202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org// and don't lead to overzealous optimization. 41202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgv = 0; 42202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgfunction push_wrapper_1(array, value) { 43202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org array.push(value); 44202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org} 45202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgarray = []; 46202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgarray.__proto__ = my_array_proto; 47202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgpush_wrapper_1(array, 100); 48202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgassertEquals(1, array.length); 49202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgassertEquals(100, v); 50202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgpush_wrapper_1(array, 100); 51202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgassertEquals(2, array.length); 52202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgassertEquals(100, v); 53202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgassertEquals("get 100", array[0]); 54202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org%OptimizeFunctionOnNextCall(push_wrapper_1); 55202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgarray = []; 56202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgarray.__proto__ = my_array_proto; 57202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgpush_wrapper_1(array, 100); 58202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgassertEquals(1, array.length); 59202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgassertEquals(200, v); 60202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgassertEquals("get 200", array[0]); 61