jitexit.js (2563B)
1 // Copy of wasm/import-export.js test with WebAssembly.promising 2 3 (async function testImportJitExit() { 4 let options = getJitCompilerOptions(); 5 if (!options['baseline.enable']) 6 return; 7 8 let baselineTrigger = options['baseline.warmup.trigger']; 9 10 let valueToConvert = 0; 11 function ffi(n) { if (n == 1337) { return valueToConvert }; return 42; } 12 13 function sum(a, b, c) { 14 if (a === 1337) 15 return valueToConvert; 16 return (a|0) + (b|0) + (c|0) | 0; 17 } 18 19 // Baseline compile ffis. 20 for (let i = baselineTrigger + 1; i --> 0;) { 21 ffi(i); 22 sum((i%2)?i:undefined, 23 (i%3)?i:undefined, 24 (i%4)?i:undefined); 25 } 26 27 let imports = { 28 a: { 29 ffi, 30 sum 31 } 32 }; 33 34 i = wasmEvalText(`(module 35 (import "a" "ffi" (func $ffi (param i32) (result i32))) 36 37 (import "a" "sum" (func $missingOneArg (param i32) (param i32) (result i32))) 38 (import "a" "sum" (func $missingTwoArgs (param i32) (result i32))) 39 (import "a" "sum" (func $missingThreeArgs (result i32))) 40 41 (func (export "foo") (param i32) (result i32) 42 local.get 0 43 call $ffi 44 ) 45 46 (func (export "missThree") (result i32) 47 call $missingThreeArgs 48 ) 49 50 (func (export "missTwo") (param i32) (result i32) 51 local.get 0 52 call $missingTwoArgs 53 ) 54 55 (func (export "missOne") (param i32) (param i32) (result i32) 56 local.get 0 57 local.get 1 58 call $missingOneArg 59 ) 60 )`, imports).exports; 61 62 // Enable the jit exit for each JS callee. 63 assertEq(i.foo(0), 42); 64 65 assertEq(i.missThree(), 0); 66 assertEq(i.missTwo(42), 42); 67 assertEq(i.missOne(13, 37), 50); 68 69 // Test the jit exit under normal conditions. 70 assertEq(i.foo(0), 42); 71 assertEq(i.foo(1337), 0); 72 73 // Test on suspendable stack. 74 var f = WebAssembly.promising(i.foo); 75 assertEq(await f(0), 42); 76 77 // Test the arguments rectifier. 78 assertEq(i.missThree(), 0); 79 assertEq(i.missTwo(-1), -1); 80 assertEq(i.missOne(23, 10), 33); 81 82 // Test OOL coercion. 83 valueToConvert = 2**31; 84 assertEq(i.foo(1337), -(2**31)); 85 86 // Test OOL error path. 87 valueToConvert = { valueOf() { throw new Error('make ffi great again'); } } 88 assertErrorMessage(() => i.foo(1337), Error, "make ffi great again"); 89 90 valueToConvert = { toString() { throw new Error('a FFI to believe in'); } } 91 assertErrorMessage(() => i.foo(1337), Error, "a FFI to believe in"); 92 93 // Test the error path in the arguments rectifier. 94 assertErrorMessage(() => i.missTwo(1337), Error, "a FFI to believe in"); 95 })();