2 if ("arguments" in this && arguments.length > 0)
3 testName = arguments[0];
4 var fails = [], passes=[];
8 if (!testName || testName == f.name)
9 check(f.name, f(), f.expected);
12 function check(desc, actual, expected)
14 if (expected == actual) {
16 return print(desc, ": passed");
19 print(desc, ": FAILED: expected", typeof(expected), "(", expected, ") != actual",
20 typeof(actual), "(", actual, ")");
23 function ifInsideLoop()
25 var cond = true, intCond = 5, count = 0;
26 for (var i = 0; i < 100; i++) {
34 ifInsideLoop.expected = 200;
37 function bitwiseAnd_inner(bitwiseAndValue) {
38 for (var i = 0; i < 60000; i++)
39 bitwiseAndValue = bitwiseAndValue & i;
40 return bitwiseAndValue;
44 return bitwiseAnd_inner(12341234);
46 bitwiseAnd.expected = 0;
49 if (!testName || testName == "bitwiseGlobal") {
50 bitwiseAndValue = Math.pow(2,32);
51 for (var i = 0; i < 60000; i++)
52 bitwiseAndValue = bitwiseAndValue & i;
53 check("bitwiseGlobal", bitwiseAndValue, 0);
59 var i1 = 55, one = 1, zero = 0, undef;
60 var o1 = { }, o2 = { };
62 var hits = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
63 for (var i = 0; i < 5000; i++) {
64 if (i1 == 55) hits[0]++;
65 if (i1 != 56) hits[1]++;
66 if (i1 < 56) hits[2]++;
67 if (i1 > 50) hits[3]++;
68 if (i1 <= 60) hits[4]++;
69 if (i1 >= 30) hits[5]++;
70 if (i1 == 7) hits[6]++;
71 if (i1 != 55) hits[7]++;
72 if (i1 < 30) hits[8]++;
73 if (i1 > 90) hits[9]++;
74 if (i1 <= 40) hits[10]++;
75 if (i1 >= 70) hits[11]++;
76 if (o1 == o2) hits[12]++;
77 if (o2 != null) hits[13]++;
78 if (s < 10) hits[14]++;
79 if (true < zero) hits[15]++;
80 if (undef > one) hits[16]++;
81 if (undef < zero) hits[17]++;
83 return hits.toString();
85 equalInt.expected = "5000,5000,5000,5000,5000,5000,0,0,0,0,0,0,0,5000,5000,0,0,0";
91 a = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
92 a = a.concat(a, a, a);
94 for (var i = 0; i < l; i++) {
99 setelem.expected = "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83";
102 function getelem_inner(a)
106 for (var i = 0; i < l; i++) {
113 return getelem_inner(a);
115 getelem.expected = 3486;
122 for (var i = 0; i < 100; i++)
130 if (!testName || testName == "globalGet") {
131 for (var i = 0; i < 500; i++)
132 globalInt = globalName + i;
133 check("globalGet", globalInt, globalName + 499);
136 if (!testName || testName == "globalSet") {
137 for (var i = 0; i < 500; i++)
139 check("globalSet", globalInt, 499);
145 for (var i = 0; i < 100; i++) {
146 accum += (i * 2) - 1;
150 arith.expected = 9800;
153 function lsh_inner(n)
156 for (var i = 0; i < 35; i++)
162 return [lsh_inner(15),lsh_inner(55),lsh_inner(1),lsh_inner(0)];
164 lsh.expected = "32768,8388608,2,1";
167 function rsh_inner(n)
170 for (var i = 0; i < 35; i++)
176 return [rsh_inner(8),rsh_inner(5),rsh_inner(35),rsh_inner(-1)];
178 rsh.expected = "1114369,8914952,35659808,0";
181 function ursh_inner(n)
184 for (var i = 0; i < 35; i++)
189 return [ursh_inner(8),ursh_inner(33),ursh_inner(0),ursh_inner(1)];
191 ursh.expected = "16777215,2147483620,4294967241,2147483620";
194 function doMath_inner(cos)
198 for (var i = 0; i < 200; i++)
199 s = -Math.pow(sin(i) + cos(i * 0.75), 4);
203 return doMath_inner(Math.cos);
205 doMath.expected = -0.5405549555611059;
208 function fannkuch() {
209 var count = Array(8);
213 // write-out the first 30 permutations
215 while (r != 1) { count[r - 1] = r; r--; }
217 count[r] = count[r] - 1;
218 if (count[r] > 0) break;
224 fannkuch.expected = 41;
230 for (var i = 0; i < 20; i++)
234 xprop.expected = 140;
238 function getprop_inner(o2)
243 for (var i = 0; i < 20; i++) {
245 x += o.a + o2.a + this.a + t.a;
250 return getprop_inner({a:9});
252 getprop.expected = 360;
257 var mods = [-1,-1,-1,-1];
258 var a = 9.5, b = -5, c = 42, d = (1/0);
259 for (var i = 0; i < 20; i++) {
266 return mods.toString();
268 mod.expected = "4.5,0,42,4,NaN";
279 var q1 = 0, q2 = 0, q3 = 0, q4 = 0, q5 = 0;
288 for (var i = 0; i < 100; ++i) {
295 var ret = [q1, q2, q3, q4, q5];
298 call.expected = "100,100,100,100,100";
304 var obj2 = { b:-1, a:-1 };
305 for (var i = 0; i < 20; i++) {
308 return [obj.a, obj2.a, obj2.b].toString();
310 setprop.expected = "19,-1,19";
315 for (var i = 0; i < 100; i++) {
323 testif.expected = "0";
327 function testincops(n) {
328 var i = 0, o = {p:0}, a = [0];
331 for (i = 0; i < n; i++);
333 for (i = 0; i < n; ++i);
336 for (o.p = 0; o.p < n; o.p++) globalinc++;
337 while (o.p-- > 0) --globalinc;
338 for (o.p = 0; o.p < n; ++o.p) ++globalinc;
339 while (--o.p >= 0) globalinc--;
342 for (a[i] = 0; a[i] < n; a[i]++);
344 for (a[i] = 0; a[i] < n; ++a[i]);
347 return [++o.p, ++a[i], globalinc].toString();
349 testincops.expected = "0,0,0";
353 var i = 0, o = [0,0,0];
354 for (i = 0; i < 100; ++i) {
355 if ((i & 1) == 0) o[0]++;
356 else if ((i & 2) == 0) o[1]++;
361 trees.expected = "50,25,25";
364 function unboxint() {
367 for (var i = 0; i < 100; ++i)
371 unboxint.expected = "8";
377 var s = "abcdefghij", s2 = "a";
379 var c = 0, d = 0, e = 0, g = 0;
380 for (var i = 0; i < 10; i++) {
381 a[i] = (s.substring(i, i+1) + s[i] + String.fromCharCode(s2.charCodeAt(0) + i)).concat(i) + i;
387 g++; // f already used
392 return a.toString() + b + c + d + e + g;
394 strings.expected = "aaa00,bbb11,ccc22,ddd33,eee44,fff55,ggg66,hhh77,iii88,jjj991019100";
397 function dependentStrings()
400 var t = "abcdefghijklmnopqrst";
401 for (var i = 0; i < 10; i++) {
402 var s = t.substring(2*i, 2*i + 2);
407 dependentStrings.expected = "ab2cd2ef2gh2ij2kl2mn2op2qr2st2";
408 test(dependentStrings);
410 function stringConvert()
413 var s1 = "F", s2 = "1.3", s3 = "5";
414 for (var i = 0; i < 10; i++) {
427 stringConvert.expected = "1,8.7,75,37,1.360,,,5";
430 function orTestHelper(a, b, n)
433 for (var i = 0; i < n; i++) {
440 var orNaNTest1, orNaNTest2;
442 orNaNTest1 = new Function("return orTestHelper(NaN, NaN, 10);");
443 orNaNTest1.name = 'orNaNTest1';
444 orNaNTest1.expected = '0';
445 orNaNTest2 = new Function("return orTestHelper(NaN, 1, 10);");
446 orNaNTest2.name = 'orNaNTest2';
447 orNaNTest2.expected = '45';
451 function andTestHelper(a, b, n)
454 for (var i = 0; i < n; i++) {
461 if (!testName || testName == "truthies") {
463 var opsies = ["||", "&&"];
464 var falsies = [null, undefined, false, NaN, 0, ""];
465 var truthies = [{}, true, 1, 42, 1/0, -1/0, "blah"];
466 var boolies = [falsies, truthies];
468 // The for each here should abort tracing, so that this test framework
469 // relies only on the interpreter while the orTestHelper and andTestHelper
470 // functions get trace-JITed.
471 for each (var op in opsies) {
472 for (var i in boolies) {
473 for (var j in boolies[i]) {
474 var x = uneval(boolies[i][j]);
475 for (var k in boolies) {
476 for (var l in boolies[k]) {
477 var y = uneval(boolies[k][l]);
478 var prefix = (op == "||") ? "or" : "and";
479 var f = new Function("return " + prefix + "TestHelper(" + x + "," + y + ",10)");
480 f.name = prefix + "Test(" + x + "," + y + ")";
481 f.expected = eval(x + op + y) ? 45 : 0;
491 function nonEmptyStack1Helper(o, farble) {
499 function nonEmptyStack1() {
500 return nonEmptyStack1Helper({a:1,b:2,c:3,d:4,e:5,f:6,g:7,h:8}, "hi");
503 nonEmptyStack1.expected = "abcdefgh";
504 test(nonEmptyStack1);
506 function nonEmptyStack2()
509 for (var c in {a:1, b:2, c:3}) {
510 for (var i = 0; i < 10; i++)
515 nonEmptyStack2.expected = "135";
516 test(nonEmptyStack2);
518 function arityMismatchMissingArg(arg)
520 for (var a = 0, i = 1; i < 10000; i *= 2) {
525 arityMismatchMissingArg.expected = 16383;
526 test(arityMismatchMissingArg);
528 function arityMismatchExtraArg()
530 return arityMismatchMissingArg(1, 2);
532 arityMismatchExtraArg.expected = 16383;
533 test(arityMismatchExtraArg);
535 function MyConstructor(i)
539 MyConstructor.prototype.toString = function() {return this.i + ""};
544 for (var i = 0; i < 10; i++)
545 a[i] = new MyConstructor(i);
548 newTest.expected = "0123456789";
551 // The following functions use a delay line of length 2 to change the value
552 // of the callee without exiting the traced loop. This is obviously tuned to
553 // match the current HOTLOOP setting of 2.
554 function shapelessArgCalleeLoop(f, g, h, a)
556 for (var i = 0; i < 10; i++) {
563 function shapelessVarCalleeLoop(f0, g, h, a)
566 for (var i = 0; i < 10; i++) {
573 function shapelessLetCalleeLoop(f0, g, h, a)
575 for (var i = 0; i < 10; i++) {
583 function shapelessUnknownCalleeLoop(n, f, g, h, a)
585 for (var i = 0; i < 10; i++) {
592 function shapelessCalleeTest()
596 var helper = function (i, a) a[i] = i;
597 shapelessArgCalleeLoop(helper, helper, function (i, a) a[i] = -i, a);
599 helper = function (i, a) a[10 + i] = i;
600 shapelessVarCalleeLoop(helper, helper, function (i, a) a[10 + i] = -i, a);
602 helper = function (i, a) a[20 + i] = i;
603 shapelessLetCalleeLoop(helper, helper, function (i, a) a[20 + i] = -i, a);
605 helper = function (i, a) a[30 + i] = i;
606 shapelessUnknownCalleeLoop(null, helper, helper, function (i, a) a[30 + i] = -i, a);
610 shapelessUnknownCalleeLoop(null, helper, helper, helper, a);
612 if (e + "" != "TypeError: f is not a function")
613 print("shapelessUnknownCalleeLoop: unexpected exception " + e);
617 shapelessCalleeTest.expected = "01-2-3-4-5-6-7-8-901-2-3-4-5-6-7-8-9012345678901-2-3-4-5-6-7-8-9";
618 test(shapelessCalleeTest);
620 function typeofTest()
622 var values = ["hi", "hi", "hi", null, 5, 5.1, true, undefined, /foo/, typeofTest, [], {}], types = [];
623 for (var i = 0; i < values.length; i++)
624 types[i] = typeof values[i];
625 return types.toString();
627 typeofTest.expected = "string,string,string,object,number,number,boolean,undefined,object,function,object,object";
634 for (var i = 0; i < 8; i++)
635 a[i] = [String.fromCharCode(97 + i)];
636 for (i = 0; i < 8; i++) {
637 for (var j = 0; j < 8; j++)
640 for (i = 0; i < 8; i++)
644 joinTest.expected = "a,0,1,2,3,4,5,6,7b,0,1,2,3,4,5,6,7c,0,1,2,3,4,5,6,7d,0,1,2,3,4,5,6,7e,0,1,2,3,4,5,6,7f,0,1,2,3,4,5,6,7g,0,1,2,3,4,5,6,7h,0,1,2,3,4,5,6,7";
649 return (x == undefined) ? 1 : 0;
651 function missingArgTest() {
653 for (var i = 0; i < 10; i++) {
658 missingArgTest.expected = "1"
659 test(missingArgTest);
663 stringify: function stringify(value, whitelist) {
664 switch (typeof(value)) {
666 return value.constructor.name;
672 function missingArgTest2() {
676 ['{"foo":"bar"}', {"foo":"bar"}],
680 for (var i=0; i < testPairs.length; i++) {
681 var s = JSON.stringify(testPairs[i][1])
686 missingArgTest2.expected = "Object,Array,Object";
687 test(missingArgTest2);
689 function deepForInLoop() {
690 // NB: the number of props set in C is arefully tuned to match HOTLOOP = 2.
691 function C(){this.p = 1, this.q = 2}
692 C.prototype = {p:1, q:2, r:3, s:4, t:5};
700 deepForInLoop.expected = "pqrst";
703 function nestedExit(x) {
705 for (var i = 0; i < 10; ++i)
709 function nestedExitLoop() {
710 for (var j = 0; j < 10; ++j)
714 nestedExitLoop.expected = "ok";
715 test(nestedExitLoop);
717 function bitsinbyte(b) {
725 function TimeFunc(func) {
727 for(var y=0; y<256; y++) func(y);
729 function nestedExit2() {
730 TimeFunc(bitsinbyte);
733 nestedExit2.expected = "ok";
736 function parsingNumbers() {
740 var s2z = "123.456zzz";
745 var r1, r1z, r2, r2z;
747 for (var i = 0; i < 10; i++) {
751 r2z = parseFloat(s2z);
754 if (r1 == e1 && r1z == e1 && r2 == e2 && r2z == e2)
758 parsingNumbers.expected = "ok";
759 test(parsingNumbers);
761 function matchInLoop() {
763 for (var i = 0; i < 10; i++) {
764 var result = k.match(/hi/) != null;
768 matchInLoop.expected = true;
777 for (var i = 0; i < 100; ++i)
781 deep2.expected = "ok";
784 var merge_type_maps_x = 0, merge_type_maps_y = 0;
785 function merge_type_maps() {
786 for (merge_type_maps_x = 0; merge_type_maps_x < 50; ++merge_type_maps_x)
787 if ((merge_type_maps_x & 1) == 1)
789 return [merge_type_maps_x,merge_type_maps_y].join(",");
791 merge_type_maps.expected = "50,25";
792 test(merge_type_maps)
794 function inner_double_outer_int() {
796 for (var m = 0; m < 20; ++m)
797 for (var n = 0; n < 100; n += i)
803 inner_double_outer_int.expected = "100";
804 test(inner_double_outer_int);
806 function newArrayTest()
809 for (var i = 0; i < 10; i++)
811 return a.map(function(x) x.length).toString();
813 newArrayTest.expected="0,0,0,0,0,0,0,0,0,0";
816 function stringSplitTest()
820 for (var i = 0; i < 10; ++i)
824 stringSplitTest.expected="a,b";
825 test(stringSplitTest);
827 function stringSplitIntoArrayTest()
831 for (var i = 0; i < 10; ++i)
835 stringSplitIntoArrayTest.expected="a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b";
836 test(stringSplitIntoArrayTest);
838 /* Keep these at the end so that we can see the summary after the trace-debug spew. */
839 print("\npassed:", passes.length && passes.join(","));
840 print("\nFAILED:", fails.length && fails.join(","));