私は、WebAssemblyバッファのメモリアドレスを取得してJavascriptに戻そうとしています。そのため、JavascriptのArrayBufferとしてメモリをインストールし、適切なアドレスのモジュールのメモリに配列を直接書き込むことができます。WebAssemblyバッファのアドレスを見つけてJavascriptに戻すにはどうしたらいいですか?
Cコード:
#include <stdint.h>
uint8_t buff[10][100];
uint64_t addr(int buffer_index){
return (uint64_t)&buff[buffer_index];
}
私はそれをコンパイル:
emcc project.c -Os -s WASM=1 -s SIDE_MODULE=1 -o project.wasm
HTML:
<script>
var importObject = {
env: {
memoryBase: 0,
tableBase: 0,
setTempRet0:(x)=>{},
memory: new WebAssembly.Memory({ initial:256 }),
table: new WebAssembly.Table({ initial:0, element:'anyfunc' })
}
};
fetch('http://localhost:9000/assets/wasm/project.wasm').then(
response => response.arrayBuffer()
).then(
bytes => WebAssembly.instantiate(bytes, importObject)
).then(
results => {
let module=results.instance
let exports=module.exports
let addr=exports._addr
console.log(addr(0))
console.log(addr(1))
console.log(addr(2))
}
)
</script>
実行の結果:
project.html:21 5242880
project.html:22 5242980
project.html:23 5243080
バッファに100バイトのチャンクがあり、返されるアドレスが100バイト離れているため、これは正常に見えます。
これらのアドレスがモジュールのメモリ内でどこを指しているかはどのようにして知ることができますか?
この回答をありがとう、私の問題を解決しました。しかし、メモリの代わりにメモリバッファを見なければならないので、正しい行は 'var buffer = new Uint8Array(importObject.env.memory.buffer、exports._addr(0)、100);'です。マンデルブロフラクタルのあなたのプロジェクトも好きです。 – sbtpr
良い点、私はコードを更新しました! – ColinE
'(exports._addr || exports.addr)(0)' - アンダーラインはemccによってのみ追加され、llvmは名前をそのままエクスポートします。 – Vitaly