(module
  (import "./globals.js" "jsthunk" (func $js_thunk))
  (import "./globals.js" "add" (func $js_add (param i32) (param i32) (result i32)))

  (export "call_js_thunk_n_times" (func $call_thunk))
  (export "call_js_add_n_times" (func $call_add))
  (export "thunk" (func $thunk))
  (export "add" (func $add))

  (func $call_thunk (param i32)
    block
      get_local 0
      i32.eqz
      br_if 0
      loop
        call $js_thunk
        get_local 0
        i32.const 1
        i32.sub
        tee_local 0
        br_if 0
      end
    end
  )

  (func $call_add (param i32) (param i32) (param i32)
    block
      get_local 0
      i32.eqz
      br_if 0
      loop
        get_local 2
        get_local 1
        call $js_add
        drop
        get_local 0
        i32.const 1
        i32.sub
        tee_local 0
        br_if 0
      end
    end
  )

  (func $thunk)

  (func $add (param i32) (param i32) (result i32)
    get_local 0
    get_local 1
    i32.add
  )
)