インポートされたJavascript関数内で呼び出し元のWASMインスタンスのヒープにアクセスすることは可能ですか?
関連して、インポートされたJavascript関数が例外をスローした後にインスタンスを再開することは可能ですか? 具体的には、現在のヒープデータ、コールスタックなど、停止した直後。
WASMプロセスを直交的に永続化できるかどうか、そしてそれを呼び出し間だけでなく呼び出し内でも可能かどうかを調べようとしています(たとえば、リソースが不足した場合は、https://github.com/ewasm/wasmを参照してください)。 -メータリング)。
インポートされたJavascript関数内で呼び出し元のWASMインスタンスのヒープにアクセスすることは可能ですか?
はい、モジュールからエクスポートすれば、リニアメモリにアクセスできます。 これはWebAssembly.Memory
オブジェクトになり、そのbuffer
プロパティは線形メモリの内容を含むArrayBuffer
になります。
関連して、インポートされたJavascript関数が例外をスローした後にインスタンスを再開することは可能ですか?
いいえ、それは現在不可能です。 例外がスローされると、コールスタックは破棄されます。 これを行うには、この動作を可能にするためにモジュールをインストルメント化する必要があります。 例外処理の提案で説明されている拡張機能のいくつかは、ここでも役立つ可能性があります。
ヒープはメモリバッファに含まれていますか? ドキュメントに記載されているのを見たことがありません。
また、WASMモジュールをインストルメント化せずに、インポートされたjavascript関数内のコールスタックにアクセスすることは不可能のようです。
WebAssemblyモジュールにはヒープがなく、バイトのフラットベクトルであるメモリがあるだけです。 C ++のような言語がWebAssemblyにコンパイルされると、ヒープはメモリに格納されますが、他のデータも同様に格納されます。
一般に、WebAssembly呼び出しスタック(呼び出された関数とそのローカルのスタックを含む)はメモリに保存されず、アクセスできません。 ただし、C ++などの言語をWebAssemblyにコンパイルすると、C ++スタックの一部の要素がメモリに格納される場合があります。 一般に、これらは「アドレス取得」C ++変数と大きな配列です。
ああ、なるほど、それが__heap_baseの目的です!
Instance {
exports:
{ memory: Memory {},
__heap_base: 66560,
__data_end: 1024,
main: [Function: 2],
fac: [Function: 3] }
}
どうもありがとうございました!
WebAssembly.Memoryはいわゆるヒープです
最も参考になるコメント
WebAssemblyモジュールにはヒープがなく、バイトのフラットベクトルであるメモリがあるだけです。 C ++のような言語がWebAssemblyにコンパイルされると、ヒープはメモリに格納されますが、他のデータも同様に格納されます。
一般に、WebAssembly呼び出しスタック(呼び出された関数とそのローカルのスタックを含む)はメモリに保存されず、アクセスできません。 ただし、C ++などの言語をWebAssemblyにコンパイルすると、C ++スタックの一部の要素がメモリに格納される場合があります。 一般に、これらは「アドレス取得」C ++変数と大きな配列です。