<br><br><div class="gmail_quote">On Fri, Dec 2, 2011 at 10:20 AM, Nicolas Cellier <span dir="ltr"><<a href="mailto:nicolas.cellier.aka.nice@gmail.com">nicolas.cellier.aka.nice@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
2011/12/2 Martin Dias <<a href="mailto:tinchodias@gmail.com">tinchodias@gmail.com</a>>:<br>
<div><div></div><div class="h5">> Hi folks<br>
><br>
> In Fuel, we serialize a block closure with its state, including its<br>
> outerContext. This enables to serialize a sorted collection with its<br>
> sortBlock:<br>
><br>
> | bytes result |<br>
> bytes := FLSerializer serializeToByteArray: (SortedCollection sortBlock: [:a<br>
> :b | a > b ]).<br>
> result := FLMaterializer materializeFromByteArray: bytes.<br>
> result<br>
> addAll: #(1 2 3);<br>
> yourself.<br>
> ---> a SortedCollection(3 2 1)<br>
><br>
> Here the problem: the byte array is huge! (800kb) because we are serializing<br>
> unneeded context for the sort block.<br>
><br>
> We wonder how to prune it and save time and space.<br>
><br>
> Thanks in advance<br>
> Martín<br>
<br>
</div></div>In the case of such clean block, there is no need of outer context<br>
during block execution.<br>
However I don't know if implementation makes it possible to ignore the<br>
context...<br>
That's more a question directed to Eliot ;)<br></blockquote><div><br></div><div>Arguably there is a bug in my closure implementation, which is that both the receiver and the method are fetched from the outerContext. That's not a bug which can be fixed without a new VM/image combination and may be something I'll look at long-term, but is something we have to live with at the moment. This means that you *do* have to serialize the outerContext. But the outerContext is used only for the receiver and method. So you don't need to full serialize the outerContext. In particular you don't need to serialize any of the outerContext's stack contents or its sender. This needs special handling, I guess in BlockClosure, to substitute a suitably reduced outerContext, but it shouldn't be hard to do. e.g.</div>
<div><br></div><div>BlockClosure methods for: '*Fuel-serialization'</div><div>outerContextForSerialization</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>^MethodContext</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>sender: nil</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>receiver outerContext receiver</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>method: outerContext method</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>args: #()</div>
<div><br></div><div><br></div><div>BlockClosure methods for: '*Fuel-serialization'</div><div>outerContextForSerialization</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>^MethodContext</div>
<div><span class="Apple-tab-span" style="white-space: pre; ">                </span>sender: nil</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>receiver self receiver</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>method: self method</div>
<div><span class="Apple-tab-span" style="white-space: pre; ">                </span>args: #()</div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<font color="#888888"><br>
Nicolas<br>
<br>
</font></blockquote></div><br><br clear="all"><div><br></div>-- <br>best,<div>Eliot</div><br>