The src/library_xxx.js files are generally good examples. Here's one snippet where C function passes a pointer to an integer array and length of that array to JS side, and JS code reads through the array: https://github.com/kripken/emscripten/blob/master/src/library_openal.js#L329. If not using JS code that lives in js-libraries, the i32 {{{ makeGetValue }}} can be replaced with a direct HEAP32[pointer >> 2].
Another example with filling a struct in JS side: https://github.com/kripken/emscripten/blob/master/src/library_html5.js#L180 and reading the fields from a pointer to a struct: https://github.com/kripken/emscripten/blob/master/src/library_html5.js#L1728 2016-09-20 16:45 GMT+03:00 Robert Goulet <robert.gou...@autodesk.com>: > Do you have an example of sending pointer into EM_ASM and reading it > directly from memory? > > In my case I am calling EM_ASM close to a thousand times to pass engine > profiling data to javascript for drawing on the web page, so I am trying to > avoid adding time to the profiling result. If EM_ASM does add overhead, > then I hope to reduce it by calling it only once instead of a thousand > times per frame. I profiled it to about ~2.5ms per frame to do these > thousand calls to EM_ASM, which is a lot if you consider the actual frame > time is <= 17ms. > > On Monday, September 19, 2016 at 5:45:21 PM UTC-4, Alon Zakai wrote: >> >> The most efficient way is to send the pointer into EM_ASM, then do reads >> directly to memory using the right offsets, but that requires using >> information about how the data is laid out in memory (on the plus side, the >> alignment rules are the natural 32-bit ones, with fully aligned doubles). >> >> Otherwise multiple calls into EM_ASM adds overhead, but in many cases it >> wouldn't be noticeable. >> >> On Mon, Sep 19, 2016 at 1:57 PM, Robert Goulet <robert...@autodesk.com> >> wrote: >> >>> Hi, >>> >>> How do we pass an array of objects to Javascript function from C? >>> >>> Consider the following example: >>> >>> struct data { >>> double a; >>> int b; >>> unsigned char c; >>> }; >>> >>> std::vector<data> my_data; >>> >>> EM_ASM_ARGS({ >>> var data_array = ??? >>> process_data(data_array); >>> }, my_data); >>> >>> Is this possible? I couldn't find any clear documentation about this >>> topic. >>> >>> For the moment I've used the following workaround, but it doesn't look >>> super efficient: >>> >>> for( auto const & i : my_data ) { >>> EM_ASM_ARGS({ >>> process_data($0, $1, $2); >>> }, i.a, i.b, i.c); >>> } >>> >>> Thanks! >>> >>> -- >>> 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 emscripten-discuss+unsubscr...@googlegroups.com. >>> 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 emscripten-discuss+unsubscr...@googlegroups.com. > 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 emscripten-discuss+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.