Open5

BunからWebAssemblyを呼び出す

mganekomganeko

BunからWebAssemblyを呼び出すトライ。
シンプルなコードだと、エラーも実行結果も出ずに終了する。
(Node.jsだと 実行結果 42 が表示される)

use_wasm_.js
const fs = require("fs");
const content = fs.readFileSync("./func.wasm");

console.warn("-- start compiling wasm --")
WebAssembly.compile(content)
  .then((module) => {
    console.warn("-- wasm compiled --");
    const lib = new WebAssembly.Instance(module, {
      env: {},
    }).exports;
    console.warn("-- wasm instance ready. lib:", lib);

    // --- call func ---
    console.warn("== Result of wasm func ==");
    const ret = lib.func();
    console.log(ret); // 42
  })
  .catch((e) => {
    console.error("ERROR:", e);
  });

console.warn("--- end ---");
mganekomganeko

WebAssemblyのモジュールを生成するためのZigソース

src/func.zig
// src/func.zig
export fn func() usize {
    return 42;
}

ビルド手順

zig build-lib \
  -O ReleaseSmall \
  -target wasm32-wasi \
  -dynamic \
  --export=func \
  src/func.zig
mganekomganeko

setTimeout()でしばらく待たせれば、OK

use_wasm_timeout.js
const fs = require("fs");
const content = fs.readFileSync("./func.wasm");

console.warn("-- start compiling wasm --")

WebAssembly.compile(content)
  .then((module) => {
    console.warn("-- wasm compiled --");
    const lib = new WebAssembly.Instance(module, {
      env: {},
    }).exports;
    console.warn("-- wasm instance ready. lib:", lib);

    // --- call func ---
    console.warn("== Result of wasm func ==");
    const ret = lib.func();
    console.log(ret); // 42
  })
  .catch((e) => {
    console.error("ERROR:", e);
  });

// --- wait for WebAssembly.compile() ---
setTimeout(function() {
  console.warn("timeout ..");
}, 100);
mganekomganeko

あるいは、単に await で待たせるのでもOK

use_wasm_await.mjs
import fs from "fs";
const content = fs.readFileSync("./func.wasm");

console.warn("-- start compiling wasm --")
const module = await WebAssembly.compile(content)
.catch((e) => {
  console.error("ERROR:", e);
});
console.warn("-- wasm compiled --");

const lib = new WebAssembly.Instance(module, {
  env: {},
}).exports;
console.warn("-- wasm instance ready. lib:", lib);

// --- call func ---
console.warn("== Result of wasm func ==");
const ret = lib.func();
console.log(ret); // 42