On 23 Feb 2017, at 19:21, raffaello.giulietti@lifeware.ch wrote:On 23/02/17 19:17, Esteban Lorenzano wrote:On 23 Feb 2017, at 19:11, raffaello.giulietti@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.
EstebanOn 23 Feb 2017, at 17:21, raffaello.giulietti@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
RaffaelloOn 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,
EstebanOn 21 Feb 2017, at 17:13, Raffaello Giulietti
<raffaello.giulietti@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