Ben Murdoch | b8a8cc1 | 2014-11-26 15:28:44 +0000 | [diff] [blame] | 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]); |