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