[CMake] Have checks are not getting set inside CMake properly
[WebKit-https.git] / PerformanceTests / TailBench9000 / bf-interpreter.js
1 "use strict";
2
3 function lookForMatchingBracket(program, pc, level) {
4     if (pc >= program.length)
5         throw "Error: Unbalanced brackets in the BF program, too many opening brackets";
6     
7     switch(program[pc]) {
8         case '[':
9             return lookForMatchingBracket(program, pc+1, level+1);
10         case ']':
11             if (level == 1)
12                 return pc;
13             return lookForMatchingBracket(program, pc+1, level-1);
14         default:
15             return lookForMatchingBracket(program, pc+1, level);
16     }
17 }
18
19 // (leftTape, tapeCursor, rightTape) form a zipper:
20 // leftTape is the (infinite) list of all values to the left of the cursor (from right to left),
21 // while rightTape is the (infinite) list of all values to the right of the cursor (from left to right).
22 // These lists are represented as functions that return an object with the first value, and a function for the rest of the list.
23 function evalRec(program, pc, input, output, leftTape, tapeCursor, rightTape, loopContinuation)
24 {
25     if (pc >= program.length)
26         return output;
27
28     switch(program[pc]) {
29     case '.':
30         const newOutput = output.concat(String.fromCharCode(tapeCursor));
31         return evalRec(program, pc+1, input, newOutput, leftTape, tapeCursor, rightTape, loopContinuation);
32     case ',':
33         return evalRec(program, pc+1, input.slice(1), output, leftTape, input.charCodeAt(0), rightTape, loopContinuation);
34     case '+':
35         return evalRec(program, pc+1, input, output, leftTape, tapeCursor+1, rightTape, loopContinuation);
36     case '-':
37         return evalRec(program, pc+1, input, output, leftTape, tapeCursor-1, rightTape, loopContinuation);
38     case '>':
39         const evaluatedRightTape = rightTape();
40         return evalRec(program, pc+1, input, output, ()=>({cursor: tapeCursor, rest: leftTape}), evaluatedRightTape.cursor, evaluatedRightTape.rest, loopContinuation);
41     case '<':
42         const evaluatedLeftTape = leftTape();
43         return evalRec(program, pc+1, input, output, evaluatedLeftTape.rest, evaluatedLeftTape.cursor, ()=>({cursor: tapeCursor, rest: rightTape}), loopContinuation);
44     case '[':
45         const matchingPC = lookForMatchingBracket(program, pc, 0);
46         if (tapeCursor == 0)
47             return evalRec(program, matchingPC+1, input, output, leftTape, tapeCursor, rightTape, loopContinuation);
48         return evalRec(program, pc+1, input, output, leftTape, tapeCursor, rightTape, (...varargs) => evalRec(program, pc, ...varargs, loopContinuation));
49     case ']':
50         return loopContinuation(input, output, leftTape, tapeCursor, rightTape);
51     default:
52         throw "Unsupported character: " + program[pc] + " at pc " + pc;
53     }
54 }
55
56 function infiniteTape()
57 {
58     return {cursor: 0, rest: infiniteTape};
59 }
60
61 function evalShort(program, input)
62 {
63     return evalRec(program, 0, input, "", infiniteTape, 0, infiniteTape, ()=>{throw "Error: Unbalanced brackets in the BF program, too many closing brackets";});
64 }
65
66 function test(program, input, expectedOutput)
67 {
68     const result = evalShort(program, input);
69     if (result != expectedOutput)
70         throw ("Wrong result, program: " + program + " on input " + input + " had output " + result + " instead of " + expectedOutput);
71 }
72
73 for (var i = 0; i < 50000; ++i) {
74     test(",...", "A", "AAA");
75     test(",..+..--.", "C", "CCDDB");
76     test(",<,>..<..", "EF", "EEFF");
77     // The following program is taken from the Wikipedia brainfuck page:
78     test("++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.", "", "Hello World!\n")
79 }