[Vm-dev] Limit of the #become:
eliot.miranda at gmail.com
Wed Apr 4 17:12:15 UTC 2012
On Wed, Apr 4, 2012 at 8:32 AM, Mariano Martinez Peck <marianopeck at gmail.com
> Hi guys. I noticed that there is a limit in the number of objects you can
> become. In my case, I am becoming 2312157 objects. So..I don't expect that
> the become works. I imagine that it was not designed for so many objects in
> mind ;)
> However, what I would really understand is where is the limitation and the
The limitation is in the number of forwarding blocks. For a two-way become
you need N * 2 forwarding blocks. for a become forward 1-way become you
need N forwarding blocks. Each forwarding block takes two words (a saved
header word and the new location). During forwarding each forwarded
object's header is changed to a pointer to its forwarding block.
See prepareForwardingTableForBecoming:with:twoWay: & fwdTableInit:.
And of course, if someone already knows which is the real number limit.
> Otherwise, I will do a kind of binary search and discover it.
> If you want to reproduce it:
> | dict |
> dict := Dictionary new.
> 2312157 timesRepeat: [ dict at: Object new put: Object new ].
> 3 timesRepeat: [Smalltalk garbageCollect].
> dict keys elementsForwardIdentityTo: dict values.
> throws a #primitiveFailed.
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Vm-dev