> 
> Blocks
> ======
> Status: All tests green when compiling with ConstantBlockClosure (but the 
> option is not yet enabled by default)
> Work continues to reducing the use of #home, this week by using #homeMethod 
> instead of "home method”
> 

And there are more in need of review, for example:

11965-Implement-ContextactiveHome-without-using-home #12063
        https://github.com/pharo-project/pharo/pull/12063

#activeHome returns the #home if it is currently on the stack, the debugger 
uses that to check if a “save and proceed”
is possible when editing code in a Block. It is implemented to search up the 
sender chain until it finds the #home:

activeHome
        | methodReturnContext |
        self isBlockContext ifFalse: [^self].
        self sender ifNil: [^nil].
        methodReturnContext := self methodReturnContext.
        ^self sender findContextSuchThat: [:ctxt | ctxt = methodReturnContext]


But it can be rewritten to do the same, but checking for the #homeMethod:

activeHome
        | homeMethod |
        self isBlockContext ifFalse: [^self].
        homeMethod := self homeMethod.
        ^self findMethodContextSuchThat: [:ctxt | ctxt method == homeMethod]


With #homeMethod being implemented to delegate to the bock:

Context>>homeMethod
        "Answer the method in which the receiver was defined, i.e. the context 
from which an ^-return ] should return from. Note: implemented to not need 
#home"

        ^ closureOrNil ifNil: [ self method ] ifNotNil: [ :closure | closure 
homeMethod ]


Where, if no #outerContext is available, it asks the CompiledBlock:
 
BlockClosure>>homeMethod
        "return the home method. If no #home is available due to no 
outerContext, use the compiledBlock"
        ^ (self home
                   ifNotNil: [ :homeContext | homeContext ]
                   ifNil: [ self compiledBlock ]) method


Which uses the static  #outerCode chain (CompiledBlocks encode have a 
back-pointer to the enclosing block or method),
with #method following #outerCode until it reaches a CompiledMethod:

CompiledBlock>>method
        "answer the compiled method that I am installed in, or nil if none.”
        ^self outerCode method



Reply via email to