wasm-10.js (2510B)
1 // |jit-test| test-also=--wasm-compiler=optimizing; skip-if: !wasmDebuggingEnabled() 2 // Tests that wasm module scripts has inspectable locals. 3 4 load(libdir + "wasm.js"); 5 load(libdir + 'eqArrayHelper.js'); 6 7 function monitorLocalValues(wast, lib, expected) { 8 function setupFrame(frame) { 9 var locals = {}; 10 framesLocals.push(locals); 11 frame.environment.names().forEach(n => { 12 locals[n] = [frame.environment.getVariable(n)]; 13 }); 14 frame.onStep = function () { 15 frame.environment.names().forEach(n => { 16 var prevValues = locals[n]; 17 if (!prevValues) 18 locals[n] = prevValues = [void 0]; 19 var value = frame.environment.getVariable(n); 20 if (prevValues[prevValues.length - 1] !== value) 21 prevValues.push(value); 22 }); 23 } 24 } 25 var framesLocals = []; 26 wasmRunWithDebugger(wast, lib, 27 function ({dbg}) { 28 dbg.onEnterFrame = function(frame) { 29 if (frame.type == "wasmcall") 30 setupFrame(frame); 31 } 32 }, 33 function ({error}) { 34 assertEq(error, undefined); 35 } 36 ); 37 assertEq(framesLocals.length, expected.length); 38 for (var i = 0; i < framesLocals.length; i++) { 39 var frameLocals = framesLocals[i]; 40 var expectedLocals = expected[i]; 41 var localsNames = Object.keys(frameLocals); 42 assertEq(localsNames.length, Object.keys(expectedLocals).length); 43 localsNames.forEach(n => { 44 assertEqArray(frameLocals[n], expectedLocals[n]); 45 }); 46 } 47 } 48 49 monitorLocalValues( 50 '(module (func (nop) (nop)) (export "test" (func 0)))', 51 undefined, 52 [{}] 53 ); 54 monitorLocalValues( 55 '(module (func (export "test") (local i32) (i32.const 1) (local.set 0)))', 56 undefined, 57 [{var0: [0, 1]}] 58 ); 59 monitorLocalValues( 60 '(module (func (export "test") (local f32) (f32.const 1.5) (local.set 0)))', 61 undefined, 62 [{var0: [0, 1.5]}] 63 ); 64 monitorLocalValues( 65 '(module (func (export "test") (local f64) (f64.const 42.25) (local.set 0)))', 66 undefined, 67 [{var0: [0, 42.25]}] 68 ); 69 monitorLocalValues( 70 `(module 71 (func (param i32) (result i32) (local.get 0) (i32.const 2) (i32.add)) 72 (func (param i32) (local i32) (local.get 0) (call 0) (local.set 1)) 73 (func (export "test") (i32.const 1) (call 1)) 74 )`.replace(/\n/g, " "), 75 undefined, 76 [{}, {var0: [1], var1: [0, 3]}, {var0: [1]}] 77 );