blob: 2943b162c9ef26e5584f7b815bc7fd8304ee205d [file] [log] [blame]
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001// 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
7function testAdd(mode) {
8 var a = [];
9 Object.defineProperty(a, "length", { writable : false});
10
11 function check(f) {
12 assertThrows(function() { f(a) }, TypeError);
13 assertFalse(0 in a);
14 assertEquals(0, a.length);
15 }
16
17 function push(a) {
18 a.push(3);
19 }
20
21 if (mode == "fast properties") %ToFastProperties(a);
22
23 check(push);
24 check(push);
25 check(push);
26 %OptimizeFunctionOnNextCall(push);
27 check(push);
28
29 function unshift(a) {
30 a.unshift(3);
31 }
32
33 check(unshift);
34 check(unshift);
35 check(unshift);
36 %OptimizeFunctionOnNextCall(unshift);
37 check(unshift);
38
39 function splice(a) {
40 a.splice(0, 0, 3);
41 }
42
43 check(splice);
44 check(splice);
45 check(splice);
46 %OptimizeFunctionOnNextCall(splice);
47 check(splice);
48}
49
50testAdd("fast properties");
51
52testAdd("normalized");
53
54function testRemove(a, mode) {
55 Object.defineProperty(a, "length", { writable : false});
56
57 function check(f) {
58 assertThrows(function() { f(a) }, TypeError);
59 assertEquals(3, a.length);
60 }
61
62 if (mode == "fast properties") %ToFastProperties(a);
63
64 function pop(a) {
65 a.pop();
66 }
67
68 check(pop);
69 check(pop);
70 check(pop);
71 %OptimizeFunctionOnNextCall(pop);
72 check(pop);
73
74 function shift(a) {
75 a.shift();
76 }
77
78 check(shift);
79 check(shift);
80 check(shift);
81 %OptimizeFunctionOnNextCall(shift);
82 check(shift);
83
84 function splice(a) {
85 a.splice(0, 1);
86 }
87
88 check(splice);
89 check(splice);
90 check(splice);
91 %OptimizeFunctionOnNextCall(splice);
92 check(splice);
93
94 %ClearFunctionTypeFeedback(pop);
95 %ClearFunctionTypeFeedback(shift);
96 %ClearFunctionTypeFeedback(splice);
97}
98
99for (var i = 0; i < 3; i++) {
100 var a = [1, 2, 3];
101 if (i == 1) {
102 a = [1, 2, 3.5];
103 } else if (i == 2) {
104 a = [1, 2, "string"];
105 }
106 testRemove(a, "fast properties");
107 testRemove(a, "normalized");
108}
109
110var b = [];
111Object.defineProperty(b.__proto__, "0", {
112 set : function(v) {
113 b.x = v;
114 Object.defineProperty(b, "length", { writable : false });
115 },
116 get: function() {
117 return b.x;
118 }
119});
120
121b = [];
122try {
123 b.push(3, 4, 5);
124} catch(e) { }
125assertFalse(1 in b);
126assertFalse(2 in b);
127assertEquals(0, b.length);
128
129b = [];
130try {
131 b.unshift(3, 4, 5);
132} catch(e) { }
133assertFalse(1 in b);
134assertFalse(2 in b);
135assertEquals(0, b.length);
136
137b = [1, 2];
138try {
139 b.unshift(3, 4, 5);
140} catch(e) { }
141assertEquals(3, b[0]);
142assertEquals(4, b[1]);
143assertEquals(5, b[2]);
144assertEquals(1, b[3]);
145assertEquals(2, b[4]);
146assertEquals(5, b.length);
147
148b = [1, 2];
149
150Object.defineProperty(b.__proto__, "4", {
151 set : function(v) {
152 b.z = v;
153 Object.defineProperty(b, "length", { writable : false });
154 },
155 get: function() {
156 return b.z;
157 }
158});
159
160try {
161 b.unshift(3, 4, 5);
162} catch(e) { }
163
164assertFalse(2 in b);
165assertFalse(3 in b);
166assertEquals(2, b.length);