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 readnewAddress := 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 + someOffsetneither:copy from: buffer + someOffset to: someAddressthis� 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 copyor 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, undercontrollable conditions, that guarantee there's no GC is possible.
Things would be much simpler if we could have pinning, isnt? :)