Czy istnieje sposób na uzyskanie dostępu do wskaźników funkcji znajdujących się w module WebAssembly?Wywołanie wskaźnika funkcji stylu C w zespole WebAssembly z JavaScript
Na przykład, biorąc pod uwagę następujące „module” skompilowany do WebAssembly:
extern void set_callback(void (*callback)(void *arg), void *arg);
static void callback(void *arg)
{
/* ... */
}
int main() {
set_callback(&callback, 0);
return 0;
}
Czy implementacja do_callback
w JavaScript powołać się na oddzwanianie bez konieczności polegania na pośredniczącego eksportu funkcji C zrobić rzeczywiste wywołanie funkcji ?
var instance = new WebAssembly.Instance(module, {
memory: /* ... */
env: {
set_callback: function set_callback(callbackptr, argptr) {
// We only got the pointer, is there any
},
},
});
Przez eksport funkcji pośrednika, mam na myśli, że mogę dodać funkcję wewnętrzną z widocznością publiczną.
do_callback(void (*callback)(void *arg), void *arg)
{
callback();
}
Następnie funkcja JavaScript set_callback
może wywołać wskaźnik funkcji za pośrednictwem delegata do_callback
funkcji.
function set_callback(callbackptr, argptr) {
instance.exports.do_callback(callbackptr, argptr);
}
Ale lepiej jest to zrobić bez konieczności przechodzenia przez ten wyraźnej zadnie, czy to możliwe, ze stołami funkcyjnych może być?
Tried to już jako opis tabel funkcyjnych w zasadzie brzmi „to jest stół wskaźnik funkcji, wykorzystanie to jest dla wskaźników funkcyjnych w stylu C ", ale przekazywanie tabel do deskryptora importu modułu nie ma zauważalnego efektu, a tabela kończy się być pusta? –
@CasperBeyer Edytowałem swój wpis, aby uwzględnić przykład pracy, którego użyłem do przetestowania tego. – Ghillie
Jak uzyskać clang do generowania importu dla tabeli i pamięci bez Emscripten? Zrób to na poziomie linkera? np. wasm-link z "pustym" modułem zawierającym import? –