[Vm-dev] Limit of the #become:

Eliot Miranda 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
> wrote:

> 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
> reason.

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.
> Thanks,
> --
> Mariano
> http://marianopeck.wordpress.com

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20120404/1ba04e9c/attachment-0001.htm

More information about the Vm-dev mailing list