[WASM] Call a JavaScript Function from WebAssembly

Posted Answer1215

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[WASM] Call a JavaScript Function from WebAssembly相关的知识,希望对你有一定的参考价值。

Using WASM Fiddle, we show how to write a simple number logger function that calls a consoleLog function defined in javascript. We then download and run the same function in a local project.

WASM Fiddle: https://wasdk.github.io/WasmFiddle/?cvrmt

Demo Repo: https://github.com/guybedford/wasm-intro

 

Basiclly WASM is hard to debug, we still need Javascript to help, the way to do debugging is we pass Javascript Console.log function into WASM though "imports".
 
Defined a C code:
#include <math.h>

void consoleLog (float num);

float getSqrt (float num) {
  consoleLog(num);
  return sqrt(num);
}

Defined a function called "consoleLog".

 

After build to wasm:

(module
  (type $FUNCSIG$vf (func (param f32)))
  (type $FUNCSIG$ff (func (param f32) (result f32)))
  (import "env" "consoleLog" (func $consoleLog (param f32)))
  (table 0 anyfunc)
  (memory $0 1)
  (export "memory" (memory $0))
  (export "getSqrt" (func $getSqrt))
  (func $getSqrt (param $0 f32) (result f32)
    (call $consoleLog
      (get_local $0)
    )
    (f32.sqrt
      (get_local $0)
    )
  )
)

It‘s importing consoleLog from a module called environment.

This is just a default module namespace name for the externals of a C code compilation process.

 

Now on JS side, we need to pass the console.log function from "imports" param:

        function fetchAndInstantiateWasm(url, imports) {
            return fetch(url)
                .then((res) => {
                    if (res.ok) {
                        return res.arrayBuffer();
                    }
                    throw new Error(‘Unable to fetch WASM‘)
                })
                .then((bytes) => {
                    return WebAssembly.compile(bytes);
                })
                .then(module => {
                    return WebAssembly.instantiate(module, imports || {});
                })
                .then(instance => instance.exports);
        }

        fetchAndInstantiateWasm(‘./program.wasm‘, {
            env: {
                consoleLog: (num) => console.log(num) 
            }
        })
            .then(m => {
                window.getSqrt = m.getSqrt;
            });

 

以上是关于[WASM] Call a JavaScript Function from WebAssembly的主要内容,如果未能解决你的问题,请参考以下文章

[WASM] Write to WebAssembly Memory from JavaScript

从 JavaScript 终止 WebAssembly

Javascript 中的 apply与call详解

javascript中的apply与call

[Javascript] Call Stack

Javascript中call和apply的区别与详解