testSource.js (7562B)
1 (function() { 2 /* 3 * NO ARGUMENT 4 */ 5 6 function f0() { 7 "use asm"; 8 function g() {} 9 return g; 10 11 } 12 13 var bodyOnly = '"use asm";\n\ 14 function g() {}\n\ 15 return g;\n'; 16 17 var funcBody = 'function f0() {\n\ 18 "use asm";\n\ 19 function g() {}\n\ 20 return g;\n\n\ 21 }'; 22 23 assertEq(f0.toString(), funcBody); 24 25 var f0 = function() { 26 "use asm"; 27 function g() {} 28 return g; 29 30 } 31 32 funcBody1 = funcBody.replace('function f0','function'); 33 assertEq(f0.toString(), funcBody1); 34 35 var g = function g0() { 36 "use asm"; 37 function g() {} 38 return g; 39 40 } 41 42 funcBody2 = funcBody.replace('function f0', 'function g0'); 43 assertEq(g.toString(), funcBody2); 44 45 f0 = new Function(bodyOnly); 46 assertEq(f0.toString(), "function anonymous(\n) {\n" + bodyOnly + "\n}"); 47 48 if (isAsmJSCompilationAvailable()) { 49 var m = new Function(bodyOnly); 50 assertEq(isAsmJSModule(m), true); 51 assertEq(m.toString(), "function anonymous(\n) {\n" + bodyOnly + "\n}"); 52 } 53 54 })(); 55 56 (function() { 57 /* 58 * ONE ARGUMENT 59 */ 60 function f1(glob) { 61 "use asm"; 62 function g() {} 63 return g; 64 65 } 66 67 var bodyOnly = '"use asm";\n\ 68 function g() {}\n\ 69 return g;\n'; 70 71 var funcBody = 'function f1(glob) {\n\ 72 "use asm";\n\ 73 function g() {}\n\ 74 return g;\n\n\ 75 }'; 76 77 assertEq(f1.toString(), funcBody); 78 79 f1 = function(glob) { 80 "use asm"; 81 function g() {} 82 return g; 83 84 } 85 86 funcBody1 = funcBody.replace('function f1', 'function'); 87 assertEq(f1.toString(), funcBody1); 88 89 var g = function g0(glob) { 90 "use asm"; 91 function g() {} 92 return g; 93 94 } 95 96 funcBody2 = funcBody.replace('function f1', 'function g0'); 97 assertEq(g.toString(), funcBody2); 98 99 f1 = new Function('glob', bodyOnly); 100 assertEq(f1.toString(), "function anonymous(glob\n) {\n" + bodyOnly + "\n}"); 101 102 if (isAsmJSCompilationAvailable()) { 103 var m = new Function('glob', bodyOnly); 104 assertEq(isAsmJSModule(m), true); 105 assertEq(m.toString(), "function anonymous(glob\n) {\n" + bodyOnly + "\n}"); 106 } 107 108 })(); 109 110 111 (function() { 112 /* 113 * TWO ARGUMENTS 114 */ 115 function f2(glob, ffi) { 116 "use asm"; 117 function g() {} 118 return g; 119 120 } 121 122 var bodyOnly = '"use asm";\n\ 123 function g() {}\n\ 124 return g;\n'; 125 126 var funcBody = 'function f2(glob, ffi) {\n\ 127 "use asm";\n\ 128 function g() {}\n\ 129 return g;\n\n\ 130 }'; 131 132 assertEq(f2.toString(), funcBody); 133 134 f2 = function(glob, ffi) { 135 "use asm"; 136 function g() {} 137 return g; 138 139 } 140 141 funcBody1 = funcBody.replace('function f2', 'function'); 142 assertEq(f2.toString(), funcBody1); 143 144 var g = function g0(glob, ffi) { 145 "use asm"; 146 function g() {} 147 return g; 148 149 } 150 151 var funcBody2 = funcBody.replace('function f2', 'function g0'); 152 assertEq(g.toString(), funcBody2); 153 154 f2 = new Function('glob', 'ffi', bodyOnly); 155 assertEq(f2.toString(), "function anonymous(glob,ffi\n) {\n" + bodyOnly + "\n}"); 156 157 if (isAsmJSCompilationAvailable()) { 158 var m = new Function('glob', 'ffi', bodyOnly); 159 assertEq(isAsmJSModule(m), true); 160 assertEq(m.toString(), "function anonymous(glob,ffi\n) {\n" + bodyOnly + "\n}"); 161 } 162 163 })(); 164 165 166 (function() { 167 /* 168 * THREE ARGUMENTS 169 */ 170 function f3(glob, ffi, heap) { 171 "use asm"; 172 function g() {} 173 return g; 174 175 } 176 177 var bodyOnly = '"use asm";\n\ 178 function g() {}\n\ 179 return g;\n'; 180 181 var funcBody = 'function f3(glob, ffi, heap) {\n\ 182 "use asm";\n\ 183 function g() {}\n\ 184 return g;\n\n\ 185 }'; 186 187 assertEq(f3.toString(), funcBody); 188 189 f3 = function(glob, ffi, heap) { 190 "use asm"; 191 function g() {} 192 return g; 193 194 } 195 196 funcBody1 = funcBody.replace('function f3', 'function'); 197 assertEq(f3.toString(), funcBody1); 198 199 var g = function g0(glob, ffi, heap) { 200 "use asm"; 201 function g() {} 202 return g; 203 204 } 205 206 funcBody2 = funcBody.replace('function f3', 'function g0'); 207 assertEq(g.toString(), funcBody2); 208 209 f3 = new Function('glob', 'ffi', 'heap', bodyOnly); 210 assertEq(f3.toString(), "function anonymous(glob,ffi,heap\n) {\n" + bodyOnly + "\n}"); 211 212 if (isAsmJSCompilationAvailable()) { 213 var m = new Function('glob', 'ffi', 'heap', bodyOnly); 214 assertEq(isAsmJSModule(m), true); 215 assertEq(m.toString(), "function anonymous(glob,ffi,heap\n) {\n" + bodyOnly + "\n}"); 216 } 217 218 })(); 219 220 /* Modules in "use strict" context */ 221 (function() { 222 223 var funcSource = 224 `function(glob, ffi, heap) { 225 "use asm"; 226 function g() {} 227 return g; 228 }`; 229 230 var f4 = eval("\"use strict\";\n(" + funcSource + ")"); 231 232 var expectedToString = funcSource; 233 234 assertEq(f4.toString(), expectedToString); 235 236 if (isAsmJSCompilationAvailable()) { 237 var f5 = eval("\"use strict\";\n(" + funcSource + ")"); 238 assertEq(isAsmJSModule(f5), true); 239 assertEq(f5.toString(), expectedToString); 240 } 241 })(); 242 243 /* Functions */ 244 (function() { 245 246 var noSrc = "function noArgument() {\n\ 247 return 42;\n\ 248 }" 249 var oneSrc = "function oneArgument(x) {\n\ 250 x = x | 0;\n\ 251 return x + 1 | 0;\n\ 252 }"; 253 var twoSrc = "function twoArguments(x, y) {\n\ 254 x = x | 0;\n\ 255 y = y | 0;\n\ 256 return x + y | 0;\n\ 257 }"; 258 var threeSrc = "function threeArguments(a, b, c) {\n\ 259 a = +a;\n\ 260 b = +b;\n\ 261 c = +c;\n\ 262 return +(+(a * b) + c);\n\ 263 }"; 264 265 var funcBody = '\n\ 266 "use asm";\n' 267 + noSrc + '\n' 268 + oneSrc + '\n' 269 + twoSrc + '\n' 270 + threeSrc + '\n' 271 + 'return {\n\ 272 no: noArgument,\n\ 273 one: oneArgument,\n\ 274 two: twoArguments,\n\ 275 three: threeArguments\n\ 276 }'; 277 278 var g = new Function(funcBody); 279 var moduleG = g(); 280 281 function checkFuncSrc(m) { 282 assertEq(m.no.toString(), noSrc); 283 284 assertEq(m.one.toString(), oneSrc); 285 286 assertEq(m.two.toString(), twoSrc); 287 288 assertEq(m.three.toString(), threeSrc); 289 } 290 checkFuncSrc(moduleG); 291 292 if (isAsmJSCompilationAvailable()) { 293 var g2 = new Function(funcBody); 294 assertEq(isAsmJSModule(g2), true); 295 m = g2(); 296 checkFuncSrc(m); 297 298 var moduleDecl = 'function g3() {' + funcBody + '}'; 299 eval(moduleDecl); 300 m = g3(); 301 assertEq(isAsmJSModule(g3), true); 302 checkFuncSrc(m); 303 304 eval('var x = 42;' + moduleDecl); 305 m = g3(); 306 assertEq(isAsmJSModule(g3), true); 307 checkFuncSrc(m); 308 } 309 310 })(); 311 312 /* Functions in "use strict" context */ 313 (function () { 314 315 var funcCode = 'function g(x) {\n\ 316 x=x|0;\n\ 317 return x + 1 | 0;}'; 318 var moduleCode = 'function () {\n\ 319 "use asm";\n' + funcCode + '\n\ 320 return g;\n\ 321 }', 322 useStrict = '"use strict";'; 323 324 var f5 = eval(useStrict + ";\n(" + moduleCode + "())"); 325 326 var expectedToString = funcCode; 327 328 assertEq(f5.toString(), expectedToString); 329 330 if (isAsmJSCompilationAvailable()) { 331 var mf5 = eval("\"use strict\";\n(" + moduleCode + ")"); 332 assertEq(isAsmJSModule(mf5), true); 333 var f5 = mf5(); 334 assertEq(f5.toString(), expectedToString); 335 } 336 337 })(); 338 339 /* Functions in "use strict" context with dynamic linking failure */ 340 (function () { 341 342 var funcCode = 'function g(x) {\n\ 343 x=x|0;\n\ 344 return x + 1 | 0;}'; 345 var moduleCode = 'function (glob) {\n\ 346 "use asm";\n\ 347 var fround = glob.Math.fround;\n\ 348 ' + funcCode + '\n\ 349 return g;\n\ 350 }', 351 useStrict = '"use strict";'; 352 353 var f6 = eval(useStrict + ";\n(" + moduleCode + "({Math:{}}))"); 354 355 assertEq(f6.toString(), funcCode); 356 357 if (isAsmJSCompilationAvailable()) { 358 var mf6 = eval("\"use strict\";\n(" + moduleCode + ")"); 359 assertEq(isAsmJSModule(mf6), true); 360 var f6 = mf6({Math:{}}); 361 assertEq(f6.toString(), funcCode); 362 } 363 364 })(); 365 366 /* Column number > 0. */ 367 (function() { 368 369 var asmSource = `function evaluate() { 370 "use asm"; 371 function another() {} 372 function func() {} 373 return func 374 }` 375 376 var m = evaluate(` 377 var f = x =>(${asmSource}); 378 f()`, { 379 columnNumber: 100 380 }); 381 382 assertEq(m.toString(), asmSource); 383 assertEq(m().toString(), `function func() {}`) 384 385 })();