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