Tests stepping through wasm scripts
Installing code an global variable.
Calling instantiate function.
Waiting for two wasm scripts to be parsed.
Ignoring script with url v8://test/callInstantiate
Got wasm script: wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-0
Requesting source for wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-0...
Got wasm script: wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-1
Requesting source for wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-1...
func $wasm_A
  nop
  nop
end

func $wasm_B (param i32)
  loop
    local.get 0
    if
      local.get 0
      i32.const 1
      i32.sub
      local.set 0
      call 0
      br 1
    end
  end
end

Setting breakpoint on line 7 (on the setlocal before the call), url wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-1
{
    columnNumber : 6
    lineNumber : 7
    scriptId : <scriptId>
}
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-1:7:6:       >local.set 0
at wasm_B (7:6):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":4} (Object)
   stack: {"0":3} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.stepInto called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-1:8:6:       >call 0
at wasm_B (8:6):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":3} (Object)
   stack: {} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.stepInto called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-0:1:2:   >nop
at wasm_A (1:2):
 - scope (global):
   -- skipped
 - scope (local):
   stack: {} (Object)
at wasm_B (8:6):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":3} (Object)
   stack: {} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.stepOver called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-0:2:2:   >nop
at wasm_A (2:2):
 - scope (global):
   -- skipped
 - scope (local):
   stack: {} (Object)
at wasm_B (8:6):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":3} (Object)
   stack: {} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.stepOut called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-1:9:6:       >br 1
at wasm_B (9:6):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":3} (Object)
   stack: {} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.stepOut called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-1:7:6:       >local.set 0
at wasm_B (7:6):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":3} (Object)
   stack: {"0":2} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.stepOver called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-1:8:6:       >call 0
at wasm_B (8:6):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":2} (Object)
   stack: {} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.stepOver called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-1:9:6:       >br 1
at wasm_B (9:6):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":2} (Object)
   stack: {} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.resume called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-1:7:6:       >local.set 0
at wasm_B (7:6):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":2} (Object)
   stack: {"0":1} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.stepInto called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-1:8:6:       >call 0
at wasm_B (8:6):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":1} (Object)
   stack: {} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.stepInto called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-0:1:2:   >nop
at wasm_A (1:2):
 - scope (global):
   -- skipped
 - scope (local):
   stack: {} (Object)
at wasm_B (8:6):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":1} (Object)
   stack: {} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.stepOut called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-1:9:6:       >br 1
at wasm_B (9:6):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":1} (Object)
   stack: {} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.stepInto called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-1:1:2:   >loop
at wasm_B (1:2):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":1} (Object)
   stack: {} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.stepInto called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-1:2:4:     >local.get 0
at wasm_B (2:4):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":1} (Object)
   stack: {} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.stepInto called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-1:3:4:     >if
at wasm_B (3:4):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":1} (Object)
   stack: {"0":1} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.stepInto called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-1:4:6:       >local.get 0
at wasm_B (4:6):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":1} (Object)
   stack: {} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.stepInto called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-1:5:6:       >i32.const 1
at wasm_B (5:6):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":1} (Object)
   stack: {"0":1} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.stepInto called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-1:6:6:       >i32.sub
at wasm_B (6:6):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":1} (Object)
   stack: {"0":1,"1":1} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.stepInto called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-1:7:6:       >local.set 0
at wasm_B (7:6):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":1} (Object)
   stack: {"0":0} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.stepInto called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-1:8:6:       >call 0
at wasm_B (8:6):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":0} (Object)
   stack: {} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.stepInto called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-0:1:2:   >nop
at wasm_A (1:2):
 - scope (global):
   -- skipped
 - scope (local):
   stack: {} (Object)
at wasm_B (8:6):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":0} (Object)
   stack: {} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.stepInto called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-0:2:2:   >nop
at wasm_A (2:2):
 - scope (global):
   -- skipped
 - scope (local):
   stack: {} (Object)
at wasm_B (8:6):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":0} (Object)
   stack: {} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.stepInto called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-0:3:0: >end
at wasm_A (3:0):
 - scope (global):
   -- skipped
 - scope (local):
   stack: {} (Object)
at wasm_B (8:6):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":0} (Object)
   stack: {} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.stepInto called
Paused at wasm://wasm/wasm-0c10a5fe/wasm-0c10a5fe-1:9:6:       >br 1
at wasm_B (9:6):
 - scope (global):
   -- skipped
 - scope (local):
   locals: {"arg#0":0} (Object)
   stack: {} (Object)
at (anonymous) (0:17):
 - scope (global):
   -- skipped
Debugger.resume called
exports.main returned!
Finished!
