I can't say that i clearly understood your concept. But if it will simplify implementation without seemingly speed loss, i am all ears :)
test |b| [ |a| a + b ] Suppose you can't compile anything away, then you get |============== |MethodContext | |a := ... |============== ^ | |============== |BlockContext | |b := ... |============== And you just look up starting at the current context and go up. Except if the var is from the homeContext, then you directly follow the home-context pointer. Since all contexts link to the home-context, this makes it 1 pointer indirection to get to the method's context. 1 for the parent context. So that makes only 2 indirections starting from the 3 nested block (so when you have [ ... [ ... [ ... ] ... ] ... ]; where all of them are required for storing captured data. ifTrue:ifFalse: etc blocks obviously don't count. And blocks without shared locals could be left out (although we might not do that, for debugging reasons). Hope that helps. cheers, Toon