blob: 55e51622f635b8deb20305bdd0883af8bfd9606d [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// Copyright 2013 the V8 project authors. All rights reserved.
2// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions
6// are met:
7// 1. Redistributions of source code must retain the above copyright
8// notice, this list of conditions and the following disclaimer.
9// 2. Redistributions in binary form must reproduce the above copyright
10// notice, this list of conditions and the following disclaimer in the
11// documentation and/or other materials provided with the distribution.
12//
13// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23
24description(
25'Tests whether bytecode codegen properly handles temporaries.'
26);
27
28var a = true;
29a = false || a;
30shouldBeTrue("a");
31
32var b = false;
33b = true && b;
34shouldBeFalse("b");
35
36function TestObject() {
37 this.toString = function() { return this.test; }
38 this.test = "FAIL";
39 return this;
40}
41
42function assign_test1()
43{
44 var testObject = new TestObject;
45 var a = testObject;
46 a.test = "PASS";
47 return testObject.test;
48}
49
50shouldBe("assign_test1()", "'PASS'");
51
52function assign_test2()
53{
54 var testObject = new TestObject;
55 var a = testObject;
56 a = a.test = "PASS";
57 return testObject.test;
58}
59
60shouldBe("assign_test2()", "'PASS'");
61
62function assign_test3()
63{
64 var testObject = new TestObject;
65 var a = testObject;
66 a.test = a = "PASS";
67 return testObject.test;
68}
69
70shouldBe("assign_test3()", "'PASS'");
71
72var testObject4 = new TestObject;
73var a4 = testObject4;
74a4.test = this.a4 = "PASS";
75
76shouldBe("testObject4.test", "'PASS'");
77
78var testObject5 = new TestObject;
79var a5 = testObject5;
80a5 = this.a5.test = "PASS";
81
82shouldBe("testObject5.test", "'PASS'");
83
84function assign_test6()
85{
86 var testObject = new TestObject;
87 var a = testObject;
88 a["test"] = "PASS";
89 return testObject.test;
90}
91
92shouldBe("assign_test6()", "'PASS'");
93
94function assign_test7()
95{
96 var testObject = new TestObject;
97 var a = testObject;
98 a = a["test"] = "PASS";
99 return testObject.test;
100}
101
102shouldBe("assign_test7()", "'PASS'");
103
104function assign_test8()
105{
106 var testObject = new TestObject;
107 var a = testObject;
108 a["test"] = a = "PASS";
109 return testObject.test;
110}
111
112shouldBe("assign_test8()", "'PASS'");
113
114function assign_test9()
115{
116 var testObject = new TestObject;
117 var a = testObject;
118 a["test"] = this.a = "PASS";
119 return testObject.test;
120}
121
122shouldBe("assign_test9()", "'PASS'");
123
124var testObject10 = new TestObject;
125var a10 = testObject10;
126a10 = this.a10["test"] = "PASS";
127
128shouldBe("testObject10.test", "'PASS'");
129
130function assign_test11()
131{
132 var testObject = new TestObject;
133 var a = testObject;
134 a[a = "test"] = "PASS";
135 return testObject.test;
136}
137
138shouldBe("assign_test11()", "'PASS'");
139
140function assign_test12()
141{
142 var test = "test";
143 var testObject = new TestObject;
144 var a = testObject;
145 a[test] = "PASS";
146 return testObject.test;
147}
148
149shouldBe("assign_test12()", "'PASS'");
150
151function assign_test13()
152{
153 var testObject = new TestObject;
154 var a = testObject;
155 a.test = (a = "FAIL", "PASS");
156 return testObject.test;
157}
158
159shouldBe("assign_test13()", "'PASS'");
160
161function assign_test14()
162{
163 var testObject = new TestObject;
164 var a = testObject;
165 a["test"] = (a = "FAIL", "PASS");
166 return testObject.test;
167}
168
169shouldBe("assign_test14()", "'PASS'");
170
171function assign_test15()
172{
173 var test = "test";
174 var testObject = new TestObject;
175 var a = testObject;
176 a[test] = (test = "FAIL", "PASS");
177 return testObject.test;
178}
179
180shouldBe("assign_test15()", "'PASS'");
181
182function assign_test16()
183{
184 var a = 1;
185 a = (a = 2);
186 return a;
187}
188
189shouldBe("assign_test16()", "2");
190
191var a17 = 1;
192a17 += (a17 += 1);
193
194shouldBe("a17", "3");
195
196function assign_test18()
197{
198 var a = 1;
199 a += (a += 1);
200 return a;
201}
202
203shouldBe("assign_test18()", "3");
204
205var a19 = { b: 1 };
206a19.b += (a19.b += 1);
207
208shouldBe("a19.b", "3");
209
210function assign_test20()
211{
212 var a = { b: 1 };
213 a.b += (a.b += 1);
214 return a.b;
215}
216
217shouldBe("assign_test20()", "3");
218
219var a21 = { b: 1 };
220a21["b"] += (a21["b"] += 1);
221
222shouldBe("a21['b']", "3");
223
224function assign_test22()
225{
226 var a = { b: 1 };
227 a["b"] += (a["b"] += 1);
228 return a["b"];
229}
230
231shouldBe("assign_test22()", "3");
232
233function assign_test23()
234{
235 var o = { b: 1 };
236 var a = o;
237 a.b += a = 2;
238 return o.b;
239}
240
241shouldBe("assign_test23()", "3");
242
243function assign_test24()
244{
245 var o = { b: 1 };
246 var a = o;
247 a["b"] += a = 2;
248 return o["b"];
249}
250
251shouldBe("assign_test24()", "3");
252
253function assign_test25()
254{
255 var o = { b: 1 };
256 var a = o;
257 a[a = "b"] += a = 2;
258 return o["b"];
259}
260
261shouldBe("assign_test25()", "3");
262
263function assign_test26()
264{
265 var o = { b: 1 };
266 var a = o;
267 var b = "b";
268 a[b] += a = 2;
269 return o["b"];
270}
271
272shouldBe("assign_test26()", "3");
273
274function assign_test27()
275{
276 var o = { b: 1 };
277 var a = o;
278 a.b += (a = 100, 2);
279 return o.b;
280}
281
282shouldBe("assign_test27()", "3");
283
284function assign_test28()
285{
286 var o = { b: 1 };
287 var a = o;
288 a["b"] += (a = 100, 2);
289 return o["b"];
290}
291
292shouldBe("assign_test28()", "3");
293
294function assign_test29()
295{
296 var o = { b: 1 };
297 var a = o;
298 var b = "b";
299 a[b] += (a = 100, 2);
300 return o["b"];
301}
302
303shouldBe("assign_test29()", "3");
304
305function assign_test30()
306{
307 var a = "foo";
308 a += (a++);
309 return a;
310}
311
312shouldBe("assign_test30()", "'fooNaN'");
313
314function assign_test31()
315{
316 function result() { return "PASS"; }
317 return (globalVar = result)()
318}
319
320shouldBe("assign_test31()", "'PASS'");
321
322function bracket_test1()
323{
324 var o = [-1];
325 var a = o[++o];
326 return a;
327}
328
329shouldBe("bracket_test1()", "-1");
330
331function bracket_test2()
332{
333 var o = [1];
334 var a = o[--o];
335 return a;
336}
337
338shouldBe("bracket_test2()", "1");
339
340function bracket_test3()
341{
342 var o = [0];
343 var a = o[o++];
344 return a;
345}
346
347shouldBe("bracket_test3()", "0");
348
349function bracket_test4()
350{
351 var o = [0];
352 var a = o[o--];
353 return a;
354}
355
356shouldBe("bracket_test4()", "0");
357
358function bracket_test5()
359{
360 var o = [1];
361 var a = o[o ^= 1];
362 return a;
363}
364
365shouldBe("bracket_test5()", "1");
366
367function bracket_test6()
368{
369 var o = { b: 1 }
370 var b = o[o = { b: 2 }, "b"];
371 return b;
372}
373
374shouldBe("bracket_test6()", "1");
375
376function mult_test1()
377{
378 var a = 1;
379 return a * (a = 2);
380}
381
382shouldBe("mult_test1()", "2");
383
384function mult_test2()
385{
386 var a = 1;
387 return a * ++a;
388}
389
390shouldBe("mult_test2()", "2");
391
392function mult_test3()
393{
394 var a = 1;
395 return a * (a += 1);
396}
397
398shouldBe("mult_test3()", "2");
399
400function div_test1()
401{
402 var a = 1;
403 return a / (a = 2);
404}
405
406shouldBe("div_test1()", "0.5");
407
408function div_test2()
409{
410 var a = 1;
411 return a / ++a;
412}
413
414shouldBe("div_test2()", "0.5");
415
416function div_test3()
417{
418 var a = 1;
419 return a / (a += 1);
420}
421
422shouldBe("div_test3()", "0.5");
423
424function mod_test1()
425{
426 var a = 1;
427 return a % (a = 2);
428}
429
430shouldBe("mod_test1()", "1");
431
432function mod_test2()
433{
434 var a = 1;
435 return a % ++a;
436}
437
438shouldBe("mod_test2()", "1");
439
440function mod_test3()
441{
442 var a = 1;
443 return a % (a += 1);
444}
445
446shouldBe("mod_test3()", "1");
447
448function add_test1()
449{
450 var a = 1;
451 return a + (a = 2);
452}
453
454shouldBe("add_test1()", "3");
455
456function add_test2()
457{
458 var a = 1;
459 return a + ++a;
460}
461
462shouldBe("add_test2()", "3");
463
464function add_test3()
465{
466 var a = 1;
467 return a + (a += 1);
468}
469
470shouldBe("add_test3()", "3");
471
472function sub_test1()
473{
474 var a = 1;
475 return a - (a = 2);
476}
477
478shouldBe("sub_test1()", "-1");
479
480function sub_test2()
481{
482 var a = 1;
483 return a - ++a;
484}
485
486shouldBe("sub_test2()", "-1");
487
488function sub_test3()
489{
490 var a = 1;
491 return a - (a += 1);
492}
493
494shouldBe("sub_test3()", "-1");
495
496function lshift_test1()
497{
498 var a = 1;
499 return a << (a = 2);
500}
501
502shouldBe("lshift_test1()", "4");
503
504function lshift_test2()
505{
506 var a = 1;
507 return a << ++a;
508}
509
510shouldBe("lshift_test2()", "4");
511
512function lshift_test3()
513{
514 var a = 1;
515 return a << (a += 1);
516}
517
518shouldBe("lshift_test3()", "4");
519
520function rshift_test1()
521{
522 var a = 4;
523 return a >> (a = 2);
524}
525
526shouldBe("rshift_test1()", "1");
527
528function rshift_test2()
529{
530 var a = 2;
531 return a >> --a;
532}
533
534shouldBe("rshift_test2()", "1");
535
536function rshift_test3()
537{
538 var a = 2;
539 return a >> (a -= 1);
540}
541
542shouldBe("rshift_test3()", "1");
543
544function urshift_test1()
545{
546 var a = 4;
547 return a >>> (a = 2);
548}
549
550shouldBe("urshift_test1()", "1");
551
552function urshift_test2()
553{
554 var a = 2;
555 return a >>> --a;
556}
557
558shouldBe("urshift_test2()", "1");
559
560function urshift_test3()
561{
562 var a = 2;
563 return a >>> (a -= 1);
564}
565
566shouldBe("urshift_test3()", "1");
567
568function less_test1()
569{
570 var a = 1;
571 return a < (a = 2);
572}
573
574shouldBeTrue("less_test1()");
575
576function less_test2()
577{
578 var a = 1;
579 return a < ++a;
580}
581
582shouldBeTrue("less_test2()");
583
584function less_test3()
585{
586 var a = 1;
587 return a < (a += 1);
588}
589
590shouldBeTrue("less_test3()");
591
592function greater_test1()
593{
594 var a = 2;
595 return a > (a = 1);
596}
597
598shouldBeTrue("greater_test1()");
599
600function greater_test2()
601{
602 var a = 2;
603 return a > --a;
604}
605
606shouldBeTrue("greater_test2()");
607
608function greater_test3()
609{
610 var a = 2;
611 return a > (a -= 1);
612}
613
614shouldBeTrue("greater_test3()");
615
616function lesseq_test1()
617{
618 var a = 1;
619 return a <= (a = 3, 2);
620}
621
622shouldBeTrue("lesseq_test1()");
623
624function lesseq_test2()
625{
626 var a = 1;
627 return a <= (++a, 1);
628}
629
630shouldBeTrue("lesseq_test2()");
631
632function lesseq_test3()
633{
634 var a = 1;
635 return a <= (a += 1, 1);
636}
637
638shouldBeTrue("lesseq_test3()");
639
640function greatereq_test1()
641{
642 var a = 2;
643 return a >= (a = 1, 2);
644}
645
646shouldBeTrue("greatereq_test1()");
647
648function greatereq_test2()
649{
650 var a = 2;
651 return a >= (--a, 2);
652}
653
654shouldBeTrue("greatereq_test2()");
655
656function greatereq_test3()
657{
658 var a = 2;
659 return a >= (a -= 1, 2);
660}
661
662shouldBeTrue("greatereq_test3()");
663
664function instanceof_test1()
665{
666 var a = { };
667 return a instanceof (a = 1, Object);
668}
669
670shouldBeTrue("instanceof_test1()");
671
672function instanceof_test2()
673{
674 var a = { valueOf: function() { return 1; } };
675 return a instanceof (++a, Object);
676}
677
678shouldBeTrue("instanceof_test2()");
679
680function instanceof_test3()
681{
682 var a = { valueOf: function() { return 1; } };
683 return a instanceof (a += 1, Object);
684}
685
686shouldBeTrue("instanceof_test3()");
687
688function in_test1()
689{
690 var a = "a";
691 return a in (a = "b", { a: 1 });
692}
693
694shouldBeTrue("in_test1()");
695
696function in_test2()
697{
698 var a = { toString: function() { return "a"; }, valueOf: function() { return 1; } };
699 return a in (++a, { a: 1 });
700}
701
702shouldBeTrue("in_test2()");
703
704function in_test3()
705{
706 var a = { toString: function() { return "a"; }, valueOf: function() { return 1; } };
707 return a in (a += 1, { a: 1 });
708}
709
710shouldBeTrue("in_test3()");
711
712function eq_test1()
713{
714 var a = 1;
715 return a == (a = 2);
716}
717
718shouldBeFalse("eq_test1()");
719
720function eq_test2()
721{
722 var a = 1;
723 return a == ++a;
724}
725
726shouldBeFalse("eq_test2()");
727
728function eq_test3()
729{
730 var a = 1;
731 return a == (a += 1);
732}
733
734shouldBeFalse("eq_test3()");
735
736function neq_test1()
737{
738 var a = 1;
739 return a != (a = 2);
740}
741
742shouldBeTrue("neq_test1()");
743
744function neq_test2()
745{
746 var a = 1;
747 return a != ++a;
748}
749
750shouldBeTrue("neq_test2()");
751
752function neq_test3()
753{
754 var a = 1;
755 return a != (a += 1);
756}
757
758shouldBeTrue("neq_test3()");
759
760function stricteq_test1()
761{
762 var a = 1;
763 return a === (a = 2);
764}
765
766shouldBeFalse("stricteq_test1()");
767
768function stricteq_test2()
769{
770 var a = 1;
771 return a === ++a;
772}
773
774shouldBeFalse("stricteq_test2()");
775
776function stricteq_test3()
777{
778 var a = 1;
779 return a === (a += 1);
780}
781
782shouldBeFalse("stricteq_test3()");
783
784function nstricteq_test1()
785{
786 var a = 1;
787 return a !== (a = 2);
788}
789
790shouldBeTrue("nstricteq_test1()");
791
792function nstricteq_test2()
793{
794 var a = 1;
795 return a !== ++a;
796}
797
798shouldBeTrue("nstricteq_test2()");
799
800function nstricteq_test3()
801{
802 var a = 1;
803 return a !== (a += 1);
804}
805
806shouldBeTrue("nstricteq_test3()");
807
808function bitand_test1()
809{
810 var a = 1;
811 return a & (a = 2);
812}
813
814shouldBe("bitand_test1()", "0");
815
816function bitand_test2()
817{
818 var a = 1;
819 return a & ++a;
820}
821
822shouldBe("bitand_test2()", "0");
823
824function bitand_test3()
825{
826 var a = 1;
827 return a & (a += 1);
828}
829
830shouldBe("bitand_test3()", "0");
831
832function bitor_test1()
833{
834 var a = 1;
835 return a | (a = 2);
836}
837
838shouldBe("bitor_test1()", "3");
839
840function bitor_test2()
841{
842 var a = 1;
843 return a | ++a;
844}
845
846shouldBe("bitor_test2()", "3");
847
848function bitor_test3()
849{
850 var a = 1;
851 return a | (a += 1);
852}
853
854shouldBe("bitor_test3()", "3");
855
856function bitxor_test1()
857{
858 var a = 1;
859 return a ^ (a = 2);
860}
861
862shouldBe("bitxor_test1()", "3");
863
864function bitxor_test2()
865{
866 var a = 1;
867 return a ^ ++a;
868}
869
870shouldBe("bitxor_test2()", "3");
871
872function bitxor_test3()
873{
874 var a = 1;
875 return a ^ (a += 1);
876}
877
878shouldBe("bitxor_test3()", "3");
879
880function switch_test1_helper(a, b)
881{
882 switch (a) {
883 case b:
884 break;
885 default:
886 break;
887 }
888
889 return b;
890}
891
892function switch_test1()
893{
894 return switch_test1_helper(0, 1) == 1;
895}
896
897shouldBeTrue("switch_test1()");
898
899function switch_test2_helper(a, b)
900{
901 var c = b;
902 switch (a) {
903 case c:
904 break;
905 default:
906 break;
907 }
908
909 return c;
910}
911
912function switch_test2()
913{
914 return switch_test2_helper(0, 1) == 1;
915}
916
917shouldBeTrue("switch_test2()");
918
919function switch_test3_helper(a)
920{
921 switch (a) {
922 case this:
923 break;
924 default:
925 break;
926 }
927
928 return this;
929}
930
931function switch_test3()
932{
933 return this == switch_test3_helper.call(this, 0);
934}
935
936shouldBeTrue("switch_test3()");
937
938function construct_test()
939{
940 var c = [function(a) { this.a = a; }];
941
942 function f()
943 {
944 return new c[0](true);
945 }
946
947 return f().a;
948}
949
950shouldBeTrue("construct_test()");
951var testStr = "[";
952for (var i = 0; i < 64; i++)
953 testStr += "(0/0), ";
954testStr += "].length";
955shouldBe(testStr, "64");