Isn't Eliot just implementing this feature, having a segment of non relocatable objects? 2013/9/23 Igor Stasenko <siguctua@gmail.com>
On 23 September 2013 21:40, Igor Stasenko <siguctua@gmail.com> wrote:
On 23 September 2013 16:23, Camillo Bruni <camillobruni@gmail.com> wrote:
Hi Jan,
I think I will add the ByteArray accessor to NBExternalAddress today or tomorrow since I need it as well for another project.
hmm, reading from memory into bytearray can be done with memory copy:
inputs: address , offset , size to read
newAddress := NBExternalAddress value: address value + offset. buffer := ByteArray new: size. NativeBoost memCopy: newAddress to: buffer size: size.
same way, writing, just swap the source and destination:
newAddress := NBExternalAddress value: address value + offset. buffer "is given from somewhere". NativeBoost memCopy: buffer to: newAddress size: size.
but as Jan noted, you cannot tell to write starting at specified offset from/to bytearray, e.g.:
copy from: address to: buffer + someOffset neither: copy from: buffer + someOffset to: someAddress
this where we need to introduce special 'field address' type, so you can construct it like this:
offsetAddress := buffer nbAddressAt: offset.
so then you can use it to pass to any function, which expects address, like memory copy or any foreign function.
Since objects are moving in memory, we cannot calculate address of field before hand:
address := NBExternalAddress value: someObject address + offset.
because if GC will happen, after computing such address and its actual use, you will read/write to wrong location.
** after computing and *before* actual use **
Thus we should keep oop + offset up to the point of passing it to external function, under controllable conditions, that guarantee there's no GC is possible.
Things would be much simpler if we could have pinning, isnt? :)
-- Best regards, Igor Stasenko.
-- Best regards, Igor Stasenko.