Oleg Privalov
Oleg Privalov

Reputation: 53

How to pass a callback to EM_ASM for c++?

I do not know how to pass the value asynchronously to EM_ASM, here's how I try to do it (but JS says it's not a function):

const auto testFunc = [] (const char* data)
{
    printf("data: %s\n", data);
}
EM_ASM_(
{
    var funcResult = ($0);
    var text = "data";
    var lengthBytes = lengthBytesUTF8(text) + 1;
    var stringOnWasmHeap = _malloc(lengthBytes);
    stringToUTF8(text, stringOnWasmHeap, lengthBytes);
    // exception thrown: TypeError: funcResult is not a function
    funcResult(stringOnWasmHeap);
}, testFunc);

The documentation says that you can use a function (em_str_callback_func) of the em_str_callback_func type. But it doesn't say how to use it. https://emscripten.org/docs/api_reference/emscripten.h.html

Upvotes: 0

Views: 1414

Answers (1)

curiousdannii
curiousdannii

Reputation: 2010

I don't know about passing callbacks, but if what you want to do is to return a value from JS, then the docs have such an example: you have to use EM_ASM_INT instead:

int x = EM_ASM_INT({
  console.log('I received: ' + $0);
  return $0 + 1;
}, 100);
printf("%d\n", x);

The API reference has another example for returning a string:

char *str = (char*)EM_ASM_INT({
  var jsString = 'Hello with some exotic Unicode characters: Tässä on yksi lumiukko: ☃, ole hyvä.';
  var lengthBytes = lengthBytesUTF8(jsString)+1;
  // 'jsString.length' would return the length of the string as UTF-16
  // units, but Emscripten C strings operate as UTF-8.
  var stringOnWasmHeap = _malloc(lengthBytes);
  stringToUTF8(jsString, stringOnWasmHeap, lengthBytes);
  return stringOnWasmHeap;
});
printf("UTF8 string says: %s\n", str);
free(str); // Each call to _malloc() must be paired with free(), or heap memory will leak!

Once you have the value in C you can just call your testfunc directly.

Upvotes: 2

Related Questions