tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 })();