On 23/02/17 19:17, Esteban Lorenzano wrote: > >> 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
What do you mean? I see it in package Alien-Core. > >> >> >> >> >> >> >> 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 >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>> >>>>> >>>> >>>> >>> >> >> > >