[squeak-dev] Retrying a message send
Igor Stasenko
siguctua at gmail.com
Sun Apr 11 08:33:40 UTC 2010
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
--
Best regards,
Igor Stasenko AKA sig.
More information about the Squeak-dev
mailing list
|