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 7 var v = 0; 8 9 // Test that elements setters/getters on prototype chain set after the fact are 10 // property detected and don't lead to overzealous optimization. 11 var my_array_proto = {}; 12 my_array_proto.__proto__ = [].__proto__; 13 14 function push_wrapper_2(array, value) { 15 array.push(value); 16 } 17 array = []; 18 array.__proto__ = my_array_proto; 19 push_wrapper_2(array, 66); 20 assertEquals(1, array.length); 21 assertEquals(0, v); 22 assertEquals(66, array[0]); 23 push_wrapper_2(array, 77); 24 assertEquals(2, array.length); 25 assertEquals(0, v); 26 assertEquals(77, array[1]); 27 %OptimizeFunctionOnNextCall(push_wrapper_2); 28 push_wrapper_2(array, 88); 29 assertEquals(3, array.length); 30 assertEquals(0, v); 31 assertEquals(88, array[2]); 32 assertOptimized(push_wrapper_2); 33 // Defining accessor should deopt optimized push. 34 Object.defineProperty(my_array_proto, "3", { 35 get: function() { return "get " + v; }, 36 set: function(value) { v += value; } 37 }); 38 assertUnoptimized(push_wrapper_2); 39 push_wrapper_2(array, 99); 40 assertEquals(4, array.length); 41 assertEquals(99, v); 42 assertEquals("get 99", array[3]); 43