> On 23 Feb 2017, at 19:11, raffaello.giulie...@lifeware.ch wrote:
> 
> 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.

Which Alien class?

Esteban

> 
> 
> 
> 
> 
> 
> 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