If you're struct is packed (or you know the padding points) and contiguous, you can use a DataView ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView ) to wrap a slice of the underlying buffer of the various HEAPs.
Something like: var view = new DataView(HEAP8.buffer.slice(addr)); event.time = view.getDouble(0, true); event.name = Pointer_stringify(view.getUint32(8, true)); event.thread_id = view.getInt32(12, true); event.type = view.getInt8(16, true); event.core_id = view.getInt8(17, true); On Tuesday, September 20, 2016 at 1:41:56 PM UTC-7, Robert Goulet wrote: > > The JS code looks like this: > > event.time = getValue(addr, 'double'); > event.name = Pointer_stringify(getValue(addr + 8, '*')); > event.thread_id = getValue(addr + 12, 'i32'); > event.type = getValue(addr + 16, 'i8'); > event.core_id = getValue(addr + 17, 'i8'); > > since the different elements of the structure varies in size, I guess I > have to use different HEAP methods? > > On Tuesday, September 20, 2016 at 4:36:47 PM UTC-4, jj wrote: >> >> Directly accessing HEAP32 will definitely be much faster than the very >> generic getValue() function. If you don't need any of the genericity of >> what getValue() offers, using HEAP32 is definitely recommended. >> >> 2016-09-20 23:27 GMT+03:00 Robert Goulet <robert...@autodesk.com>: >> >>> Thanks jj, I ended up using getValue on the JS side to get the data from >>> the pointer I pass from C. Is there any performance concerns with this or >>> should I use HEAP32 instead? >>> >>> On Tuesday, September 20, 2016 at 12:33:01 PM UTC-4, jj wrote: >>>> >>>> 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...@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. >>> >> >> -- 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.