Hi, I solved the problem, but only one error happen when i call the callback:
*```Cannot pass deleted object as a pointer of type XVoidFunctorString const*```* The line where it happen is here: https://github.com/xplpc/xplpc/blob/wasm-mapping/wasm/sample/src/xplpc/proxy/platform-proxy.ts#L36 *```EMSCRIPTEN_BINDINGS(xplpc_std_function){ em::class_<std::function<void(const std::string &)>>("XVoidFunctorString") .constructor<>() .function("exec", &std::function<void(const std::string &)>::operator());}```* The binding for callback is here: https://github.com/xplpc/xplpc/blob/wasm-mapping/wasm/lib/src/bind.cpp#L41-L81 If i remove the line *`await this.sleep(3000);`* it works, so can be something related from free memory in some place. What im doing wrong? This part is documented in emscriptem tests here: https://github.com/emscripten-core/emscripten/blob/main/test/embind/embind_test.cpp#L1952-L1958 Thanks. Em domingo, 23 de julho de 2017 às 19:27:58 UTC-3, [email protected] escreveu: > I managed to make everything work as expected. Your comments have been > really helpful, Alexandre, thank you! 😀 > > > On Wednesday, July 19, 2017 at 5:19:26 PM UTC+3, Alexandre Perrot wrote: >> >> Both are possible, but I'd say val is the best option. >> >> I did not test it, but it seems to me that since val has an operator(), >> it can be used as a functor, and thus be directly passed as an >> std::function. >> Otherwise, it is easy to create a lambda that will call it. >> >> Le lundi 17 juillet 2017 17:44:18 UTC+2, Vangelis Ts. a écrit : >>> >>> Thank you very much for your response, Alexandre. 🙂 >>> >>> Passing functions from JS to call later on from C++ is exactly what I am >>> trying to do. I suspect that *emscripten::val* is the only way ―or is >>> it also possible by using *std::function*? >>> >>> In any case, my C++ library uses *std::function* internally and >>> (ideally) I would like to avoid making changes to the code that calls the >>> callbacks. Is there the ability to "translate" an *emscripten::val* to >>> *std::function*, in order to transparently pass the callbacks to the >>> rest C++ code? >>> >>> >>> On Monday, July 17, 2017 at 10:24:49 AM UTC+3, Alexandre Perrot wrote: >>>> >>>> Hi, >>>> >>>> std::functions are not bound by default, you need to do that yourself. >>>> >>>> Have a look at l.1775 of embind_test.cpp >>>> >>>> https://github.com/kripken/emscripten/blob/master/tests/embind/embind_test.cpp#L1775 >>>> >>>> This registers an std::function as a class, with the opcall method >>>> binding the c++ () operator. >>>> >>>> Alternatively, you could use an emscripten::val to pass a function from >>>> js. >>>> >>>> Le lundi 10 juillet 2017 14:58:08 UTC+2, Vangelis Ts. a écrit : >>>>> >>>>> Hello, >>>>> >>>>> I am trying to use a simple C++ program containing using >>>>> *std::function* with Embind. However, the latter does not seem to >>>>> recognize *std::function*. >>>>> >>>>> More specifically, here is the example I used: >>>>> >>>>> *Foo.cpp* >>>>> >>>>> >>>>> #include <functional> >>>>> #include <emscripten/bind.h> >>>>> >>>>> using namespace emscripten; >>>>> >>>>> int bar(std::function<int(int)> func, int num) { >>>>> return func(num); >>>>> } >>>>> >>>>> EMSCRIPTEN_BINDINGS(Foo) { >>>>> function("bar", &bar); >>>>> } >>>>> >>>>> >>>>> *Foo.html* >>>>> >>>>> >>>>> <!doctype html> >>>>> <html> >>>>> <script src="foo.js"></script> >>>>> <script> >>>>> console.log('Foo: ' + Module.bar); >>>>> </script> >>>>> </html> >>>>> >>>>> >>>>> *Compilation* >>>>> >>>>> >>>>> *$* emcc --bind foo.cpp -o foo.js >>>>> >>>>> >>>>> The compilation succeeds with no errors or warnings. >>>>> >>>>> *Result* >>>>> >>>>> >>>>> <https://lh3.googleusercontent.com/-cbSwX8ZiNag/WWNzyjMIwsI/AAAAAAAAKUA/06dRJmG-0C4b3_jHxB1c_Eu1Mny5947ZQCLcBGAs/s1600/Screen%2BShot%2B2017-07-10%2Bat%2B14.57.05.png> >>>>> >>>>> >>>>> I also tried to compile and/or run the test files of Embind (see >>>>> embind_test.cpp >>>>> <https://github.com/kripken/emscripten/blob/master/tests/embind/embind_test.cpp> >>>>> and embind.test.js >>>>> <https://github.com/kripken/emscripten/blob/master/tests/embind/embind.test.js>), >>>>> >>>>> which also contain function that use *std::function* (e.g. >>>>> emval_test_get_function_ptr >>>>> (definition) >>>>> <https://github.com/kripken/emscripten/blob/master/tests/embind/embind_test.cpp#L153> >>>>> / emval_test_get_function_ptr (binding) >>>>> <https://github.com/kripken/emscripten/blob/master/tests/embind/embind_test.cpp#L1780>), >>>>> >>>>> with exactly the same command and they *do work fine*: >>>>> >>>>> *Result* >>>>> >>>>> >>>>> <https://lh3.googleusercontent.com/-9Cn4jyhAPzg/WWN1pN3B8TI/AAAAAAAAKUQ/x_t2dM-qyi8n6hTcIf968IQSaxmfFxoDACLcBGAs/s1600/Screen%2BShot%2B2017-07-10%2Bat%2B14.56.02.png> >>>>> >>>>> *Generated source code* >>>>> >>>>> >>>>> <https://lh3.googleusercontent.com/-80B9SjRLHME/WWN16hbcMCI/AAAAAAAAKUU/ZzP2QEes3Pk0gacNafhtMMgyUAazTTEkwCLcBGAs/s1600/Screen%2BShot%2B2017-07-10%2Bat%2B14.55.53.png> >>>>> >>>>> I should also mention that I tried many different combinations, e.g. >>>>> *std::function* with different types, as return type, as argument, as >>>>> an independent function (like in the above example), as a class or struct >>>>> method, but had no luck. >>>>> >>>>> Any ideas would prove of great help. >>>>> >>>>> Thank you very much, in advance. >>>>> >>>>> >>>>> ― Vangelis >>>>> >>>> -- You received this message because you are subscribed to the Google Groups "emscripten-discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/emscripten-discuss/745c02f2-3e91-45c4-b0bf-866cec9ec51fn%40googlegroups.com.
