[WASM] Call a JavaScript Function from WebAssembly
2017-06-29 15:22
585 查看
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:
Defined a function called "consoleLog".
After build to wasm:
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:
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] Write to WebAssembly Memory from JavaScript
- [WASM] Read WebAssembly Memory from JavaScript
- [WASM] Create and Run a Native WebAssembly Function
- call a JavaScript function from C++ code
- how to call javascript function in webview
- error C2556: 'void __thiscall......overloaded function differs only by return type from 'int __thiscall
- Javascript点滴:this, Function.apply 及Function.call
- Could not load type 'System.Web.UI.ScriptReferenceBase' from assembly 'System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.
- How to call Postback from Javascript
- Some JavaScript Codes or Nodes Collected from Web
- Function.apply and Function.call in JavaScript
- Function.apply and Function.call in JavaScript
- Calling Web Services From Html Pages using Javascript
- call web services from iPhone
- .NET Web 执行错误Could not load type '...' from assembly '..., Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' because the me
- ADS 转Keil, ADS升级至MDK常见错误 invalid call from '~PRES8' function to 'REQ8' 解决方法
- javascript中的 function.apply 和 fucntion.call的调用
- Web service vs function call
- (原創) 如何每间格一段时间就执行function? (Web) (JavaScript)
- How to call the EnumJobs function from a Visual Basic .NET application