blob: 78e12576f1b70d55d5471b7ee7e3dd1bcaf68ce0 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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
Ben Murdochb8a8cc12014-11-26 15:28:44 +00005#include "test/cctest/compiler/function-tester.h"
6
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00007namespace v8 {
8namespace internal {
9namespace compiler {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000010
11TEST(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
26TEST(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
40TEST(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
54TEST(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
70TEST(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
83TEST(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
92TEST(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
102TEST(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
112TEST(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
122TEST(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
132TEST(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
142TEST(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
162TEST(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
180TEST(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
198TEST(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
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000214TEST(BinopLessThanOrEqual) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000215 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
230TEST(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
246TEST(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
262TEST(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
272TEST(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
289TEST(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
302TEST(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
317TEST(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
332TEST(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
340TEST(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
350TEST(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
358TEST(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
367TEST(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
377TEST(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
388TEST(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
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000397TEST(GlobalStoreStrict) {
398 FunctionTester T("(function(a,b) { 'use strict'; g = a + b; return g; })");
399
400 T.CheckThrows(T.Val(22), T.Val(11));
401 CompileRun("var g = 'a global variable';");
402 T.CheckCall(T.Val(33), T.Val(22), T.Val(11));
403}
404
405
406TEST(ContextLoad) {
407 FunctionTester T("(function(a,b) { (function(){a}); return a + b; })");
408
409 T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
410 T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
411}
412
413
414TEST(ContextStore) {
415 FunctionTester T("(function(a,b) { (function(){x}); var x = a; return x; })");
416
417 T.CheckCall(T.Val(23), T.Val(23), T.undefined());
418 T.CheckCall(T.Val("a"), T.Val("a"), T.undefined());
419}
420
421
422TEST(LookupLoad) {
423 FunctionTester T("(function(a,b) { with(a) { return x + b; } })");
424
425 T.CheckCall(T.Val(24), T.NewObject("({x:23})"), T.Val(1));
426 T.CheckCall(T.Val(32), T.NewObject("({x:23, b:9})"), T.Val(2));
427 T.CheckCall(T.Val(45), T.NewObject("({__proto__:{x:42}})"), T.Val(3));
428 T.CheckCall(T.Val(69), T.NewObject("({get x() { return 65; }})"), T.Val(4));
429}
430
431
432TEST(LookupStore) {
433 FunctionTester T("(function(a,b) { var x; with(a) { x = b; } return x; })");
434
435 T.CheckCall(T.undefined(), T.NewObject("({x:23})"), T.Val(1));
436 T.CheckCall(T.Val(2), T.NewObject("({y:23})"), T.Val(2));
437 T.CheckCall(T.Val(23), T.NewObject("({b:23})"), T.Val(3));
438 T.CheckCall(T.undefined(), T.NewObject("({__proto__:{x:42}})"), T.Val(4));
439}
440
441
442TEST(BlockLoadStore) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000443 FunctionTester T("(function(a) { 'use strict'; { let x = a+a; return x; }})");
444
445 T.CheckCall(T.Val(46), T.Val(23));
446 T.CheckCall(T.Val("aa"), T.Val("a"));
447}
448
449
450TEST(BlockLoadStoreNested) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000451 const char* src =
452 "(function(a,b) {"
453 "'use strict';"
454 "{ let x = a, y = a;"
455 " { let y = b;"
456 " return x + y;"
457 " }"
458 "}})";
459 FunctionTester T(src);
460
461 T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
462 T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
463}
464
465
466TEST(ObjectLiteralComputed) {
467 FunctionTester T("(function(a,b) { o = { x:a+b }; return o.x; })");
468
469 T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
470 T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
471}
472
473
474TEST(ObjectLiteralNonString) {
475 FunctionTester T("(function(a,b) { o = { 7:a+b }; return o[7]; })");
476
477 T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
478 T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
479}
480
481
482TEST(ObjectLiteralPrototype) {
483 FunctionTester T("(function(a) { o = { __proto__:a }; return o.x; })");
484
485 T.CheckCall(T.Val(23), T.NewObject("({x:23})"), T.undefined());
486 T.CheckCall(T.undefined(), T.NewObject("({y:42})"), T.undefined());
487}
488
489
490TEST(ObjectLiteralGetter) {
491 FunctionTester T("(function(a) { o = { get x() {return a} }; return o.x; })");
492
493 T.CheckCall(T.Val(23), T.Val(23), T.undefined());
494 T.CheckCall(T.Val("x"), T.Val("x"), T.undefined());
495}
496
497
498TEST(ArrayLiteral) {
499 FunctionTester T("(function(a,b) { o = [1, a + b, 3]; return o[1]; })");
500
501 T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
502 T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
503}
504
505
506TEST(RegExpLiteral) {
507 FunctionTester T("(function(a) { o = /b/; return o.test(a); })");
508
509 T.CheckTrue(T.Val("abc"));
510 T.CheckFalse(T.Val("xyz"));
511}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000512
513
514TEST(ClassLiteral) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000515 const char* src =
516 "(function(a,b) {"
517 " class C {"
518 " x() { return a; }"
519 " static y() { return b; }"
520 " get z() { return 0; }"
521 " constructor() {}"
522 " }"
523 " return new C().x() + C.y();"
524 "})";
525 FunctionTester T(src);
526
527 T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
528 T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
529}
530
531} // namespace compiler
532} // namespace internal
533} // namespace v8