Bug 438861 Autocomplete does not pass back previous results to a second search. r...
[mozilla-central.git] / js / src / trace-test.js
blobde3fee165f83272786abc35dd7a8a07f82431043
1 var testName = null;
2 if ("arguments" in this && arguments.length > 0)
3   testName = arguments[0];
4 var fails = [], passes=[];
6 function test(f)
8   if (!testName || testName == f.name)
9     check(f.name, f(), f.expected);
12 function check(desc, actual, expected)
14   if (expected == actual) {
15     passes.push(desc);
16     return print(desc, ": passed");
17   }
18   fails.push(desc);
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++) {
27     if (cond)
28       count++;
29     if (intCond)
30       count++;
31   }
32   return count;
34 ifInsideLoop.expected = 200;
35 test(ifInsideLoop);
37 function bitwiseAnd_inner(bitwiseAndValue) {
38   for (var i = 0; i < 60000; i++)
39     bitwiseAndValue = bitwiseAndValue & i;
40   return bitwiseAndValue;
42 function bitwiseAnd()
44   return bitwiseAnd_inner(12341234);
46 bitwiseAnd.expected = 0;
47 test(bitwiseAnd);
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);
57 function equalInt()
59   var i1 = 55, one = 1, zero = 0, undef;
60   var o1 = { }, o2 = { };
61   var s = "5";
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]++;
82   }
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";
86 test(equalInt);
88 var a;
89 function setelem()
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);
93   var l = a.length;
94   for (var i = 0; i < l; i++) {
95     a[i] = i;
96   }
97   return a.toString();
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";
100 test(setelem);
102 function getelem_inner(a)
104   var accum = 0;
105   var l = a.length;
106   for (var i = 0; i < l; i++) {
107     accum += a[i];
108   }
109   return accum;
111 function getelem()
113   return getelem_inner(a);
115 getelem.expected = 3486;
116 test(getelem);
118 globalName = 907;
119 function name()
121   var a = 0;
122   for (var i = 0; i < 100; i++)
123     a = globalName;
124   return a;
126 name.expected = 907;
127 test(name);
129 var globalInt = 0;
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++)
138     globalInt = i;
139   check("globalSet", globalInt, 499);
142 function arith()
144   var accum = 0;
145   for (var i = 0; i < 100; i++) {
146     accum += (i * 2) - 1;
147   }
148   return accum;
150 arith.expected = 9800;
151 test(arith);
153 function lsh_inner(n)
155   var r;
156   for (var i = 0; i < 35; i++)
157     r = 0x1 << n;
158   return r;
160 function lsh()
162   return [lsh_inner(15),lsh_inner(55),lsh_inner(1),lsh_inner(0)];
164 lsh.expected = "32768,8388608,2,1";
165 test(lsh);
167 function rsh_inner(n)
169   var r;
170   for (var i = 0; i < 35; i++)
171     r = 0x11010101 >> n;
172   return r;
174 function rsh()
176   return [rsh_inner(8),rsh_inner(5),rsh_inner(35),rsh_inner(-1)];
178 rsh.expected = "1114369,8914952,35659808,0";
179 test(rsh);
181 function ursh_inner(n)
183   var r;
184   for (var i = 0; i < 35; i++)
185     r = -55 >>> n;
186   return r;
188 function ursh() {
189   return [ursh_inner(8),ursh_inner(33),ursh_inner(0),ursh_inner(1)];
191 ursh.expected = "16777215,2147483620,4294967241,2147483620";
192 test(ursh);
194 function doMath_inner(cos)
196     var s = 0;
197     var sin = Math.sin;
198     for (var i = 0; i < 200; i++)
199         s = -Math.pow(sin(i) + cos(i * 0.75), 4);
200     return s;
202 function doMath() {
203   return doMath_inner(Math.cos);
205 doMath.expected = -0.5405549555611059;
206 test(doMath);
208 function fannkuch() {
209    var count = Array(8);
210    var r = 8;
211    var done = 0;
212    while (done < 40) {
213       // write-out the first 30 permutations
214       done += r;
215       while (r != 1) { count[r - 1] = r; r--; }
216       while (true) {
217          count[r] = count[r] - 1;
218          if (count[r] > 0) break;
219          r++;
220       }
221    }
222    return done;
224 fannkuch.expected = 41;
225 test(fannkuch);
227 function xprop()
229   a = 0;
230   for (var i = 0; i < 20; i++)
231     a += 7;
232   return a;
234 xprop.expected = 140;
235 test(xprop);
237 var a = 2;
238 function getprop_inner(o2)
240   var o = {a:5};
241   var t = this;
242   var x = 0;
243   for (var i = 0; i < 20; i++) {
244     t = this;
245     x += o.a + o2.a + this.a + t.a;
246   }
247   return x;
249 function getprop() {
250   return getprop_inner({a:9});
252 getprop.expected = 360;
253 test(getprop);
255 function mod()
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++) {
260     mods[0] = a % b;
261     mods[1] = b % 1;
262     mods[2] = c % d;
263     mods[3] = c % a;
264     mods[4] = b % 0;
265   }
266   return mods.toString();
268 mod.expected = "4.5,0,42,4,NaN";
269 test(mod);
271 function glob_f1() {
272   return 1;
274 function glob_f2() {
275   return glob_f1();
277 function call()
279   var q1 = 0, q2 = 0, q3 = 0, q4 = 0, q5 = 0;
280   var o = {};
281   function f1() {
282       return 1;
283   }
284   function f2(f) {
285       return f();
286   }
287   o.f = f1;
288   for (var i = 0; i < 100; ++i) {
289       q1 += f1();
290       q2 += f2(f1);
291       q3 += glob_f1();
292       q4 += o.f();
293       q5 += glob_f2();
294   }
295   var ret = [q1, q2, q3, q4, q5];
296   return ret;
298 call.expected =  "100,100,100,100,100";
299 test(call);
301 function setprop()
303   var obj = { a:-1 };
304   var obj2 = { b:-1, a:-1 };
305   for (var i = 0; i < 20; i++) {
306     obj2.b = obj.a = i;
307   }
308   return [obj.a, obj2.a, obj2.b].toString();
310 setprop.expected =  "19,-1,19";
311 test(setprop);
313 function testif() {
314         var q = 0;
315         for (var i = 0; i < 100; i++) {
316                 if ((i & 1) == 0)
317                         q++;
318                 else
319                         q--;
320         }
321     return q;
323 testif.expected = "0";
324 test(testif);
326 var globalinc = 0;
327 function testincops(n) {
328   var i = 0, o = {p:0}, a = [0];
329   n = 100;
331   for (i = 0; i < n; i++);
332   while (i-- > 0);
333   for (i = 0; i < n; ++i);
334   while (--i >= 0);
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--;
341   ++i; // set to 0
342   for (a[i] = 0; a[i] < n; a[i]++);
343   while (a[i]-- > 0);
344   for (a[i] = 0; a[i] < n; ++a[i]);
345   while (--a[i] >= 0);
347   return [++o.p, ++a[i], globalinc].toString();
349 testincops.expected = "0,0,0";
350 test(testincops);
352 function trees() {
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]++;
357     else o[2]++;
358   }
359   return o;
361 trees.expected = "50,25,25";
362 test(trees);
364 function unboxint() {
365     var q = 0;
366     var o = [4];
367     for (var i = 0; i < 100; ++i)
368         q = o[0] << 1;
369     return q;
371 unboxint.expected = "8";
372 test(unboxint);
374 function strings()
376   var a = [], b = -1;
377   var s = "abcdefghij", s2 = "a";
378   var f = "f";
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;
382     if (s[i] == f)
383       c++;
384     if (s[i] != 'b')
385       d++;
386     if ("B" > s2)
387       g++; // f already used
388     if (s2 < "b")
389       e++;
390     b = s.length;
391   }
392   return a.toString() + b + c + d + e + g;
394 strings.expected = "aaa00,bbb11,ccc22,ddd33,eee44,fff55,ggg66,hhh77,iii88,jjj991019100";
395 test(strings);
397 function dependentStrings()
399   var a = [];
400   var t = "abcdefghijklmnopqrst";
401   for (var i = 0; i < 10; i++) {
402     var s = t.substring(2*i, 2*i + 2);
403     a[i] = s + s.length;
404   }
405   return a.join("");
407 dependentStrings.expected = "ab2cd2ef2gh2ij2kl2mn2op2qr2st2";
408 test(dependentStrings);
410 function stringConvert()
412   var a = [];
413   var s1 = "F", s2 = "1.3", s3 = "5";
414   for (var i = 0; i < 10; i++) {
415     a[0] = 1 >> s1;
416     a[1] = 10 - s2;
417     a[2] = 15 * s3;
418     a[3] = s3 | 32;
419     a[4] = s2 + 60;
420     // a[5] = 9 + s3;
421     // a[6] = -s3;
422     a[7] = s3 & "7";
423     // a[8] = ~s3;
424   }
425   return a.toString();
427 stringConvert.expected = "1,8.7,75,37,1.360,,,5";
428 test(stringConvert);
430 function orTestHelper(a, b, n)
432   var k = 0;
433   for (var i = 0; i < n; i++) {
434     if (a || b)
435       k += i;
436   }
437   return k;
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';
448 test(orNaNTest1);
449 test(orNaNTest2);
451 function andTestHelper(a, b, n)
453   var k = 0;
454   for (var i = 0; i < n; i++) {
455     if (a && b)
456       k += i;
457   }
458   return k;
461 if (!testName || testName == "truthies") {
462   (function () {
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;
482                test(f);
483              }
484            }
485          }
486        }
487      }
488    })();
491 function nonEmptyStack1Helper(o, farble) {
492     var a = [];
493     var j = 0;
494     for (var i in o)
495         a[j++] = i;
496     return a.join("");
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()
508   var a = 0;
509   for (var c in {a:1, b:2, c:3}) {
510     for (var i = 0; i < 10; i++)
511       a += i;
512   }
513   return String(a);
515 nonEmptyStack2.expected = "135";
516 test(nonEmptyStack2);
518 function arityMismatchMissingArg(arg)
520   for (var a = 0, i = 1; i < 10000; i *= 2) {
521     a += i;
522   }
523   return a;
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)
537   this.i = i;
539 MyConstructor.prototype.toString = function() {return this.i + ""};
541 function newTest()
543   var a = [];
544   for (var i = 0; i < 10; i++)
545     a[i] = new MyConstructor(i);
546   return a.join("");
548 newTest.expected = "0123456789";
549 test(newTest);
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++) {
557     f(i, a);
558     f = g;
559     g = h;
560   }
563 function shapelessVarCalleeLoop(f0, g, h, a)
565   var f = f0;
566   for (var i = 0; i < 10; i++) {
567     f(i, a);
568     f = g;
569     g = h;
570   }
573 function shapelessLetCalleeLoop(f0, g, h, a)
575   for (var i = 0; i < 10; i++) {
576     let f = f0;
577     f(i, a);
578     f = g;
579     g = h;
580   }
583 function shapelessUnknownCalleeLoop(n, f, g, h, a)
585   for (var i = 0; i < 10; i++) {
586     (n || f)(i, a);
587     f = g;
588     g = h;
589   }
592 function shapelessCalleeTest()
594   var a = [];
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);
608   try {
609     helper = {hack: 42};
610     shapelessUnknownCalleeLoop(null, helper, helper, helper, a);
611   } catch (e) {
612     if (e + "" != "TypeError: f is not a function")
613       print("shapelessUnknownCalleeLoop: unexpected exception " + e);
614   }
615   return a.join("");
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";
628 test(typeofTest);
630 function joinTest()
632   var s = "";
633   var a = [];
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++)
638       a[i][1 + j] = j;
639   }
640   for (i = 0; i < 8; i++)
641     s += a[i].join(",");
642   return s;
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";
645 test(joinTest);
647 function arity1(x)
649   return (x == undefined) ? 1 : 0;
651 function missingArgTest() {
652   var q;
653   for (var i = 0; i < 10; i++) {
654     q = arity1();
655   }
656   return q;
658 missingArgTest.expected = "1"
659 test(missingArgTest);
661 JSON = function () {
662     return {
663         stringify: function stringify(value, whitelist) {
664             switch (typeof(value)) {
665               case "object":
666                 return value.constructor.name;
667             }
668         }
669     };
670 }();
672 function missingArgTest2() {
673   var testPairs = [
674     ["{}", {}],
675     ["[]", []],
676     ['{"foo":"bar"}', {"foo":"bar"}],
677   ]
679   var a = [];
680   for (var i=0; i < testPairs.length; i++) {
681     var s = JSON.stringify(testPairs[i][1])
682     a[i] = s;
683   }
684   return a.join(",");
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};
693   var o = new C;
694   var j = 0;
695   var a = [];
696   for (var i in o)
697     a[j++] = i;
698   return a.join("");
700 deepForInLoop.expected = "pqrst";
701 test(deepForInLoop);
703 function nestedExit(x) {
704     var q = 0;
705     for (var i = 0; i < 10; ++i)
706         if (x)
707             ++q;
709 function nestedExitLoop() {
710     for (var j = 0; j < 10; ++j)
711         nestedExit(j < 7);
712     return "ok";
714 nestedExitLoop.expected = "ok";
715 test(nestedExitLoop);
717 function bitsinbyte(b) {
718     var m = 1, c = 0;
719     while(m<0x100) {
720         if(b & m) c++;
721         m <<= 1;
722     }
723     return 1;
725 function TimeFunc(func) {
726     var x,y;
727     for(var y=0; y<256; y++) func(y);
729 function nestedExit2() {
730     TimeFunc(bitsinbyte);
731     return "ok";
733 nestedExit2.expected = "ok";
734 test(nestedExit2);
736 function parsingNumbers() {
737     var s1 = "123";
738     var s1z = "123zzz";
739     var s2 = "123.456";
740     var s2z = "123.456zzz";
742     var e1 = 123;
743     var e2 = 123.456;
745     var r1, r1z, r2, r2z;
747     for (var i = 0; i < 10; i++) {
748         r1 = parseInt(s1);
749         r1z = parseInt(s1z);
750         r2 = parseFloat(s2);
751         r2z = parseFloat(s2z);
752     }
754     if (r1 == e1 && r1z == e1 && r2 == e2 && r2z == e2)
755         return "ok";
756     return "fail";
758 parsingNumbers.expected = "ok";
759 test(parsingNumbers);
761 function matchInLoop() {
762     var k = "hi";
763     for (var i = 0; i < 10; i++) {
764         var result = k.match(/hi/) != null;
765     }
766     return result;
768 matchInLoop.expected = true;
769 test(matchInLoop);
771 function deep1(x) {
772     if (x > 90)
773         return 1;
774     return 2;
776 function deep2() {
777     for (var i = 0; i < 100; ++i)
778         deep1(i);
779     return "ok";
781 deep2.expected = "ok";
782 test(deep2);
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)
788             ++merge_type_maps_y;
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() {
795     function f(i) {
796         for (var m = 0; m < 20; ++m)
797             for (var n = 0; n < 100; n += i)
798                 ;
799         return n;
800     }
801     return f(.5);
803 inner_double_outer_int.expected = "100";
804 test(inner_double_outer_int);
806 function newArrayTest()
808   var a = [];
809   for (var i = 0; i < 10; i++)
810     a[i] = new Array();
811   return a.map(function(x) x.length).toString();
813 newArrayTest.expected="0,0,0,0,0,0,0,0,0,0";
814 test(newArrayTest);
816 function stringSplitTest()
818   var s = "a,b"
819   var a = null;
820   for (var i = 0; i < 10; ++i)
821     a = s.split(",");
822   return a.join();
824 stringSplitTest.expected="a,b";
825 test(stringSplitTest);
827 function stringSplitIntoArrayTest()
829   var s = "a,b"
830   var a = [];
831   for (var i = 0; i < 10; ++i)
832     a[i] = s.split(",");
833   return a.join();
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(","));