Line data Source code
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 : #include "src/objects-inl.h"
6 : #include "test/cctest/compiler/function-tester.h"
7 :
8 : namespace v8 {
9 : namespace internal {
10 : namespace compiler {
11 :
12 26643 : TEST(BinopAdd) {
13 4 : FunctionTester T("(function(a,b) { return a + b; })");
14 :
15 4 : T.CheckCall(3, 1, 2);
16 4 : T.CheckCall(-11, -2, -9);
17 4 : T.CheckCall(-11, -1.5, -9.5);
18 16 : T.CheckCall(T.Val("AB"), T.Val("A"), T.Val("B"));
19 12 : T.CheckCall(T.Val("A11"), T.Val("A"), T.Val(11));
20 12 : T.CheckCall(T.Val("12B"), T.Val(12), T.Val("B"));
21 16 : T.CheckCall(T.Val("38"), T.Val("3"), T.Val("8"));
22 16 : T.CheckCall(T.Val("31"), T.Val("3"), T.NewObject("([1])"));
23 16 : T.CheckCall(T.Val("3[object Object]"), T.Val("3"), T.NewObject("({})"));
24 4 : }
25 :
26 :
27 26643 : TEST(BinopSubtract) {
28 4 : FunctionTester T("(function(a,b) { return a - b; })");
29 :
30 4 : T.CheckCall(3, 4, 1);
31 4 : T.CheckCall(3.0, 4.5, 1.5);
32 8 : T.CheckCall(T.Val(-9), T.Val("0"), T.Val(9));
33 8 : T.CheckCall(T.Val(-9), T.Val(0.0), T.Val("9"));
34 12 : T.CheckCall(T.Val(1), T.Val("3"), T.Val("2"));
35 12 : T.CheckCall(T.nan(), T.Val("3"), T.Val("B"));
36 12 : T.CheckCall(T.Val(2), T.Val("3"), T.NewObject("([1])"));
37 12 : T.CheckCall(T.nan(), T.Val("3"), T.NewObject("({})"));
38 4 : }
39 :
40 :
41 26643 : TEST(BinopMultiply) {
42 4 : FunctionTester T("(function(a,b) { return a * b; })");
43 :
44 4 : T.CheckCall(6, 3, 2);
45 4 : T.CheckCall(4.5, 2.0, 2.25);
46 8 : T.CheckCall(T.Val(6), T.Val("3"), T.Val(2));
47 8 : T.CheckCall(T.Val(4.5), T.Val(2.0), T.Val("2.25"));
48 12 : T.CheckCall(T.Val(6), T.Val("3"), T.Val("2"));
49 12 : T.CheckCall(T.nan(), T.Val("3"), T.Val("B"));
50 12 : T.CheckCall(T.Val(3), T.Val("3"), T.NewObject("([1])"));
51 12 : T.CheckCall(T.nan(), T.Val("3"), T.NewObject("({})"));
52 4 : }
53 :
54 :
55 26643 : TEST(BinopDivide) {
56 4 : FunctionTester T("(function(a,b) { return a / b; })");
57 :
58 4 : T.CheckCall(2, 8, 4);
59 4 : T.CheckCall(2.1, 8.4, 4);
60 4 : T.CheckCall(V8_INFINITY, 8, 0);
61 4 : T.CheckCall(-V8_INFINITY, -8, 0);
62 8 : T.CheckCall(T.infinity(), T.Val(8), T.Val("0"));
63 8 : T.CheckCall(T.minus_infinity(), T.Val("-8"), T.Val(0.0));
64 12 : T.CheckCall(T.Val(1.5), T.Val("3"), T.Val("2"));
65 12 : T.CheckCall(T.nan(), T.Val("3"), T.Val("B"));
66 12 : T.CheckCall(T.Val(1.5), T.Val("3"), T.NewObject("([2])"));
67 12 : T.CheckCall(T.nan(), T.Val("3"), T.NewObject("({})"));
68 4 : }
69 :
70 :
71 26643 : TEST(BinopModulus) {
72 4 : FunctionTester T("(function(a,b) { return a % b; })");
73 :
74 4 : T.CheckCall(3, 8, 5);
75 8 : T.CheckCall(T.Val(3), T.Val("8"), T.Val(5));
76 8 : T.CheckCall(T.Val(3), T.Val(8), T.Val("5"));
77 12 : T.CheckCall(T.Val(1), T.Val("3"), T.Val("2"));
78 12 : T.CheckCall(T.nan(), T.Val("3"), T.Val("B"));
79 12 : T.CheckCall(T.Val(1), T.Val("3"), T.NewObject("([2])"));
80 12 : T.CheckCall(T.nan(), T.Val("3"), T.NewObject("({})"));
81 4 : }
82 :
83 :
84 26643 : TEST(BinopShiftLeft) {
85 4 : FunctionTester T("(function(a,b) { return a << b; })");
86 :
87 4 : T.CheckCall(4, 2, 1);
88 8 : T.CheckCall(T.Val(4), T.Val("2"), T.Val(1));
89 8 : T.CheckCall(T.Val(4), T.Val(2), T.Val("1"));
90 4 : }
91 :
92 :
93 26643 : TEST(BinopShiftRight) {
94 4 : FunctionTester T("(function(a,b) { return a >> b; })");
95 :
96 4 : T.CheckCall(4, 8, 1);
97 4 : T.CheckCall(-4, -8, 1);
98 8 : T.CheckCall(T.Val(4), T.Val("8"), T.Val(1));
99 8 : T.CheckCall(T.Val(4), T.Val(8), T.Val("1"));
100 4 : }
101 :
102 :
103 26643 : TEST(BinopShiftRightLogical) {
104 4 : FunctionTester T("(function(a,b) { return a >>> b; })");
105 :
106 4 : T.CheckCall(4, 8, 1);
107 4 : T.CheckCall(0x7FFFFFFC, -8, 1);
108 8 : T.CheckCall(T.Val(4), T.Val("8"), T.Val(1));
109 8 : T.CheckCall(T.Val(4), T.Val(8), T.Val("1"));
110 4 : }
111 :
112 :
113 26643 : TEST(BinopAnd) {
114 4 : FunctionTester T("(function(a,b) { return a & b; })");
115 :
116 4 : T.CheckCall(7, 7, 15);
117 4 : T.CheckCall(7, 15, 7);
118 8 : T.CheckCall(T.Val(7), T.Val("15"), T.Val(7));
119 8 : T.CheckCall(T.Val(7), T.Val(15), T.Val("7"));
120 4 : }
121 :
122 :
123 26643 : TEST(BinopOr) {
124 4 : FunctionTester T("(function(a,b) { return a | b; })");
125 :
126 4 : T.CheckCall(6, 4, 2);
127 4 : T.CheckCall(6, 2, 4);
128 8 : T.CheckCall(T.Val(6), T.Val("2"), T.Val(4));
129 8 : T.CheckCall(T.Val(6), T.Val(2), T.Val("4"));
130 4 : }
131 :
132 :
133 26643 : TEST(BinopXor) {
134 4 : FunctionTester T("(function(a,b) { return a ^ b; })");
135 :
136 4 : T.CheckCall(7, 15, 8);
137 4 : T.CheckCall(7, 8, 15);
138 8 : T.CheckCall(T.Val(7), T.Val("8"), T.Val(15));
139 8 : T.CheckCall(T.Val(7), T.Val(8), T.Val("15"));
140 4 : }
141 :
142 :
143 26643 : TEST(BinopStrictEqual) {
144 4 : FunctionTester T("(function(a,b) { return a === b; })");
145 :
146 4 : T.CheckTrue(7, 7);
147 4 : T.CheckFalse(7, 8);
148 4 : T.CheckTrue(7.1, 7.1);
149 4 : T.CheckFalse(7.1, 8.1);
150 :
151 4 : T.CheckTrue(T.Val("7.1"), T.Val("7.1"));
152 4 : T.CheckFalse(T.Val(7.1), T.Val("7.1"));
153 4 : T.CheckFalse(T.Val(7), T.undefined());
154 4 : T.CheckFalse(T.undefined(), T.Val(7));
155 :
156 : CompileRun("var o = { desc : 'I am a singleton' }");
157 4 : T.CheckFalse(T.NewObject("([1])"), T.NewObject("([1])"));
158 4 : T.CheckFalse(T.NewObject("({})"), T.NewObject("({})"));
159 4 : T.CheckTrue(T.NewObject("(o)"), T.NewObject("(o)"));
160 4 : }
161 :
162 :
163 26643 : TEST(BinopEqual) {
164 4 : FunctionTester T("(function(a,b) { return a == b; })");
165 :
166 4 : T.CheckTrue(7, 7);
167 4 : T.CheckFalse(7, 8);
168 4 : T.CheckTrue(7.1, 7.1);
169 4 : T.CheckFalse(7.1, 8.1);
170 :
171 4 : T.CheckTrue(T.Val("7.1"), T.Val("7.1"));
172 4 : T.CheckTrue(T.Val(7.1), T.Val("7.1"));
173 :
174 : CompileRun("var o = { desc : 'I am a singleton' }");
175 4 : T.CheckFalse(T.NewObject("([1])"), T.NewObject("([1])"));
176 4 : T.CheckFalse(T.NewObject("({})"), T.NewObject("({})"));
177 4 : T.CheckTrue(T.NewObject("(o)"), T.NewObject("(o)"));
178 4 : }
179 :
180 :
181 26643 : TEST(BinopNotEqual) {
182 4 : FunctionTester T("(function(a,b) { return a != b; })");
183 :
184 4 : T.CheckFalse(7, 7);
185 4 : T.CheckTrue(7, 8);
186 4 : T.CheckFalse(7.1, 7.1);
187 4 : T.CheckTrue(7.1, 8.1);
188 :
189 4 : T.CheckFalse(T.Val("7.1"), T.Val("7.1"));
190 4 : T.CheckFalse(T.Val(7.1), T.Val("7.1"));
191 :
192 : CompileRun("var o = { desc : 'I am a singleton' }");
193 4 : T.CheckTrue(T.NewObject("([1])"), T.NewObject("([1])"));
194 4 : T.CheckTrue(T.NewObject("({})"), T.NewObject("({})"));
195 4 : T.CheckFalse(T.NewObject("(o)"), T.NewObject("(o)"));
196 4 : }
197 :
198 :
199 26643 : TEST(BinopLessThan) {
200 4 : FunctionTester T("(function(a,b) { return a < b; })");
201 :
202 4 : T.CheckTrue(7, 8);
203 4 : T.CheckFalse(8, 7);
204 4 : T.CheckTrue(-8.1, -8);
205 4 : T.CheckFalse(-8, -8.1);
206 4 : T.CheckFalse(0.111, 0.111);
207 :
208 4 : T.CheckFalse(T.Val("7.1"), T.Val("7.1"));
209 4 : T.CheckFalse(T.Val(7.1), T.Val("6.1"));
210 4 : T.CheckFalse(T.Val(7.1), T.Val("7.1"));
211 4 : T.CheckTrue(T.Val(7.1), T.Val("8.1"));
212 4 : }
213 :
214 :
215 26643 : TEST(BinopLessThanOrEqual) {
216 4 : FunctionTester T("(function(a,b) { return a <= b; })");
217 :
218 4 : T.CheckTrue(7, 8);
219 4 : T.CheckFalse(8, 7);
220 4 : T.CheckTrue(-8.1, -8);
221 4 : T.CheckFalse(-8, -8.1);
222 4 : T.CheckTrue(0.111, 0.111);
223 :
224 4 : T.CheckTrue(T.Val("7.1"), T.Val("7.1"));
225 4 : T.CheckFalse(T.Val(7.1), T.Val("6.1"));
226 4 : T.CheckTrue(T.Val(7.1), T.Val("7.1"));
227 4 : T.CheckTrue(T.Val(7.1), T.Val("8.1"));
228 4 : }
229 :
230 :
231 26643 : TEST(BinopGreaterThan) {
232 4 : FunctionTester T("(function(a,b) { return a > b; })");
233 :
234 4 : T.CheckFalse(7, 8);
235 4 : T.CheckTrue(8, 7);
236 4 : T.CheckFalse(-8.1, -8);
237 4 : T.CheckTrue(-8, -8.1);
238 4 : T.CheckFalse(0.111, 0.111);
239 :
240 4 : T.CheckFalse(T.Val("7.1"), T.Val("7.1"));
241 4 : T.CheckTrue(T.Val(7.1), T.Val("6.1"));
242 4 : T.CheckFalse(T.Val(7.1), T.Val("7.1"));
243 4 : T.CheckFalse(T.Val(7.1), T.Val("8.1"));
244 4 : }
245 :
246 :
247 26643 : TEST(BinopGreaterThanOrEqual) {
248 4 : FunctionTester T("(function(a,b) { return a >= b; })");
249 :
250 4 : T.CheckFalse(7, 8);
251 4 : T.CheckTrue(8, 7);
252 4 : T.CheckFalse(-8.1, -8);
253 4 : T.CheckTrue(-8, -8.1);
254 4 : T.CheckTrue(0.111, 0.111);
255 :
256 4 : T.CheckTrue(T.Val("7.1"), T.Val("7.1"));
257 4 : T.CheckTrue(T.Val(7.1), T.Val("6.1"));
258 4 : T.CheckTrue(T.Val(7.1), T.Val("7.1"));
259 4 : T.CheckFalse(T.Val(7.1), T.Val("8.1"));
260 4 : }
261 :
262 :
263 26643 : TEST(BinopIn) {
264 4 : FunctionTester T("(function(a,b) { return a in b; })");
265 :
266 4 : T.CheckTrue(T.Val("x"), T.NewObject("({x:23})"));
267 4 : T.CheckFalse(T.Val("y"), T.NewObject("({x:42})"));
268 4 : T.CheckFalse(T.Val(123), T.NewObject("({x:65})"));
269 4 : T.CheckTrue(T.Val(1), T.NewObject("([1,2,3])"));
270 4 : }
271 :
272 :
273 26643 : TEST(BinopInstanceOf) {
274 4 : FunctionTester T("(function(a,b) { return a instanceof b; })");
275 :
276 4 : T.CheckTrue(T.NewObject("(new Number(23))"), T.NewObject("Number"));
277 4 : T.CheckFalse(T.NewObject("(new Number(23))"), T.NewObject("String"));
278 4 : T.CheckFalse(T.NewObject("(new String('a'))"), T.NewObject("Number"));
279 4 : T.CheckTrue(T.NewObject("(new String('b'))"), T.NewObject("String"));
280 4 : T.CheckFalse(T.Val(1), T.NewObject("Number"));
281 4 : T.CheckFalse(T.Val("abc"), T.NewObject("String"));
282 :
283 : CompileRun("var bound = (function() {}).bind(undefined)");
284 4 : T.CheckTrue(T.NewObject("(new bound())"), T.NewObject("bound"));
285 4 : T.CheckTrue(T.NewObject("(new bound())"), T.NewObject("Object"));
286 4 : T.CheckFalse(T.NewObject("(new bound())"), T.NewObject("Number"));
287 4 : }
288 :
289 :
290 26643 : TEST(UnopNot) {
291 4 : FunctionTester T("(function(a) { return !a; })");
292 :
293 4 : T.CheckCall(T.true_value(), T.false_value(), T.undefined());
294 4 : T.CheckCall(T.false_value(), T.true_value(), T.undefined());
295 4 : T.CheckCall(T.true_value(), T.Val(0.0), T.undefined());
296 4 : T.CheckCall(T.false_value(), T.Val(123), T.undefined());
297 8 : T.CheckCall(T.false_value(), T.Val("x"), T.undefined());
298 4 : T.CheckCall(T.true_value(), T.undefined(), T.undefined());
299 4 : T.CheckCall(T.true_value(), T.nan(), T.undefined());
300 4 : }
301 :
302 :
303 26643 : TEST(UnopCountPost) {
304 4 : FunctionTester T("(function(a) { return a++; })");
305 :
306 4 : T.CheckCall(T.Val(0.0), T.Val(0.0), T.undefined());
307 4 : T.CheckCall(T.Val(2.3), T.Val(2.3), T.undefined());
308 4 : T.CheckCall(T.Val(123), T.Val(123), T.undefined());
309 8 : T.CheckCall(T.Val(7), T.Val("7"), T.undefined());
310 8 : T.CheckCall(T.nan(), T.Val("x"), T.undefined());
311 4 : T.CheckCall(T.nan(), T.undefined(), T.undefined());
312 4 : T.CheckCall(T.Val(1.0), T.true_value(), T.undefined());
313 4 : T.CheckCall(T.Val(0.0), T.false_value(), T.undefined());
314 4 : T.CheckCall(T.nan(), T.nan(), T.undefined());
315 4 : }
316 :
317 :
318 26643 : TEST(UnopCountPre) {
319 4 : FunctionTester T("(function(a) { return ++a; })");
320 :
321 4 : T.CheckCall(T.Val(1.0), T.Val(0.0), T.undefined());
322 4 : T.CheckCall(T.Val(3.3), T.Val(2.3), T.undefined());
323 4 : T.CheckCall(T.Val(124), T.Val(123), T.undefined());
324 8 : T.CheckCall(T.Val(8), T.Val("7"), T.undefined());
325 8 : T.CheckCall(T.nan(), T.Val("x"), T.undefined());
326 4 : T.CheckCall(T.nan(), T.undefined(), T.undefined());
327 4 : T.CheckCall(T.Val(2.0), T.true_value(), T.undefined());
328 4 : T.CheckCall(T.Val(1.0), T.false_value(), T.undefined());
329 4 : T.CheckCall(T.nan(), T.nan(), T.undefined());
330 4 : }
331 :
332 :
333 26643 : TEST(PropertyNamedLoad) {
334 4 : FunctionTester T("(function(a,b) { return a.x; })");
335 :
336 8 : T.CheckCall(T.Val(23), T.NewObject("({x:23})"), T.undefined());
337 8 : T.CheckCall(T.undefined(), T.NewObject("({y:23})"), T.undefined());
338 4 : }
339 :
340 :
341 26643 : TEST(PropertyKeyedLoad) {
342 4 : FunctionTester T("(function(a,b) { return a[b]; })");
343 :
344 12 : T.CheckCall(T.Val(23), T.NewObject("({x:23})"), T.Val("x"));
345 8 : T.CheckCall(T.Val(42), T.NewObject("([23,42,65])"), T.Val(1));
346 12 : T.CheckCall(T.undefined(), T.NewObject("({x:23})"), T.Val("y"));
347 8 : T.CheckCall(T.undefined(), T.NewObject("([23,42,65])"), T.Val(4));
348 4 : }
349 :
350 :
351 26643 : TEST(PropertyNamedStore) {
352 4 : FunctionTester T("(function(a) { a.x = 7; return a.x; })");
353 :
354 8 : T.CheckCall(T.Val(7), T.NewObject("({})"), T.undefined());
355 8 : T.CheckCall(T.Val(7), T.NewObject("({x:23})"), T.undefined());
356 4 : }
357 :
358 :
359 26643 : TEST(PropertyKeyedStore) {
360 4 : FunctionTester T("(function(a,b) { a[b] = 7; return a.x; })");
361 :
362 12 : T.CheckCall(T.Val(7), T.NewObject("({})"), T.Val("x"));
363 12 : T.CheckCall(T.Val(7), T.NewObject("({x:23})"), T.Val("x"));
364 12 : T.CheckCall(T.Val(9), T.NewObject("({x:9})"), T.Val("y"));
365 4 : }
366 :
367 :
368 26643 : TEST(PropertyNamedDelete) {
369 4 : FunctionTester T("(function(a) { return delete a.x; })");
370 :
371 : CompileRun("var o = Object.create({}, { x: { value:23 } });");
372 4 : T.CheckTrue(T.NewObject("({x:42})"), T.undefined());
373 4 : T.CheckTrue(T.NewObject("({})"), T.undefined());
374 4 : T.CheckFalse(T.NewObject("(o)"), T.undefined());
375 4 : }
376 :
377 :
378 26643 : TEST(PropertyKeyedDelete) {
379 4 : FunctionTester T("(function(a, b) { return delete a[b]; })");
380 :
381 : CompileRun("function getX() { return 'x'; }");
382 : CompileRun("var o = Object.create({}, { x: { value:23 } });");
383 4 : T.CheckTrue(T.NewObject("({x:42})"), T.Val("x"));
384 4 : T.CheckFalse(T.NewObject("(o)"), T.Val("x"));
385 4 : T.CheckFalse(T.NewObject("(o)"), T.NewObject("({toString:getX})"));
386 4 : }
387 :
388 :
389 26643 : TEST(GlobalLoad) {
390 4 : FunctionTester T("(function() { return g; })");
391 :
392 4 : T.CheckThrows(T.undefined(), T.undefined());
393 : CompileRun("var g = 23;");
394 4 : T.CheckCall(T.Val(23));
395 4 : }
396 :
397 :
398 26643 : TEST(GlobalStoreStrict) {
399 4 : FunctionTester T("(function(a,b) { 'use strict'; g = a + b; return g; })");
400 :
401 4 : T.CheckThrows(T.Val(22), T.Val(11));
402 : CompileRun("var g = 'a global variable';");
403 4 : T.CheckCall(T.Val(33), T.Val(22), T.Val(11));
404 4 : }
405 :
406 :
407 26643 : TEST(ContextLoad) {
408 4 : FunctionTester T("(function(a,b) { (function(){a}); return a + b; })");
409 :
410 4 : T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
411 16 : T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
412 4 : }
413 :
414 :
415 26643 : TEST(ContextStore) {
416 4 : FunctionTester T("(function(a,b) { (function(){x}); var x = a; return x; })");
417 :
418 4 : T.CheckCall(T.Val(23), T.Val(23), T.undefined());
419 12 : T.CheckCall(T.Val("a"), T.Val("a"), T.undefined());
420 4 : }
421 :
422 :
423 26643 : TEST(LookupLoad) {
424 4 : FunctionTester T("(function(a,b) { with(a) { return x + b; } })");
425 :
426 8 : T.CheckCall(T.Val(24), T.NewObject("({x:23})"), T.Val(1));
427 8 : T.CheckCall(T.Val(32), T.NewObject("({x:23, b:9})"), T.Val(2));
428 8 : T.CheckCall(T.Val(45), T.NewObject("({__proto__:{x:42}})"), T.Val(3));
429 8 : T.CheckCall(T.Val(69), T.NewObject("({get x() { return 65; }})"), T.Val(4));
430 4 : }
431 :
432 :
433 26643 : TEST(LookupStore) {
434 4 : FunctionTester T("(function(a,b) { var x; with(a) { x = b; } return x; })");
435 :
436 8 : T.CheckCall(T.undefined(), T.NewObject("({x:23})"), T.Val(1));
437 8 : T.CheckCall(T.Val(2), T.NewObject("({y:23})"), T.Val(2));
438 8 : T.CheckCall(T.Val(23), T.NewObject("({b:23})"), T.Val(3));
439 8 : T.CheckCall(T.undefined(), T.NewObject("({__proto__:{x:42}})"), T.Val(4));
440 4 : }
441 :
442 :
443 26643 : TEST(BlockLoadStore) {
444 4 : FunctionTester T("(function(a) { 'use strict'; { let x = a+a; return x; }})");
445 :
446 4 : T.CheckCall(T.Val(46), T.Val(23));
447 4 : T.CheckCall(T.Val("aa"), T.Val("a"));
448 4 : }
449 :
450 :
451 26643 : TEST(BlockLoadStoreNested) {
452 : const char* src =
453 : "(function(a,b) {"
454 : "'use strict';"
455 : "{ let x = a, y = a;"
456 : " { let y = b;"
457 : " return x + y;"
458 : " }"
459 : "}})";
460 4 : FunctionTester T(src);
461 :
462 4 : T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
463 16 : T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
464 4 : }
465 :
466 :
467 26643 : TEST(ObjectLiteralComputed) {
468 4 : FunctionTester T("(function(a,b) { o = { x:a+b }; return o.x; })");
469 :
470 4 : T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
471 16 : T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
472 4 : }
473 :
474 :
475 26643 : TEST(ObjectLiteralNonString) {
476 4 : FunctionTester T("(function(a,b) { o = { 7:a+b }; return o[7]; })");
477 :
478 4 : T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
479 16 : T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
480 4 : }
481 :
482 :
483 26643 : TEST(ObjectLiteralPrototype) {
484 4 : FunctionTester T("(function(a) { o = { __proto__:a }; return o.x; })");
485 :
486 8 : T.CheckCall(T.Val(23), T.NewObject("({x:23})"), T.undefined());
487 8 : T.CheckCall(T.undefined(), T.NewObject("({y:42})"), T.undefined());
488 4 : }
489 :
490 :
491 26643 : TEST(ObjectLiteralGetter) {
492 4 : FunctionTester T("(function(a) { o = { get x() {return a} }; return o.x; })");
493 :
494 4 : T.CheckCall(T.Val(23), T.Val(23), T.undefined());
495 12 : T.CheckCall(T.Val("x"), T.Val("x"), T.undefined());
496 4 : }
497 :
498 :
499 26643 : TEST(ArrayLiteral) {
500 4 : FunctionTester T("(function(a,b) { o = [1, a + b, 3]; return o[1]; })");
501 :
502 4 : T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
503 16 : T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
504 4 : }
505 :
506 :
507 26643 : TEST(RegExpLiteral) {
508 4 : FunctionTester T("(function(a) { o = /b/; return o.test(a); })");
509 :
510 8 : T.CheckTrue(T.Val("abc"));
511 8 : T.CheckFalse(T.Val("xyz"));
512 4 : }
513 :
514 :
515 26643 : TEST(ClassLiteral) {
516 : const char* src =
517 : "(function(a,b) {"
518 : " class C {"
519 : " x() { return a; }"
520 : " static y() { return b; }"
521 : " get z() { return 0; }"
522 : " constructor() {}"
523 : " }"
524 : " return new C().x() + C.y();"
525 : "})";
526 4 : FunctionTester T(src);
527 :
528 4 : T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
529 16 : T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
530 4 : }
531 :
532 : } // namespace compiler
533 : } // namespace internal
534 79917 : } // namespace v8
|