tor-browser

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

wasm-14.js (2701B)


      1 // |jit-test| test-also=--wasm-compiler=optimizing; skip-if: !wasmDebuggingEnabled(); skip-if: true
      2 // An extension of wasm-10.js, testing that wasm GC objects are inspectable in locals.
      3 
      4 // As of bug 1825098, this test is disabled. (skip-if: true)
      5 // See https://bugzilla.mozilla.org/show_bug.cgi?id=1836320
      6 
      7 load(libdir + "wasm.js");
      8 
      9 function monitorLocalValues(wast, lib, expected) {
     10  function setupFrame(frame) {
     11    var locals = {};
     12    framesLocals.push(locals);
     13    frame.environment.names().forEach(n => {
     14      locals[n] = [frame.environment.getVariable(n)];
     15    });
     16    frame.onStep = function () {
     17      frame.environment.names().forEach(n => {
     18        var prevValues = locals[n];
     19        if (!prevValues) {
     20          locals[n] = prevValues = [void 0];
     21        }
     22        var value = frame.environment.getVariable(n);
     23        if (prevValues[prevValues.length - 1] !== value) {
     24          prevValues.push(value);
     25        }
     26      });
     27    }
     28  }
     29  var framesLocals = [];
     30  wasmRunWithDebugger(wast, lib,
     31    function ({dbg}) {
     32      dbg.onEnterFrame = function(frame) {
     33        if (frame.type == "wasmcall") {
     34          setupFrame(frame);
     35        }
     36      }
     37    },
     38    function ({error}) {
     39      assertEq(error, undefined);
     40    }
     41  );
     42  assertEq(framesLocals.length, expected.length);
     43  for (var i = 0; i < framesLocals.length; i++) {
     44    var frameLocals = framesLocals[i];
     45    var expectedLocals = expected[i];
     46    var localsNames = Object.keys(frameLocals);
     47    assertEq(localsNames.length, Object.keys(expectedLocals).length);
     48    for (const n of localsNames) {
     49      const actualValues = frameLocals[n];
     50      const expectedValues = expectedLocals[n];
     51      for (let j = 0; j < expectedValues.length; j++) {
     52        const actual = actualValues[j];
     53        const expected = expectedValues[j];
     54        if (expected === null) {
     55          assertEq(actual, null, `values differed at index ${j}`);
     56        } else {
     57          for (const key of Object.keys(expected)) {
     58            const actualField = actual.getProperty(key).return;
     59            const expectedField = expected[key];
     60            assertEq(actualField, expectedField, `values differed for key "${key}"`);
     61          }
     62        }
     63      }
     64    }
     65  }
     66 }
     67 
     68 monitorLocalValues(
     69  `(module
     70  (type (struct i32 i64))
     71  (func (export "test")
     72    (local (ref null 0))
     73    (local.set 0 (struct.new 0 (i32.const 1) (i64.const 2)))
     74  )
     75 )`,
     76  undefined,
     77  [{var0: [null, {0: 1, 1: 2n}]}]
     78 );
     79 monitorLocalValues(
     80  `(module
     81  (type (array i32))
     82  (func (export "test")
     83    (local (ref null 0))
     84    (i64.const 3)
     85    (local.set 0 (array.new 0 (i32.const 123) (i32.const 2)))
     86    drop
     87  )
     88 )`,
     89  undefined,
     90  [{var0: [null, {length: 2, 0: 123, 1: 123}]}]
     91 );