Hi Esteban,

yes, I already looked at LibC's memcpy, but that doesn't help in case
you need to copy a *portion* of the ByteArray that does not start at
index 1. While one can do pointer arithmetic on ExternalAddress, this
does not, of course, apply to ByteArray.

To sum up, I think Pharo 5 currently lacks an efficient way to copy
parts of ByteArrays to/from the C heap. One has to instantiate
additional temporary ByteArrays and perform copies between ByteArrays in
addition to LibC>>memcpy.

But I see there's an Alien class which seems to better support such
copying. Thus, I wonder if it is somehow compatible with the rest of UFFI.






On 23/02/17 17:35, Esteban Lorenzano wrote:
> Sorry, I forgot to answer and now I'm in movement. 
> Look in LibC memcpy method (is not called exactly like that) and his uses. 
> That's the faster you can move things inside the image.
> 
> And remember: an EA is a pointer and a ByteArray is an array who will be 
> passed as pointer too.
> 
> Esteban 
> 
>> On 23 Feb 2017, at 17:21, raffaello.giulie...@lifeware.ch wrote:
>>
>> Hi,
>>
>> browsing through ByteArray's and ExternalAddress's code, I'm getting the
>> impression that copying *portions* of ByteArrays from/to the C heap can
>> be quite costly.
>>
>> Copying *to* the C heap sometimes requires first copying the portion of
>> the ByteArray into a newly instantiated temporary ByteArray, then
>> copying the latter to the C heap.
>>
>> Copying *from* the C heap might require explicitly looping over the
>> single bytes. I say "might" because I still cannot find more direct way,
>> as using ByteArray>>replaceFrom:to:with:startingAt: doesn't seem to work.
>>
>> Any suggestion on more effective copy operations?
>>
>> Thanks
>> Raffaello
>>
>>
>>
>>
>>
>>
>>> On 22/02/17 15:08, Raffaello Giulietti wrote:
>>> Hi Esteban,
>>>
>>> not sure I'm understanding your snippet correctly.
>>>
>>> Below is my try. It throws a SubscriptOutOfBounds exception in the last
>>> line. The reason is that the implementation of ByteArray
>>> replaceFrom:to:with:startingAt: does not consider that ea is meant to be
>>> a pointer to a C byte array, not an object whose content is to be copied
>>> directly.
>>>
>>>
>>> | ea ba |
>>> ea := ExternalAddress gcallocate: 200.
>>> ba := ByteArray new: 100.
>>> ba replaceFrom: 1 to: 50 with: ea startingAt: 51.
>>>
>>>
>>> Am I missing some point?
>>>
>>>
>>>
>>>
>>>> On 2017-02-21 17:20, Esteban Lorenzano wrote:
>>>> usually, something more or less like this:
>>>>
>>>> sourceByteArrayOrExternalAddress := … some ...
>>>> destEnternalAddressOrByteArray
>>>>    replaceFrom: 1
>>>>    to: sourceByteArrayOrExternalAddress size
>>>>      with: sourceByteArrayOrExternalAddress
>>>>    startingAt: 1
>>>>
>>>> and or course you can play with the starting points and sizes.
>>>>
>>>> cheers,
>>>> Esteban
>>>>
>>>>
>>>>> On 21 Feb 2017, at 17:13, Raffaello Giulietti
>>>>> <raffaello.giulie...@lifeware.ch> wrote:
>>>>>
>>>>> Hi,
>>>>>
>>>>> I'm having a hard time finding documentation on how to copy a portion
>>>>> of a ByteArray to/from another portion of a heap allocated C byte
>>>>> array with UFFI.
>>>>>
>>>>> My current reference is
>>>>> https://ci.inria.fr/pharo-contribution/view/Books/job/PharoBookWorkInProgress/lastSuccessfulBuild/artifact/book-result/UnifiedFFI/UnifiedFFI.pdf
>>>>>
>>>>>
>>>>> Thanks for directing me at relevant docs or examples and sorry in
>>>>> advance if I missed some important point in the docs.
>>>>>
>>>>> RG
>>>>>
>>>>>
>>>>
>>>>
>>>
>>>
>>
>>
> 


Reply via email to