WebAssembly modülünde yaşayan işlev işaretçilerine erişim elde etmek için herhangi bir yol var mı? Verilen örnek içinBir WebAssembly uygulamasında bir C stili işlev işaretçisini JavaScript'ten çağırma
, WebAssembly için derlenmiş "modülü" Aşağıdaki:
extern void set_callback(void (*callback)(void *arg), void *arg);
static void callback(void *arg)
{
/* ... */
}
int main() {
set_callback(&callback, 0);
return 0;
}
JavaScript do_callback
bir uygulama fiili işlev çağrısını yapmak için bir aracı C işlevi ihracat güvenmek zorunda kalmadan geri arama çağırmak Can ?
var instance = new WebAssembly.Instance(module, {
memory: /* ... */
env: {
set_callback: function set_callback(callbackptr, argptr) {
// We only got the pointer, is there any
},
},
});
Arabirim işlevi dışa aktarma yoluyla, genel görünürlüğe sahip bir dahili işlev ekleyebileceğimi kastediyorum.
do_callback(void (*callback)(void *arg), void *arg)
{
callback();
}
Sonra JavaScript
set_callback
fonksiyonu temsilci
do_callback
fonksiyonu aracılığıyla işlev işaretçisi çağırabilir.
function set_callback(callbackptr, argptr) {
instance.exports.do_callback(callbackptr, argptr);
}
Ancak, bu açık dolaylama yoluyla gitmek zorunda kalmadan bunu yapmak için tercih edilir belki fonksiyon tablolarla, mümkün mü?
bu fonksiyon tabloları açıklama temelde olarak okur olarak zaten "bu bir işlev işaretçisi tablosu, kullanımıdır çalıştı mesafesindedir C stili işlev işaretçileri için "ancak bir modülün içe aktarım tanımlayıcısına giden tabloların gözlenebilir bir etkisi yoktur ve tablo boş bırakılır? –
@CasperBeyer Bu yazıyı test etmek için kullandığım çalışma örneğini içerecek şekilde yayınımı düzenledim. – Ghillie
Emscripten olmadan tablo ve bellek için ithalat üretmek için nasıl clang alabilirim? Linker seviyesinde mi? ör., ithalatı içeren bir "boş" modül ile wasm-link? –