[squeak-dev] Re: Retrying a message send
Igor Stasenko
siguctua at gmail.com
Sun Apr 11 08:48:44 UTC 2010
On 11 April 2010 11:33, Igor Stasenko <siguctua at gmail.com> wrote:
> Hello,
>
> suppose you having a method:
>
> foo
> <primitive: ... >
> self recompileAndRetry
>
>
> a #recompileAndRetry should do following:
> 1) recompile method #foo and install new version of #foo into class
> 2) restart execution from callee of #foo, so that it will call the
> same method again (but its renewed version)
>
>
> This is similar to what debugger does, when you changing a method in
> code pane and accepting it, except that it restarting a
> context of called method, instead of restarting from a point where
> caller context did a message send (and so, if a new method contains a
> primitive,
> it will be called by VM).
>
> Any ideas, how i can do (2) easily?
>
> My own thoughts is following:
>
> recompileAndRetry
> | retryCtx retryMethod caller method rcvr |
> retryCtx := thisContext sender.
> caller := retryCtx sender.
>
> method := retryCtx method.
> "here we recompile a method, like following: "
> method := method methodClass recompile: method selector.
>
> "now we're resending the same message"
> args := Array new: method numArgs.
> 1 to: args size do: [ :i | args at: i put: (retryCtx tempAt: i) ].
>
>
> thisContext terminateTo: caller.
> ^ retryCtx receiver perform: method selector arguments: args
>
Forgot to add:
the problem with the above, that if i restart it in that way, a call
stack, when i enter the new #foo method will be following:
caller context -> #recompileAndRetry context -> #foo
while i want, obviously, a clean stack state, as if this method
invoked naturally by interpreter:
caller context -> #foo
>
> --
> Best regards,
> Igor Stasenko AKA sig.
>
--
Best regards,
Igor Stasenko AKA sig.
More information about the Squeak-dev
mailing list
|