blob: a655b65c78fa2bfedd08d767bb43760765ce7167 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2015 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: --strong-mode --allow-natives-syntax
6
7// TODO(conradw): Track implementation of strong bit for other objects, add
8// tests.
9
10function getSloppyObjects() {
11 return [(function(){}), ({})];
12}
13
14function getStrictObjects() {
15 "use strict";
16 return [(function(){}), ({})];
17}
18
19function getWeakObjects() {
20 return getSloppyObjects().concat(getStrictObjects());
21}
22
23function getStrongObjects() {
24 "use strong";
25// Strong functions can't have properties added to them, and will be tested as a
26// special case.
27 return [({})];
28}
29
30function strongFunction() {
31 "use strong";
32}
33
34function deleteFromObjectSloppy(o) {
35 return delete o.foo;
36}
37
38function deleteFromObjectKeyedSloppy(o) {
39 return delete o["foo"];
40}
41
42function deleteFromObjectKeyedVarSloppy(o) {
43 var a = "foo";
44 return delete o[a];
45}
46
47function deleteFromObjectKeyedComputedSloppy(o) {
48 var a = "o";
49 return delete o["fo" + a];
50}
51
52function deleteFromObjectWith(o) {
53 with (o) {
54 return delete foo;
55 }
56}
57
58function deleteFromObjectElementSloppy(o) {
59 return delete o[0];
60}
61
62function deleteFromObjectElementVarSloppy(o) {
63 var a = 0;
64 return delete o[a];
65}
66
67function deleteFromObjectElementSparseSloppy(o) {
68 return delete o[100000];
69}
70
71function deleteFromObjectElementVarSloppy(o) {
72 var a = 0;
73 return delete o[a];
74}
75
76function deleteFromObjectElementSparseVarSloppy(o) {
77 var a = 100000;
78 return delete o[a];
79}
80
81function deleteFromObjectStrict(o) {
82 "use strict";
83 return delete o.foo;
84}
85
86function deleteFromObjectKeyedStrict(o) {
87 "use strict";
88 return delete o["foo"];
89}
90
91function deleteFromObjectKeyedVarStrict(o) {
92 "use strict";
93 var a = "foo";
94 return delete o[a];
95}
96
97function deleteFromObjectKeyedComputedStrict(o) {
98 "use strict";
99 var a = "o";
100 return delete o["fo" + a];
101}
102
103function deleteFromObjectElementStrict(o) {
104 "use strict";
105 return delete o[0];
106}
107
108function deleteFromObjectElementSparseStrict(o) {
109 "use strict";
110 return delete o[100000];
111}
112
113function deleteFromObjectElementVarStrict(o) {
114 "use strict";
115 var a = 0;
116 return delete o[a];
117}
118
119function deleteFromObjectElementSparseVarStrict(o) {
120 "use strict";
121 var a = 100000;
122 return delete o[a];
123}
124
125function testStrongObjectDelete() {
126 "use strict";
127
128 let deletePropertyFuncsSloppy = [
129 deleteFromObjectSloppy,
130 deleteFromObjectKeyedSloppy,
131 deleteFromObjectKeyedVarSloppy,
132 deleteFromObjectKeyedComputedSloppy,
133 deleteFromObjectWith
134 ];
135 let deletePropertyFuncsStrict = [
136 deleteFromObjectStrict,
137 deleteFromObjectKeyedStrict,
138 deleteFromObjectKeyedVarStrict,
139 deleteFromObjectKeyedComputedStrict
140 ];
141 let deleteElementFuncsSloppy = [
142 deleteFromObjectElementSloppy,
143 deleteFromObjectElementVarSloppy
144 ];
145 let deleteElementSparseFuncsSloppy = [
146 deleteFromObjectElementSparseSloppy,
147 deleteFromObjectElementSparseVarSloppy
148 ];
149 let deleteElementFuncsStrict = [
150 deleteFromObjectElementStrict,
151 deleteFromObjectElementVarStrict
152 ];
153 let deleteElementSparseFuncsStrict = [
154 deleteFromObjectElementSparseStrict,
155 deleteFromObjectElementSparseVarStrict
156 ];
157 let deleteFuncs = deletePropertyFuncsSloppy.concat(
158 deletePropertyFuncsStrict, deleteElementFuncsSloppy,
159 deleteElementSparseFuncsSloppy, deleteElementFuncsStrict,
160 deleteElementSparseFuncsStrict);
161
162 for (let deleteFunc of deleteFuncs) {
163 assertTrue(deleteFunc(strongFunction));
164 }
165
166 let testCasesSloppy = [
167 [deletePropertyFuncsSloppy, "foo"],
168 [deleteElementFuncsSloppy, "0"],
169 [deleteElementSparseFuncsSloppy, "100000"]
170 ];
171
172 let testCasesStrict = [
173 [deletePropertyFuncsStrict, "foo"],
174 [deleteElementFuncsStrict, "0"],
175 [deleteElementSparseFuncsStrict, "100000"]
176 ];
177
178 let propDescs = [
179 {configurable: true, value: "bar"},
180 {configurable: true, value: 1},
181 {configurable: true, enumerable: true, writable: true, value: "bar"},
182 {configurable: true, enumerable: true, writable: true, value: 1},
183 {configurable: true, get: (function(){return 0}), set: (function(x){})}
184 ];
185
186 for (let propDesc of propDescs) {
187 for (let testCase of testCasesSloppy) {
188 let name = testCase[1];
189 for (let deleteFunc of testCase[0]) {
190 for (let o of getWeakObjects()) {
191 Object.defineProperty(o, name, propDesc);
192 assertTrue(delete o["bar"]);
193 assertTrue(delete o[5000]);
194 assertTrue(deleteFunc(o));
195 assertFalse(o.hasOwnProperty(name));
196 %OptimizeFunctionOnNextCall(deleteFunc);
197 Object.defineProperty(o, name, propDesc);
198 assertTrue(deleteFunc(o));
199 assertFalse(o.hasOwnProperty(name));
200 %DeoptimizeFunction(deleteFunc);
201 Object.defineProperty(o, name, propDesc);
202 assertTrue(deleteFunc(o));
203 assertFalse(o.hasOwnProperty(name));
204 }
205 for (let o of getStrongObjects()) {
206 Object.defineProperty(o, name, propDesc);
207 assertTrue(delete o["bar"]);
208 assertTrue(delete o[5000]);
209 assertFalse(deleteFunc(o));
210 assertTrue(o.hasOwnProperty(name));
211 %OptimizeFunctionOnNextCall(deleteFunc);
212 assertFalse(deleteFunc(o));
213 assertTrue(o.hasOwnProperty(name));
214 %DeoptimizeFunction(deleteFunc);
215 assertFalse(deleteFunc(o));
216 assertTrue(o.hasOwnProperty(name));
217 }
218 }
219 }
220 for (let testCase of testCasesStrict) {
221 let name = testCase[1];
222 for (let deleteFunc of testCase[0]) {
223 for (let o of getWeakObjects()) {
224 Object.defineProperty(o, name, propDesc);
225 assertTrue(delete o["bar"]);
226 assertTrue(delete o[5000]);
227 assertTrue(deleteFunc(o));
228 assertFalse(o.hasOwnProperty(name));
229 %OptimizeFunctionOnNextCall(deleteFunc);
230 Object.defineProperty(o, name, propDesc);
231 assertTrue(deleteFunc(o));
232 assertFalse(o.hasOwnProperty(name));
233 %DeoptimizeFunction(deleteFunc);
234 Object.defineProperty(o, name, propDesc);
235 assertTrue(deleteFunc(o));
236 assertFalse(o.hasOwnProperty(name));
237 }
238 for (let o of getStrongObjects()) {
239 Object.defineProperty(o, name, propDesc);
240 assertTrue(delete o["bar"]);
241 assertTrue(delete o[5000]);
242 assertThrows(function(){deleteFunc(o)}, TypeError);
243 assertTrue(o.hasOwnProperty(name));
244 %OptimizeFunctionOnNextCall(deleteFunc);
245 assertThrows(function(){deleteFunc(o)}, TypeError);
246 assertTrue(o.hasOwnProperty(name));
247 %DeoptimizeFunction(deleteFunc);
248 assertThrows(function(){deleteFunc(o)}, TypeError);
249 assertTrue(o.hasOwnProperty(name));
250 }
251 }
252 }
253 }
254}
255testStrongObjectDelete();