// 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 --opt --no-always-opt var v = 0; // Test that elements setters/getters on prototype chain set after the fact are // property detected and don't lead to overzealous optimization. var my_array_proto = {}; my_array_proto.__proto__ = [].__proto__; function push_wrapper_2(array, value) { array.push(value); } %PrepareFunctionForOptimization(push_wrapper_2); array = []; array.__proto__ = my_array_proto; push_wrapper_2(array, 66); assertEquals(1, array.length); assertEquals(0, v); assertEquals(66, array[0]); push_wrapper_2(array, 77); assertEquals(2, array.length); assertEquals(0, v); assertEquals(77, array[1]); %OptimizeFunctionOnNextCall(push_wrapper_2); push_wrapper_2(array, 88); assertEquals(3, array.length); assertEquals(0, v); assertEquals(88, array[2]); assertOptimized(push_wrapper_2); // Defining accessor should deopt optimized push. Object.defineProperty(my_array_proto, "3", { get: function() { return "get " + v; }, set: function(value) { v += value; } }); assertUnoptimized(push_wrapper_2); push_wrapper_2(array, 99); assertEquals(4, array.length); assertEquals(99, v); assertEquals("get 99", array[3]);