Apakah mungkin untuk mengakses tumpukan instance WASM yang memanggil dalam fungsi Javascript yang diimpor?
Terkait, apakah mungkin untuk melanjutkan instance setelah fungsi Javascript yang diimpor memberikan pengecualian? Secara khusus, tepat setelah titik di mana ia berhenti, termasuk data tumpukan saat ini, tumpukan panggilan, dll.
Saya mencoba mencari tahu apakah mungkin untuk membuat proses WASM persisten secara ortogonal, dan itu tidak hanya di antara panggilan, tetapi di dalam panggilan (misalnya ketika mereka kehabisan sumber daya, lihat https://github.com/ewasm/wasm -pengukuran).
Apakah mungkin untuk mengakses tumpukan instance WASM yang memanggil dalam fungsi Javascript yang diimpor?
Ya, Anda dapat mengakses memori linier jika Anda mengekspornya dari modul. Ini akan menjadi objek WebAssembly.Memory
, dan properti buffer
adalah ArrayBuffer
dengan isi memori linier.
Terkait, apakah mungkin untuk melanjutkan instance setelah fungsi Javascript yang diimpor memberikan pengecualian?
Tidak, itu tidak mungkin saat ini. Tumpukan panggilan dibuang ketika pengecualian dilemparkan. Untuk melakukan ini, Anda harus melengkapi modul Anda untuk memungkinkan perilaku ini. Sepertinya beberapa ekstensi yang dibahas dalam proposal penanganan pengecualian juga akan membantu di sini.
Apakah tumpukan terkandung dalam buffer memori? Saya belum melihatnya disebutkan dalam dokumentasi.
Tampaknya juga tidak mungkin untuk mengakses tumpukan panggilan dalam fungsi javascript yang diimpor tanpa melengkapi modul WASM.
Modul WebAssembly tidak memiliki tumpukan, hanya memiliki memori yang merupakan vektor datar byte. Saat bahasa seperti C++ dikompilasi ke WebAssembly, heap disimpan di memori, begitu juga data lainnya.
Secara umum, tumpukan panggilan WebAssembly (yang mencakup tumpukan fungsi yang dipanggil dan lokalnya) tidak disimpan dalam memori, dan tidak dapat diakses. Tetapi ketika bahasa seperti C++ dikompilasi ke WebAssembly, beberapa elemen dari tumpukan C++ dapat disimpan dalam memori. Umumnya ini adalah variabel C++ "diambil alamat" dan array besar.
Ah, begitu, jadi untuk itulah __heap_base!
Instance {
exports:
{ memory: Memory {},
__heap_base: 66560,
__data_end: 1024,
main: [Function: 2],
fac: [Function: 3] }
}
Terima kasih banyak!
WebAssembly.Memori disebut tumpukan
Komentar yang paling membantu
Modul WebAssembly tidak memiliki tumpukan, hanya memiliki memori yang merupakan vektor datar byte. Saat bahasa seperti C++ dikompilasi ke WebAssembly, heap disimpan di memori, begitu juga data lainnya.
Secara umum, tumpukan panggilan WebAssembly (yang mencakup tumpukan fungsi yang dipanggil dan lokalnya) tidak disimpan dalam memori, dan tidak dapat diakses. Tetapi ketika bahasa seperti C++ dikompilasi ke WebAssembly, beberapa elemen dari tumpukan C++ dapat disimpan dalam memori. Umumnya ini adalah variabel C++ "diambil alamat" dan array besar.