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.

Reply via email to