On Fri, Dec 2, 2011 at 8:30 PM, Juan Vuletich <[email protected]> wrote:
> Eliot Miranda wrote: > >> >> >> On Fri, Dec 2, 2011 at 10:55 AM, Mariano Martinez Peck < >> [email protected] <mailto:[email protected]>**> wrote: >> >> Thanks both. I am right to assume that if the block refers to temp >> vars, parameters, or whatever in another scope, then such solution >> won't work. I mean, if I have this example for example: >> >> | bytes result blah | >> blah := 42. >> bytes := FLSerializer serializeToByteArray: (SortedCollection >> sortBlock: [:a :b | (a + blah) > b ]). >> >> Then the 'blah' is in a different context. So the mentioned >> solution works for "clean" closures, which are "self contained". >> In the other cases (such as this example), we should serialize the >> whole stack. Is this correct? >> >> >> No. The closure implementation arranges that any and all temporary >> variables accessed by the closure are directly accessible from the closure >> without accessing the outer contexts. >> ... >> > > WRT clean closures, check what I did in Cuis to serialize > SortedCollections. See implementors and senders of #isClean. > > Nice. Thanks Juan. I was checking your code, and that's exactly why I asked Eliot. In your method you say: isClean "A clean closure is one that doesn't really need the home context because: - It doesn't send messages to self or super - It doesn't access any instance variable - It doesn't access any outer temp - It doesn't do ^ return" ..... So... my question is, WHAT do I need to serialize if I want to be able to serialize also "non clean". I mean, for each item on that list, what do I need apart from the closure instance and the receiver and method from the outerContext ? the whole stack of contexts ? Thanks a lot in advance! -- Mariano http://marianopeck.wordpress.com
