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