Ok, but then how does Emscripten handles C/C++ code that deals with 
int64_t/uint64_t values?

On Wednesday, November 2, 2016 at 3:53:34 PM UTC-4, Brion Vibber wrote:
>
> JavaScript can't natively handle 64-bit integers, and there's no 
> Int64Array type to read from.
>
> If you know the value will be in the range of 53 bits, or don't care that 
> precision will be lost at larger magnitudes, then it can be handled as a 
> double-precision float on the JS side:
>
>   var low = Module.HEAP32[ptr / 4];
>   var high = Module.HEAP32[(ptr + 4) / 4];
>   var double = high * Math.pow(2, 32) + low;
>
> -- brion
>
> On Wed, Nov 2, 2016 at 12:22 PM, Robert Goulet <robert...@autodesk.com 
> <javascript:>> wrote:
>
>> Question about Emscripten HEAP access, is there a way to read 64bit 
>> integer signed/unsigned values? I see HEAPF64 and HEAP32, etc., but no 
>> HEAP64?
>>
>> Thanks!
>>
>>
>> On Wednesday, September 21, 2016 at 5:23:48 PM UTC-4, Robert Goulet wrote:
>>>
>>> Thanks guys, the code works as expected now. I didn't get back as much 
>>> performance as I hoped but its faster nonetheless. Cheers!
>>>
>>> On Wednesday, September 21, 2016 at 5:10:16 PM UTC-4, Charles Vaughn 
>>> wrote:
>>>>
>>>> Yeah, I usually end up screwing up the pointer shifts.
>>>>
>>>> Another thing to keep in mind is if you used packed structs (don't 
>>>> recommend that for Emscripten built code), you'll need to do something 
>>>> like 
>>>> DataView.
>>>>
>>>> On Wednesday, September 21, 2016 at 1:14:05 AM UTC-7, jj wrote:
>>>>>
>>>>> You can also go via the HEAP objects, so
>>>>>
>>>>> event.time = HEAPF64[addr>>3];
>>>>> event.name = Pointer_stringify(HEAP32[addr+8 >> 2]);
>>>>> event.thread_id = HEAP32[addr+12 >> 2];
>>>>> event.type = HEAP8[addr + 16];
>>>>> event.core_id = HEAP8[addr + 17];
>>>>>
>>>>> 2016-09-21 0:06 GMT+03:00 Charles Vaughn <cva...@gmail.com>:
>>>>>
>>>>>> 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.
>>>>>>
>>>>>
>>>>> -- 
>> 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 <javascript:>.
>> 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