You can just put things on the Module object yourself. Write the JS to do it, using Module['name'] = value (so it works in closure too), then add it as a --post-js to your C++ code, and then normal JS from outside will be able to access it.
- Alon On Fri, Oct 17, 2014 at 7:14 AM, Pepijn Van Eeckhoudt < [email protected]> wrote: > Hi, > > I'm in the process of making a tool similar to webidl-binder. Right now > I'm trying to add support for callback interfaces, but I'm a bit stuck on > how to get this working. > > What I would like to do is be able to make an implementation of a callback > interface in Javascript, pass it to C++ and then invoke methods on the > callback object. I'm trying to implement this using a lookup table where > callback objects get registered and assigned an id when first passed to > C++. On the C++ side a proxy object is created which wraps the id value and > dispatches member functions to functions defined in Javascript. Those > functions are included using the --js-library flag as per the documentation. > > In the code below I've put the object lookup table inside the js-library. > The problem I have now is that I need some way to access that lookup table > (directly or indirectly) from Javascript code that isn't processed by > emscripten. I think the most reliable way to do this will be to export the > table via the Module object. My question is how I can do this. Is there any > way to force symbols defined in a js-library to be exported via Module? Or > is there an easier strategy to implement callbacks? > > Thanks, > > Pepijn > > Example code showing the pattern I'm trying to implement follows. > > In my test IDL file I have something like > interface Test { > void callMeBack(Callback c); > }; > callback interface Callback { > void callback(Test t); > }; > > The C++ implementations for Test and Callback are (abbreviated) > void Test::callMeBack(Callback *cb) { > cb->callback(this); > } > > class Callback { > int handle; > Callback(int handle) : handle(handle) {} > void callback(Test* test) { > js_callback_Callback_callback(this->handle, test); > } > }; > > extern "C" { > void emscripten_operation_Callback_callback(int handle, Test* test); > } > > And finally the JS library looks like this > mergeInto(LibraryManager.library,{ > $CALLBACK_OBJECTS: { > cache: [] > }, > emscripten_operation_Callback_callback: function (handle, test_ptr) { > CALLBACK_OBJECTS.cache[handle].callback(test_ptr); > } > }); > > -- > 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]. > For more options, visit https://groups.google.com/d/optout. > -- 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]. For more options, visit https://groups.google.com/d/optout.
