blob: 678873fb3afce974cfdfbc9986d62cf97273d33f [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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]);