This is halt related, but you can see how Fuel checks wether the closure is "clean" and if true, it serializes a pruned version of it so that to avoid a whole stack. See BlockClosure >> fuelAccept:
fuelAccept: aGeneralMapper ^ self *shouldBeSubstitutedByCleanCopy* "The 'onRecursionDo:' is just to avoid an infinitive loop for the substitution. The cleanCopy MUST be a clean copy so it can be serialized normally" ifTrue: [ aGeneralMapper visitSubstitution: self by: *self cleanCopy *onRecursionDo: [ aGeneralMapper visitVariableObject: self ] ] ifFalse: [ aGeneralMapper visitVariableObject: self ] Cheers, On Sun, Dec 27, 2015 at 1:31 PM, Clément Bera <bera.clem...@gmail.com> wrote: > There is no way of creating such blocks currently. > > In fact only non local returns and debugging are problems as remote > variables are accessed through an indirection. A lightweight block (to > reuse your terms) with no outer context but accesses to remote temporary > variables would work fine. > > The common terminology is as follow: > - Blocks are called clean blocks if there are no remote temporary variable > access and no outer context references > - They're called copying block if there are remote temporary access but > still no outer context > - They're called full blocks if they have an outer context (One can > sometimes distinguish also full and fullcopying blocks, but it does not > matter) > > Pharo supports only full blocks, on the contrary to other smalltalk such > as VW. I did a working implementation of clean blocks, as you describe, but > I didn't integrate it because I didn't like loosing part of the debugging > features. That was years ago I am not sure I can find the code anymore. I > can explain the design though as it's pretty straightforward. > > To implement such blocks, you need to share a fake outerContext between > all the clean blocks created in the same method. You can't have nil as an > outer context else the VM behaves badly. Instead of the block creation > bytecode, you can use the pushLiteral instruction to push the BlockClosure > created at compilation time and stored in the literal frame of the method. > You can put the bytecode of clean blocks at the end of the bytecode zone of > the method, followed by a returnTop instruction at the end (without the > return instruction the JIT is confused on where the end of the bytecoded > method is). Let me know if you want to implement that I can help. I still > think it should be an external library and not in the base Pharo though for > debugging purpose. > > To solve your problem of moving blocks around, it may also be possible to > use ephemerons to remove the dependency. Maybe some ephemeron experts can > help you there. > > 2015-12-26 16:47 GMT+01:00 webwarrior <r...@webwarrior.ws>: > >> BlockClosure objects hold reference to object that created them via >> outerContext receiver. This can cause memory leaks when moving blocks >> around/deepcopying/serializing. >> >> Is there a way to get "lightweight" block that has empty outerContext >> (like >> when executing code in Playground) or is there another class for such >> "lightweight" blocks somewhere? >> >> Obviously I'm talking about blocks that don't reference variables in >> enclosing scope and don't do nonlocal return. >> >> >> >> -- >> View this message in context: >> http://forum.world.st/Block-that-doesn-t-leak-memory-tp4868529.html >> Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com. >> >> > -- Mariano http://marianopeck.wordpress.com