山本悠滋
2026-11-12 Fukuoka.wasm
以降のスライドは、Claude Code (Opus 5.5) と相談しつつ実験し、生成したものを加筆・修正して使っています。
borrow で受け取ったハンドルは、呼び出しが返る前に drop
しなければならないresourceディレクトリーへ!Python
側の Blob.append で self をグローバル変数
escape に保存
resource で宣言したメソッドは第1引数に
self: borrow<...> が渡されるそうなので…
world example {
export blobs;
export call-gc: func(); // <- 🆕
}self は Python
コンポーネント自身が実装するリソースの実体 (rep)lower_borrowcomponent-model/design/mvp/canonical-abi/definitions.py
の lower_borrow:
lower_borrow (続き)num_borrows が増えないので、呼び出し終了時の
trap_if(self.num_borrows > 0) も発火しようがないcomponentize-py/runtime/src/lib.rs
の push_borrow
export したリソース型
release_borrows で自動的に drop
handle を 0
にして無効化コンポーネント自身で実装していないリソースを
borrow<blob> で受け取るコンポーネントが必要
interface processor {
use blobs.{blob};
process: func(b: borrow<blob>); // b をグローバル変数に保存
later: func() -> list<u8>; // 保存した b を使う
}
world processor-world {
import blobs;
export processor;
}
こちらのコミットより:
blob の実装(componentize-py
で作成):
python.wasm)processor の実装(jco componentize
で作成):
processor.wasm)Blob
を作り、processor.process(blob) に渡すjco transpile --map で import を Python の
export に繋ぐprocessor.js:
processor-host.js:
Uint8Array(4) [ 1, 2, 3, 100 ] ← process() 中は正常
----
TypeError: Resource error: Not a valid "Blob" resource.
at Blob.append (out-python/python.js)
...
at _trampoline0 (out-processor/processor.js)
process() から返った時点で、componentize-js
のバインディングが borrow ハンドルを droplater()
では解放済みのハンドルテーブルのスロットを読み、偽の Blob
を作ってしまうpython.js が「有効な Blob
ではない」として拒否jco transpile の出力には契約チェックが実装されている
'borrow handles still remain at the end of the call'componentize-js がハンドルを自動で
drop するので、このチェックは発火しないresource.drop
を呼ばないコンポーネントを WAT で手書きする必要がある(らしい)borrow
の契約は他のコンポーネントが実装したリソースのハンドルに対するもの