💡

jscのWasm系APIをデバッグするためのスクリプト

2024/08/04に公開

以下のスクリプトを run-jscwat という名前で適当な場所に作ってパスを通しておく。wat2wasm を使って test.wattest.wasm にして、それを base64 にしたやつを標準入力に流す。

run-jscwat
#!/bin/bash

WEBKIT_DIR=${WEBKIT_DIR:-"/home/sosukesuzuki/ghq/github.com/WebKit/WebKit"}

JSC_PATH="$WEBKIT_DIR/WebKitBuild/JSCOnly/Debug/bin/jsc"
TEST_SCRIPT="$WEBKIT_DIR/WebKitBuild/JSCOnly/Debug/test.js"
WAT_FILE="$WEBKIT_DIR/WebKitBuild/JSCOnly/Debug/test.wat"
WASM_FILE="$WEBKIT_DIR/WebKitBuild/JSCOnly/Debug/test.wasm"

OPTIONS="$@"

DEFAULT_OPTION="--useDollarVM=1"

wat2wasm "$WAT_FILE" -o "$WASM_FILE"

WASM_BASE64=$(base64 "$WASM_FILE")

echo "$WASM_BASE64" | $JSC_PATH $DEFAULT_OPTION $OPTIONS $TEST_SCRIPT

test.js はこんな感じで、標準入力から値を読み取って Uint8Array.fromBase64 でバイト列に戻して WebAssembly.compile する。

test.js
const base64 = readline();

const bytes = Uint8Array.fromBase64(base64);

const module = await WebAssembly.compile(bytes);
for (const importEntry of WebAssembly.Module.imports(module)) {
  print(importEntry.module);
  print(importEntry.name);
  print(importEntry.kind);
}

Uint8Array.fromBase64 はまだ stage 3 になっていないため --useUint8ArrayBase64Methods=1 をつけないと動かないので注意。

こうしたら、好きに test.wat を書いて Wasm 系の API を動かせる。

run-jscwat -m --useUint8ArrayBase64Methods=1

Discussion