MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1function addNums(a, b) {
2 return a + b;
3}
4for (let i = 0; i < 200; i++) addNums(i, i + 1);
5let r1 = addNums(100, 42);
6console.log('[fb_num_only ADD]', r1, 'ok:', r1 === 142);
7
8function subNums(a, b) {
9 return a - b;
10}
11for (let i = 0; i < 200; i++) subNums(i * 2, i);
12let r2 = subNums(100, 58);
13console.log('[fb_num_only SUB]', r2, 'ok:', r2 === 42);
14
15function mulNums(a, b) {
16 return a * b;
17}
18for (let i = 0; i < 200; i++) mulNums(i, 2);
19let r3 = mulNums(21, 2);
20console.log('[fb_num_only MUL]', r3, 'ok:', r3 === 42);
21
22function divNums(a, b) {
23 return a / b;
24}
25for (let i = 0; i < 200; i++) divNums(i * 3, 3);
26let r4 = divNums(84, 2);
27console.log('[fb_num_only DIV]', r4, 'ok:', r4 === 42);
28
29function ltNums(a, b) {
30 return a < b;
31}
32for (let i = 0; i < 200; i++) ltNums(i, 100);
33console.log('[fb_num_only LT] 3<5:', ltNums(3, 5), 'ok:', ltNums(3, 5) === true);
34console.log('[fb_num_only LT] 5<3:', ltNums(5, 3), 'ok:', ltNums(5, 3) === false);
35
36function leNums(a, b) {
37 return a <= b;
38}
39for (let i = 0; i < 200; i++) leNums(i, 100);
40console.log('[fb_num_only LE] 3<=3:', leNums(3, 3), 'ok:', leNums(3, 3) === true);
41console.log('[fb_num_only LE] 4<=3:', leNums(4, 3), 'ok:', leNums(4, 3) === false);
42
43function gtNums(a, b) {
44 return a > b;
45}
46for (let i = 0; i < 200; i++) gtNums(i, 100);
47console.log('[fb_num_only GT] 5>3:', gtNums(5, 3), 'ok:', gtNums(5, 3) === true);
48console.log('[fb_num_only GT] 3>3:', gtNums(3, 3), 'ok:', gtNums(3, 3) === false);
49
50function geNums(a, b) {
51 return a >= b;
52}
53for (let i = 0; i < 200; i++) geNums(i, 100);
54console.log('[fb_num_only GE] 3>=3:', geNums(3, 3), 'ok:', geNums(3, 3) === true);
55console.log('[fb_num_only GE] 2>=3:', geNums(2, 3), 'ok:', geNums(2, 3) === false);
56
57function addStrs(a, b) {
58 return a + b;
59}
60for (let i = 0; i < 200; i++) addStrs('x', 'y');
61let r5 = addStrs('hello', ' world');
62console.log('[fb_never_num ADD]', r5, 'ok:', r5 === 'hello world');
63
64function ltStrs(a, b) {
65 return a < b;
66}
67for (let i = 0; i < 200; i++) ltStrs('abc', 'def');
68console.log("[fb_never_num LT] 'a'<'b':", ltStrs('a', 'b'), 'ok:', ltStrs('a', 'b') === true);
69console.log("[fb_never_num LT] 'b'<'a':", ltStrs('b', 'a'), 'ok:', ltStrs('b', 'a') === false);
70console.log("[fb_never_num LT] 'z'<'a':", ltStrs('z', 'a'), 'ok:', ltStrs('z', 'a') === false);
71
72function addMixed(a, b) {
73 return a + b;
74}
75for (let i = 0; i < 100; i++) addMixed(i, i);
76for (let i = 0; i < 100; i++) addMixed('a', 'b');
77let r6 = addMixed(20, 22);
78let r7 = addMixed('foo', 'bar');
79console.log('[mixed ADD] num:', r6, 'ok:', r6 === 42);
80console.log('[mixed ADD] str:', r7, 'ok:', r7 === 'foobar');
81
82function addTrainedNum(a, b) {
83 return a + b;
84}
85for (let i = 0; i < 200; i++) addTrainedNum(i, i);
86
87let r8 = addTrainedNum('bail', 'out');
88console.log('[fb_num_only bailout]', r8, 'ok:', r8 === 'bailout');
89
90let r9 = addTrainedNum(10, 32);
91console.log('[post-bailout num]', r9, 'ok:', r9 === 42);
92
93function numericLoop(n) {
94 let sum = 0;
95 for (let i = 0; i < n; i++) {
96 sum = sum + i;
97 }
98 return sum;
99}
100for (let i = 0; i < 200; i++) numericLoop(10);
101let r10 = numericLoop(10000);
102let expected = (9999 * 10000) / 2;
103console.log('[numeric loop]', r10, 'ok:', r10 === expected);
104
105function mathChain(a, b, c) {
106 let x = a + b;
107 let y = x * c;
108 let z = y - a;
109 return z / b;
110}
111for (let i = 1; i < 200; i++) mathChain(i, i + 1, 2);
112let r11 = mathChain(10, 5, 3);
113console.log('[math chain]', r11, 'ok:', r11 === 7);
114
115function countAbove(arr, threshold) {
116 let count = 0;
117 for (let i = 0; i < arr.length; i++) {
118 if (arr[i] > threshold) count = count + 1;
119 }
120 return count;
121}
122let nums = [];
123for (let i = 0; i < 100; i++) nums[i] = i;
124for (let i = 0; i < 200; i++) countAbove(nums, 50);
125let r12 = countAbove(nums, 50);
126console.log('[comparison loop]', r12, 'ok:', r12 === 49);
127
128function concatLoop(prefix, n) {
129 let s = prefix;
130 for (let i = 0; i < n; i++) {
131 s = s + '.';
132 }
133 return s;
134}
135for (let i = 0; i < 200; i++) concatLoop('x', 3);
136let r13 = concatLoop('start', 5);
137console.log('[string concat loop]', r13, 'ok:', r13 === 'start.....');
138
139function numericInitThenString() {
140 let x = 0;
141 x = 'safe';
142 return x;
143}
144for (let i = 0; i < 200; i++) numericInitThenString();
145let r14 = numericInitThenString();
146console.log('[numeric init then string]', r14, 'ok:', r14 === 'safe');
147
148function numericInitBranchString(flag) {
149 let x = 0;
150 if (flag) x = 's';
151 return x + 1;
152}
153for (let i = 0; i < 200; i++) numericInitBranchString(false);
154let r15 = numericInitBranchString(true);
155let r16 = numericInitBranchString(false);
156console.log('[numeric init branch string]', r15, 'ok:', r15 === 's1');
157console.log('[numeric init branch number]', r16, 'ok:', r16 === 1);
158
159function conditionalLocalAdd(flag) {
160 let x = flag ? 'p' : 2;
161 return x + 1;
162}
163for (let i = 0; i < 200; i++) conditionalLocalAdd(false);
164let r17 = conditionalLocalAdd(true);
165let r18 = conditionalLocalAdd(false);
166console.log('[conditional local add bailout]', r17, 'ok:', r17 === 'p1');
167console.log('[conditional local add warm]', r18, 'ok:', r18 === 3);
168
169function conditionalLocalMul(flag) {
170 let x = flag ? 'p' : 2;
171 return x * 2;
172}
173for (let i = 0; i < 200; i++) conditionalLocalMul(false);
174let r19 = conditionalLocalMul(true);
175let r20 = conditionalLocalMul(false);
176console.log('[conditional local mul bailout]', r19, 'ok:', Number.isNaN(r19));
177console.log('[conditional local mul warm]', r20, 'ok:', r20 === 4);
178
179let allOk =
180 r1 === 142 &&
181 r2 === 42 &&
182 r3 === 42 &&
183 r4 === 42 &&
184 ltNums(3, 5) === true &&
185 ltNums(5, 3) === false &&
186 leNums(3, 3) === true &&
187 leNums(4, 3) === false &&
188 gtNums(5, 3) === true &&
189 gtNums(3, 3) === false &&
190 geNums(3, 3) === true &&
191 geNums(2, 3) === false &&
192 r5 === 'hello world' &&
193 ltStrs('a', 'b') === true &&
194 r6 === 42 &&
195 r7 === 'foobar' &&
196 r8 === 'bailout' &&
197 r9 === 42 &&
198 r10 === expected &&
199 r11 === 7 &&
200 r12 === 49 &&
201 r13 === 'start.....' &&
202 r14 === 'safe' &&
203 r15 === 's1' &&
204 r16 === 1 &&
205 r17 === 'p1' &&
206 r18 === 3 &&
207 Number.isNaN(r19) &&
208 r20 === 4;
209
210console.log('');
211console.log('all type feedback tests passed:', allOk);