Design: Javascriptからスタック/ヒープにアクセスする

作成日 2018年06月12日  ·  5コメント  ·  ソース: WebAssembly/design

インポートされたJavascript関数内で呼び出し元のWASMインスタンスのヒープにアクセスすることは可能ですか?

関連して、インポートされたJavascript関数が例外をスローした後にインスタンスを再開することは可能ですか? 具体的には、現在のヒープデータ、コールスタックなど、停止した直後。

WASMプロセスを直交的に永続化できるかどうか、そしてそれを呼び出し間だけでなく呼び出し内でも可能かどうかを調べようとしています(たとえば、リソースが不足した場合は、https://github.com/ewasm/wasmを参照してください)。 -メータリング)。

最も参考になるコメント

WebAssemblyモジュールにはヒープがなく、バイトのフラットベクトルであるメモリがあるだけです。 C ++のような言語がWebAssemblyにコンパイルされると、ヒープはメモリに格納されますが、他のデータも同様に格納されます。

一般に、WebAssembly呼び出しスタック(呼び出された関数とそのローカルのスタックを含む)はメモリに保存されず、アクセスできません。 ただし、C ++などの言語をWebAssemblyにコンパイルすると、C ++スタックの一部の要素がメモリに格納される場合があります。 一般に、これらは「アドレス取得」C ++変数と大きな配列です。

全てのコメント5件

インポートされた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はいわゆるヒープです

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

nikhedonia picture nikhedonia  ·  7コメント

jfbastien picture jfbastien  ·  6コメント

mfateev picture mfateev  ·  5コメント

JimmyVV picture JimmyVV  ·  4コメント

aaabbbcccddd00001111 picture aaabbbcccddd00001111  ·  3コメント