[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
>
>
>


-- 
best,
Eliot
-------------- 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