💡
jscのWasm系APIをデバッグするためのスクリプト
以下のスクリプトを run-jscwat
という名前で適当な場所に作ってパスを通しておく。wat2wasm
を使って test.wat
を test.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